From c8e5702127e507e82e6f68a4b8c546803accea9d Mon Sep 17 00:00:00 2001 From: Koen Kooi Date: Thu, 30 Jun 2005 08:19:37 +0000 Subject: import clean BK tree at cset 1.3670 --- .../glibc-2.3.2/glibc-2.3.2-200304020432.patch | 136135 ++++++++++++++++++ 1 file changed, 136135 insertions(+) (limited to 'packages/glibc/glibc-2.3.2/glibc-2.3.2-200304020432.patch') diff --git a/packages/glibc/glibc-2.3.2/glibc-2.3.2-200304020432.patch b/packages/glibc/glibc-2.3.2/glibc-2.3.2-200304020432.patch index e69de29bb2..2fcd1f2da6 100644 --- a/packages/glibc/glibc-2.3.2/glibc-2.3.2-200304020432.patch +++ b/packages/glibc/glibc-2.3.2/glibc-2.3.2-200304020432.patch @@ -0,0 +1,136135 @@ +diff -u -udbrN glibc-2.3.2/ChangeLog glibc-2.3.2-200304020432/ChangeLog +--- glibc-2.3.2/ChangeLog Sat Mar 1 02:10:14 2003 ++++ glibc-2.3.2-200304020432/ChangeLog Wed Apr 2 06:00:15 2003 +@@ -1,3 +1,1581 @@ ++2003-04-01 Roland McGrath ++ ++ * scripts/abilist.awk: Allow dots in soname suffix. ++ ++ * scripts/abilist.awk (emit): Fix bailout condition. ++ ++2003-04-01 Jakub Jelinek ++ ++ * sysdeps/unix/sysv/linux/sparc/sparc64/sigsuspend.c: Use the ++ IA-64 version. ++ ++ * elf/tls-macros.h [__ia64__] (TLS_IE, TLS_LD, TLS_GD): Add gp ++ register as input to asm. ++ ++2003-04-01 Jakub Jelinek ++ ++ * sysdeps/unix/sysv/linux/ia64/bits/siginfo.h (sigevent_t): Fix a typo. ++ ++2003-04-01 Andreas Jaeger ++ ++ * configure.in: Output as/ld as name if version is too old. ++ ++2003-03-31 Daniel Jacobowitz ++ ++ * configure.in: Don't require an installed C library in the test ++ for ".set" assembler support. ++ ++2003-03-31 Roland McGrath ++ ++ * signal/tst-sigset.c: New file. ++ * signal/Makefile (tests): Add it. ++ ++2003-03-31 Ulrich Drepper ++ ++ * sysdeps/unix/sysv/linux/alpha/bits/signum.h (_NSIG): Define to 65. ++ * sysdeps/unix/sysv/linux/hppa/bits/signum.h (_NSIG): Likewise. ++ * sysdeps/unix/sysv/linux/sparc/bits/signum.h (_NSIG): Likewise. ++ * sysdeps/unix/sysv/linux/bits/signum.h (_NSIG): Likewise. ++ (__SIGRTMAX): Adjust accordingly. ++ * sysdeps/gnu/siglist.c: If OLD2_SIGLIST_SIZE is defined define ++ second compatibility symbol set. ++ * sysdeps/unix/sysv/linux/siglist.h (OLD2_SIGLIST_SIZE): Define. ++ ++2003-03-31 Andreas Schwab ++ ++ * sysdeps/m68k/m68020/bits/atomic.h (atomic_increment_and_test): ++ Define. ++ (atomic_decrement_and_test): Fix test. ++ ++2003-03-31 Jakub Jelinek ++ ++ * sysdeps/sparc/sparc32/bits/atomic.h: New file. ++ * sysdeps/sparc/sparc32/sparcv9/bits/atomic.h: New file. ++ * sysdeps/sparc/sparc64/bits/atomic.h: New file. ++ * sysdeps/sparc/sparc32/atomicity.h: Removed. ++ * sysdeps/sparc/sparc32/sparcv9/atomicity.h: Removed. ++ * sysdeps/sparc/sparc64/atomicity.h: Removed. ++ ++2003-03-30 Roland McGrath ++ ++ * scripts/abilist.awk: Grok .opd foo plus .text .foo as "foo F" alone. ++ ++ * intl/po2test.sed: Anchor substitution regexps to fix last change. ++ ++2003-03-29 Paolo Bonzini ++ ++ * intl/po2test.sed: Unify the transformations for msgid and msgstr ++ and remove a useless s/// command. ++ ++2003-03-27 David Mosberger ++ ++ * sysdeps/ia64/dl-machine.h (RTLD_START): Wrap ".save rp, r0" ++ directive into empty .prologue region to ensure that call-chain ++ is terminated even for the first instruction. ++ ++ * sysdeps/ia64/elf/start.S (_start): Use ".save rp, r0" idiom ++ to terminate call-chain right from the get-go. ++ ++ * sysdeps/unix/sysv/linux/ia64/fork.S (fork): Remove unnecessary ++ stop bit between compare & branch. ++ ++2003-03-29 Ulrich Drepper ++ ++ * stdlib/strtod.c (INTERNAL): Recognize first digit after decimal ++ point correctly [PR libc/4993]. ++ ++ * sysdeps/unix/sysv/linux/ifaddrs.c (getifaddrs): Avoid ++ netlink_open calls if netlink is known to not be available. ++ ++2003-03-29 Alexandre Oliva ++ ++ * configure.in: Add mips64* support. ++ * sysdeps/mips/bits/endian.h: Make it bi-endian. ++ * sysdeps/mips/mipsel/bits/endian.h: Removed. ++ * sysdeps/mips/mips64/n32/el/bits/endian.h: Removed. ++ * sysdeps/mips/mips64/n64/el/bits/endian.h: Removed. ++ * sysdeps/mips/mips32/Makefile (CC): Add -mabi=32. ++ * sysdeps/mips/mips64/n32/Makefile (CC): Add -mabi=n32. ++ * sysdeps/mips/mips64/n64/Makefile (CC): Add -mabi=64. ++ * sysdeps/mips/Implies: Moved wordsize-32 to... ++ * sysdeps/mips/mips32/Implies: New file. ++ * sysdeps/unix/mips/sysdep.h (PSEUDO_NOERRNO, PSEUDO_END_NOERRNO, ++ ret_NOERRNO): New. ++ (ret, PSEUDO_END): Moved past END. ++ (PSEUDO): Moved to... ++ * sysdeps/unix/mips/mips32/sysdep.h: New file. ++ * sysdeps/unix/mips/mips64/n32/sysdep.h: Removed #undef PSEUDO. ++ * sysdeps/unix/mips/mips64/n64/sysdep.h: Likewise. ++ * sysdeps/unix/sysv/linux/mips/sysdep.h: Move to... ++ * sysdeps/unix/sysv/linux/mips/mips32/sysdep.h: New file. ++ * sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h: New file. ++ ++ * sysdeps/unix/sysv/linux/mips/clone.S (__thread_start): ++ Re-introduce ENTRY. ++ ++2003-03-28 Thorsten Kukuk ++ ++ * sysdeps/unix/sysv/linux/ifaddrs.c: New file. ++ * inet/test-ifaddrs.c: Allow AF_PACKET. ++ * sysdeps/unix/sysv/linux/kernel-features.h: Add ++ __ASSUME_NETLINK_SUPPORT. ++ ++2003-03-28 Ulrich Drepper ++ ++ * elf/vismain.c (do_test): Comment out tests which fail in the moment. ++ ++2003-03-26 H.J. Lu ++ ++ * elf/vismod.h (getvarlocal1): Return const char **. ++ (getvarinmod1): Likewise. ++ (getvaritcpt1): Likewise. ++ (getvarlocal2): Likewise. ++ (getvarinmod2): Likewise. ++ (getvaritcpt2): Likewise. ++ (getvaritcpt3): Likewise. ++ * elf/vismain.c (do_test): Adjusted. ++ * elf/vismod1.c (getvarlocal1): Return address. ++ (getvarinmod1): Likewise. ++ (getvaritcpt1): Likewise. ++ * elf/vismod2.c (getvarlocal2): Likewise. ++ (getvarinmod2): Likewise. ++ (getvaritcpt2): Likewise. ++ * elf/vismod3.c (getvaritcpt3): Likewise. ++ ++2003-03-28 Roland McGrath ++ ++ * elf/vismain.c (do_test): Print both addresses when they don't match. ++ ++ * scripts/abilist.awk: If given -v filename_regexp and/or -v ++ libname_regexp when parsing names, then produce output only ++ for those matching the given regexps. In combine mode, save all ++ stanzas for a final sorting by stanza header at the end. ++ Emit a blank line between stanzas. ++ ++ * scripts/abilist.awk: When given -v combine=1, do parse_names and ++ emit a single output stream with lib name in stanza header lines. ++ ++ * scripts/abilist.awk: Emit A for all *ABS* regardless of type. ++ ++2003-03-27 Roland McGrath ++ ++ * sysdeps/powerpc/bits/atomic.h [! __powerpc64__] ++ (__arch_atomic_decrement_if_positive_64): Fix bogus definition. ++ ++2003-03-28 Kaz Kojima ++ ++ * sysdeps/sh/bits/atomic.h (__arch_compare_and_exchange_val_8_acq): ++ Return old value. Make asm output reg constraint earlyclobber. ++ Renamed from... ++ (__arch_compare_and_exchange_8_acq): ... this. ++ (__arch_compare_and_exchange_val_16_acq): ++ Return old value. Make asm output reg constraint earlyclobber. ++ Renamed from... ++ (__arch_compare_and_exchange_16_acq): ... this. ++ (__arch_compare_and_exchange_val_32_acq): ++ Return old value. Make asm output reg constraint earlyclobber. ++ Renamed from... ++ (__arch_compare_and_exchange_32_acq): ... this. ++ (__arch_compare_and_exchange_val_64_acq): ++ Renamed from... ++ (__arch_compare_and_exchange_64_acq): ... this. ++ (atomic_exchange_and_add): Use local variables and ++ __arch_compare_and_exchange_val_64_acq. ++ (atomic_add): Likewise. ++ (atomic_add_negative, atomic_add_zero): Use local variables. ++ ++2003-03-28 Alexandre Oliva ++ ++ * sysdeps/unix/mips/sysdep.S: Include sys/asm.h. ++ ++2003-03-27 Ulrich Drepper ++ ++ * Makefile: Remove libmd5crypt goal. ++ ++2003-03-25 Jakub Jelinek ++ ++ * sysdeps/powerpc/powerpc32/dl-machine.h (elf_machine_rela): Restore ++ special handling of relocations against local symbols. ++ ++2003-03-27 Steven Munroe ++ ++ * sysdeps/powerpc/bits/atomic.h ++ (__arch_compare_and_exchange_bool_32_acq): Move to [!__powerpc64__]. ++ [__powerpc64__] (__arch_compare_and_exchange_bool_32_acq): ++ Define PPC64 specific version. ++ [__powerpc64__] (__arch_compare_and_exchange_bool_64_acq): ++ Change (mem) constraint to "b". ++ [__powerpc64__] (__arch_atomic_exchange_and add_64): ++ Replace addi with add. Change (value) contraint to "r". ++ Change (mem) constraint to "b". ++ [__powerpc64__] (__arch_atomic_decrement_if_positive_64): New macro. ++ (__arch_atomic_exchange_32): Change (mem) constraint to "b". ++ (__arch_atomic_exchange_and_add_32): Change (mem) constraint to "b". ++ (__arch_atomic_decrement_if_positive_32): New macro. ++ (atomic_decrement_if_positive): Use __arch* macros. ++ ++2003-03-27 Jakub Jelinek ++ ++ * sysdeps/ia64/fpu/libm-test-ulps: Update. ++ ++2003-03-27 Roland McGrath ++ ++ * scripts/rpm2dynsym.sh: New file. ++ * Makefile (distribute): Add it. ++ ++2003-03-27 David Mosberger ++ ++ * sysdeps/unix/sysv/linux/ia64/getcontext.S: Restore caller's ++ ar.unat before returning. Add missing .mem.offset directives ++ to ensure file gets assembled without warnings. ++ * sysdeps/unix/sysv/linux/ia64/setjmp.S: Likewise. ++ ++2003-03-27 Jakub Jelinek ++ ++ * sysdeps/unix/sysv/linux/sysconf.c (__sysconf) <_SC_MONOTONIC_CLOCK>: ++ Return -1 instead of 0 if clock_getres failed. ++ ++2003-03-27 Roland McGrath ++ ++ * scripts/abilist.awk: If variable `parse_names' is set, grok the file ++ header lines and write out foo.symlist files for each foo.so.NN listed. ++ ++ * libio/libioP.h (_IO_wfile_jumps): Remove attribute_hidden. ++ This symbol is exported, and we don't want to hide it. ++ Add libc_hidden_proto instead. ++ (_IO_file_jumps): Add libc_hidden_proto. ++ * libio/wfileops.c (_IO_wfile_jumps): Add libc_hidden_data_def. ++ Remove INTVARDEF. ++ * libio/fileops.c (_IO_file_jumps): Likewise. ++ * libio/stdfiles.c: Don't use INTUSE on them. ++ * libio/iofdopen.c (_IO_new_fdopen): Likewise. ++ * libio/iofopen.c (__fopen_internal): Likewise. ++ * libio/freopen.c (freopen): Likewise. ++ * libio/freopen64.c (freopen64): Likewise. ++ * libio/iovdprintf.c (_IO_vdprintf): Likewise. ++ ++ * Makerules (check-abi) [$(enable-check-abi) = warn]: ++ Ignore exit status from diff. ++ * configure.in (enable_check_abi): Document possible value "warn". ++ Change default to no for now. ++ * configure: Regenerated. ++ ++ * sysdeps/unix/Makefile ($(objpfx)stub-syscalls.c): Emit stub_warning ++ macro calls and a #include at the end. ++ * Makerules ($(objpfx)stubs): Tweak sed commands. ++ ++ * sysdeps/unix/sysv/linux/syscalls.list: Use - rather than EXTRA in ++ caller column for *xattr syscalls, since they are in sysdeps/generic. ++ ++ * sysdeps/unix/sysv/linux/i386/setfsuid.c: setfsgid -> setfsuid ++ * sysdeps/unix/sysv/linux/i386/setfsgid.c: setfsuid -> setfsgid ++ ++2003-03-26 Roland McGrath ++ ++ * Makerules (check-abi-config): Use /thread instead of /tls when ++ use-thread and not just use-tls is set. ++ ++ * Makerules (update-abi): Put quotes around $(update-abi-config). ++ ++ * elf/Makefile (check-abi): Depend on check-abi-ld. ++ (update-abi): Depend on update-abi-ld. ++ ++2003-03-26 GOTO Masanori ++ ++ * sysdeps/unix/sysv/linux/i386/setfsuid.c: Use INTERNAL_SYSCALL and ++ do not check for errors (unless testing for 32bit variant). ++ * sysdeps/unix/sysv/linux/i386/setfsgid.c: Likewise. ++ ++2003-03-27 Philip Blundell ++ ++ * sysdeps/unix/sysv/linux/arm/sysdep.h (PSEUDO_RET_NOERRNO): Use ++ unconditional mov. Remove nop. ++ ++ * sysdeps/unix/sysv/linux/kernel-features.h ++ (__ASSUME_VFORK_SYSCALL): Define for kernel 2.4 on arm. ++ * sysdeps/unix/sysv/linux/arm/vfork.S: Elide compatibility code ++ when __ASSUME_VFORK_SYSCALL is defined. ++ * sysdeps/unix/sysv/linux/arm/mmap64.S: Likewise for ++ __ASSUME_MMAP2_SYSCALL. ++ * sysdeps/unix/sysv/linux/arm/sigaction.c: Likewise for ++ __ASSUME_REALTIME_SIGNALS. ++ ++2003-03-26 Ulrich Drepper ++ ++ * sysdeps/generic/ldsodefs.h (ELF_RTYPE_CLASS_COPY): Define to 2 ++ only if DL_NO_COPY_RELOCS is not defined. ++ * sysdeps/ia64/dl-lookupcfg.h: Define DL_NO_COPY_RELOCS. ++ ++2003-03-26 Roland McGrath ++ ++ * sysdeps/unix/make-syscalls.sh: When an undefined syscall has ++ SOURCE=-, append its symbol names to make variable unix-stub-syscalls. ++ * sysdeps/unix/Makefile [$(subdir) = misc] [unix-stub-syscalls] ++ (sysdep_routines): Add stub-syscalls. ++ ($(objpfx)stub-syscalls.c): New target. ++ (generated): Add stub-syscalls.c. ++ ++ * tls.make.c: Also define use-tls according to USE_TLS macro. ++ ++2003-03-26 Ulrich Drepper ++ ++ * sysdeps/unix/sysv/linux/alpha/bits/siginfo.h (struct siginfo): Avoid ++ no-op padding element. ++ * sysdeps/unix/sysv/linux/bits/siginfo.h: Likewise. ++ * sysdeps/unix/sysv/linux/ia64/bits/siginfo.h: Likewise. ++ * sysdeps/unix/sysv/linux/s390/bits/siginfo.h: Likewise. ++ * sysdeps/unix/sysv/linux/sparc/bits/siginfo.h: Likewise. ++ ++2003-03-26 GOTO Masanori ++ ++ * sysdeps/unix/sysv/linux/i386/getgroups.c: Fix the error ++ condition check for the return value of getgroups32. ++ ++2003-03-26 Jakub Jelinek ++ ++ * sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h (PSEUDO_NOERRNO): ++ Fix a typo. ++ * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h (PSEUDO_NOERRNO, ++ PSEUDO_END_NOERRNO): Define. ++ * sysdeps/unix/sysdep.h (PSEUDO_END_NOERRNO): Fix a typo. ++ Define to PSEUDO_END. ++ ++2003-03-26 Ulrich Drepper ++ ++ * abilist/librt.abilist: Add new timer interfaces for 64-bit archs. ++ ++2003-03-25 Jiro SEKIBA ++ ++ * iconvdata/euc-tw.c (from_euc_tw): Fix return value of TO_LOOP. ++ * iconvdata/bug-iconv4.c: New file. ++ * iconvdata/Makefile (tests): Add bug-iconv4. ++ ++2003-03-25 H.J. Lu ++ ++ * elf/dl-lookup.c (_dl_lookup_symbol): Avoid looking up protected ++ symbols twice. ++ (_dl_lookup_versioned_symbol): Likewise. ++ ++2003-03-26 Jakub Jelinek ++ ++ * csu/tst-atomic.c (do_test): Add some new ++ atomic_compare_and_exchange_val_acq, atomic_add_zero, ++ atomic_compare_and_exchange_bool_acq and atomic_add_negative tests. ++ * include/atomic.h (atomic_add_negative, atomic_add_zero): ++ Prefix local variable so that it doesn't clash with the one ++ in atomic_exchange_and_add. ++ * sysdeps/ia64/bits/atomic.h (atomic_exchange): Fix for long/void * ++ pointers. ++ (atomic_exchange_and_add): Implement using __sync_fetch_and_add_?i. ++ * sysdeps/powerpc/bits/atomic.h (atomic_exchange_and_add): Force ++ value into register. ++ * sysdeps/s390/bits/atomic.h (__arch_compare_and_exchange_val_64_acq): ++ Cast newval to long. ++ * sysdeps/x86_64/bits/atomic.h ++ (__arch_compare_and_exchange_val_64_acq): Cast newval and oldval to ++ long. ++ (atomic_exchange): Cast newvalue to long if sizeof == 8. ++ (atomic_exchange_and_add): Cast value to long if sizeof == 8. ++ (atomic_add, atomic_add_negative, atomic_add_zero): Likewise. ++ (atomic_bit_set): Shift 1L up in all cases to shut up warnings. ++ ++2003-03-21 Martin Schwidefsky ++ ++ * sysdeps/s390/s390-32/backtrace.c (__backtrace): Remove high order ++ bit from backtrace addresses. ++ ++2003-03-21 Andreas Schwab ++ ++ * sysdeps/unix/sysv/linux/i386/chown.c: Don't define any versioned ++ __chown symbols. ++ ++2003-03-25 Roland McGrath ++ ++ * config.make.in (enable-check-abi): New variable from configure. ++ * configure.in (enable_check_abi): New substituted variable, ++ controlled by --{enable,disable}-check-abi (default yes). ++ * configure: Regenerated. ++ * Makerules [$(enable-check-abi) = yes] (tests): Put this condition ++ on check-abi dependency. ++ ++2003-03-26 Andreas Schwab ++ ++ * sysdeps/m68k/m68020/bits/atomic.h: Fix typos. ++ * include/atomic.h: Likewise. ++ ++ * sysdeps/unix/sysv/linux/m68k/sysdep.h: Define ret_NOERRNO. ++ ++2003-03-25 Roland McGrath ++ ++ * sysdeps/powerpc/bits/atomic.h (__arch_atomic_exchange_32): New macro. ++ (__arch_atomic_exchange_64): New macro. ++ (atomic_exchange): Use them. ++ (__arch_atomic_exchange_and_add_32): New macro. ++ (__arch_atomic_exchange_and_add_64): New macro. ++ (atomic_exchange_and_add): Use them. ++ Original patch from Steven Munroe . ++ ++2003-03-25 Alexandre Oliva ++ ++ * sysdeps/mips/sgidefs.h (_MIPS_ISA_MIPS32, _MIPS_ISA_MIPS64): ++ Define. ++ * sysdeps/mips/sys/asm.h: Test _MIPS_ISA against them on all ++ ISA tests. ++ (ALSZ, ALMASK, SZREG, REG_S, REG_L): Define based on ABI, not ISA. ++ (PTR_ADD, etc): Test _MIPS_SZPTR instead of _MIPS_SZLONG. ++ * sysdeps/unix/sysv/linux/mips/bits/sigaction.h: Use _MIPS_SZPTR ++ to decide whether to add padding. ++ * sysdeps/unix/sysv/linux/mips/bits/sigaction.h: Use _MIPS_SZPTR ++ to decide whether to add padding. ++ * sysdeps/unix/sysv/linux/mips/kernel_sigaction.h (struct ++ old_kernel_sigaction): Likewise. ++ ++2003-03-25 Ulrich Drepper ++ ++ * csu/tst-atomic.c: Adjust tests to what atomic_add_negative and ++ atomic_add_zero were supposed to do. ++ * include/atomic.h: Adjust atomic_add_negative and atomic_add_zero ++ to x86 behavior. ++ ++ * sysdeps/generic/bits/typesizes.h (__TIMER_T_TYPE): Define as void*. ++ This matches the new timer implementation. ++ * sysdeps/unix/sysv/linux/sparc/bits/typesizes.h (__TIMER_T_TYPE): ++ Likewise. ++ * sysdeps/unix/sysv/linux/alpha/bits/typesizes.h (__TIMER_T_TYPE): ++ Likewise. ++ * sysdeps/unix/sysv/linux/bits/siginfo.h (struct siginfo): Adjust ++ timer info for what the kernel provides these days. ++ (struct sigevent): Add _tid field. ++ Define SIGEV_THREAD_ID. ++ Remove struct __pthread_attr_s forward declaration. ++ * sysdeps/unix/sysv/linux/alpha/bits/siginfo.h: Likewise. ++ * sysdeps/unix/sysv/linux/ia64/bits/siginfo.h: Likewise. ++ * sysdeps/unix/sysv/linux/s390/bits/siginfo.h: Likewise. ++ * sysdeps/unix/sysv/linux/sparc/bits/siginfo.h: Likewise. ++ ++ * Versions.def (librt): Add GLIBC_2.3.3. ++ ++ * abilist/libpthread.abilist: Update for nptl. ++ ++2003-03-24 Jon Grimm ++ ++ * inet/netinet/in.h: Add IPPROTO_SCTP. ++ ++2003-03-24 Ulrich Drepper ++ ++ * sysdeps/unix/sysv/linux/sys/epoll.h (EPOLLET): Define. ++ ++2003-03-24 Philip Blundell ++ ++ * sysdeps/unix/sysv/linux/arm/sysdep.h (INTERNAL_SYSCALL): ++ Remove a1 from clobber list. ++ ++2003-03-24 Ulrich Drepper ++ ++ * timezone/antarctica: Update from tzdata2003a. ++ * timezone/asia: Likewise. ++ * timezone/australasia: Likewise. ++ * timezone/europe: Likewise. ++ * timezone/iso3166.tab: Likewise. ++ * timezone/northamerica: Likewise. ++ * timezone/southamerica: Likewise. ++ * timezone/zone.tab: Likewise. ++ ++2003-03-24 Steven Munroe ++ ++ * sysdeps/powerpc/powerpc64/sysdep.h (PSEUDO_END_NOERRNO): Fix typo. ++ ++2003-03-23 Ulrich Drepper ++ ++ * sysdeps/unix/sysv/linux/ia64/sysdep.h (ret_NOERRNO): Avoid ++ unwanted expansion by definining to ret. Patch by Ian Wienand. ++ ++ * sysdeps/unix/make-syscalls.sh: Recognize 'E' in first position of ++ the parameter description to denote no error checking. Generate ++ appropriate pseudo asm code. ++ * sysdeps/unix/syscalls.list: Mark getgid, getpid, getuid with 'E'. ++ * sysdeps/unix/sysv/linux/syscalls.list: Mark getegid, geteuid, ++ getpgrp, and getppid with 'E'. ++ * sysdeps/powerpc/powerpc32/sysdep.h: Define PSEUDO_NOERRNO, ++ PSEUDO_END_NOERRNO, and ret_NOERRNO. ++ * sysdeps/powerpc/powerpc64/sysdep.h: Likewise. ++ * sysdeps/unix/sysdep.h: Likewise. ++ * sysdeps/unix/alpha/sysdep.h: Likewise. ++ * sysdeps/unix/sparc/sysdep.h: Likewise. ++ * sysdeps/unix/sysv/linux/arm/sysdep.h: Likewise. ++ * sysdeps/unix/sysv/linux/cris/sysdep.h: Likewise. ++ * sysdeps/unix/sysv/linux/hppa/sysdep.h: Likewise. ++ * sysdeps/unix/sysv/linux/i386/sysdep.h: Likewise. ++ * sysdeps/unix/sysv/linux/ia64/sysdep.h: Likewise. ++ * sysdeps/unix/sysv/linux/m68k/sysdep.h: Likewise. ++ * sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h: Likewise. ++ * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h: Likewise. ++ * sysdeps/unix/sysv/linux/sh/sysdep.h: Likewise. ++ * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h: Likewise. ++ * sysdeps/unix/sysv/linux/x86_64/sysdep.h: Likewise. ++ ++2003-03-23 Roland McGrath ++ ++ * Makeconfig (+includes): Don't use $(last-includes). ++ ++2003-03-22 Alexandre Oliva ++ ++ * sysdeps/unix/sysv/linux/configure.in: Update mips64 patterns. ++ * sysdeps/unix/sysv/linux/configure: Rebuilt. ++ ++2003-03-23 Jakub Jelinek ++ ++ * sysdeps/alpha/fpu/libm-test-ulps: Update. ++ * sysdeps/arm/libm-test-ulps: Update. ++ * sysdeps/hppa/fpu/libm-test-ulps: Update. ++ * sysdeps/ia64/fpu/libm-test-ulps: Update. ++ * sysdeps/mips/fpu/libm-test-ulps: Update. ++ * sysdeps/powerpc/nofpu/libm-test-ulps: Update. ++ * sysdeps/powerpc/fpu/libm-test-ulps: Update. ++ * sysdeps/sparc/sparc32/fpu/libm-test-ulps: Update. ++ * sysdeps/sparc/sparc64/fpu/libm-test-ulps: Update. ++ * sysdeps/sh/sh4/fpu/libm-test-ulps: Update. ++ * sysdeps/s390/fpu/libm-test-ulps: Update. ++ * sysdeps/x86_64/fpu/libm-test-ulps: Update. ++ ++2003-03-22 Roland McGrath ++ ++ * include/atomic.h: Put parens around all macro arguments. ++ (__atomic_val_bysize, __atomic_bool_bysize): New macros. ++ (atomic_compare_and_exchange_val_acq): Use it. ++ (atomic_compare_and_exchange_bool_acq): Likewise. ++ (atomic_increment_and_test): Invert sense of test. ++ (atomic_decrement_and_test): Likewise. ++ * csu/tst-atomic.c: Update those tests to match. ++ ++2003-03-22 Jakub Jelinek ++ ++ * include/atomic.h (atomic_compare_and_exchange_val_acq): Add comment. ++ Don't define if __arch_compare_and_exchange_val_32_acq is not defined. ++ (atomic_compare_and_exchange_bool_acq): Add comment. Don't use ++ __oldval variable in the macro, since it might be macro argument. ++ (atomic_decrement_if_positive): Initialize __memp, remove setting ++ of non-existent variable. ++ (atomic_bit_test_set): Cast 1 to __typeof (*mem) before shifting. ++ * sysdeps/ia64/bits/atomic.h (atomic_exchange_and_add): Implement ++ using atomic_compare_and_exchange_val_acq. ++ (atomic_decrement_if_positive, atomic_bit_test_set): Define. ++ * sysdeps/s390/bits/atomic.h (__arch_compare_and_exchange_val_8_acq): ++ Renamed from... ++ (__arch_compare_and_exchange_bool_8_acq): ... this. ++ (__arch_compare_and_exchange_val_16_acq): Renamed from... ++ (__arch_compare_and_exchange_bool_16_acq): ... this. ++ (__arch_compare_and_exchange_val_32_acq): Return old value. Renamed ++ from... ++ (__arch_compare_and_exchange_bool_32_acq): ... this. ++ (__arch_compare_and_exchange_val_64_acq): Return old value. Renamed ++ from... ++ (__arch_compare_and_exchange_bool_64_acq): ... this. ++ (__arch_compare_and_exchange_val_32_acq): Use __typeof for local ++ variables types instead of assuming int. ++ Change prefix of local variables to __arch. ++ * sysdeps/generic/bits/atomic.h (arch_compare_and_exchange_acq): ++ Remove. ++ (atomic_compare_and_exchange_val_acq, ++ atomic_compare_and_exchange_bool_acq): Define. ++ ++ * csu/tst-atomic.c: New test. ++ * csu/tst-atomic-long.c: New test. ++ * csu/Makefile (tests): Add tst-atomic and tst-atomic-long. ++ ++ * malloc/memusagestat.c (main): Kill warning if uint64_t is ulong. ++ ++ * sysdeps/s390/Versions: Add trailing newline. ++ ++ * sysdeps/unix/sysv/linux/sysconf.c (__sysconf): Kill warning ++ if INTERNAL_SYSCALL_ERROR_P doesn't use its first argument. ++ ++2003-03-22 Andreas Schwab ++ ++ * sysdeps/m68k/fpu/libm-test-ulps: Update. ++ ++ * sysdeps/m68k/m68020/bits/atomic.h: New file. ++ * sysdeps/m68k/m68020/atomicity.h: Removed. ++ ++2003-03-22 Alexandre Oliva ++ ++ * sysdeps/mips/elf/ldsodefs.h: Add mips-specific elf64 relocation ++ data structures and macros. Protect from multiple inclusion. ++ ++ * sysdeps/mips/dl-machine.h (ELF_MIPS_GNU_GOT1_MASK): Fix harmless ++ typo in #if test. ++ ++2003-03-21 Andreas Jaeger ++ ++ * sysdeps/i386/fpu/libm-test-ulps: Update. ++ ++ * math/libm-test.inc (tgamma_test): Recompute some constants with ++ 36 digits precision. ++ (lgamma_test): Likewise. ++ (ccos_test): Likewise. ++ (ccosh_test): Likewise. ++ (clog10_test): Likewise. ++ (csin_test): Likewise. ++ (csinh_test): Likewise. ++ (ctan_test): Likewise. ++ (ctanh_test): Likewise. ++ ++2003-03-19 Jakub Jelinek ++ ++ * sysdeps/sparc/sparc64/fpu/libm-test-ulps: Regenerated. ++ ++2003-03-21 Roland McGrath ++ ++ * sysdeps/i386/i486/bits/atomic.h (atomic_bit_set): Use "ir" ++ constraint to permit non-constant BIT argument. ++ (atomic_bit_test_set): Likewise. ++ * sysdeps/x86_64/bits/atomic.h (atomic_bit_test_set): Likewise. ++ (atomic_bit_set): Likewise. Use 1UL in case that BIT might be >= 32. ++ For quadword case, use "i" constraint if __builtin_constant_p and < 32 ++ or "r" constraint otherwise. ++ ++ * configure.in: Move AC_PROG_CC and other program-finding before all ++ the version checks. ++ * configure: Regenerated. ++ ++2003-03-21 Alexandre Oliva ++ ++ * sysdeps/mips/mips64/memcpy.S: Fix porting bug that broke ++ unaligned copying of 8-15 bytes. From Chris Demetriou ++ . Fix label names. ++ * sysdeps/mips/mips64/memset.S: Fix label names. Make similar ++ change as to memcpy.S. ++ * sysdeps/mips/memcpy.S: Formatting changes. ++ * sysdeps/mips/memset.S: Likewise. ++ ++2003-03-21 Roland McGrath ++ ++ * sysdeps/arm/sysdep.h (CALL_MCOUNT): Add trailing semicolon. ++ ++2003-03-21 Alexandre Oliva ++ ++ * sysdeps/mips/mips64/memcpy.S, sysdeps/mips/mips64/memset.S: New. ++ * sysdeps/mips/memcpy.S, sysdeps/mips/memset.S: Update comments. ++ ++2003-03-21 Roland McGrath ++ ++ * sysdeps/i386/i486/bits/atomic.h ++ (__arch_compare_and_exchange_val_64_acq): Rewrite abort-calling ++ version of the macro to avoid compile-time warnings. ++ [! __PIC__] (__arch_compare_and_exchange_64_acq): Rename to above. ++ (atomic_exchange_and_add, atomic_add): Fix name and usage of it. ++ (atomic_increment, atomic_decrement): Likewise. ++ ++2003-03-21 Ulrich Drepper ++ ++ * sysdeps/x86_64/bits/atomic.h: Don't use matching memory constraints. ++ * sysdeps/i386/i486/bits/atomic.h: Likewise. ++ ++2003-03-21 Roland McGrath ++ ++ * include/atomic.h (atomic_compare_and_exchange_bool_acq): Typo fix. ++ ++2003-03-20 Ulrich Drepper ++ ++ * include/atomic.h: Define atomic_compare_and_exchange_val_acq, ++ atomic_compare_and_exchange_val_rel, ++ atomic_compare_and_exchange_bool_acq, and ++ atomic_compare_and_exchange_bool_rel instead of ++ atomic_compare_and_exchange_acq and atomic_compare_and_exchange_rel. ++ * sysdeps/i386/i486/bits/atomic.h: Define ++ __arch_compare_and_exchange_val_*_acq instead of ++ __arch_compare_and_exchange_*_acq. ++ * sysdeps/x86_64/bits/atomic.h: Likewise. ++ * sysdeps/ia64/bits/atomic.h: Define ++ __arch_compare_and_exchange_bool_*_acq instead of ++ __arch_compare_and_exchange_*_acq. ++ * sysdeps/powerpc/bits/atomic.h: Likewise. ++ * sysdeps/s390/bits/atomic.h: Likewise. ++ * gmon/mcount.c: Adjust for new form of compare&exchange macros. ++ * malloc/set-freeres.c: Likewise. ++ * nscd/cache.c: Likewise. ++ * stdlib/cxa_finalize.c: Likewise. ++ * sysdeps/unix/sysv/linux/getsysstats.c: Likewise. ++ ++2003-03-20 Alexandre Oliva ++ ++ * sysdeps/mips/bits/setjmp.h: n32 has only 6 call-saved fpregs. ++ * sysdeps/mips/mips64/setjmp_aux.c (__sigsetjmp_aux): Adjust. ++ * sysdeps/mips/mips64/__longjmp.c (__longjmp): Likewise. ++ ++ * sysdeps/unix/sysv/linux/mips/pread.c: Don't break up offset ++ into high and low halves on n64. ++ * sysdeps/unix/sysv/linux/mips/pread64.c: Likewise. ++ * sysdeps/unix/sysv/linux/mips/pwrite.c: Likewise. ++ * sysdeps/unix/sysv/linux/mips/pwrite64.c: Likewise. ++ ++2003-03-20 Ulrich Drepper ++ ++ * include/atomic.h (atomic_decrement_if_positive): Adjust for the ++ correct atomic_compare_and_exchange_acq semantics. ++ ++2003-03-20 Alexandre Oliva ++ ++ * sysdeps/mips/ieee754.h: Remove excess #endif. ++ ++2003-03-20 Roland McGrath ++ ++ * sysdeps/powerpc/bits/atomic.h (atomic_exchange): Remove unused ++ variable. Remove superfluous memory clobber. ++ ++ * include/atomic.h: Syntax braino fix. ++ ++ * posix/tst-nice.c (do_test): Use %m formats instead of printing errno ++ in decimal. Don't bail if niced at start. Just check that nice call ++ bumps the total at all. ++ ++2003-03-20 Alexandre Oliva ++ ++ * sysdeps/mips/bits/setjmp.h: Store all N32 and N64 registers, ++ including pc, gp, sp and fp, as long long. ++ * sysdeps/mips/mips64/setjmp.S: Pass gp to __sigsetjmp_aux. ++ * sysdeps/mips/mips64/setjmp_aux.c: Adjust type of arguments. ++ Add gp argument, and set gp in the jmpbuf to it. ++ * sysdeps/mips/setjmp_aux.c: Revert to o32-only. ++ ++2003-03-20 Ulrich Drepper ++ ++ * include/atomic.h: Define atomic_exchange and ++ atomic_decrement_if_positive if not already defined. Add some ++ __builtin_expect. ++ * sysdeps/i386/i486/bits/atomic.h: Define atomic_exchange. ++ * sysdeps/x86_64/bits/atomic.h: Likewise. ++ * sysdeps/ia64/bits/atomic.h: Pretty printing. Define atomic_exchange. ++ * sysdeps/powerpc/bits/atomic.h: Pretty printing. Define ++ atomic_exchange, atomic_exchange_and_add, and ++ atomic_decrement_if_positive ++ ++2003-03-20 Alexandre Oliva ++ ++ * sysdeps/unix/sysv/linux/mips/mips64/n64/ioctl.S: Sign-extend ++ with a single instruction. ++ ++ * sysdeps/mips/dl-machine.h (ELF_MIPS_GNU_GOT1_MASK): Define ++ properly for n64. ++ (elf_machine_runtime_setup): Cast link_map pointer to Elf Addr ++ type. ++ (elf_machine_rel, elf_machine_rel_relative): Cast symidx to Elf ++ Word before comparing with gotsym. Take reloc_addr argument as ++ void*. Remove the code added for the compiler to drop any ++ alignment assumptions. ++ ++2003-03-19 Ulrich Drepper ++ ++ * Makefile (distribute): Add include/atomic.h and bits/atomic.h. ++ * include/atomic.h: New file. ++ * sysdeps/i386/i486/bits/atomic.h: New file. ++ * sysdeps/x86_64/bits/atomic.h: New file. ++ * sysdeps/s390/bits/atomic.h: New file. ++ * sysdeps/sh/bits/atomic.h: New file. ++ * sysdeps/ia64/bits/atomic.h: New file. ++ * sysdeps/powerpc/bits/atomic.h: New file. ++ * sysdeps/generic/bits/atomic.h: New file. ++ * sysdeps/i386/i486/atomicity.h: Removed. ++ * sysdeps/x86_64/atomicity.h: Removed. ++ * sysdeps/s390/s390-32/atomicity.h: Removed. ++ * sysdeps/s390/s390-64/atomicity.h: Removed. ++ * sysdeps/ia64/atomicity.h: Removed. ++ * sysdeps/powerpc/powerpc32/atomicity.h: Removed. ++ * sysdeps/powerpc/powerpc64/atomicity.h: Removed. ++ * elf/dl-profile.c: Use atomic.h instead of atomicity.h. Adjust ++ use of macros from atomicity.h to new names and semantics. ++ * gmon_mcount.c: Likewise. ++ * malloc/set-freeres.c: Likewise. ++ * nscd/cache.c: Likewise. ++ * stdlib/cxa_finalize.c: Likewise. ++ * sysdeps/unix/sysv/linux/getsysstats.c: Likewise. ++ ++2003-03-19 Alexandre Oliva ++ ++ * sysdeps/mips/ieee754.h: New file, suitable to replace both ++ ../ieee754/ieee754.h and ../ieee754/ldbl-128/ieee754.h, kept ++ mips-specific for now. ++ ++2003-03-19 Ulrich Drepper ++ ++ * stdlib/strtod.c (INTERNAL): While eating trailing zeros handle ++ hexdigits correctly. Reported by Fred Tydeman . ++ * stdlib/tst-strtod.c: Add test for the bug. ++ ++ * posix/tst-nice.c (do_test): Remove invalid of return value. ++ Don't run test if initial level != 0. ++ ++2003-03-19 Amos Waterland ++ ++ * posix/tst-nice.c: New file. ++ * posix/Makefile (tests): Add tst-nice. ++ ++2003-03-18 Roland McGrath ++ ++ * abilist: New directory of libfoo.abilist files maintained using ++ scripts/merge-abilist.awk and "make update-abi" rules. ++ * Makefile (distribute): Add abilist/*.abilist. ++ * Makerules [$(build-shared) = yes] [$(subdir)] (tests): ++ Depend on check-abi. ++ ++ * configure.in: Move $critic_missing check after all AC_CHECK_PROG_VER. ++ * configure: Regenerated. ++ ++ * sysdeps/unix/sysv/linux/syscalls.list (posix_fadvise64): Fix name. ++ ++2003-03-18 Ulrich Drepper ++ ++ * sysdeps/posix/sysconf.c (__sysconf): Handle _SC_MONOTONIC_CLOCK ++ correctly. ++ ++2003-03-18 Steven Munroe ++ ++ * sysdeps/powerpc/powerpc64/memcpy.S: New file. ++ ++2003-03-18 Ulrich Drepper ++ ++ * Versions.def: Add GLIBC_2.3.3 for libpthread. ++ ++2003-03-17 Ulrich Drepper ++ ++ * sysdeps/generic/libc-start.c [!SHARED && ++ !LIBC_START_MAIN_AUXVEC_ARG]: Compute beginning of auxvec correctly. ++ ++2003-03-17 Roland McGrath ++ ++ * include/ctype.h: Revert last change. ++ ++2003-03-17 Ulrich Drepper ++ ++ * argp/tst-argp1.c: Use test-skeleton.c. ++ * locale/tst-C-locale.c: Likewise. ++ ++2003-03-17 Alexandre Oliva ++ ++ * sysdeps/mips/mips64/Implies: Move wordsize-64 to... ++ * sysdeps/mips/mips64/n64/Implies: New file. ++ * sysdeps/mips/mips64/n64/Makefile: New file. ++ * sysdeps/mips/mips64/n64/el/bits/endian.h: New file. ++ * sysdeps/mips/mips64/n32/Implies: New file. ++ * sysdeps/mips/mips64/n32/Makefile: New file. ++ * sysdeps/mips/mips64/n32/el/bits/endian.h: New file. ++ * sysdeps/unix/mips/mips64/n32/sysdep.h: New file. ++ * sysdeps/unix/mips/mips64/n64/sysdep.h: New file. ++ * sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h: New file. ++ * sysdeps/unix/sysv/linux/mips/mips64/n64/glob64.c: New file. ++ * sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h: New file. ++ * sysdeps/unix/sysv/linux/mips/mips64/ldconfig.h: New file. ++ * sysdeps/unix/sysv/linux/mips/mips64/llseek.c: New file. ++ * sysdeps/unix/sysv/linux/mips/mips64/recv.c: New file. ++ * sysdeps/unix/sysv/linux/mips/mips64/send.c: New file. ++ * sysdeps/unix/sysv/linux/mips/mips64/syscall.S: New file. ++ * sysdeps/unix/sysv/linux/mips/mips64/syscalls.list: New file. ++ * sysdeps/unix/sysv/linux/mips/mips64/umount.c: New file. ++ * sysdeps/unix/sysv/linux/mips/mips64/n64/ioctl.S: New file. ++ ++ * sysdeps/unix/sysv/linux/configure.in (libc_cv_slibdir): Use ++ lib64 for mips64/n64 and lib32 for mips64/n32. ++ (ldd_rewrite_script): Needed for all mips64 configurations. ++ * sysdeps/unix/sysv/linux/configure: Rebuilt. ++ * sysdeps/unix/sysv/linux/mips/mips64/ldd-rewrite.sed: New file. ++ * sysdeps/unix/sysv/linux/mips/mips64/Dist: New file. ++ ++ * sysdeps/mips/machine-gmon.h (MCOUNT): Define for N32 and N64 as ++ well. ++ ++ * sysdeps/unix/sysv/linux/mips/configure.in: New. Pre-process ++ asm/unistd.h into asm-unistd.h. ++ * sysdeps/unix/sysv/linux/mips/configure: Generated. ++ * sysdeps/unix/sysv/linux/mips/Makefile: Do custom processing ++ of syscall list. ++ * sysdeps/unix/sysv/linux/mips/sys/syscall.h: New file. ++ * sysdeps/unix/sysv/linux/mips/clone.S: Don't include ++ asm/unistd.h. ++ ++ * sysdeps/unix/sysv/linux/mips/sys/ptrace.h: New file. ++ * sysdeps/unix/sysv/linux/mips/ptrace.c: New file. Use long ++ long type for registers on n32. ++ ++ * sysdeps/mips/bits/wordsize.h: New file, appropriate for all ++ 3 ABIs. ++ * sysdeps/mips/mips64/gmp-mparam.h: New file. Define ++ BITS_PER_LONGINT to __WORDSIZE, to match all 3 ABIs. ++ * sysdeps/mips/setjmp_aux.c (STRINGXP, REGS, PTRS): New macros. ++ (__sigsetjmp_aux): Use them. Adjust for all 3 ABIs. ++ * sysdeps/mips/elf/start.S: Adjust for all 3 ABIs. ++ * sysdeps/unix/mips/brk.S: Likewise. ++ * sysdeps/unix/mips/sysdep.S: Likewise. ++ * sysdeps/unix/sysv/linux/mips/clone.S: Likewise. ++ * sysdeps/mips/bits/setjmp.h (__jmp_buf): Likewise. ++ * sysdeps/mips/sys/ucontext.h: Likewise. ++ * sysdeps/unix/sysv/linux/mips/sys/profcs.h: Likewise. ++ * sysdeps/unix/sysv/linux/mips/sys/ucontext.h: Likewise. ++ * sysdeps/unix/sysv/linux/mips/kernel_stat.h: Likewise. ++ * sysdeps/mips/mips64/bsd-_setjmp.S: Likewise. ++ * sysdeps/mips/mips64/bsd-setjmp.S: Likewise. ++ * sysdeps/mips/mips64/setjmp.S: Likewise. ++ * sysdeps/mips/mips64/bits/setjmp.h: Deleted, obsolete. ++ * sysdeps/mips/mips64/soft-fp/sfp-machine.h: Use long long for ++ 64-bit types. ++ ++2003-03-16 Ulrich Drepper ++ ++ * sysdeps/unix/clock_settime.c (HANDLE_REALTIME): Define tv here, ++ not at function level. ++ * sysdeps/unix/clock_gettime.c (HANDLE_REALTIME): Likewise. ++ ++2003-03-15 Roland McGrath ++ ++ * nis/nss_nis/nis-hosts.c (internal_gethostbyname2_r): int -> size_t ++ * nis/nss_nis/nis-network.c (_nss_nis_getnetbyname_r): Likewise. ++ * nis/nss_nis/nis-alias.c (_nss_nis_getaliasbyname_r): Likewise. ++ * nis/nis_table.c (__create_ib_request): Likewise. ++ ++ * posix/fnmatch_loop.c: Add casts for signedness. ++ * nss/nss_files/files-hosts.c: Likewise. ++ * nscd/nscd_getpw_r.c (nscd_getpw_r): Likewise. ++ * gmon/gmon.c (write_call_graph): Use u_long for FROM_LEN. ++ * nscd/nscd_getgr_r.c (nscd_getgr_r): Use nscd_ssize_t for CNT. ++ ++ * configure.in (libc_cv_visibility_attribute): Use AC_TRY_COMMAND, ++ get errors into the log file. ++ (libc_cv_broken_visibility_attribute): Likewise. ++ (libc_cv_broken_alias_attribute): Likewise. ++ (libc_cv_asm_weak_directive): Likewise. ++ (libc_cv_need_minus_P): Likewise. ++ (libc_cv_dot_text): Likewise. ++ (libc_cv_asm_global_directive): Likewise. ++ (libc_cv_asm_type_prefix): Likewise. ++ * configure: Regenerated. ++ ++ * nscd/cache.c (cache_search): Give first arg type `request_type'. ++ * nscd/nscd.h: Update decl. ++ ++ * nscd/nscd_getpw_r.c (nscd_getpw_r): Add casts for signedness. ++ * nscd/nscd_getgr_r.c (nscd_getgr_r): Likewise. ++ * elf/dl-close.c (_dl_close): Likewise. ++ * sysdeps/unix/sysv/linux/powerpc/chown.c (__chown): int -> size_t ++ * io/fts.c (fts_build): Likewise. ++ * elf/cache.c (add_to_cache): Likewise. ++ * locale/programs/locarchive.c (show_archive_content): Likewise. ++ ++ * posix/fnmatch.c (fnmatch): Tweak __builtin_expect use. ++ ++ * include/ctype.h (__ctype_b_loc): Tweak type punning to make gcc 3.3 ++ happy. ++ (__ctype_toupper_loc, __ctype_tolower_loc): Likewise. ++ ++2003-03-15 Ulrich Drepper ++ ++ * sysdeps/unix/sysv/linux/ia64/system.c: Use the generic Linux ++ code for most parts. ++ ++2003-03-15 Roland McGrath ++ ++ * sysdeps/unix/sysv/linux/i386/system.c: Moved to ... ++ * sysdeps/unix/sysv/linux/system.c: ... here. ++ (FORK): Don't #define if already #define'd. ++ * sysdeps/unix/sysv/linux/s390/system.c: File removed. ++ * sysdeps/unix/sysv/linux/kernel-features.h [__powerpc__]: ++ (__ASSUME_CLONE_THREAD_FLAGS): Define for kernel >= 2.5.64. ++ ++ * dlfcn/tst-dlinfo.c: New file. ++ * dlfcn/Makefile (tests): Add tst-dlinfo. ++ ($(objpfx)tst-dlinfo): New target. ++ ++ * dlfcn/dlinfo.c: New file. ++ * dlfcn/Makefile (libdl-routines): Add it. ++ * dlfcn/Versions (libdl: GLIBC_2.3.3): Add dlinfo. ++ * dlfcn/dlfcn.h [__USE_GNU]: Declare dlinfo. ++ [__USE_GNU] (RTLD_DI_*): New enum constants. ++ [__USE_GNU] (Dl_serpath, Dl_serinfo): New types. ++ * elf/dl-load.c (cache_rpath): New inline function. ++ (_dl_map_object): Use it. ++ (_dl_rtld_di_serinfo): New function. ++ * sysdeps/generic/ldsodefs.h: Declare it. ++ * elf/Versions (ld: GLIBC_PRIVATE): Add it. ++ ++ * sysdeps/powerpc/elf/libc-start.c (AUX_VECTOR_INIT): Define it. ++ (LIBC_START_MAIN, LIBC_START_MAIN_AUXVEC_ARG, MAIN_AUXVEC_ARG) ++ (INIT_MAIN_ARGS): Define, and #include . ++ (__libc_start_main): Just call the generic one for most of the work. ++ ++ * sysdeps/generic/libc-start.c [LIBC_START_MAIN]: If defined, define a ++ static function by that name instead of BP_SYM (__libc_start_main). ++ [LIBC_START_MAIN_AUXVEC_ARG]: Take AUXVEC as argument. ++ [MAIN_AUXVEC_ARG]: Pass 4th argument to MAIN. ++ [INIT_MAIN_ARGS]: Give INIT the same args as MAIN. ++ ++ * sysdeps/generic/dl-sysdep.c (_dl_sysdep_start) [DL_PLATFORM_AUXV]: ++ Use this macro for extra AT_* cases. ++ * sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c (DL_PLATFORM_AUXV): ++ New macro, guts from ... ++ (__aux_init_cache): ... here, function removed. ++ (DL_PLATFORM_INIT): Don't define this. ++ ++ * sysdeps/powerpc/powerpc32/memset.S: Put __cache_line_size in bss. ++ * sysdeps/powerpc/powerpc64/memset.S: Likewise. ++ ++ * Versions.def (libthread_db): Add GLIBC_2.3.3 set. ++ ++2003-03-14 Roland McGrath ++ ++ * dlfcn/dlerror.c (dlerror): If objname is "", don't put ": " after it. ++ ++2003-03-14 Jakub Jelinek ++ ++ * sysdeps/unix/sysv/linux/Makefile (syscall-%.h): Fix a typo. ++ ++ * sysdeps/unix/sysv/linux/sparc/sparc64/pause.c: Include ++ sysdeps/posix/pause.c instead of sysdeps/unix/common/pause.c. ++ ++2003-03-14 Alexandre Oliva ++ ++ * sysdeps/mips/fpu/bits/mathdef.h: New. ++ (__NO_LONG_DOUBLE_MATH): Define for o32. ++ ++ * sysdeps/mips/sys/asm.h: Formatting changes. ++ (PTR, PTRSIZE, PTRLOG): Adjust for all 3 ABIs. ++ (CPADD): Define for all of them. ++ (SETUP_GP, SETUP_GPX, SETUP_GPX_L, SAVE_GP, SETUP_GP64, ++ SETUP_GPX64, SETUP_GPX64_L, RESTORE_GP64, USE_ALT_CP, ++ NARGSAVE): Define per ABI spec. ++ (END): Don't redefine. ++ (LONG_SLL, LONG_SLLV, LONG_SRL, LONG_SRLV, LONG_SRA, ++ LONG_SRAV): Remove duplicate definitions. ++ (PTR_ADD, PTR_ADDI, PTR_ADDU, PTR_ADDIU, PTR_SUB, PTR_SUBI, ++ PTR_SUBU, PTR_SUBIU, PTR_L, PTR_S, PTR_SLL, PTR_SLLV, PTR_SRL, ++ PTR_SRLV, PTR_SRA, PTR_SRAV, PTR_SCALESHIFT): Define for n32. ++ (PTR_LA): Define for all 3 ABIs. ++ ++ * sysdeps/mips/dl-machine.h: Include sys/asm.h. ++ (elf_machine_matches_host): Prevent linking of o32 and n32 ++ together. ++ (elf_machine_dynamic): Document assumption on $gp. ++ (STRINGXP, STRINGXV, STRINGV_): New macros. ++ (elf_machine_load_address): Use them to stringize PTR_LA and ++ PTR_SUBU. ++ (ELF_DL_FRAME_SIZE, ELF_DL_SAVE_ARG_REGS, ++ ELF_DL_RESTORE_ARG_REGS, IFABIO32): New macros used in... ++ (_dl_runtime_resolve): Adjust it for all 3 ABIs. ++ (__dl_runtime_resolve): Cast the symtab initializer to the ++ right type. ++ (RTLD_START): Use it. Adjust it for all 3 ABIs. ++ (elf_machine_rel): Mark as always_inline in RTLD_BOOTSTRAP. ++ Handle 64-bit R_MIPS_REL composite relocation and accept ++ R_MIPS_64 relocations to shift addend size to 64 bits. ++ Document assumption regarding local GOT entries. Document ++ backward-compatibility departing from the ABI behavior in ++ applying relocations that reference section symbols, no longer ++ used. Support relocations to mis-aligned offsets. ++ * sysdeps/mips/mips64/dl-machine.h: Deleted, obsolete. ++ ++ * sysdeps/unix/sysv/linux/mips/readelflib.c: New file. ++ ++ * sysdeps/unix/sysv/linux/mips/kernel_sigaction.h ++ (_KERNEL_NSIG_BPW): Define in terms of _MIPS_SZLONG. ++ * sysdeps/unix/sysv/linux/mips/sigaction.c: Define restore and ++ restore_rt functions. Use them. ++ ++ * sysdeps/unix/sysv/linux/mips/sys/tas.h (_test_and_set): Don't ++ .set mips2 on new abis. ++ ++2003-03-13 Ulrich Drepper ++ ++ * posix/getconf.c: Recognize POSIX2_SYMLINKS. ++ * sysdeps/generic/bits/confname.h: Define _PC_2_SYMLINKS. ++ * sysdeps/posix/fpathconf.c: Handle _PC_2_SYMLINKS. ++ * sysdeps/posix/pathconf.c: Likewise. ++ * sysdeps/unix/sysv/linux/fpathconf.c: Likewise. ++ * sysdeps/unix/sysv/linux/pathconf.c: Likewise. ++ * sysdeps/unix/sysv/linux/pathconf.h: Define statfs_symlinks. ++ ++ * sysdeps/unix/sysv/linux/linux_fsinfo.h: Define some more magic ++ words. ++ ++2003-03-14 Alexandre Oliva ++ ++ * include/gmp.h: Include/gmp-mparam.h. ++ * stdlib/strtod.c: Include gmp-mparam.h before gmp.h and ++ gmp-impl.h. ++ ++ * elf/dl-conflict.c: Don't compile _dl_resolve_conflicts if ++ ELF_MACHINE_NO_RELA is set. ++ * elf/rtld.c (dl_main): No prelink support for REL-only. ++ ++ * sysdeps/generic/ldconfig.h (FLAG_MIPS64_LIBN32, ++ FLAG_MIPS64_LIBN64): Define. ++ * elf/cache.c (print_entry): Handle mips64 n32 and n64. ++ ++ * sysdeps/mips/memcpy.S: Map t0-3 to a4-7 on new abis. ++ * sysdeps/mips/memset.S: Likewise. ++ * sysdeps/mips/sys/regdef.h: Alias a4-7 or t0-3 to $8-11 ++ depending on the ABI. ++ ++ * sysdeps/mips/atomicity.h (exchange_and_add, atomic_add): ++ Don't .set mips2 on new abi. ++ (compare_and_swap): Likewise. Support 64-bit longs on n64. ++ ++ * stdlib/fpioconst.h: Include gmp.h with angle brackets. ++ ++2003-03-13 Roland McGrath ++ ++ * elf/dl-load.c (_dl_map_object_from_fd): Bail if no PT_LOAD phdrs ++ found. Reported by Alexandre Oliva . ++ ++2003-03-13 Alexandre Oliva ++ ++ * stdio-common/_itoa.c (_itoa_base_table): Make 64-bit ++ literals long long. ++ * stdlib/fpioconst.c: Likewise. ++ * stdlib/strtod.c: Likewise. ++ ++ * sysdeps/mips/add_n.S: Use L macro for local labels. ++ * sysdeps/mips/addmul_1.S: Likewise. ++ * sysdeps/mips/lshift.S: Likewise. ++ * sysdeps/mips/memcpy.S: Likewise. ++ * sysdeps/mips/memset.S: Likewise. ++ * sysdeps/mips/mul_1.S: Likewise. ++ * sysdeps/mips/rshift.S: Likewise. ++ * sysdeps/mips/sub_n.S: Likewise. ++ * sysdeps/mips/submul_1.S: Likewise. ++ * sysdeps/mips/mips64/add_n.S: Likewise. ++ * sysdeps/mips/mips64/addmul_1.S: Likewise. ++ * sysdeps/mips/mips64/lshift.S: Likewise. ++ * sysdeps/mips/mips64/mul_1.S: Likewise. ++ * sysdeps/mips/mips64/rshift.S: Likewise. ++ * sysdeps/mips/mips64/sub_n.S: Likewise. ++ * sysdeps/mips/mips64/submul_1.S: Likewise. ++ * sysdeps/unix/mips/sysdep.h: Define L() according to ABI ++ conventions. Define END as in sys/asm.h. ++ * sysdeps/unix/mips/sysdep.S: Likewise. ++ * sysdeps/unix/mips/wait.S: Likewise. ++ * sysdeps/unix/sysv/linux/mips/clone.S: Likewise. ++ ++ * sysdeps/ieee754/dbl-64/dbl2mpn.c (__mpn_extract_double): ++ Cast shifted values that may be too narrow to mp_limb_t. ++ * sysdeps/ieee754/dbl-64/mpn2dbl.c (__mpn_construct_double): ++ Likewise. ++ * sysdeps/ieee754/flt-32/mpn2flt.c (__mpn_construct_float): ++ Likewise. ++ * sysdeps/ieee754/ldbl-128/ldbl2mpn.c ++ (__mpn_extract_long_double): Likewise. ++ * sysdeps/ieee754/ldbl-128/mpn2ldbl.c ++ (__mpn_construct_long_double): Likewise. ++ * sysdeps/ieee754/ldbl-96/ldbl2mpn.c ++ (__mpn_extract_long_double): Likewise. ++ * sysdeps/ieee754/ldbl-96/mpn2ldbl.c ++ (__mpn_construct_long_double): Likewise. ++ ++2003-03-13 Roland McGrath ++ ++ * elf/Makefile ($(objpfx)librtld.mk): Tweak regexp so that one-line ++ entries in the map file match too. ++ ++2003-03-13 Guido Guenther ++ ++ * sysdeps/unix/sysv/linux/mips/clone.S: introduce and use local ++ label .Lthread_start since current binutils don't allow branches ++ to globally visible symbols. ++ ++2003-03-13 Jakub Jelinek ++ ++ * sysdeps/unix/sysv/linux/ia64/sysdep.h (BREAK_INSN_1, BREAK_INSN, ++ ASM_OUTARGS_0, ASM_OUTARGS_1, ASM_OUTARGS_2, ASM_OUTARGS_3, ++ ASM_OUTARGS_4, ASM_OUTARGS_5, ASM_OUTARGS_6): Define. ++ (INTERNAL_SYSCALL, INLINE_SYSCALL): Use it. Make syscall arguments ++ clobbered by the syscall. ++ (ASM_ARGS_1, ASM_ARGS_2, ASM_ARGS_3, ASM_ARGS_4, ASM_ARGS_5, ++ ASM_ARGS_6): Change constraints from r to index of corresponding ++ output register. ++ * sysdeps/unix/sysv/linux/ia64/clone2.S (__clone2): Swap ++ ptid and ctid to match kernel. ++ * sysdeps/unix/sysv/linux/ia64/system.c (FORK): Likewise. ++ ++2003-03-12 Steven Munroe ++ ++ * sysdeps/powerpc/powerpc64/elf/configure.in: Remove ++ AC_DEFINE(PI_STATIC_AND_HIDDEN). Not supported for PowerPC64. ++ * sysdeps/powerpc/powerpc64/elf/configure: Regenerated. ++ ++2003-03-11 Roland McGrath ++ ++ * sysdeps/powerpc/powerpc64/dl-machine.h (elf_machine_rela): ++ Check SYM_MAP rather than SYM as definedness check. ++ Handle R_PPC64_ADDR32, R_PPC64_ADDR30, and R_PPC64_REL64 relocs. ++ Don't handle R_PPC64_REL24 reloc. ++ Mostly from Steven Munroe . ++ ++ * sysdeps/powerpc/powerpc64/dl-machine.h ++ [USE_TLS] (elf_machine_type_class): Match all the TLS relocs in a ++ block, so we cover all the TPREL16* flavors without 6 ||s. ++ [USE_TLS] (elf_machine_tprel): New function. ++ (elf_machine_rela) [USE_TLS]: Use elf_machine_tprel for TPREL64 reloc, ++ and handle TPREL16 relocs too. Return rather than break for DTPREL64. ++ Mostly from Steven Munroe . ++ ++2003-03-11 Ralf Baechle ++ ++ * sysdeps/unix/sysv/linux/mips/clone.S (__thread_start): Use jal ++ instead of jalr to invoke subroutine so restoring the $gp register ++ will work properly. ++ ++2003-03-11 Martin Schwidefsky ++ ++ * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h (__NR_pread64): Define ++ to __NR_pread if not defined. ++ (__NR_pwrite64): Define to __NR_pwrite if not defined. ++ ++2003-03-11 Jakub Jelinek ++ ++ * sysdeps/unix/sysv/linux/ia64/system.c: New file. ++ * sysdeps/unix/sysv/linux/kernel-features.h ++ (__ASSUME_CLONE_THREAD_FLAGS): Define for IA-64 and s390* with ++ kernel >= 2.5.64. ++ ++2003-03-11 Jakub Jelinek ++ ++ * sysdeps/generic/dl-sysdep.c (_dl_important_hwcaps): If CNT == 1, ++ allocate space even for the trailing '/'. ++ Reported by John Reiser . ++ ++ * sysdeps/unix/sysv/linux/ia64/sysdep.h (LOAD_ARGS_6, ASM_ARGS_6, ++ ASM_CLOBBERS_6): Define. ++ (ASM_CLOBBERS_5): Use ASM_CLOBBERS_6. ++ * sysdeps/unix/sysv/linux/ia64/clone2.S (__clone2): Reorder arguments ++ to match IA-32 order. ++ * sysdeps/unix/sysv/linux/i386/clone.S: Fix comment. ++ ++2003-03-10 Steven Munroe ++ ++ * sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S: Don't clobber R7. ++ Copy extra params for NPTL to registers used in clone syscall. ++ ++2003-03-10 Martin Schwidefsky ++ ++ * sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list: Correct system ++ call names for pread and pwrite. ++ ++2003-03-10 Roland McGrath ++ ++ * dlfcn/Makefile (libdl-routines): Add dladdr1. ++ * dlfcn/dladdr1.c: New file. ++ * dlfcn/dlfcn.h [__USE_GNU]: Declare dladdr1. ++ [__USE_GNU] (RTLD_DL_SYMENT, RTLD_DL_LINKMAP): New enum constants. ++ * elf/dl-addr.c (_dl_addr): Take new args, a struct link_map ** and ++ a const ElfNN_Sym ** to fill in. ++ * include/dlfcn.h: Update decl. Include . ++ * dlfcn/dladdr.c (dladdr): Update caller. ++ * malloc/mtrace.c (tr_where): Likewise. ++ * sysdeps/generic/elf/backtracesyms.c: Likewise. ++ * sysdeps/generic/elf/backtracesymsfd.c: Likewise. ++ * dlfcn/Versions (libdl: GLIBC_2.3.3): New set, add dladdr1. ++ * Versions.def (libdl): Define GLIBC_2.3.3 set. ++ ++ * sysdeps/unix/make-syscalls.sh: Generate $(compile-syscall) for ++ assembler command. ++ * sysdeps/unix/Makefile (compile-syscall): New variable. ++ Pass -g0 to compiler for assembling syscall stubs from stdin. ++ ++ * sysdeps/i386/sysdep.h [HAVE_CPP_ASM_DEBUGINFO] ++ (STABS_CURRENT_FILE, STABS_CURRENT_FILE1, STABS_FUN, STABS_FUN_END): ++ Define these to do nothing. ++ ++ * configure.in: New check for -g on .S files. ++ * configure: Regenerated. ++ * config.make.in (have-cpp-asm-debuginfo): New variable. ++ * config.h.in (HAVE_CPP_ASM_DEBUGINFO): New #undef. ++ * Makeconfig (ASFLAGS): New variable, if undefined and ++ $(have-cpp-asm-debuginfo), take options matching -g% from $(CFLAGS). ++ * Makerules (compile.S, COMPILE.S): Use $(ASFLAGS). ++ ++2003-03-09 Roland McGrath ++ ++ * sysdeps/unix/sysv/linux/powerpc/powerpc32/clone.S: Take 3 new args ++ used by NPTL on new kernels. From Paul Mackerras . ++ ++2003-03-09 Ulrich Drepper ++ ++ * po/fi.po: Update from translation team. ++ * po/ca.po: Likewise. ++ * po/da.po: Likewise. ++ ++2003-03-08 Ulrich Drepper ++ ++ * rt/tst-aio7.c (do_test): Change BYTES into a #define. ++ ++2003-03-07 Ulrich Drepper ++ ++ * rt/tst-aio7.c (do_test): Give BUFF permanent extent, too. ++ ++ * sysdeps/powerpc/fpu/w_sqrt.c: Fix comment. ++ ++2003-03-07 Roland McGrath ++ ++ * sysdeps/s390/s390-32/sysdep.h (L): Use .Lfoo instead of foo. ++ * sysdeps/s390/s390-64/sysdep.h (L): Likewise. ++ ++2003-03-04 Guido Guenther ++ ++ * sysdeps/unix/sysv/linux/mips/syscalls.list: Remove unneeded ++ stubs, we have INLINE_SYSCALL. ++ * sysdeps/unix/sysv/linux/mips/bits/mman.h: Define MAP_POPULATE, ++ MAP_NONBLOCK. ++ ++2003-03-06 Roland McGrath ++ ++ * rt/tst-aio7.c (do_test): Revert last change. Instead, give CB1 ++ permanent extent and add a comment about testing its implicit teardown. ++ ++2003-03-06 Martin Schwidefsky ++ ++ * rt/tst-aio7.c (do_test): Cancel i/o on CB1 before it's out of scope. ++ ++2003-03-05 Ulrich Drepper ++ ++ * sysdeps/generic/dl-tls.c (_dl_allocate_tls_storage): Fix ++ reversed __builtin_expect expectation. ++ ++2003-03-05 Roland McGrath ++ ++ * stdio-common/sscanf.c: Use prototype defn with ... syntax. ++ * libio/swscanf.c: Likewise. ++ * libio/swprintf.c: Likewise. ++ ++2003-03-04 Roland McGrath ++ ++ * sysdeps/powerpc/powerpc64/dl-machine.h: Include . ++ (elf_machine_rela): Always use RESOLVE_MAP, needed for ++ R_PPC64_JMP_SLOT as well as TLS cases. ++ (BIT_INSERT): Move parenthesis where it ought to have been. ++ Reported by Steven Munroe . ++ ++ * posix/confstr.c (confstr): Correct STRING_LEN values for ++ _CS_GNU_LIBC_VERSION and _CS_GNU_LIBPTHREAD_VERSION, add missing ++ break. Reported by Alexandre Julliard . ++ ++2003-03-04 Jakub Jelinek ++ ++ * sysdeps/ia64/fpu/libm-test-ulps: Regenerated. ++ ++2003-03-04 Ulrich Drepper ++ ++ * sysdeps/unix/sysv/linux/x86_64/clone.S: Add support for the new ++ clone parameters. ++ ++ * po/sv.po: Update from translation team. ++ ++2003-03-04 Andreas Jaeger ++ Ulrich Drepper ++ ++ * sysdeps/unix/sysv/linux/x86_64/sysdep.h: Fix comments. ++ ++2003-03-03 Ulrich Drepper ++ ++ * sysdeps/generic/dl-sysdep.h: Add double include protection. ++ ++ * po/tr.po: Update from translation team. ++ ++ * elf/dl-load.c (_dl_map_object_from_fd): Determine whether there ++ are holes between the segments. Only call mprotect to set ++ proection to PROT_NONE if there are some. ++ ++ * elf/dl-load.c (struct filebuf): Actually use FILEBUF_SIZE. ++ Update comment. ++ ++ * include/sched.h (__clone2): Use ... instead of adding all the ++ new parameters. ++ ++2003-03-03 Roland McGrath ++ ++ * elf/dl-load.c (struct filebuf): Fix typo in last change. ++ ++ * sysdeps/powerpc/powerpc32/elf/configure.in: Don't define ++ PI_STATIC_AND_HIDDEN. ++ ++2003-03-03 Ian Wienand ++ ++ * sysdeps/unix/sysv/linux/ia64/clone2.S: Update to take extra clone ++ flags. ++ * include/sched.h: Update clone2 prototype. ++ ++2003-03-03 Andreas Jaeger ++ ++ * math/tgmath.h (__TGMATH_UNARY_REAL_RET_ONLY): New definition. ++ (llrint): Use it to correct return type. ++ (lrint): Likewise. ++ (lround): Likewise. ++ (llround): Likewise. ++ ++2003-03-03 Ulrich Drepper ++ ++ * elf/dl-load.c (struct filebuf): For 64-bit platforms use 640 ++ byte filebuf size. ++ ++ * libio/fileops.c (_IO_new_file_fopen): Close stillborn descriptor ++ if ccs parameter isn't valid. Reported by Andreas Schwab. ++ ++2003-03-03 Martin Schwidefsky ++ ++ * sysdeps/unix/sysv/linux/s390/s390-32/syscall.S (syscall): Add support ++ for system call numbers > 255. ++ * sysdeps/unix/sysv/linux/s390/s390-32/syscall.h (DO_CALL, ++ INLINE_SYSCALL, INTERNAL_SYSCALL_DIRECT, INTERNAL_SYSCALL_SVC0, ++ INTERNAL_SYSCALL): Likewise. ++ * sysdeps/unix/sysv/linux/s390/s390-64/syscall.S (syscall): Likewise. ++ * sysdeps/unix/sysv/linux/s390/s390-64/syscall.h (DO_CALL, ++ INLINE_SYSCALL, INTERNAL_SYSCALL_DIRECT, INTERNAL_SYSCALL_SVC0, ++ INTERNAL_SYSCALL): Likewise. ++ ++2003-03-03 Martin Schwidefsky ++ ++ * sysdeps/generic/dl-tls.c (_dl_deallocate_tls): Don't free the dtv ++ array if it is the initial dtv. ++ ++2003-03-03 Ulrich Drepper ++ ++ * po/es.po: Update from translation team. ++ * po/fr.po: Likewise. ++ * po/gl.po: Likewise. ++ * po/sk.po: Likewise. ++ * po/sv.po: Likewise. ++ ++ * sysdeps/unix/sysv/linux/syscalls.list: Add remap_file_pages entry. ++ * misc/sys/mman.h: Add prototype for remap_file_pages. ++ * sysdeps/generic/remap_file_pages.c: New file. ++ * misc/Makefile (routines): Add remap_file_pages. ++ * misc/Versions [libc:GLIBC_2.3.3]: Add remap_file_pages. ++ ++ * sysdeps/unix/sysv/linux/x86_64/bits/mman.h: Define MAP_POPULATE ++ and MAP_NONBLOCK. ++ * sysdeps/unix/sysv/linux/s390/bits/mman.h: Likewise. ++ * sysdeps/unix/sysv/linux/powerpc/bits/mman.h: Likewise ++ * sysdeps/unix/sysv/linux/m68k/bits/mman.h: Likewise. ++ * sysdeps/unix/sysv/linux/arm/bits/mman.h: Likewise. ++ * sysdeps/unix/sysv/linux/ia64/bits/mman.h: Likewise. ++ * sysdeps/unix/sysv/linux/hppa/bits/mman.h: Likewise. ++ * sysdeps/unix/sysv/linux/alpha/bits/mman.h: Likewise. ++ * sysdeps/unix/sysv/linux/i386/bits/mman.h: Likewise. ++ ++2003-03-03 Roland McGrath ++ ++ * sysdeps/ia64/dl-fptr.c (__ia64_make_fptr): Revert last change. ++ * sysdeps/ia64/dl-machine.h: Likewise. ++ * sysdeps/ia64/dl-symaddr.c (_dl_symbol_address): Remove const from ++ argument type. ++ * sysdeps/ia64/dl-lookupcfg.h: Update decl. ++ ++ * sysdeps/wordsize-64/strtol_l.c (strtoll_l): Define as weak alias. ++ * sysdeps/wordsize-64/strtoul_l.c (strtoull_l): Define as weak alias. ++ * locale/Versions (libc: GLIBC_2.3): Move those to ... ++ * sysdeps/wordsize-32/Versions (libc: GLIBC_2.3): ... here, new file. ++ * sysdeps/wordsize-64/Versions (libc: GLIBC_2.3.3) Likewise. ++ * Versions.def (libc): Add GLIBC_2.3.3 set. ++ ++ * sysdeps/ia64/dl-fptr.c (__ia64_make_fptr): Add const to MAP arg. ++ * sysdeps/ia64/dl-machine.h: Update decl. ++ ++2003-03-03 Andreas Jaeger ++ ++ * sysdeps/unix/clock_settime.c (HANDLE_REALTIME): Add missing brace. ++ ++2003-03-02 Roland McGrath ++ ++ * scripts/abilist.awk: Reject data items with apparent 0 size. ++ ++ * scripts/merge-abilist.awk: Restore hack to elide pattern foo.*/bar ++ after foo.* as if it were a duplicate. ++ ++ * sysdeps/unix/sysv/linux/ia64/brk.S: Add .type and .size for __curbrk. ++ ++2003-03-02 Ulrich Drepper ++ ++ * elf/dl-load.c (struct filebuf): Reduce buf array to 512 bytes. ++ ++ * sysdeps/generic/bits/time.h: Define CLOCK_MONOTONIC. ++ * sysdeps/posix/clock_getres.c: Define code for CLOCK_REALTIME only ++ if not already defined. Use SYSDEP_GETRES to allow other files to ++ provide alternative implementations. ++ * sysdeps/unix/sysv/linux/clock_getres.c: New file ++ * sysdeps/unix/clock_gettime.c: Define code for CLOCK_REALTIME only ++ if not already defined. Use SYSDEP_GETTIME to allow other files to ++ provide alternative implementations. ++ * sysdeps/unix/sysv/linux/clock_gettime.c: New file. ++ * sysdeps/unix/clock_settime.c: Define code for CLOCK_REALTIME only ++ if not already defined. Use SYSDEP_GETTIME to allow other files to ++ provide alternative implementations. ++ * sysdeps/unix/sysv/linux/clock_settime.c: New file. ++ * sysdeps/unix/clock_nanosleep.c: Use SYSDEP_NANOSLEEP to allow ++ other files to provide alternative implementations. Rearrange ++ tests for invalid parameters. ++ * sysdeps/unix/sysv/linux/clock_nanosleep.c: New file. ++ * sysdeps/unix/sysv/linux/sysconf.c: New file. ++ * sysdeps/unix/sysv/linux/kernel-features.h: Define ++ __ASSUME_POSIX_TIMERS for Linux 2.5.63 and up. ++ * sysdeps/unix/sysv/linux/bits/posix_opt.h: Define ++ _POSIX_MONOTONIC_CLOCK. ++ ++2003-03-02 Roland McGrath ++ ++ * scripts/merge-abilist.awk: More checks for bogus input. ++ Uniquify duplicate config names. ++ ++ * scripts/abilist.awk: Don't distinguish weak symbols in normal output. ++ ++ * sysdeps/powerpc/powerpc32/dl-machine.c (_dl_reloc_overflow): Renamed ++ from dl_reloc_overflow, make global. ++ (__process_machine_rela): Update callers. ++ * sysdeps/powerpc/powerpc32/dl-machine.h: Declare _dl_reloc_overflow. ++ Add attribute_hidden to __process_machine_rela decl. ++ (elf_machine_type_class, elf_machine_rela): Handle 16-bit TLS relocs. ++ ++ * sysdeps/generic/libc-start.c (__libc_start_main): Don't assign const ++ variable. ++ ++ * sysdeps/powerpc/powerpc64/dl-machine.h (elf_machine_fixup_plt): ++ Don't use weak_extern for dl_rtld_map. Instead check only if [SHARED]. ++ (elf_machine_rela): Clean up. ++ ++ * sysdeps/powerpc/powerpc32/dl-machine.h (elf_machine_rela): Clean up. ++ ++ PowerPC TLS support contributed by Paul Mackerras . ++ * sysdeps/powerpc/powerpc32/elf/configure.in: New file. ++ * sysdeps/powerpc/powerpc32/elf/configure: New generated file. ++ * elf/tls-macros.h [__powerpc__ && !__powerpc64__] ++ (TLS_LE, TLS_IE, TLS_LD, TLS_GD): Define them. ++ * sysdeps/powerpc/powerpc32/dl-machine.h (elf_machine_rela): Support ++ new relocs for TLS. ++ ++ * sysdeps/powerpc/dl-tls.h (TLS_TP_OFFSET, TLS_DTV_OFFSET): Move these ++ macros out of [SHARED]. ++ (TLS_TPREL_VALUE, TLS_DTPREL_VALUE): New macros. ++ ++ * elf/elf.h: Define R_PPC_* relocs for TLS support. ++ Clean up R_PPC64_* macro definition comments. ++ ++ * configure.in: In "running configure fragment for" message, ++ omit $srcdir from the name if we prepended it. ++ * configure: Regenerated. ++ ++ * elf/dl-reloc.c (allocate_static_tls): Fix calculations. ++ From Jakub Jelinek . ++ ++ * sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h: Revert last change, ++ which duplicated the O_DIRECT defn. ++ ++2003-03-01 GOTO Masanori ++ ++ * stdlib/stdlib.h: Add missing __USE_BSD enclosure for BSD derived ++ random functions. ++ ++2003-03-01 Andreas Schwab ++ ++ * resolv/Makefile (tests): Don't depend on ++ $(objpfx)mtrace-tst-leaks when cross compiling. ++ ++ * sysdeps/m68k/dl-machine.h (_dl_start_user): Access ++ __libc_stack_end through GOT since it is a global symbol. ++ + 2003-03-01 GOTO Masanori + + * argp/argp.h: Fix a typo. +diff -u -udbrN glibc-2.3.2/Makeconfig glibc-2.3.2-200304020432/Makeconfig +--- glibc-2.3.2/Makeconfig Mon Jan 6 06:31:36 2003 ++++ glibc-2.3.2-200304020432/Makeconfig Sun Mar 23 12:17:13 2003 +@@ -621,7 +621,7 @@ + +includes = -I$(..)include -I. \ + $(patsubst %/,-I%,$(objpfx)) $(patsubst %/,-I%,$(..)) \ + $(libio-include) $(includes) \ +- $(+sysdep-includes) $(last-includes) $(sysincludes) ++ $(+sysdep-includes) $(sysincludes) + + # Since libio has several internal header files, we use a -I instead + # of many little headers in the include directory. +@@ -716,6 +716,12 @@ + libtype.oS = lib%_nonshared.a + endif + ++# The assembler can generate debug information too. ++ifndef ASFLAGS ++ifeq ($(have-cpp-asm-debuginfo),yes) ++ASFLAGS := $(filter -g%,$(CFLAGS)) ++endif ++endif + + +gnu-stabs = $(shell echo>&2 '*** BARF ON ME') + +diff -u -udbrN glibc-2.3.2/Makefile glibc-2.3.2-200304020432/Makefile +--- glibc-2.3.2/Makefile Fri Feb 21 07:22:51 2003 ++++ glibc-2.3.2-200304020432/Makefile Fri Mar 28 02:13:00 2003 +@@ -274,6 +274,7 @@ + include/shlib-compat.h include/pthread.h Versions.def \ + cppflags-iterator.mk tls.make.c \ + include/stubs-prologue.h include/gnu/stubs.h \ ++ include/atomic.h bits/atomic.h \ + INTERFACE CONFORMANCE NAMESPACE LICENSES \ + $(addprefix scripts/, \ + rellns-sh config.sub config.guess \ +@@ -282,7 +283,10 @@ + gen-sorted.awk abi-versions.awk abilist.awk \ + firstversions.awk documented.sh cpp \ + output-format.sed gen-as-const.awk \ +- merge-abilist.awk extract-abilist.awk) ++ merge-abilist.awk extract-abilist.awk \ ++ rpm2dynsym.sh \ ++ ) \ ++ $(wildcard abilist/*.abilist) + + distribute := $(strip $(distribute)) + generated := $(generated) stubs.h +@@ -316,12 +320,6 @@ + $(MAKE) $(PARALLELMFLAGS) -C $(@D) $(@F) + + iconvdata/% localedata/% po/% manual/%: +- $(MAKE) $(PARALLELMFLAGS) -C $(@D) $(@F) +- +-# This is a special goal for people making binary distributions. Normally +-# everybody uses the DES based crypt library but for the distribution we +-# need the only-MD5 based one as well. +-md5-crypt/libmd5crypt: + $(MAKE) $(PARALLELMFLAGS) -C $(@D) $(@F) + + # glibc 2.0 contains some header files which aren't used with glibc 2.1 +diff -u -udbrN glibc-2.3.2/Makerules glibc-2.3.2-200304020432/Makerules +--- glibc-2.3.2/Makerules Sun Feb 23 00:23:31 2003 ++++ glibc-2.3.2-200304020432/Makerules Thu Mar 27 10:47:53 2003 +@@ -396,8 +396,10 @@ + + # GCC can grok options after the file name, and it looks nicer that way. + compile.c = $(CC) $< -c $(CFLAGS) $(CPPFLAGS) +-compile.S = $(CC) $< -c $(CPPFLAGS) $(S-CPPFLAGS) $(ASFLAGS-$(suffix $@)) +-COMPILE.S = $(CC) -c $(CPPFLAGS) $(S-CPPFLAGS) $(ASFLAGS-$(suffix $@)) ++compile.S = $(CC) $< -c $(CPPFLAGS) $(S-CPPFLAGS) \ ++ $(ASFLAGS) $(ASFLAGS-$(suffix $@)) ++COMPILE.S = $(CC) -c $(CPPFLAGS) $(S-CPPFLAGS) \ ++ $(ASFLAGS) $(ASFLAGS-$(suffix $@)) + COMPILE.s = $(filter-out -pipe,$(CC)) -c $(ASFLAGS) + + # If we want to generate MD5 checksums for the sources do this now. +@@ -1188,15 +1190,23 @@ + LC_ALL=C \ + $(AWK) -f $< -v 'config=$(check-abi-config)' \ + $(filter %.abilist,$^) \ +- | diff -pu0 - $(filter %.symlist,$^) ++ | { diff -pu0 - $(filter %.symlist,$^) $(check-abi-warn) ; } + endef ++ifeq ($(enable-check-abi),warn) ++check-abi-warn = || echo '*** WARNING: $*.so failed ABI check' ++endif + + ifeq ($(firstword $(sysd-sorted-done) f)$(firstword $(generating) f),tf) + -include $(common-objpfx)tls.make +-config-tls-yes := tls +-config-tls-no := notls ++config-tls := notls ++ifeq ($(use-tls),yes) ++config-tls := tls ++endif ++ifeq ($(use-thread),yes) ++config-tls := thread ++endif + check-abi-config := \ +- $(config-machine)-$(config-vendor)-$(config-os)/$(config-tls-$(use-thread)) ++ $(config-machine)-$(config-vendor)-$(config-os)/$(config-tls) + endif + + update-abi-%: $(..)scripts/merge-abilist.awk $(..)abilist/%.abilist \ +@@ -1211,7 +1221,7 @@ + endef + else + define update-abi +-LC_ALL=C $(AWK) -v config=$(update-abi-config) -f $^ \ ++LC_ALL=C $(AWK) -v config='$(update-abi-config)' -f $^ \ + > $(..)abilist/$*.abilist.new + @if cmp -s $(..)abilist/$*.abilist.new $(..)abilist/$*.abilist 2> /dev/null; \ + then rm -f $(..)abilist/$*.abilist.new; \ +@@ -1233,15 +1243,20 @@ + update-abi: subdir_update-abi + endif + +-# Enable this when all the .abilist files are in place. +-#tests: check-abi +- + ifeq ($(subdir),elf) + check-abi: check-abi-libc + update-abi: update-abi-libc + common-generated += libc.symlist + endif + ++ifeq ($(build-shared),yes) ++ifneq ($(enable-check-abi),no) ++ifdef subdir ++tests: check-abi ++endif ++endif ++endif ++ + endif + + # There's no good place to put this - here will do. +@@ -1370,13 +1385,15 @@ + .PHONY: stubs # The parent Makefile calls this target. + stubs: $(objpfx)stubs + endif +-s = $(sysdep_dir)/generic + $(objpfx)stubs: $(+depfiles) + # Use /dev/null since `...` might expand to empty. +- (s=`cd $s && $(PWD_P)`; \ ++ (s=`cd $(sysdep_dir) && $(PWD_P)`; \ + $(patsubst %/,cd % &&,$(objpfx)) \ + sed -n 's/^stub_warning *(\([^)]*\).*$$/#define __stub_\1/p' \ +- `sed -n -e '\@ $s/[^ ]*\.c@{; s@^.* $s/\([^ ]*\.c\).*$$@'"$$s"'/\1@; h; }' \ ++ `sed -n -e 's@$(sysdep_dir)/@'"$$s"'/@g' \ ++ -e 's@\$$(common-objpfx)@$(..)@g' -e 's@\$$(objpfx)@@g' \ ++ -e '/: *[^ ]/{s@^.*: *\([^ ]*\) .*$$@\1@; h; }' \ ++ -e '/:$$/d' \ + -e '/stub-tag\.h/{; g; p; }' \ + $(patsubst $(objpfx)%,%,$^) /dev/null` \ + /dev/null) > $@T +diff -u -udbrN glibc-2.3.2/NEWS glibc-2.3.2-200304020432/NEWS +--- glibc-2.3.2/NEWS Mon Jan 13 10:26:13 2003 ++++ glibc-2.3.2-200304020432/NEWS Sun Mar 16 00:16:13 2003 +@@ -1,9 +1,17 @@ +-GNU C Library NEWS -- history of user-visible changes. 2003-1-12 +-Copyright (C) 1992-2002, 2003 Free Software Foundation, Inc. ++GNU C Library NEWS -- history of user-visible changes. 2003-3-15 ++Copyright (C) 1992-2002,2003 Free Software Foundation, Inc. + See the end for copying conditions. + + Please send GNU C library bug reports using the `glibcbug' script to + . Please send questions and suggestions to . ++ ++Version 2.3.3 ++ ++* New functions `dladdr1' and `dlinfo' in provide more ways to ++ interrogate the dynamic linker, compatible with the Solaris interface. ++ ++* ELF thread-local storage support (TLS) now works on PowerPC and PowerPC64; ++ implemented by Paul Mackerras, Steven Munroe, and Roland McGrath. + + Version 2.3.2 + +diff -u -udbrN glibc-2.3.2/README-alpha glibc-2.3.2-200304020432/README-alpha +--- glibc-2.3.2/README-alpha Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/README-alpha Thu May 13 12:22:39 1999 +@@ -0,0 +1,287 @@ ++ GNU libc SNAPSHOT SYSTEM ++ (general info) ++ Updated 1997-9-26 ++ ++WHAT ARE GNU libc SNAPSHOTS ++--------------------------- ++ ++Snapshots are an "image" of the main glibc development tree, captured at a ++particular random instant in time. When you use the snapshots, you should be ++able to maintain a local copy of libc that is no more than one day older than ++the official source tree used by the libc maintainers. ++ ++The primary purpose of providing snapshots is to widen the group of motivated ++developers that would like to help test, debug, and enhance glibc, by providing ++you with access to the "latest and greatest" source. This has several ++advantages, and several disadvantages. ++ ++ First the advantages: ++ ++ o Once we have a large base of motivated testers using the snapshots, ++ this should provide good coverage across all currently supported ++ glibc hosts and targets. If a new bug is introduced in glibc due to ++ fixing another bug or ongoing development, it should become ++ obvious much more quickly and get fixed before the next general ++ net release. This should help to reduce the chances of glibc being ++ released to the general public with a major bug that went unnoticed ++ during the release cycle testing because they are machine dependent. ++ We hope to greatly improve glibc's stability and reliability by ++ involving more people and more execution environments in the ++ prerelease testing. ++ ++ o With access to the latest source, any diffs that you send to fix ++ bugs or add new features should be much easier for the glibc team ++ to merge into the official source base (after suitable review ++ of course). This encourages us to merge your changes quicker, ++ while they are still "fresh". ++ ++ o Once your diffs are merged, you can obtain a new copy of glibc ++ containing your changes almost immediately. Thus you do not ++ have to maintain local copies of your changes for any longer ++ than it takes to get them merged into the official source base. ++ This encourages you to send in changes quicker. ++ ++ And the disadvantages: ++ ++ o The snapshot you get will be largely untested and of unknown quality. ++ It may fail to configure or compile. It may have serious bugs. ++ You should always keep a copy of the last known working version ++ before updating to the current snapshot, or at least be able to ++ regenerate a working version if the latest snapshot is unusable ++ in your environment for some reason. ++ ++ If a production version of glibc has a bug and a snapshot has the fix, ++ and you care about stability, you should put only the fix for that ++ particular problem into your production version. Of course, if you ++ are eager to test glibc, you can use the snapshot versions in your ++ daily work, but users who have not been consulted about whether they ++ feel like testing glibc should generally have something which is at ++ least as bug free as the last released version. ++ ++ o Providing timely response to your questions, bug reports, and ++ submitted patches will require the glibc development team to allocate ++ time from an already thin time budget. Please try to help us make ++ this time as productive as possible. See the section below about ++ how to submit changes. ++ ++ ++WHO SHOULD TRY THE SNAPSHOTS ++---------------------------- ++ ++Remember, these are snapshots not tested versions. So if you use ++these versions you should be able to ++ ++ o make sure your system stays usable ++ ++ o locate and hopefully fix problems ++ ++ o to port glibc to a new target yourself ++ ++You should not use the snapshots if ++ ++ o your system is needed in a production environment which needs ++ stability ++ ++ o you expect us to fix your problems since you somehow depend on them. ++ You must be willing to fix the problems yourself, we don't want to ++ see "I have problems, fix this" messages. ++ ++ ++HOW TO GET THE SNAPSHOTS ++------------------------ ++ ++At the moment we provide a full snapshot weekly (every sunday), so ++that users getting a snapshot for the first time, or updating after ++a long period of not updating, can get the latest version in a single ++operation. Along with the full snapshot, we will provide incremental ++diffs on a nearly daily basis (whenever code changes). Each daily ++diff will be relative to the source tree after applying all previous ++daily diffs. The daily diffs are for people who have relatively low ++bandwidth ftp or uucp connections. ++ ++The files will be available via anonymous ftp from alpha.gnu.org, in ++directory /gnu/libc and on linux.kernel.org in /pub/software/libs/glibc. The ++directories should look something like: ++ ++ libc-970921.tar.gz ++ libc-970917-970922.diff.gz ++ libc-970922-970925.diff.gz ++ . ++ . ++ . ++ ++Please note that the snapshots on alpha.gnu.org and on ++linux.kernel.org are not always in sync. Patches to some files might ++appear a day a diff earlier or later on alpha than on kernel. ++Use always alpha or always kernel but don't mix them. ++ ++There are sometimes additionally test releases of the add-ons available in ++these directories. If a new version of an add-on is available it is normally ++required for the corresponding snapshot so always pay attention for these. ++ ++Note that we provide GNU gzip compressed files only. You can ftp gzip ++from ftp.gnu.org in directory pub/gnu. ++ ++In some cases the dates for diffs and snapshots do not match like in the ++example above. The full release is for 970921 but the patch is for ++970917-970922. This only means that nothing changed between 970917 and 970922 ++and that you have to use this patch on top of the 970921 snapshot since the ++patch is made on 970922. ++ ++Also, as the gcc developers did with their gcc snapshot system, even though we ++will make the snapshots available on a publically accessible ftp area, we ask ++that recipients not widely publicise their availability. The motivation for ++this request is not to hoard them, but to avoid the situation where the ++general glibc user base naively attempts to use the snapshots, has trouble with ++them, complains publically, and the reputation of glibc declines because of a ++perception of instability or lack of quality control. ++ ++ ++GLIBC TEST SUITE ++---------------- ++ ++A test suite is distributed as an integral part of the snapshots. A simple ++"make check" in your build directory is sufficient to run the tests. glibc ++should pass all tests and if any fails, please report it. A failure might not ++originate from a bug in glibc but also from bugs in the tools, e.g. with gcc ++2.7.2.x the math tests fail some of the tests because of compiler bugs. ++ ++Note that the test suite is still in its infancy. The tests themselves only ++cover a small portion of libc features, and where tests do exist for a feature ++they are not exhaustive. New tests are welcome. ++ ++ ++GETTING HELP, GLIBC DISCUSSIONS, etc ++------------------------------------ ++ ++People who want to help with glibc and who test out snapshots ++regularly should get on the libc-alpha@sourceware.cygnus.com mailing ++list by sending an email to libc-alpha-subscribe@sourceware.cygnus.com. ++This list is meant (as the name suggests) for the discussion of test ++releases and also reports for them. People who are on this list are ++welcome to post questions of general interest. ++ ++People who are not only willing to test the snapshots but instead ++really want to help developing glibc should contact ++libc-hacker-subscribe@sourceware.cygnus.com.org to be put on the developers ++mailing list. This list is really only meant for developers. No ++questions about installation problems or other simple topics are ++wanted nor will they be answered. ++ ++Do *not* send any questions about the snapshots or patches specific to the ++snapshots to bug-glibc@gnu.org. Nobody there will have any idea what ++you are talking about and it will just cause confusion. ++ ++ ++BUG REPORTS ++----------- ++ ++Send bug reports directly to Ulrich Drepper . Please ++do *not* use the glibcbug script for reporting bugs in the snapshots. ++glibcbug should only be used for problems with the official released versions. ++We don't like bug reports in the bug database because otherwise the impression ++of instability or lack of quality control of glibc as a whole might manifest ++in people's mind. ++ ++Note that since no testing is done on the snapshots, and snapshots may even be ++made when glibc is in an inconsistent state, it may not be unusual for an ++occasional snapshot to have a very obvious bug, such as failure to compile on ++*any* machine. It is likely that such bugs will be fixed by the next ++snapshot, so it really isn't necessary to report them unless they persist for ++a couple of days. ++ ++Missing files should always be reported, since they usually mean there is a ++problem with the snapshot-generating process and we won't know about them ++unless someone tells us. ++ ++Bugs which are non-obvious, such as failure to compile on only a specific ++machine, a new machine dependent or obscure bug (particularly one not detected ++by the testsuite), etc should be reported when you discover them, or have a ++suggested patch to fix them. ++ ++ ++FORMAT FOR PATCHES ++------------------ ++ ++If you have a fix for a bug, or an enhancement to submit, send your patch to ++Ulrich Drepper . Here are some simple guidelines for ++submitting patches: ++ ++ o Use "unified diffs" for patches. A typical command for generating ++ context diffs is "diff -ru glibc-old glibc-patched". ++ ++ o Use the "minimalist approach" for patches. That is, each patch ++ should address only one particular bug, new feature, etc. Do not ++ save up many unrelated changes and submit them all in one big ++ patch, since in general, the larger the patch the more difficult ++ it is for us to decide if the patch is either correct or ++ desirable. And if we find something about the patch that needs ++ to be corrected before it can be installed, we would have to reject ++ the entire patch, which might contain changes which otherwise would ++ be accepted if submitted separately. ++ ++ o Submit a sample ChangeLog entry with your patch. See the existing ++ glibc ChangeLog for examples of what a ChangeLog entry should look ++ like. The emacs command ^X4A will create a ChangeLog entry header ++ for you. ++ ++ ++BUILDING SNAPSHOTS ++------------------ ++ ++The `best' way to build glibc is to use an extra directory, e.g.: ++tar xzf libc-970921.tar.gz ++mkdir build-glibc ++cd build-glibc ++../libc-970921/configure ... ++ ++In this way you can easily clean up (since `make clean' doesn't work at ++the moment) and rebuild glibc. ++ ++ ++NECESSARY TOOLS ++--------------- ++ ++For the recommended versions of gcc, binutils, make, texinfo, gettext, ++autoconf and other tools which might be especially needed when using patches, ++please read the file INSTALL. ++ ++ ++HOW CAN YOU HELP ++---------------- ++ ++It helps already a lot if you just install glibc on your system and try to ++solve any problems. You might want to look at the file `PROJECTS' and help ++with one of those projects, fix some bugs (see `BUGS' or the bug database), ++port to an unsupported platform, ... ++ ++ ++FURTHER DOCUMENTATION ++--------------------- ++ ++A lot of questions are answered in the FAQ. The files `INSTALL', `README' and ++`NOTES' contain the most important documentation. Furthermore glibc has its ++own 700+ pages info documentation, ... ++ ++ ++ ++And finally a word of caution: The libc is one of the most fundamental parts ++of your system - and these snapshots are untested and come without any ++guarantee or warranty. You might be lucky and everything works or you might ++crash your system. If you install a glibc snapshot as primary library, you ++should have a backup somewhere. ++ ++On many systems it is also a problem to replace the libc while the system is ++running. In the worst case on broken OSes some systems crash. On better ++systems you can move the old libc aside but removing it will cause problems ++since there are still processes using this libc image and so you might have to ++check the filesystem to get rid of the libc data. One good alternative (which ++is also safer) is to use a chroot'ed environment. ++ ++Thanks for your help and support. ++ ++Thanks to Fred Fish from Cygnus for the original version of this text ++(for GDB). ++ ++ ++Ulrich Drepper +diff -u -udbrN glibc-2.3.2/README.template glibc-2.3.2-200304020432/README.template +--- glibc-2.3.2/README.template Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/README.template Wed Oct 2 23:16:42 2002 +@@ -0,0 +1,87 @@ ++This directory contains the version VERSION release of the GNU C Library. ++Many bugs have been fixed since the last release. ++Some bugs surely remain. ++ ++As of this release, the GNU C library is known to run on the following ++configurations: ++ ++ *-*-gnu GNU Hurd ++ i[3456]86-*-linux-gnu Linux-2.x on Intel ++ m68k-*-linux-gnu Linux-2.x on Motorola 680x0 ++ alpha*-*-linux-gnu Linux-2.x on DEC Alpha ++ powerpc-*-linux-gnu Linux and MkLinux on PowerPC systems ++ powerpc64-*-linux-gnu Linux-2.4.19+ on 64-bit PowerPC systems ++ sparc-*-linux-gnu Linux-2.x on SPARC ++ sparc64-*-linux-gnu Linux-2.x on UltraSPARC 64-bit ++ arm-*-none ARM standalone systems ++ arm-*-linux Linux-2.x on ARM ++ arm-*-linuxaout Linux-2.x on ARM using a.out binaries ++ mips*-*-linux-gnu Linux-2.x on MIPS ++ ia64-*-linux-gnu Linux-2.x on ia64 ++ s390-*-linux-gnu Linux-2.x on IBM S/390 ++ s390x-*-linux-gnu Linux-2.4+ on IBM S/390 64-bit ++ sh-*-linux-gnu Linux-2.x on Super Hitachi ++ cris-*-linux-gnu Linux-2.4+ on CRIS ++ x86-64-*-linux-gnu Linux-2.4+ on x86-64 ++ ++Former releases of this library (version 1.09.1 and perhaps earlier ++versions) used to run on the following configurations: ++ ++ alpha-dec-osf1 ++ i[3456]86-*-bsd4.3 ++ i[3456]86-*-isc2.2 ++ i[3456]86-*-isc3 ++ i[3456]86-*-sco3.2 ++ i[3456]86-*-sco3.2v4 ++ i[3456]86-*-sysv ++ i[3456]86-*-sysv4 ++ i[3456]86-force_cpu386-none ++ i[3456]86-sequent-bsd ++ i960-nindy960-none ++ m68k-hp-bsd4.3 ++ m68k-mvme135-none ++ m68k-mvme136-none ++ m68k-sony-newsos3 ++ m68k-sony-newsos4 ++ m68k-sun-sunos4 ++ mips-dec-ultrix4 ++ mips-sgi-irix4 ++ sparc-sun-solaris2 ++ sparc-sun-sunos4 ++ ++Since no one has volunteered to test and fix the above configurations, ++these are not supported at the moment. It's expected that these don't ++work anymore. Porting the library is not hard. If you are interested ++in doing a port, please contact the glibc maintainers by sending ++electronic mail to . ++ ++There are some add-ons which can be used together with GNU libc. They ++are designed in a way to ease the installation by integrating them in ++the libc source tree. Simply get the add-ons you need and use the ++--enable-add-ons option of the `configure' script to tell where the ++add-ons are found. Please read the FAQ file for more details. ++ ++See the file INSTALL to find out how to configure, build, install, and port ++the GNU C library. You might also consider reading the WWW pages for the ++GNU libc at http://www.gnu.org/software/libc/libc.html. ++ ++The GNU C Library is completely documented by the Texinfo manual found ++in the `manual/' subdirectory. The manual is still being updated and ++contains some known errors and omissions; we regret that we do not ++have the resources to work on the manual as much as we would like. ++Please send comments on the manual to , and ++not to the library bug-reporting address. ++ ++The file NOTES contains a description of the feature-test macros used ++in the GNU C library, explaining how you can tell the library what ++facilities you want it to make available. ++ ++We prefer to get bug reports sent using the `glibcbug' shell script which ++is installed together with the rest of the GNU libc to . ++Simply run this shell script and fill in the information. Nevertheless ++you can still send bug reports to as normal electronic ++mails. ++ ++The GNU C Library is free software. See the file COPYING.LIB for copying ++conditions, and LICENSES for notices about a few contributions that require ++these additional notices to be distributed. +diff -u -udbrN glibc-2.3.2/Versions.def glibc-2.3.2-200304020432/Versions.def +--- glibc-2.3.2/Versions.def Tue Dec 10 20:05:17 2002 ++++ glibc-2.3.2-200304020432/Versions.def Tue Mar 25 21:28:24 2003 +@@ -18,6 +18,7 @@ + GLIBC_2.3 + GLIBC_2.3.1 + GLIBC_2.3.2 ++ GLIBC_2.3.3 + %ifdef USE_IN_LIBIO + HURD_CTHREADS_0.3 + %endif +@@ -32,6 +33,7 @@ + libdl { + GLIBC_2.0 + GLIBC_2.1 ++ GLIBC_2.3.3 + } + libm { + GLIBC_2.0 +@@ -71,6 +73,7 @@ + GLIBC_2.2.3 + GLIBC_2.2.6 + GLIBC_2.3.2 ++ GLIBC_2.3.3 + GLIBC_PRIVATE + } + libresolv { +@@ -82,6 +85,7 @@ + GLIBC_2.1 + GLIBC_2.2 + GLIBC_2.3 ++ GLIBC_2.3.3 + } + libutil { + GLIBC_2.0 +@@ -96,6 +100,7 @@ + GLIBC_2.1.3 + GLIBC_2.2.3 + GLIBC_2.3 ++ GLIBC_2.3.3 + } + libanl { + GLIBC_2.2.3 +diff -u -udbrN glibc-2.3.2/abilist/ld.abilist glibc-2.3.2-200304020432/abilist/ld.abilist +--- glibc-2.3.2/abilist/ld.abilist Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/abilist/ld.abilist Wed Apr 2 06:39:52 2003 +@@ -0,0 +1,35 @@ ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++ GLIBC_2.0 A ++ _r_debug D 0x14 ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __libc_memalign F ++ calloc F ++ free F ++ malloc F ++ realloc F ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++ GLIBC_2.1 A ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ _dl_mcount F ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++ GLIBC_2.2.5 A ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ _r_debug D 0x28 ++GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls ++ GLIBC_2.2 A ++GLIBC_2.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls powerpc64-.*-linux.*/thread s390-.*-linux.*/tls s390x-.*-linux.*/tls x86_64-.*-linux.*/tls ++ GLIBC_2.3 A ++GLIBC_2.3 i.86-.*-linux.*/thread i.86-.*-linux.*/tls ++ ___tls_get_addr F ++GLIBC_2.3 i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls powerpc64-.*-linux.*/thread x86_64-.*-linux.*/tls ++ __tls_get_addr F ++GLIBC_2.3 s390-.*-linux.*/tls s390x-.*-linux.*/tls ++ __tls_get_offset F +diff -u -udbrN glibc-2.3.2/abilist/libBrokenLocale.abilist glibc-2.3.2-200304020432/abilist/libBrokenLocale.abilist +--- glibc-2.3.2/abilist/libBrokenLocale.abilist Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/abilist/libBrokenLocale.abilist Wed Apr 2 06:39:52 2003 +@@ -0,0 +1,13 @@ ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++ GLIBC_2.0 A ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __ctype_get_mb_cur_max F ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++ GLIBC_2.2.5 A ++GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.2 A ++GLIBC_2.3 powerpc64-.*-linux.*/thread ++ GLIBC_2.3 A +diff -u -udbrN glibc-2.3.2/abilist/libanl.abilist glibc-2.3.2-200304020432/abilist/libanl.abilist +--- glibc-2.3.2/abilist/libanl.abilist Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/abilist/libanl.abilist Wed Apr 2 06:39:52 2003 +@@ -0,0 +1,13 @@ ++GLIBC_2.2.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.2.3 A ++GLIBC_2.2.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ gai_cancel F ++ gai_error F ++ gai_suspend F ++ getaddrinfo_a F ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++ GLIBC_2.2.5 A ++GLIBC_2.3 powerpc64-.*-linux.*/thread ++ GLIBC_2.3 A +diff -u -udbrN glibc-2.3.2/abilist/libc.abilist glibc-2.3.2-200304020432/abilist/libc.abilist +--- glibc-2.3.2/abilist/libc.abilist Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/abilist/libc.abilist Wed Apr 2 06:39:52 2003 +@@ -0,0 +1,2231 @@ ++GCC_3.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GCC_3.0 A ++ _Unwind_Find_FDE F ++ __deregister_frame_info_bases F ++ __register_frame_info_bases F ++ __register_frame_info_table_bases F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ++ __fpu_control D 0x2 ++ vm86 F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++ GLIBC_2.0 A ++ _IO_stderr_ D 0x50 ++ _IO_stdin_ D 0x50 ++ _IO_stdout_ D 0x50 ++ __strtoq_internal F ++ __strtouq_internal F ++ _sys_errlist D 0x1ec ++ _sys_siglist D 0x80 ++ res_init F ++ sys_errlist D 0x1ec ++ sys_sigabbrev D 0x80 ++ sys_siglist D 0x80 ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.1.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ getaliasbyname_r F ++ getaliasent_r F ++ getgrent_r F ++ getgrgid_r F ++ getgrnam_r F ++ gethostbyaddr_r F ++ gethostbyname2_r F ++ gethostbyname_r F ++ gethostent_r F ++ getnetbyaddr_r F ++ getnetbyname_r F ++ getnetent_r F ++ getprotobyname_r F ++ getprotobynumber_r F ++ getprotoent_r F ++ getpwent_r F ++ getpwnam_r F ++ getpwuid_r F ++ getrpcbyname_r F ++ getrpcbynumber_r F ++ getrpcent_r F ++ getservbyname_r F ++ getservbyport_r F ++ getservent_r F ++ getspent_r F ++ getspnam_r F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls powerpc64-.*-linux.*/thread s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls x86_64-.*-linux.*/tls ++ _sys_nerr D 0x4 ++ sys_nerr D 0x4 ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ _IO_do_write F ++ _IO_fclose F ++ _IO_fdopen F ++ _IO_file_attach F ++ _IO_file_close_it F ++ _IO_file_fopen F ++ _IO_file_init F ++ _IO_file_overflow F ++ _IO_file_seekoff F ++ _IO_file_setbuf F ++ _IO_file_sync F ++ _IO_file_underflow F ++ _IO_file_write F ++ _IO_file_xsputn F ++ _IO_fopen F ++ _IO_popen F ++ _IO_proc_close F ++ _IO_proc_open F ++ fclose F ++ fdopen F ++ fopen F ++ pclose F ++ popen F ++ pthread_attr_init F ++ tmpfile F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ chown F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ fnmatch F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ _IO_fgetpos F ++ _IO_fsetpos F ++ fgetpos F ++ fopencookie F ++ fsetpos F ++ getrlimit F ++ localeconv F ++ msgctl F ++ semctl F ++ setrlimit F ++ shmctl F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ re_max_failures D 0x4 ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls powerpc64-.*-linux.*/thread s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls x86_64-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ pthread_cond_broadcast F ++ pthread_cond_destroy F ++ pthread_cond_init F ++ pthread_cond_signal F ++ pthread_cond_wait F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls powerpc64-.*-linux.*/thread s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls x86_64-.*-linux.*/tls ++ realpath F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ _IO_adjust_column F ++ _IO_default_doallocate F ++ _IO_default_finish F ++ _IO_default_pbackfail F ++ _IO_default_uflow F ++ _IO_default_xsgetn F ++ _IO_default_xsputn F ++ _IO_doallocbuf F ++ _IO_feof F ++ _IO_ferror F ++ _IO_fflush F ++ _IO_fgets F ++ _IO_file_close F ++ _IO_file_doallocate F ++ _IO_file_open F ++ _IO_file_read F ++ _IO_file_seek F ++ _IO_file_stat F ++ _IO_flockfile F ++ _IO_flush_all F ++ _IO_flush_all_linebuffered F ++ _IO_fprintf F ++ _IO_fputs F ++ _IO_fread F ++ _IO_free_backup_area F ++ _IO_ftell F ++ _IO_ftrylockfile F ++ _IO_funlockfile F ++ _IO_fwrite F ++ _IO_getc F ++ _IO_getline F ++ _IO_gets F ++ _IO_init F ++ _IO_init_marker F ++ _IO_link_in F ++ _IO_marker_delta F ++ _IO_marker_difference F ++ _IO_padn F ++ _IO_peekc_locked F ++ _IO_printf F ++ _IO_putc F ++ _IO_puts F ++ _IO_remove_marker F ++ _IO_seekmark F ++ _IO_seekoff F ++ _IO_seekpos F ++ _IO_setb F ++ _IO_setbuffer F ++ _IO_setvbuf F ++ _IO_sgetn F ++ _IO_sprintf F ++ _IO_sputbackc F ++ _IO_sscanf F ++ _IO_str_init_readonly F ++ _IO_str_init_static F ++ _IO_str_overflow F ++ _IO_str_pbackfail F ++ _IO_str_seekoff F ++ _IO_str_underflow F ++ _IO_sungetc F ++ _IO_switch_to_get_mode F ++ _IO_un_link F ++ _IO_ungetc F ++ _IO_unsave_markers F ++ _IO_vfprintf F ++ _IO_vfscanf F ++ _IO_vsprintf F ++ __adjtimex F ++ __argz_count F ++ __argz_next F ++ __argz_stringify F ++ __assert_fail F ++ __assert_perror_fail F ++ __bsd_getpgrp F ++ __check_rhosts_file D 0x4 ++ __close F ++ __cmsg_nxthdr F ++ __connect F ++ __ctype_get_mb_cur_max F ++ __daylight D 0x4 ++ __dcgettext F ++ __default_morecore F ++ __dgettext F ++ __dup2 F ++ __errno_location F ++ __fcntl F ++ __ffs F ++ __finite F ++ __finitef F ++ __finitel F ++ __fxstat F ++ __getdelim F ++ __getpagesize F ++ __getpgid F ++ __getpid F ++ __gettimeofday F ++ __gmtime_r F ++ __h_errno_location F ++ __isinf F ++ __isinff F ++ __isinfl F ++ __isnan F ++ __isnanf F ++ __isnanl F ++ __iswctype F ++ __ivaliduser F ++ __libc_calloc F ++ __libc_free F ++ __libc_init_first F ++ __libc_mallinfo F ++ __libc_malloc F ++ __libc_mallopt F ++ __libc_memalign F ++ __libc_pvalloc F ++ __libc_realloc F ++ __libc_start_main F ++ __libc_valloc F ++ __lseek F ++ __lxstat F ++ __mbrlen F ++ __mbrtowc F ++ __mempcpy F ++ __monstartup F ++ __nss_configure_lookup F ++ __nss_database_lookup F ++ __nss_group_lookup F ++ __nss_hosts_lookup F ++ __nss_next F ++ __nss_passwd_lookup F ++ __open F ++ __overflow F ++ __pipe F ++ __printf_fp F ++ __profile_frequency F ++ __read F ++ __res_randomid F ++ __sbrk F ++ __sched_get_priority_max F ++ __sched_get_priority_min F ++ __sched_getparam F ++ __sched_getscheduler F ++ __sched_setscheduler F ++ __sched_yield F ++ __secure_getenv F ++ __select F ++ __send F ++ __setpgid F ++ __sigaction F ++ __sigaddset F ++ __sigdelset F ++ __sigismember F ++ __sigpause F ++ __sigsetjmp F ++ __stpcpy F ++ __stpncpy F ++ __strcasecmp F ++ __strdup F ++ __strerror_r F ++ __strtod_internal F ++ __strtof_internal F ++ __strtok_r F ++ __strtol_internal F ++ __strtold_internal F ++ __strtoll_internal F ++ __strtoul_internal F ++ __strtoull_internal F ++ __sysv_signal F ++ __uflow F ++ __underflow F ++ __vfscanf F ++ __vsnprintf F ++ __vsscanf F ++ __wait F ++ __waitpid F ++ __wcstod_internal F ++ __wcstof_internal F ++ __wcstol_internal F ++ __wcstold_internal F ++ __wcstoll_internal F ++ __wcstoul_internal F ++ __wcstoull_internal F ++ __write F ++ __xmknod F ++ __xpg_basename F ++ __xstat F ++ _exit F ++ _libc_intl_domainname D 0x5 ++ _longjmp F ++ _mcleanup F ++ _mcount F ++ _nl_msg_cat_cntr D 0x4 ++ _obstack_allocated_p F ++ _obstack_begin F ++ _obstack_begin_1 F ++ _obstack_free F ++ _obstack_memory_used F ++ _obstack_newchunk F ++ _rpc_dtablesize F ++ _seterr_reply F ++ _setjmp F ++ _tolower F ++ _toupper F ++ a64l F ++ abort F ++ abs F ++ accept F ++ access F ++ acct F ++ addmntent F ++ adjtime F ++ adjtimex F ++ advance F ++ alarm F ++ alphasort F ++ argz_add F ++ argz_add_sep F ++ argz_append F ++ argz_count F ++ argz_create F ++ argz_create_sep F ++ argz_delete F ++ argz_extract F ++ argz_insert F ++ argz_next F ++ argz_replace F ++ argz_stringify F ++ asctime F ++ asctime_r F ++ asprintf F ++ atof F ++ atoi F ++ atol F ++ atoll F ++ authnone_create F ++ authunix_create F ++ authunix_create_default F ++ basename F ++ bcmp F ++ bcopy F ++ bdflush F ++ bind F ++ bindresvport F ++ bindtextdomain F ++ brk F ++ bsd_signal F ++ bsearch F ++ btowc F ++ bzero F ++ calloc F ++ callrpc F ++ canonicalize_file_name F ++ catclose F ++ catgets F ++ catopen F ++ cfgetispeed F ++ cfgetospeed F ++ cfmakeraw F ++ cfree F ++ cfsetispeed F ++ cfsetospeed F ++ cfsetspeed F ++ chdir F ++ chflags F ++ chmod F ++ chroot F ++ clearenv F ++ clearerr F ++ clearerr_unlocked F ++ clnt_broadcast F ++ clnt_create F ++ clnt_pcreateerror F ++ clnt_perrno F ++ clnt_perror F ++ clnt_spcreateerror F ++ clnt_sperrno F ++ clnt_sperror F ++ clntraw_create F ++ clnttcp_create F ++ clntudp_bufcreate F ++ clntudp_create F ++ clock F ++ close F ++ closedir F ++ closelog F ++ confstr F ++ connect F ++ copysign F ++ copysignf F ++ copysignl F ++ creat F ++ create_module F ++ ctermid F ++ ctime F ++ ctime_r F ++ cuserid F ++ daemon F ++ daylight D 0x4 ++ dcgettext F ++ delete_module F ++ dgettext F ++ difftime F ++ dirfd F ++ dirname F ++ div F ++ dprintf F ++ drand48 F ++ drand48_r F ++ dup F ++ dup2 F ++ dysize F ++ ecvt F ++ ecvt_r F ++ endaliasent F ++ endfsent F ++ endgrent F ++ endhostent F ++ endmntent F ++ endnetent F ++ endnetgrent F ++ endprotoent F ++ endpwent F ++ endrpcent F ++ endservent F ++ endspent F ++ endttyent F ++ endusershell F ++ endutent F ++ envz_add F ++ envz_entry F ++ envz_get F ++ envz_merge F ++ envz_remove F ++ envz_strip F ++ erand48 F ++ erand48_r F ++ err F ++ error F ++ error_at_line F ++ error_message_count D 0x4 ++ error_one_per_line D 0x4 ++ errx F ++ ether_aton F ++ ether_aton_r F ++ ether_hostton F ++ ether_line F ++ ether_ntoa F ++ ether_ntoa_r F ++ ether_ntohost F ++ euidaccess F ++ execl F ++ execle F ++ execlp F ++ execv F ++ execve F ++ execvp F ++ exit F ++ fchdir F ++ fchflags F ++ fchmod F ++ fchown F ++ fcloseall F ++ fcntl F ++ fcvt F ++ fcvt_r F ++ fdatasync F ++ feof F ++ feof_unlocked F ++ ferror F ++ ferror_unlocked F ++ fexecve F ++ fflush F ++ fflush_unlocked F ++ ffs F ++ fgetc F ++ fgetgrent F ++ fgetgrent_r F ++ fgetpwent F ++ fgetpwent_r F ++ fgets F ++ fgetspent F ++ fgetspent_r F ++ fileno F ++ fileno_unlocked F ++ finite F ++ finitef F ++ finitel F ++ flock F ++ flockfile F ++ fork F ++ fpathconf F ++ fprintf F ++ fputc F ++ fputc_unlocked F ++ fputs F ++ fread F ++ free F ++ freeaddrinfo F ++ freopen F ++ frexp F ++ frexpf F ++ frexpl F ++ fscanf F ++ fseek F ++ fstatfs F ++ fsync F ++ ftell F ++ ftime F ++ ftok F ++ ftruncate F ++ ftrylockfile F ++ fts_children F ++ fts_close F ++ fts_open F ++ fts_read F ++ fts_set F ++ ftw F ++ funlockfile F ++ fwrite F ++ gcvt F ++ get_avphys_pages F ++ get_current_dir_name F ++ get_kernel_syms F ++ get_myaddress F ++ get_nprocs F ++ get_nprocs_conf F ++ get_phys_pages F ++ getaddrinfo F ++ getaliasbyname F ++ getaliasent F ++ getc F ++ getc_unlocked F ++ getchar F ++ getchar_unlocked F ++ getcwd F ++ getdelim F ++ getdirentries F ++ getdomainname F ++ getdtablesize F ++ getegid F ++ getenv F ++ geteuid F ++ getfsent F ++ getfsfile F ++ getfsspec F ++ getgid F ++ getgrent F ++ getgrgid F ++ getgrnam F ++ getgroups F ++ gethostbyaddr F ++ gethostbyname F ++ gethostbyname2 F ++ gethostent F ++ gethostid F ++ gethostname F ++ getitimer F ++ getline F ++ getlogin F ++ getlogin_r F ++ getmntent F ++ getmntent_r F ++ getnetbyaddr F ++ getnetbyname F ++ getnetent F ++ getnetgrent F ++ getnetgrent_r F ++ getopt F ++ getopt_long F ++ getopt_long_only F ++ getpagesize F ++ getpass F ++ getpeername F ++ getpgid F ++ getpgrp F ++ getpid F ++ getppid F ++ getpriority F ++ getprotobyname F ++ getprotobynumber F ++ getprotoent F ++ getpublickey F ++ getpw F ++ getpwent F ++ getpwnam F ++ getpwuid F ++ getresgid F ++ getresuid F ++ getrpcbyname F ++ getrpcbynumber F ++ getrpcent F ++ getrpcport F ++ getrusage F ++ gets F ++ getsecretkey F ++ getservbyname F ++ getservbyport F ++ getservent F ++ getsid F ++ getsockname F ++ getsockopt F ++ getspent F ++ getspnam F ++ getsubopt F ++ gettext F ++ gettimeofday F ++ getttyent F ++ getttynam F ++ getuid F ++ getusershell F ++ getutent F ++ getutent_r F ++ getutid F ++ getutid_r F ++ getutline F ++ getutline_r F ++ getw F ++ getwd F ++ glob F ++ glob_pattern_p F ++ globfree F ++ gmtime F ++ gmtime_r F ++ group_member F ++ gsignal F ++ gtty F ++ h_nerr D 0x4 ++ hasmntopt F ++ hcreate F ++ hcreate_r F ++ hdestroy F ++ hdestroy_r F ++ herror F ++ hsearch F ++ hsearch_r F ++ hstrerror F ++ htonl F ++ htons F ++ index F ++ inet_addr F ++ inet_aton F ++ inet_lnaof F ++ inet_makeaddr F ++ inet_netof F ++ inet_network F ++ inet_nsap_addr F ++ inet_nsap_ntoa F ++ inet_ntoa F ++ inet_ntop F ++ inet_pton F ++ init_module F ++ initgroups F ++ initstate F ++ initstate_r F ++ innetgr F ++ insque F ++ ioctl F ++ iruserok F ++ isalnum F ++ isalpha F ++ isascii F ++ isatty F ++ isblank F ++ iscntrl F ++ isdigit F ++ isfdtype F ++ isgraph F ++ isinf F ++ isinff F ++ isinfl F ++ islower F ++ isnan F ++ isnanf F ++ isnanl F ++ isprint F ++ ispunct F ++ isspace F ++ isupper F ++ iswalnum F ++ iswalpha F ++ iswcntrl F ++ iswctype F ++ iswdigit F ++ iswgraph F ++ iswlower F ++ iswprint F ++ iswpunct F ++ iswspace F ++ iswupper F ++ iswxdigit F ++ isxdigit F ++ jrand48 F ++ jrand48_r F ++ kill F ++ killpg F ++ klogctl F ++ l64a F ++ labs F ++ lchown F ++ lckpwdf F ++ lcong48 F ++ lcong48_r F ++ ldexp F ++ ldexpf F ++ ldexpl F ++ ldiv F ++ lfind F ++ link F ++ listen F ++ llabs F ++ lldiv F ++ llseek F ++ localtime F ++ localtime_r F ++ lockf F ++ longjmp F ++ lrand48 F ++ lrand48_r F ++ lsearch F ++ lseek F ++ madvise F ++ mallinfo F ++ malloc F ++ malloc_get_state F ++ malloc_set_state F ++ malloc_stats F ++ malloc_trim F ++ malloc_usable_size F ++ mallopt F ++ mblen F ++ mbrlen F ++ mbrtowc F ++ mbsinit F ++ mbsnrtowcs F ++ mbsrtowcs F ++ mbstowcs F ++ mbtowc F ++ mcheck F ++ memalign F ++ memccpy F ++ memchr F ++ memcmp F ++ memcpy F ++ memfrob F ++ memmem F ++ memmove F ++ memset F ++ mkdir F ++ mkfifo F ++ mkstemp F ++ mktemp F ++ mktime F ++ mlock F ++ mlockall F ++ mmap F ++ modf F ++ modff F ++ modfl F ++ monstartup F ++ mount F ++ mprobe F ++ mprotect F ++ mrand48 F ++ mrand48_r F ++ mremap F ++ msgget F ++ msgrcv F ++ msgsnd F ++ msync F ++ mtrace F ++ munlock F ++ munlockall F ++ munmap F ++ muntrace F ++ nanosleep F ++ nfsservctl F ++ nice F ++ nl_langinfo F ++ nrand48 F ++ nrand48_r F ++ ntohl F ++ ntohs F ++ obstack_exit_failure D 0x4 ++ obstack_free F ++ obstack_printf F ++ obstack_vprintf F ++ on_exit F ++ open F ++ open_memstream F ++ opendir F ++ openlog F ++ opterr D 0x4 ++ optind D 0x4 ++ optopt D 0x4 ++ parse_printf_format F ++ pathconf F ++ pause F ++ perror F ++ personality F ++ pipe F ++ pmap_getmaps F ++ pmap_getport F ++ pmap_rmtcall F ++ pmap_set F ++ pmap_unset F ++ poll F ++ prctl F ++ printf F ++ profil F ++ pselect F ++ psignal F ++ pthread_attr_destroy F ++ pthread_attr_getdetachstate F ++ pthread_attr_getinheritsched F ++ pthread_attr_getschedparam F ++ pthread_attr_getschedpolicy F ++ pthread_attr_getscope F ++ pthread_attr_setdetachstate F ++ pthread_attr_setinheritsched F ++ pthread_attr_setschedparam F ++ pthread_attr_setschedpolicy F ++ pthread_attr_setscope F ++ pthread_condattr_destroy F ++ pthread_condattr_init F ++ pthread_equal F ++ pthread_exit F ++ pthread_getschedparam F ++ pthread_mutex_destroy F ++ pthread_mutex_init F ++ pthread_mutex_lock F ++ pthread_mutex_unlock F ++ pthread_self F ++ pthread_setcancelstate F ++ pthread_setcanceltype F ++ pthread_setschedparam F ++ ptrace F ++ putc F ++ putc_unlocked F ++ putchar F ++ putchar_unlocked F ++ putenv F ++ putpwent F ++ puts F ++ putspent F ++ pututline F ++ putw F ++ pvalloc F ++ qecvt F ++ qecvt_r F ++ qfcvt F ++ qfcvt_r F ++ qgcvt F ++ qsort F ++ query_module F ++ quotactl F ++ raise F ++ rand F ++ rand_r F ++ random F ++ random_r F ++ rcmd F ++ re_comp F ++ re_compile_fastmap F ++ re_compile_pattern F ++ re_exec F ++ re_match F ++ re_match_2 F ++ re_search F ++ re_search_2 F ++ re_set_registers F ++ re_set_syntax F ++ read F ++ readdir F ++ readdir_r F ++ readlink F ++ readv F ++ realloc F ++ reboot F ++ recv F ++ recvfrom F ++ recvmsg F ++ regcomp F ++ regerror F ++ regexec F ++ regfree F ++ register_printf_function F ++ registerrpc F ++ remove F ++ remque F ++ rename F ++ revoke F ++ rewind F ++ rewinddir F ++ rexec F ++ rexecoptions D 0x4 ++ rindex F ++ rmdir F ++ rpmatch F ++ rresvport F ++ ruserok F ++ ruserpass F ++ sbrk F ++ scalbn F ++ scalbnf F ++ scalbnl F ++ scandir F ++ scanf F ++ sched_get_priority_max F ++ sched_get_priority_min F ++ sched_getparam F ++ sched_getscheduler F ++ sched_rr_get_interval F ++ sched_setparam F ++ sched_setscheduler F ++ sched_yield F ++ seed48 F ++ seed48_r F ++ seekdir F ++ select F ++ semget F ++ semop F ++ send F ++ sendmsg F ++ sendto F ++ setaliasent F ++ setbuf F ++ setbuffer F ++ setcontext F ++ setdomainname F ++ setegid F ++ setenv F ++ seteuid F ++ setfsent F ++ setfsgid F ++ setfsuid F ++ setgid F ++ setgrent F ++ setgroups F ++ sethostent F ++ sethostid F ++ sethostname F ++ setitimer F ++ setjmp F ++ setlinebuf F ++ setlocale F ++ setlogin F ++ setlogmask F ++ setmntent F ++ setnetent F ++ setnetgrent F ++ setpgid F ++ setpgrp F ++ setpriority F ++ setprotoent F ++ setpwent F ++ setregid F ++ setresgid F ++ setresuid F ++ setreuid F ++ setrpcent F ++ setservent F ++ setsid F ++ setsockopt F ++ setspent F ++ setstate F ++ setstate_r F ++ settimeofday F ++ setttyent F ++ setuid F ++ setusershell F ++ setutent F ++ setvbuf F ++ sgetspent F ++ sgetspent_r F ++ shmat F ++ shmdt F ++ shmget F ++ shutdown F ++ sigaction F ++ sigaddset F ++ sigaltstack F ++ sigandset F ++ sigblock F ++ sigdelset F ++ sigemptyset F ++ sigfillset F ++ siggetmask F ++ siginterrupt F ++ sigisemptyset F ++ sigismember F ++ siglongjmp F ++ signal F ++ sigorset F ++ sigpause F ++ sigpending F ++ sigprocmask F ++ sigreturn F ++ sigsetmask F ++ sigstack F ++ sigsuspend F ++ sigvec F ++ sigwait F ++ sleep F ++ snprintf F ++ socket F ++ socketpair F ++ sprintf F ++ srand F ++ srand48 F ++ srand48_r F ++ srandom F ++ srandom_r F ++ sscanf F ++ ssignal F ++ sstk F ++ statfs F ++ step F ++ stime F ++ stpcpy F ++ stpncpy F ++ strcasecmp F ++ strcat F ++ strchr F ++ strcmp F ++ strcoll F ++ strcpy F ++ strcspn F ++ strdup F ++ strerror F ++ strerror_r F ++ strfmon F ++ strfry F ++ strftime F ++ strlen F ++ strncasecmp F ++ strncat F ++ strncmp F ++ strncpy F ++ strndup F ++ strnlen F ++ strpbrk F ++ strptime F ++ strrchr F ++ strsep F ++ strsignal F ++ strspn F ++ strstr F ++ strtod F ++ strtof F ++ strtok F ++ strtok_r F ++ strtol F ++ strtold F ++ strtoll F ++ strtoq F ++ strtoul F ++ strtoull F ++ strtouq F ++ strxfrm F ++ stty F ++ svc_exit F ++ svc_fdset D 0x80 ++ svc_getreq F ++ svc_getreqset F ++ svc_register F ++ svc_run F ++ svc_sendreply F ++ svc_unregister F ++ svcerr_auth F ++ svcerr_decode F ++ svcerr_noproc F ++ svcerr_noprog F ++ svcerr_progvers F ++ svcerr_systemerr F ++ svcerr_weakauth F ++ svcfd_create F ++ svcraw_create F ++ svctcp_create F ++ svcudp_bufcreate F ++ svcudp_create F ++ svcudp_enablecache F ++ swab F ++ swapoff F ++ swapon F ++ symlink F ++ sync F ++ syscall F ++ sysconf F ++ sysctl F ++ sysinfo F ++ syslog F ++ system F ++ tcdrain F ++ tcflow F ++ tcflush F ++ tcgetattr F ++ tcgetpgrp F ++ tcsendbreak F ++ tcsetattr F ++ tcsetpgrp F ++ tdelete F ++ telldir F ++ tempnam F ++ textdomain F ++ tfind F ++ time F ++ timegm F ++ timelocal F ++ times F ++ tmpnam F ++ tmpnam_r F ++ toascii F ++ tolower F ++ toupper F ++ towctrans F ++ towlower F ++ towupper F ++ tr_break F ++ truncate F ++ tsearch F ++ ttyname F ++ ttyname_r F ++ ttyslot F ++ twalk F ++ tzset F ++ ualarm F ++ ulckpwdf F ++ ulimit F ++ umask F ++ umount F ++ uname F ++ ungetc F ++ unlink F ++ unsetenv F ++ updwtmp F ++ uselib F ++ usleep F ++ ustat F ++ utime F ++ utimes F ++ utmpname F ++ valloc F ++ vasprintf F ++ vdprintf F ++ verr F ++ verrx F ++ vfork F ++ vfprintf F ++ vfscanf F ++ vhangup F ++ vlimit F ++ vprintf F ++ vscanf F ++ vsnprintf F ++ vsprintf F ++ vsscanf F ++ vsyslog F ++ vtimes F ++ vwarn F ++ vwarnx F ++ wait F ++ wait3 F ++ wait4 F ++ waitpid F ++ warn F ++ warnx F ++ wcpcpy F ++ wcpncpy F ++ wcrtomb F ++ wcscat F ++ wcschr F ++ wcscmp F ++ wcscoll F ++ wcscpy F ++ wcscspn F ++ wcsdup F ++ wcslen F ++ wcsncat F ++ wcsncmp F ++ wcsncpy F ++ wcsnrtombs F ++ wcspbrk F ++ wcsrchr F ++ wcsrtombs F ++ wcsspn F ++ wcsstr F ++ wcstod F ++ wcstof F ++ wcstok F ++ wcstol F ++ wcstold F ++ wcstombs F ++ wcstoq F ++ wcstoul F ++ wcstouq F ++ wcswidth F ++ wcsxfrm F ++ wctob F ++ wctomb F ++ wctrans F ++ wctype F ++ wcwidth F ++ wmemchr F ++ wmemcmp F ++ wmemcpy F ++ wmemmove F ++ wmemset F ++ write F ++ writev F ++ xdr_accepted_reply F ++ xdr_array F ++ xdr_authunix_parms F ++ xdr_bool F ++ xdr_bytes F ++ xdr_callhdr F ++ xdr_callmsg F ++ xdr_char F ++ xdr_cryptkeyarg F ++ xdr_cryptkeyarg2 F ++ xdr_cryptkeyres F ++ xdr_des_block F ++ xdr_double F ++ xdr_enum F ++ xdr_float F ++ xdr_free F ++ xdr_int F ++ xdr_key_netstarg F ++ xdr_key_netstres F ++ xdr_keybuf F ++ xdr_keystatus F ++ xdr_long F ++ xdr_netobj F ++ xdr_opaque F ++ xdr_opaque_auth F ++ xdr_pmap F ++ xdr_pmaplist F ++ xdr_pointer F ++ xdr_reference F ++ xdr_rejected_reply F ++ xdr_replymsg F ++ xdr_rmtcall_args F ++ xdr_rmtcallres F ++ xdr_short F ++ xdr_string F ++ xdr_u_char F ++ xdr_u_int F ++ xdr_u_long F ++ xdr_u_short F ++ xdr_union F ++ xdr_vector F ++ xdr_void F ++ xdr_wrapstring F ++ xdrmem_create F ++ xdrrec_create F ++ xdrrec_endofrecord F ++ xdrrec_eof F ++ xdrrec_skiprecord F ++ xdrstdio_create F ++ xencrypt F ++ xprt_register F ++ xprt_unregister F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __fork F ++ _nl_default_dirname D 0x12 ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __bzero F ++ __clone F ++ clone F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls ++ __divdi3 F ++ __moddi3 F ++ __udivdi3 F ++ __umoddi3 F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ atexit F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2 s390x-.*-linux.*/tls ++ __deregister_frame F ++ __frame_state_for F ++ __register_frame F ++ __register_frame_info_table F ++ __register_frame_table F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2 s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ __deregister_frame_info F ++ __register_frame_info F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2 sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ _IO_file_jumps D 0x54 ++ _IO_list_all D 0x4 ++ __after_morecore_hook D 0x4 ++ __ctype32_b D 0x4 ++ __ctype_b D 0x4 ++ __ctype_tolower D 0x4 ++ __ctype_toupper D 0x4 ++ __curbrk D 0x4 ++ __environ D 0x4 ++ __free_hook D 0x4 ++ __malloc_hook D 0x4 ++ __malloc_initialize_hook D 0x4 ++ __memalign_hook D 0x4 ++ __morecore D 0x4 ++ __progname D 0x4 ++ __progname_full D 0x4 ++ __rcmd_errstr D 0x4 ++ __realloc_hook D 0x4 ++ __timezone D 0x4 ++ __tzname D 0x8 ++ _environ D 0x4 ++ _nl_domain_bindings D 0x4 ++ _null_auth D 0xc ++ _obstack D 0x4 ++ environ D 0x4 ++ error_print_progname D 0x4 ++ h_errlist D 0x14 ++ loc1 D 0x4 ++ loc2 D 0x4 ++ locs D 0x4 ++ mallwatch D 0x4 ++ obstack_alloc_failed_handler D 0x4 ++ optarg D 0x4 ++ program_invocation_name D 0x4 ++ program_invocation_short_name D 0x4 ++ re_syntax_options D 0x4 ++ rpc_createerr D 0x10 ++ stderr D 0x4 ++ stdin D 0x4 ++ stdout D 0x4 ++ svcauthdes_stats D 0xc ++ timezone D 0x4 ++ tzname D 0x8 ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls s390-.*-linux.*/tls ++ ___brk_addr D 0x4 ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ mcount F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls ++ ioperm F ++ iopl F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls ++ _errno D 0x4 ++ _h_errno D 0x4 ++ errno D 0x4 ++ h_errno D 0x4 ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/tls powerpc-.*-linux.*/notls powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2 sh[34].*-.*-linux.*/notls ++ _res D 0x200 ++GLIBC_2.0 m68.*-.*-linux.*/notls ++ _res D 0x1fe ++ cacheflush F ++GLIBC_2.0 m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __fpu_control D 0x4 ++GLIBC_2.0 powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls ++ __ashldi3 F ++ __ashrdi3 F ++ __cmpdi2 F ++ __fixdfdi F ++ __fixsfdi F ++ __fixunsdfdi F ++ __fixunssfdi F ++ __floatdidf F ++ __floatdisf F ++ __lshrdi3 F ++ __ucmpdi2 F ++GLIBC_2.1.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ++ __memcpy_by2 F ++ __memcpy_by4 F ++ __memcpy_g F ++ __mempcpy_by2 F ++ __mempcpy_by4 F ++ __mempcpy_byn F ++ __memset_ccn_by2 F ++ __memset_ccn_by4 F ++ __memset_gcn_by2 F ++ __memset_gcn_by4 F ++ __stpcpy_g F ++ __strcat_c F ++ __strcat_g F ++ __strchr_c F ++ __strchr_g F ++ __strchrnul_c F ++ __strchrnul_g F ++ __strcmp_gg F ++ __strcpy_g F ++ __strcspn_cg F ++ __strcspn_g F ++ __strlen_g F ++ __strncat_g F ++ __strncmp_g F ++ __strncpy_by2 F ++ __strncpy_by4 F ++ __strncpy_byn F ++ __strncpy_gg F ++ __strpbrk_cg F ++ __strpbrk_g F ++ __strrchr_c F ++ __strrchr_g F ++ __strspn_cg F ++ __strspn_g F ++ __strstr_cg F ++ __strstr_g F ++GLIBC_2.1.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++ GLIBC_2.1.1 A ++GLIBC_2.1.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ _Exit F ++ __mempcpy_small F ++ __stpcpy_small F ++ __strcpy_small F ++ __strcspn_c1 F ++ __strcspn_c2 F ++ __strcspn_c3 F ++ __strpbrk_c2 F ++ __strpbrk_c3 F ++ __strsep_1c F ++ __strsep_2c F ++ __strsep_3c F ++ __strsep_g F ++ __strspn_c1 F ++ __strspn_c2 F ++ __strspn_c3 F ++ __strtok_r_1c F ++ __strverscmp F ++ getutmp F ++ getutmpx F ++ imaxabs F ++ imaxdiv F ++ strchrnul F ++ xdr_hyper F ++ xdr_int64_t F ++ xdr_longlong_t F ++ xdr_u_hyper F ++ xdr_u_longlong_t F ++ xdr_uint64_t F ++GLIBC_2.1.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++ GLIBC_2.1.2 A ++GLIBC_2.1.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __vfork F ++GLIBC_2.1.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++ GLIBC_2.1.3 A ++GLIBC_2.1.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __cxa_atexit F ++ __cxa_finalize F ++ __sigsuspend F ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls ++ scalbln F ++ scalblnf F ++ scalblnl F ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++ GLIBC_2.1 A ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.2 ia64-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ wordexp F ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ _IO_fgetpos64 F ++ _IO_fsetpos64 F ++ __fxstat64 F ++ __lxstat64 F ++ __xstat64 F ++ fgetpos64 F ++ fsetpos64 F ++ getrlimit64 F ++ readdir64 F ++ readdir64_r F ++ scandir64 F ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ glob64 F ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ alphasort64 F ++ versionsort64 F ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ _IO_file_finish F ++ _IO_getline_info F ++ __asprintf F ++ __backtrace F ++ __backtrace_symbols F ++ __backtrace_symbols_fd F ++ __duplocale F ++ __freelocale F ++ __isalnum_l F ++ __isalpha_l F ++ __isascii_l F ++ __isblank_l F ++ __iscntrl_l F ++ __isdigit_l F ++ __isgraph_l F ++ __islower_l F ++ __isprint_l F ++ __ispunct_l F ++ __isspace_l F ++ __isupper_l F ++ __iswalnum_l F ++ __iswalpha_l F ++ __iswblank_l F ++ __iswcntrl_l F ++ __iswctype_l F ++ __iswdigit_l F ++ __iswgraph_l F ++ __iswlower_l F ++ __iswprint_l F ++ __iswpunct_l F ++ __iswspace_l F ++ __iswupper_l F ++ __iswxdigit_l F ++ __isxdigit_l F ++ __libc_allocate_rtsig F ++ __libc_current_sigrtmax F ++ __libc_current_sigrtmin F ++ __libc_freeres F ++ __libc_sa_len F ++ __newlocale F ++ __poll F ++ __pread64 F ++ __pwrite64 F ++ __rawmemchr F ++ __signbit F ++ __signbitf F ++ __strcasecmp_l F ++ __strcasestr F ++ __strcoll_l F ++ __strfmon_l F ++ __strncasecmp_l F ++ __strtod_l F ++ __strtof_l F ++ __strtol_l F ++ __strtold_l F ++ __strtoll_l F ++ __strtoul_l F ++ __strtoull_l F ++ __strxfrm_l F ++ __toascii_l F ++ __tolower_l F ++ __toupper_l F ++ __towctrans F ++ __towctrans_l F ++ __towlower_l F ++ __towupper_l F ++ __wcscasecmp_l F ++ __wcscoll_l F ++ __wcsncasecmp_l F ++ __wcstod_l F ++ __wcstof_l F ++ __wcstol_l F ++ __wcstold_l F ++ __wcstoll_l F ++ __wcstoul_l F ++ __wcstoull_l F ++ __wcsxfrm_l F ++ __wctype_l F ++ _argp_unlock_xxx F ++ _authenticate F ++ _dl_mcount_wrapper F ++ _dl_mcount_wrapper_check F ++ addseverity F ++ argp_err_exit_status D 0x4 ++ argp_error F ++ argp_failure F ++ argp_help F ++ argp_parse F ++ argp_state_help F ++ argp_usage F ++ authdes_create F ++ authdes_getucred F ++ authdes_pk_create F ++ backtrace F ++ backtrace_symbols F ++ backtrace_symbols_fd F ++ capget F ++ capset F ++ cbc_crypt F ++ clntunix_create F ++ creat64 F ++ des_setparity F ++ ecb_crypt F ++ endutxent F ++ fattach F ++ fdetach F ++ ffsl F ++ ffsll F ++ fgetc_unlocked F ++ fgets_unlocked F ++ fmtmsg F ++ fopen64 F ++ fputs_unlocked F ++ fread_unlocked F ++ freopen64 F ++ fseeko F ++ fseeko64 F ++ fstatfs64 F ++ fstatvfs F ++ fstatvfs64 F ++ ftello F ++ ftello64 F ++ ftruncate64 F ++ ftw64 F ++ fwrite_unlocked F ++ gai_strerror F ++ getcontext F ++ getdate F ++ getdate_err D 0x4 ++ getdate_r F ++ getmsg F ++ getnameinfo F ++ getnetname F ++ getpmsg F ++ getpt F ++ getutxent F ++ getutxid F ++ getutxline F ++ globfree64 F ++ gnu_get_libc_release F ++ gnu_get_libc_version F ++ grantpt F ++ host2netname F ++ iconv F ++ iconv_close F ++ iconv_open F ++ if_freenameindex F ++ if_indextoname F ++ if_nameindex F ++ if_nametoindex F ++ in6addr_any D 0x10 ++ in6addr_loopback D 0x10 ++ isastream F ++ iswblank F ++ key_decryptsession F ++ key_decryptsession_pk F ++ key_encryptsession F ++ key_encryptsession_pk F ++ key_gendes F ++ key_get_conv F ++ key_secretkey_is_set F ++ key_setnet F ++ key_setsecret F ++ lockf64 F ++ lseek64 F ++ makecontext F ++ mempcpy F ++ mmap64 F ++ netname2host F ++ netname2user F ++ nftw F ++ nftw64 F ++ ntp_adjtime F ++ ntp_gettime F ++ open64 F ++ passwd2des F ++ pread F ++ pread64 F ++ printf_size F ++ printf_size_info F ++ ptsname F ++ ptsname_r F ++ putgrent F ++ putmsg F ++ putpmsg F ++ pututxline F ++ pwrite F ++ pwrite64 F ++ rawmemchr F ++ rtime F ++ sendfile F ++ setrlimit64 F ++ setutxent F ++ sighold F ++ sigignore F ++ sigqueue F ++ sigrelse F ++ sigset F ++ sigtimedwait F ++ sigwaitinfo F ++ statfs64 F ++ statvfs F ++ statvfs64 F ++ strcasestr F ++ strtoimax F ++ strtoumax F ++ strverscmp F ++ svcunix_create F ++ svcunixfd_create F ++ swapcontext F ++ sysv_signal F ++ tcgetsid F ++ tdestroy F ++ tmpfile64 F ++ truncate64 F ++ umount2 F ++ unlockpt F ++ updwtmpx F ++ user2netname F ++ utmpxname F ++ versionsort F ++ waitid F ++ wcscasecmp F ++ wcsncasecmp F ++ wcsnlen F ++ wcstoimax F ++ wcstoll F ++ wcstoull F ++ wcstoumax F ++ wcswcs F ++ wordfree F ++ xdecrypt F ++ xdr_authdes_cred F ++ xdr_authdes_verf F ++ xdr_getcredres F ++ xdr_int16_t F ++ xdr_int32_t F ++ xdr_int8_t F ++ xdr_netnamestr F ++ xdr_sizeof F ++ xdr_uint16_t F ++ xdr_uint32_t F ++ xdr_uint8_t F ++ xdr_unixcred F ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2 sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ __key_decryptsession_pk_LOCAL D 0x4 ++ __key_encryptsession_pk_LOCAL D 0x4 ++ __key_gendes_LOCAL D 0x4 ++ _sys_errlist D 0x1f4 ++ _sys_siglist D 0x100 ++ argp_program_bug_address D 0x4 ++ argp_program_version D 0x4 ++ argp_program_version_hook D 0x4 ++ sys_errlist D 0x1f4 ++ sys_sigabbrev D 0x100 ++ sys_siglist D 0x100 ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls ++ __signbitl F ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls ++| GLIBC_2.2 sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ _IO_2_1_stderr_ D 0x98 ++ _IO_2_1_stdin_ D 0x98 ++ _IO_2_1_stdout_ D 0x98 ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++ modify_ldt F ++GLIBC_2.1 powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++ _IO_2_1_stderr_ D 0xa0 ++ _IO_2_1_stdin_ D 0xa0 ++ _IO_2_1_stdout_ D 0xa0 ++GLIBC_2.1 s390-.*-linux.*/tls ++ __chown F ++GLIBC_2.2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.2.1 A ++GLIBC_2.2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ pivot_root F ++ posix_openpt F ++GLIBC_2.2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.2.2 A ++GLIBC_2.2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __nss_hostname_digits_dots F ++GLIBC_2.2.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.2.3 A ++GLIBC_2.2.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __rpc_thread_createerr F ++ __rpc_thread_svc_fdset F ++ __rpc_thread_svc_max_pollfd F ++ __rpc_thread_svc_pollfd F ++ sprofil F ++GLIBC_2.2.4 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.2.4 A ++GLIBC_2.2.4 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ dl_iterate_phdr F ++ getgrouplist F ++ sockatmark F ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++ GLIBC_2.2.5 A ++ __arch_prctl F ++ arch_prctl F ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ _IO_adjust_wcolumn F ++ _IO_free_wbackup_area F ++ _IO_init_wmarker F ++ _IO_iter_begin F ++ _IO_iter_end F ++ _IO_iter_file F ++ _IO_iter_next F ++ _IO_least_wmarker F ++ _IO_list_lock F ++ _IO_list_resetlock F ++ _IO_list_unlock F ++ _IO_seekwmark F ++ _IO_sputbackwc F ++ _IO_sungetwc F ++ _IO_switch_to_main_wget_area F ++ _IO_switch_to_wbackup_area F ++ _IO_switch_to_wget_mode F ++ _IO_unsave_wmarkers F ++ _IO_wdefault_doallocate F ++ _IO_wdefault_finish F ++ _IO_wdefault_pbackfail F ++ _IO_wdefault_uflow F ++ _IO_wdefault_xsgetn F ++ _IO_wdefault_xsputn F ++ _IO_wdo_write F ++ _IO_wdoallocbuf F ++ _IO_wfile_overflow F ++ _IO_wfile_seekoff F ++ _IO_wfile_sync F ++ _IO_wfile_underflow F ++ _IO_wfile_xsputn F ++ _IO_wmarker_delta F ++ _IO_wsetb F ++ __assert F ++ __cyg_profile_func_enter F ++ __cyg_profile_func_exit F ++ __endmntent F ++ __fbufsize F ++ __flbf F ++ __fpending F ++ __fpurge F ++ __freadable F ++ __freading F ++ __fsetlocking F ++ __fwritable F ++ __fwriting F ++ __getmntent_r F ++ __nl_langinfo_l F ++ __open64 F ++ __res_init F ++ __res_nclose F ++ __res_ninit F ++ __res_state F ++ __setmntent F ++ __statfs F ++ __strndup F ++ __sysconf F ++ __sysctl F ++ __wctrans_l F ++ __woverflow F ++ __wuflow F ++ __wunderflow F ++ __xpg_sigpause F ++ _flushlbf F ++ bind_textdomain_codeset F ++ dcngettext F ++ dngettext F ++ fgetwc F ++ fgetwc_unlocked F ++ fgetws F ++ fgetws_unlocked F ++ fmemopen F ++ fputwc F ++ fputwc_unlocked F ++ fputws F ++ fputws_unlocked F ++ fwide F ++ fwprintf F ++ fwscanf F ++ getdirentries64 F ++ getloadavg F ++ getwc F ++ getwc_unlocked F ++ getwchar F ++ getwchar_unlocked F ++ iruserok_af F ++ mcheck_check_all F ++ mcheck_pedantic F ++ memrchr F ++ mincore F ++ mkdtemp F ++ mkstemp64 F ++ moncontrol F ++ ngettext F ++ posix_fadvise F ++ posix_fadvise64 F ++ posix_fallocate F ++ posix_fallocate64 F ++ posix_madvise F ++ posix_memalign F ++ posix_spawn F ++ posix_spawn_file_actions_addclose F ++ posix_spawn_file_actions_adddup2 F ++ posix_spawn_file_actions_addopen F ++ posix_spawn_file_actions_destroy F ++ posix_spawn_file_actions_init F ++ posix_spawnattr_destroy F ++ posix_spawnattr_getflags F ++ posix_spawnattr_getpgroup F ++ posix_spawnattr_getschedparam F ++ posix_spawnattr_getschedpolicy F ++ posix_spawnattr_getsigdefault F ++ posix_spawnattr_getsigmask F ++ posix_spawnattr_init F ++ posix_spawnattr_setflags F ++ posix_spawnattr_setpgroup F ++ posix_spawnattr_setschedparam F ++ posix_spawnattr_setschedpolicy F ++ posix_spawnattr_setsigdefault F ++ posix_spawnattr_setsigmask F ++ posix_spawnp F ++ putwc F ++ putwc_unlocked F ++ putwchar F ++ putwchar_unlocked F ++ rcmd_af F ++ rexec_af F ++ rresvport_af F ++ ruserok_af F ++ svc_getreq_common F ++ svc_getreq_poll F ++ svc_max_pollfd D 0x4 ++ swprintf F ++ swscanf F ++ ungetwc F ++ vfwprintf F ++ vfwscanf F ++ vswprintf F ++ vswscanf F ++ vwprintf F ++ vwscanf F ++ wcschrnul F ++ wcsftime F ++ wmempcpy F ++ wprintf F ++ wscanf F ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls ++ __ctype32_b D 0x8 ++ __ctype32_tolower D 0x8 ++ __ctype32_toupper D 0x8 ++ __ctype_b D 0x8 ++ __ctype_tolower D 0x8 ++ __ctype_toupper D 0x8 ++ _res D 0x238 ++ _sys_errlist D 0x3e8 ++ sys_errlist D 0x3e8 ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ _IO_2_1_stderr_ D 0xe0 ++ _IO_2_1_stdin_ D 0xe0 ++ _IO_2_1_stdout_ D 0xe0 ++ _IO_file_jumps D 0xa8 ++ _IO_list_all D 0x8 ++ _IO_wfile_jumps D 0xa8 ++ __after_morecore_hook D 0x8 ++ __curbrk D 0x8 ++ __environ D 0x8 ++ __free_hook D 0x8 ++ __key_decryptsession_pk_LOCAL D 0x8 ++ __key_encryptsession_pk_LOCAL D 0x8 ++ __key_gendes_LOCAL D 0x8 ++ __malloc_hook D 0x8 ++ __malloc_initialize_hook D 0x8 ++ __memalign_hook D 0x8 ++ __morecore D 0x8 ++ __progname D 0x8 ++ __progname_full D 0x8 ++ __rcmd_errstr D 0x8 ++ __realloc_hook D 0x8 ++ __timezone D 0x8 ++ __tzname D 0x10 ++ _environ D 0x8 ++ _nl_domain_bindings D 0x8 ++ _null_auth D 0x18 ++ _obstack D 0x8 ++ _res_hconf D 0x48 ++ _sys_siglist D 0x200 ++ argp_program_bug_address D 0x8 ++ argp_program_version D 0x8 ++ argp_program_version_hook D 0x8 ++ environ D 0x8 ++ error_print_progname D 0x8 ++ h_errlist D 0x28 ++ loc1 D 0x8 ++ loc2 D 0x8 ++ locs D 0x8 ++ mallwatch D 0x8 ++ obstack_alloc_failed_handler D 0x8 ++ optarg D 0x8 ++ program_invocation_name D 0x8 ++ program_invocation_short_name D 0x8 ++ re_syntax_options D 0x8 ++ rpc_createerr D 0x20 ++ stderr D 0x8 ++ stdin D 0x8 ++ stdout D 0x8 ++ svc_pollfd D 0x8 ++ svcauthdes_stats D 0x18 ++ sys_sigabbrev D 0x200 ++ sys_siglist D 0x200 ++ timezone D 0x8 ++ tzname D 0x10 ++GLIBC_2.2.6 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls x86_64-.*-linux.*/tls ++ GLIBC_2.2.6 A ++GLIBC_2.2.6 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls x86_64-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __nanosleep F ++GLIBC_2.2.6 ia64-.*-linux.*/tls ++ getunwind F ++GLIBC_2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.2 A ++GLIBC_2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ __ctype32_tolower D 0x4 ++ __ctype32_toupper D 0x4 ++ _res_hconf D 0x30 ++ svc_pollfd D 0x4 ++GLIBC_2.2 i.86-.*-linux.*/thread i.86-.*-linux.*/tls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++ _IO_wfile_jumps D 0x54 ++GLIBC_2.2 ia64-.*-linux.*/tls ++ __clone2 F ++ __divdf3 F ++ __divsf3 F ++ __divtf3 F ++ __multi3 F ++ _inb F ++ _inl F ++ _inw F ++ _outb F ++ _outl F ++ _outw F ++ inb F ++ inl F ++ inw F ++ outb F ++ outw F ++ pciconfig_read F ++ pciconfig_write F ++GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls ++ ___brk_addr D 0x8 ++GLIBC_2.2 sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ _nl_default_dirname D 0x20 ++GLIBC_2.3.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls powerpc64-.*-linux.*/thread s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls x86_64-.*-linux.*/tls ++ GLIBC_2.3.2 A ++ __register_atfork F ++ lchmod F ++ sched_getaffinity F ++ sched_setaffinity F ++ strptime_l F ++GLIBC_2.3.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls powerpc64-.*-linux.*/thread s390-.*-linux.*/tls s390x-.*-linux.*/tls x86_64-.*-linux.*/tls ++ epoll_create F ++ epoll_ctl F ++ epoll_wait F ++GLIBC_2.3.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls powerpc64-.*-linux.*/thread s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls x86_64-.*-linux.*/tls ++ GLIBC_2.3.3 A ++ remap_file_pages F ++GLIBC_2.3.3 i.86-.*-linux.*/thread i.86-.*-linux.*/tls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls ++ _sys_siglist D 0x104 ++ sys_sigabbrev D 0x104 ++ sys_siglist D 0x104 ++GLIBC_2.3.3 ia64-.*-linux.*/tls powerpc64-.*-linux.*/thread s390x-.*-linux.*/tls x86_64-.*-linux.*/tls ++| GLIBC_2.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ strtoll_l F ++ strtoull_l F ++GLIBC_2.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls powerpc64-.*-linux.*/thread s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls x86_64-.*-linux.*/tls ++ GLIBC_2.3 A ++ __ctype_b_loc F ++ __ctype_tolower_loc F ++ __ctype_toupper_loc F ++ __isctype F ++ __strftime_l F ++ __uselocale F ++ __wcsftime_l F ++ duplocale F ++ fgetxattr F ++ flistxattr F ++ freeifaddrs F ++ freelocale F ++ fremovexattr F ++ fsetxattr F ++ futimes F ++ getifaddrs F ++ getxattr F ++ isalnum_l F ++ isalpha_l F ++ isblank_l F ++ iscntrl_l F ++ isctype F ++ isdigit_l F ++ isgraph_l F ++ islower_l F ++ isprint_l F ++ ispunct_l F ++ isspace_l F ++ isupper_l F ++ iswalnum_l F ++ iswalpha_l F ++ iswblank_l F ++ iswcntrl_l F ++ iswctype_l F ++ iswdigit_l F ++ iswgraph_l F ++ iswlower_l F ++ iswprint_l F ++ iswpunct_l F ++ iswspace_l F ++ iswupper_l F ++ iswxdigit_l F ++ isxdigit_l F ++ lgetxattr F ++ listxattr F ++ llistxattr F ++ lremovexattr F ++ lsetxattr F ++ lutimes F ++ newlocale F ++ nl_langinfo_l F ++ readahead F ++ removexattr F ++ sendfile64 F ++ setxattr F ++ strcasecmp_l F ++ strcoll_l F ++ strfmon_l F ++ strftime_l F ++ strncasecmp_l F ++ strtod_l F ++ strtof_l F ++ strtol_l F ++ strtold_l F ++ strtoul_l F ++ strxfrm_l F ++ tolower_l F ++ toupper_l F ++ towctrans_l F ++ towlower_l F ++ towupper_l F ++ uselocale F ++ wcscasecmp_l F ++ wcscoll_l F ++ wcsftime_l F ++ wcsncasecmp_l F ++ wcstod_l F ++ wcstof_l F ++ wcstol_l F ++ wcstold_l F ++ wcstoll_l F ++ wcstoul_l F ++ wcstoull_l F ++ wcsxfrm_l F ++ wctrans_l F ++ wctype_l F ++GLIBC_2.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ _sys_errlist D 0x1f8 ++ sys_errlist D 0x1f8 ++GLIBC_2.3 ia64-.*-linux.*/tls powerpc64-.*-linux.*/thread s390x-.*-linux.*/tls x86_64-.*-linux.*/tls ++ _sys_errlist D 0x3f0 ++ sys_errlist D 0x3f0 +diff -u -udbrN glibc-2.3.2/abilist/libcrypt.abilist glibc-2.3.2-200304020432/abilist/libcrypt.abilist +--- glibc-2.3.2/abilist/libcrypt.abilist Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/abilist/libcrypt.abilist Wed Apr 2 06:39:52 2003 +@@ -0,0 +1,19 @@ ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.0 A ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 s390x-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ crypt F ++ crypt_r F ++ encrypt F ++ encrypt_r F ++ fcrypt F ++ setkey F ++ setkey_r F ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++ GLIBC_2.2.5 A ++GLIBC_2.2 s390x-.*-linux.*/tls ++ GLIBC_2.2 A ++GLIBC_2.3 powerpc64-.*-linux.*/thread ++ GLIBC_2.3 A +diff -u -udbrN glibc-2.3.2/abilist/libdl.abilist glibc-2.3.2-200304020432/abilist/libdl.abilist +--- glibc-2.3.2/abilist/libdl.abilist Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/abilist/libdl.abilist Wed Apr 2 06:39:52 2003 +@@ -0,0 +1,33 @@ ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.0 A ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 s390x-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ dlopen F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 s390x-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ dladdr F ++ dlclose F ++ dlerror F ++ dlsym F ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.1 A ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 s390x-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ dlvsym F ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++ GLIBC_2.2.5 A ++GLIBC_2.2 s390x-.*-linux.*/tls ++ GLIBC_2.2 A ++GLIBC_2.3.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls powerpc64-.*-linux.*/thread s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls x86_64-.*-linux.*/tls ++ GLIBC_2.3.3 A ++ dladdr1 F ++ dlinfo F ++GLIBC_2.3 powerpc64-.*-linux.*/thread ++ GLIBC_2.3 A +diff -u -udbrN glibc-2.3.2/abilist/libm.abilist glibc-2.3.2-200304020432/abilist/libm.abilist +--- glibc-2.3.2/abilist/libm.abilist Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/abilist/libm.abilist Wed Apr 2 06:39:52 2003 +@@ -0,0 +1,355 @@ ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++ GLIBC_2.0 A ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ _LIB_VERSION D 0x4 ++ acos F ++ acosf F ++ acosh F ++ acoshf F ++ acoshl F ++ acosl F ++ asin F ++ asinf F ++ asinh F ++ asinhf F ++ asinhl F ++ asinl F ++ atan F ++ atan2 F ++ atan2f F ++ atan2l F ++ atanf F ++ atanh F ++ atanhf F ++ atanhl F ++ atanl F ++ cbrt F ++ cbrtf F ++ cbrtl F ++ ceil F ++ ceilf F ++ ceill F ++ copysign F ++ copysignf F ++ copysignl F ++ cos F ++ cosf F ++ cosh F ++ coshf F ++ coshl F ++ cosl F ++ drem F ++ dremf F ++ dreml F ++ erf F ++ erfc F ++ erfcf F ++ erfcl F ++ erff F ++ erfl F ++ exp F ++ expf F ++ expl F ++ expm1 F ++ expm1f F ++ expm1l F ++ fabs F ++ fabsf F ++ fabsl F ++ finite F ++ finitef F ++ finitel F ++ floor F ++ floorf F ++ floorl F ++ fmod F ++ fmodf F ++ fmodl F ++ frexp F ++ frexpf F ++ frexpl F ++ gamma F ++ gammaf F ++ gammal F ++ hypot F ++ hypotf F ++ hypotl F ++ ilogb F ++ ilogbf F ++ ilogbl F ++ j0 F ++ j0f F ++ j0l F ++ j1 F ++ j1f F ++ j1l F ++ jn F ++ jnf F ++ jnl F ++ ldexp F ++ ldexpf F ++ ldexpl F ++ lgamma F ++ lgamma_r F ++ lgammaf F ++ lgammaf_r F ++ lgammal F ++ lgammal_r F ++ log F ++ log10 F ++ log10f F ++ log10l F ++ log1p F ++ log1pf F ++ log1pl F ++ logb F ++ logbf F ++ logbl F ++ logf F ++ logl F ++ matherr F ++ modf F ++ modff F ++ modfl F ++ nextafter F ++ nextafterf F ++ nextafterl F ++ pow F ++ powf F ++ powl F ++ remainder F ++ remainderf F ++ remainderl F ++ rint F ++ rintf F ++ rintl F ++ scalb F ++ scalbf F ++ scalbl F ++ scalbn F ++ scalbnf F ++ scalbnl F ++ signgam D 0x4 ++ significand F ++ significandf F ++ significandl F ++ sin F ++ sinf F ++ sinh F ++ sinhf F ++ sinhl F ++ sinl F ++ sqrt F ++ sqrtf F ++ sqrtl F ++ tan F ++ tanf F ++ tanh F ++ tanhf F ++ tanhl F ++ tanl F ++ y0 F ++ y0f F ++ y0l F ++ y1 F ++ y1f F ++ y1l F ++ yn F ++ ynf F ++ ynl F ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++ GLIBC_2.1 A ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ feclearexcept F ++ fegetenv F ++ fegetexceptflag F ++ feraiseexcept F ++ fesetenv F ++ fesetexceptflag F ++ feupdateenv F ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __clog10 F ++ __clog10f F ++ __clog10l F ++ __finite F ++ __finitef F ++ __finitel F ++ __fpclassify F ++ __fpclassifyf F ++ __signbit F ++ __signbitf F ++ cabs F ++ cabsf F ++ cabsl F ++ cacos F ++ cacosf F ++ cacosh F ++ cacoshf F ++ cacoshl F ++ cacosl F ++ carg F ++ cargf F ++ cargl F ++ casin F ++ casinf F ++ casinh F ++ casinhf F ++ casinhl F ++ casinl F ++ catan F ++ catanf F ++ catanh F ++ catanhf F ++ catanhl F ++ catanl F ++ ccos F ++ ccosf F ++ ccosh F ++ ccoshf F ++ ccoshl F ++ ccosl F ++ cexp F ++ cexpf F ++ cexpl F ++ cimag F ++ cimagf F ++ cimagl F ++ clog F ++ clog10 F ++ clog10f F ++ clog10l F ++ clogf F ++ clogl F ++ conj F ++ conjf F ++ conjl F ++ cpow F ++ cpowf F ++ cpowl F ++ cproj F ++ cprojf F ++ cprojl F ++ creal F ++ crealf F ++ creall F ++ csin F ++ csinf F ++ csinh F ++ csinhf F ++ csinhl F ++ csinl F ++ csqrt F ++ csqrtf F ++ csqrtl F ++ ctan F ++ ctanf F ++ ctanh F ++ ctanhf F ++ ctanhl F ++ ctanl F ++ exp10 F ++ exp10f F ++ exp10l F ++ exp2 F ++ exp2f F ++ fdim F ++ fdimf F ++ fdiml F ++ fegetround F ++ feholdexcept F ++ fesetround F ++ fetestexcept F ++ fma F ++ fmaf F ++ fmal F ++ fmax F ++ fmaxf F ++ fmaxl F ++ fmin F ++ fminf F ++ fminl F ++ llrint F ++ llrintf F ++ llrintl F ++ llround F ++ llroundf F ++ llroundl F ++ log2 F ++ log2f F ++ log2l F ++ lrint F ++ lrintf F ++ lrintl F ++ lround F ++ lroundf F ++ lroundl F ++ nan F ++ nanf F ++ nanl F ++ nearbyint F ++ nearbyintf F ++ nearbyintl F ++ nexttoward F ++ nexttowardf F ++ nexttowardl F ++ pow10 F ++ pow10f F ++ pow10l F ++ remquo F ++ remquof F ++ remquol F ++ round F ++ roundf F ++ roundl F ++ scalbln F ++ scalblnf F ++ scalblnl F ++ sincos F ++ sincosf F ++ sincosl F ++ tgamma F ++ tgammaf F ++ tgammal F ++ trunc F ++ truncf F ++ truncl F ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls ++ __fpclassifyl F ++ __signbitl F ++ exp2l F ++GLIBC_2.1 powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __fe_dfl_env D 0x8 ++ __fe_enabled_env D 0x8 ++ __fe_nomask_env F ++ __fe_nonieee_env D 0x8 ++GLIBC_2.2.3 ia64-.*-linux.*/tls ++ GLIBC_2.2.3 A ++ matherrf F ++ matherrl F ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++ GLIBC_2.2.5 A ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ fedisableexcept F ++ feenableexcept F ++ fegetexcept F ++GLIBC_2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ++ __expl F ++ __expm1l F ++GLIBC_2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.2 A ++GLIBC_2.3 powerpc64-.*-linux.*/thread ++ GLIBC_2.3 A +diff -u -udbrN glibc-2.3.2/abilist/libnsl.abilist glibc-2.3.2-200304020432/abilist/libnsl.abilist +--- glibc-2.3.2/abilist/libnsl.abilist Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/abilist/libnsl.abilist Wed Apr 2 06:39:52 2003 +@@ -0,0 +1,142 @@ ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.0 A ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 s390x-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __yp_check F ++ xdr_domainname F ++ xdr_keydat F ++ xdr_mapname F ++ xdr_peername F ++ xdr_valdat F ++ xdr_yp_buf F ++ xdr_ypbind_binding F ++ xdr_ypbind_resp F ++ xdr_ypbind_resptype F ++ xdr_ypbind_setdom F ++ xdr_ypdelete_args F ++ xdr_ypmap_parms F ++ xdr_ypmaplist F ++ xdr_yppush_status F ++ xdr_yppushresp_xfr F ++ xdr_ypreq_key F ++ xdr_ypreq_nokey F ++ xdr_ypreq_xfr F ++ xdr_ypresp_all F ++ xdr_ypresp_key_val F ++ xdr_ypresp_maplist F ++ xdr_ypresp_master F ++ xdr_ypresp_order F ++ xdr_ypresp_val F ++ xdr_ypresp_xfr F ++ xdr_ypstat F ++ xdr_ypupdate_args F ++ xdr_ypxfrstat F ++ yp_all F ++ yp_bind F ++ yp_first F ++ yp_get_default_domain F ++ yp_maplist F ++ yp_master F ++ yp_match F ++ yp_next F ++ yp_order F ++ yp_unbind F ++ yp_update F ++ ypbinderr_string F ++ yperr_string F ++ ypprot_err F ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.1 A ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 s390x-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __free_fdresult F ++ __nis_default_access F ++ __nis_default_group F ++ __nis_default_owner F ++ __nis_default_ttl F ++ __nis_finddirectory F ++ __nis_hash F ++ __nisbind_connect F ++ __nisbind_create F ++ __nisbind_destroy F ++ __nisbind_next F ++ nis_add F ++ nis_add_entry F ++ nis_addmember F ++ nis_checkpoint F ++ nis_clone_directory F ++ nis_clone_object F ++ nis_clone_result F ++ nis_creategroup F ++ nis_destroy_object F ++ nis_destroygroup F ++ nis_dir_cmp F ++ nis_domain_of F ++ nis_domain_of_r F ++ nis_first_entry F ++ nis_free_directory F ++ nis_free_object F ++ nis_free_request F ++ nis_freenames F ++ nis_freeresult F ++ nis_freeservlist F ++ nis_freetags F ++ nis_getnames F ++ nis_getservlist F ++ nis_ismember F ++ nis_leaf_of F ++ nis_leaf_of_r F ++ nis_lerror F ++ nis_list F ++ nis_local_directory F ++ nis_local_group F ++ nis_local_host F ++ nis_local_principal F ++ nis_lookup F ++ nis_mkdir F ++ nis_modify F ++ nis_modify_entry F ++ nis_name_of F ++ nis_name_of_r F ++ nis_next_entry F ++ nis_perror F ++ nis_ping F ++ nis_print_directory F ++ nis_print_entry F ++ nis_print_group F ++ nis_print_group_entry F ++ nis_print_link F ++ nis_print_object F ++ nis_print_result F ++ nis_print_rights F ++ nis_print_table F ++ nis_read_obj F ++ nis_remove F ++ nis_remove_entry F ++ nis_removemember F ++ nis_rmdir F ++ nis_servstate F ++ nis_sperrno F ++ nis_sperror F ++ nis_sperror_r F ++ nis_stats F ++ nis_verifygroup F ++ nis_write_obj F ++ readColdStartFile F ++ writeColdStartFile F ++ xdr_cback_data F ++ xdr_obj_p F ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++ GLIBC_2.2.5 A ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ xdr_ypall F ++GLIBC_2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.2 A ++GLIBC_2.3 powerpc64-.*-linux.*/thread ++ GLIBC_2.3 A +diff -u -udbrN glibc-2.3.2/abilist/libpthread.abilist glibc-2.3.2-200304020432/abilist/libpthread.abilist +--- glibc-2.3.2/abilist/libpthread.abilist Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/abilist/libpthread.abilist Wed Apr 2 06:39:52 2003 +@@ -0,0 +1,256 @@ ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++ GLIBC_2.0 A ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ pthread_attr_init F ++ pthread_create F ++ sem_destroy F ++ sem_getvalue F ++ sem_init F ++ sem_post F ++ sem_trywait F ++ sem_wait F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ pthread_atfork F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls powerpc64-.*-linux.*/thread s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls x86_64-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ pthread_cond_broadcast F ++ pthread_cond_destroy F ++ pthread_cond_init F ++ pthread_cond_signal F ++ pthread_cond_timedwait F ++ pthread_cond_wait F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ _IO_flockfile F ++ _IO_ftrylockfile F ++ _IO_funlockfile F ++ __close F ++ __connect F ++ __errno_location F ++ __fcntl F ++ __fork F ++ __h_errno_location F ++ __lseek F ++ __open F ++ __pthread_getspecific F ++ __pthread_key_create F ++ __pthread_mutex_destroy F ++ __pthread_mutex_init F ++ __pthread_mutex_lock F ++ __pthread_mutex_trylock F ++ __pthread_mutex_unlock F ++ __pthread_mutexattr_destroy F ++ __pthread_mutexattr_init F ++ __pthread_mutexattr_settype F ++ __pthread_once F ++ __pthread_setspecific F ++ __read F ++ __send F ++ __sigaction F ++ __wait F ++ __write F ++ _pthread_cleanup_pop F ++ _pthread_cleanup_pop_restore F ++ _pthread_cleanup_push F ++ _pthread_cleanup_push_defer F ++ accept F ++ close F ++ connect F ++ fcntl F ++ flockfile F ++ fork F ++ fsync F ++ ftrylockfile F ++ funlockfile F ++ longjmp F ++ lseek F ++ msync F ++ nanosleep F ++ open F ++ pause F ++ pthread_attr_destroy F ++ pthread_attr_getdetachstate F ++ pthread_attr_getinheritsched F ++ pthread_attr_getschedparam F ++ pthread_attr_getschedpolicy F ++ pthread_attr_getscope F ++ pthread_attr_setdetachstate F ++ pthread_attr_setinheritsched F ++ pthread_attr_setschedparam F ++ pthread_attr_setschedpolicy F ++ pthread_attr_setscope F ++ pthread_cancel F ++ pthread_condattr_destroy F ++ pthread_condattr_init F ++ pthread_detach F ++ pthread_equal F ++ pthread_exit F ++ pthread_getschedparam F ++ pthread_getspecific F ++ pthread_join F ++ pthread_key_create F ++ pthread_key_delete F ++ pthread_kill F ++ pthread_kill_other_threads_np F ++ pthread_mutex_destroy F ++ pthread_mutex_init F ++ pthread_mutex_lock F ++ pthread_mutex_trylock F ++ pthread_mutex_unlock F ++ pthread_mutexattr_destroy F ++ pthread_mutexattr_getkind_np F ++ pthread_mutexattr_init F ++ pthread_mutexattr_setkind_np F ++ pthread_once F ++ pthread_self F ++ pthread_setcancelstate F ++ pthread_setcanceltype F ++ pthread_setschedparam F ++ pthread_setspecific F ++ pthread_sigmask F ++ pthread_testcancel F ++ raise F ++ read F ++ recv F ++ recvfrom F ++ recvmsg F ++ send F ++ sendmsg F ++ sendto F ++ sigaction F ++ siglongjmp F ++ sigwait F ++ system F ++ tcdrain F ++ vfork F ++ wait F ++ waitpid F ++ write F ++GLIBC_2.1.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++ GLIBC_2.1.1 A ++GLIBC_2.1.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ sem_close F ++ sem_open F ++ sem_unlink F ++GLIBC_2.1.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++ GLIBC_2.1.2 A ++GLIBC_2.1.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __vfork F ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++ GLIBC_2.1 A ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 ia64-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __libc_allocate_rtsig F ++ __libc_current_sigrtmax F ++ __libc_current_sigrtmin F ++ pthread_attr_getguardsize F ++ pthread_attr_getstackaddr F ++ pthread_attr_getstacksize F ++ pthread_attr_setguardsize F ++ pthread_attr_setstackaddr F ++ pthread_attr_setstacksize F ++ pthread_getconcurrency F ++ pthread_mutexattr_gettype F ++ pthread_mutexattr_settype F ++ pthread_rwlock_destroy F ++ pthread_rwlock_init F ++ pthread_rwlock_rdlock F ++ pthread_rwlock_tryrdlock F ++ pthread_rwlock_trywrlock F ++ pthread_rwlock_unlock F ++ pthread_rwlock_wrlock F ++ pthread_rwlockattr_destroy F ++ pthread_rwlockattr_getkind_np F ++ pthread_rwlockattr_getpshared F ++ pthread_rwlockattr_init F ++ pthread_rwlockattr_setkind_np F ++ pthread_rwlockattr_setpshared F ++ pthread_setconcurrency F ++GLIBC_2.2.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.2.3 A ++GLIBC_2.2.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ pthread_getattr_np F ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++ GLIBC_2.2.5 A ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __open64 F ++ __pread64 F ++ __pthread_rwlock_destroy F ++ __pthread_rwlock_init F ++ __pthread_rwlock_rdlock F ++ __pthread_rwlock_tryrdlock F ++ __pthread_rwlock_trywrlock F ++ __pthread_rwlock_unlock F ++ __pthread_rwlock_wrlock F ++ __pwrite64 F ++ __res_state F ++ lseek64 F ++ open64 F ++ pread F ++ pread64 F ++ pthread_attr_getstack F ++ pthread_attr_setstack F ++ pthread_barrier_destroy F ++ pthread_barrier_init F ++ pthread_barrier_wait F ++ pthread_barrierattr_destroy F ++ pthread_barrierattr_init F ++ pthread_barrierattr_setpshared F ++ pthread_condattr_getpshared F ++ pthread_condattr_setpshared F ++ pthread_getcpuclockid F ++ pthread_mutex_timedlock F ++ pthread_mutexattr_getpshared F ++ pthread_mutexattr_setpshared F ++ pthread_rwlock_timedrdlock F ++ pthread_rwlock_timedwrlock F ++ pthread_spin_destroy F ++ pthread_spin_init F ++ pthread_spin_lock F ++ pthread_spin_trylock F ++ pthread_spin_unlock F ++ pthread_yield F ++ pwrite F ++ pwrite64 F ++ sem_timedwait F ++GLIBC_2.2.6 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls x86_64-.*-linux.*/tls ++ GLIBC_2.2.6 A ++GLIBC_2.2.6 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls x86_64-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __nanosleep F ++GLIBC_2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.2 A ++GLIBC_2.3.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls powerpc64-.*-linux.*/thread s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls x86_64-.*-linux.*/tls ++ GLIBC_2.3.2 A ++GLIBC_2.3.3 i.86-.*-linux.*/thread sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.3.3 A ++ pthread_barrierattr_getpshared F ++ pthread_condattr_getclock F ++ pthread_condattr_setclock F ++ pthread_timedjoin_np F ++ pthread_tryjoin_np F ++GLIBC_2.3 powerpc64-.*-linux.*/thread ++ GLIBC_2.3 A +diff -u -udbrN glibc-2.3.2/abilist/libresolv.abilist glibc-2.3.2-200304020432/abilist/libresolv.abilist +--- glibc-2.3.2/abilist/libresolv.abilist Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/abilist/libresolv.abilist Wed Apr 2 06:39:52 2003 +@@ -0,0 +1,95 @@ ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.0 A ++ dn_expand F ++ res_mkquery F ++ res_query F ++ res_querydomain F ++ res_search F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 s390x-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __b64_ntop F ++ __b64_pton F ++ __dn_comp F ++ __dn_count_labels F ++ __dn_skipname F ++ __fp_nquery F ++ __fp_query F ++ __fp_resstat F ++ __hostalias F ++ __loc_aton F ++ __loc_ntoa F ++ __p_cdname F ++ __p_cdnname F ++ __p_class F ++ __p_fqname F ++ __p_fqnname F ++ __p_option F ++ __p_query F ++ __p_secstodate F ++ __p_time F ++ __p_type F ++ __putlong F ++ __putshort F ++ __res_close F ++ __res_dnok F ++ __res_hnok F ++ __res_isourserver F ++ __res_mailok F ++ __res_nameinquery F ++ __res_ownok F ++ __res_queriesmatch F ++ __res_send F ++ __sym_ntop F ++ __sym_ntos F ++ __sym_ston F ++ _gethtbyaddr F ++ _gethtbyname F ++ _gethtbyname2 F ++ _gethtent F ++ _getlong F ++ _getshort F ++ _sethtent F ++ inet_net_ntop F ++ inet_net_pton F ++ inet_neta F ++ res_gethostbyaddr F ++ res_gethostbyname F ++ res_gethostbyname2 F ++ res_send_setqhook F ++ res_send_setrhook F ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ __p_class_syms D 0x54 ++ __p_type_syms D 0x21c ++ _res_opcodes D 0x40 ++GLIBC_2.0 ia64-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 s390x-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __p_class_syms D 0xa8 ++ __p_type_syms D 0x438 ++ _res_opcodes D 0x80 ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++ GLIBC_2.2.5 A ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ __dn_expand F ++ __res_hostalias F ++ __res_mkquery F ++ __res_nmkquery F ++ __res_nquery F ++ __res_nquerydomain F ++ __res_nsearch F ++ __res_nsend F ++ __res_query F ++ __res_querydomain F ++ __res_search F ++GLIBC_2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.2 A ++GLIBC_2.3.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls powerpc64-.*-linux.*/thread s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls x86_64-.*-linux.*/tls ++ GLIBC_2.3.2 A ++ __p_rcode F ++GLIBC_2.3 powerpc64-.*-linux.*/thread ++ GLIBC_2.3 A +diff -u -udbrN glibc-2.3.2/abilist/librt.abilist glibc-2.3.2-200304020432/abilist/librt.abilist +--- glibc-2.3.2/abilist/librt.abilist Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/abilist/librt.abilist Wed Apr 2 06:39:52 2003 +@@ -0,0 +1,44 @@ ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.1 A ++GLIBC_2.1 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 s390x-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ aio_cancel F ++ aio_cancel64 F ++ aio_error F ++ aio_error64 F ++ aio_fsync F ++ aio_fsync64 F ++ aio_init F ++ aio_read F ++ aio_read64 F ++ aio_return F ++ aio_return64 F ++ aio_suspend F ++ aio_suspend64 F ++ aio_write F ++ aio_write64 F ++ lio_listio F ++ lio_listio64 F ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++ GLIBC_2.2.5 A ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ clock_getcpuclockid F ++ clock_getres F ++ clock_gettime F ++ clock_nanosleep F ++ clock_settime F ++ shm_open F ++ shm_unlink F ++ timer_create F ++ timer_delete F ++ timer_getoverrun F ++ timer_gettime F ++ timer_settime F ++GLIBC_2.2 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.2 A ++GLIBC_2.3 powerpc64-.*-linux.*/thread ++ GLIBC_2.3 A +diff -u -udbrN glibc-2.3.2/abilist/libthread_db.abilist glibc-2.3.2-200304020432/abilist/libthread_db.abilist +--- glibc-2.3.2/abilist/libthread_db.abilist Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/abilist/libthread_db.abilist Wed Apr 2 06:39:52 2003 +@@ -0,0 +1,59 @@ ++GLIBC_2.1.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.1.3 A ++GLIBC_2.1.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 s390x-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ td_init F ++ td_log F ++ td_ta_clear_event F ++ td_ta_delete F ++ td_ta_enable_stats F ++ td_ta_event_addr F ++ td_ta_event_getmsg F ++ td_ta_get_nthreads F ++ td_ta_get_ph F ++ td_ta_get_stats F ++ td_ta_map_id2thr F ++ td_ta_map_lwp2thr F ++ td_ta_new F ++ td_ta_reset_stats F ++ td_ta_set_event F ++ td_ta_setconcurrency F ++ td_ta_thr_iter F ++ td_ta_tsd_iter F ++ td_thr_clear_event F ++ td_thr_dbresume F ++ td_thr_dbsuspend F ++ td_thr_event_enable F ++ td_thr_event_getmsg F ++ td_thr_get_info F ++ td_thr_getfpregs F ++ td_thr_getgregs F ++ td_thr_getxregs F ++ td_thr_getxregsize F ++ td_thr_set_event F ++ td_thr_setfpregs F ++ td_thr_setgregs F ++ td_thr_setprio F ++ td_thr_setsigpending F ++ td_thr_setxregs F ++ td_thr_sigsetmask F ++ td_thr_tsd F ++ td_thr_validate F ++GLIBC_2.2.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.2.3 A ++GLIBC_2.2.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ td_symbol_list F ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++ GLIBC_2.2.5 A ++GLIBC_2.2 s390x-.*-linux.*/tls ++ GLIBC_2.2 A ++GLIBC_2.3.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls powerpc64-.*-linux.*/thread s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls x86_64-.*-linux.*/tls ++ GLIBC_2.3.3 A ++ td_thr_tlsbase F ++GLIBC_2.3 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls powerpc64-.*-linux.*/thread s390-.*-linux.*/tls s390x-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls x86_64-.*-linux.*/tls ++ GLIBC_2.3 A ++ td_thr_tls_get_addr F +diff -u -udbrN glibc-2.3.2/abilist/libutil.abilist glibc-2.3.2-200304020432/abilist/libutil.abilist +--- glibc-2.3.2/abilist/libutil.abilist Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/abilist/libutil.abilist Wed Apr 2 06:39:52 2003 +@@ -0,0 +1,18 @@ ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++ GLIBC_2.0 A ++GLIBC_2.0 i.86-.*-linux.*/notls i.86-.*-linux.*/thread i.86-.*-linux.*/tls ia64-.*-linux.*/tls m68.*-.*-linux.*/notls powerpc-.*-linux.*/notls powerpc-.*-linux.*/thread powerpc-.*-linux.*/tls s390-.*-linux.*/tls sh[34].*-.*-linux.*/notls sh[34].*-.*-linux.*/thread sh[34].*-.*-linux.*/tls ++| GLIBC_2.2.5 x86_64-.*-linux.*/tls ++| GLIBC_2.2 s390x-.*-linux.*/tls ++| GLIBC_2.3 powerpc64-.*-linux.*/thread ++ forkpty F ++ login F ++ login_tty F ++ logout F ++ logwtmp F ++ openpty F ++GLIBC_2.2.5 x86_64-.*-linux.*/tls ++ GLIBC_2.2.5 A ++GLIBC_2.2 s390x-.*-linux.*/tls ++ GLIBC_2.2 A ++GLIBC_2.3 powerpc64-.*-linux.*/thread ++ GLIBC_2.3 A +diff -u -udbrN glibc-2.3.2/argp/tst-argp1.c glibc-2.3.2-200304020432/argp/tst-argp1.c +--- glibc-2.3.2/argp/tst-argp1.c Wed Dec 4 23:45:02 2002 ++++ glibc-2.3.2-200304020432/argp/tst-argp1.c Mon Mar 17 20:21:04 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 2002 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. + +@@ -29,7 +29,7 @@ + #define OPT_TOPLEVEL 304 + + +-static const struct argp_option options[] = ++static const struct argp_option test_options[] = + { + { NULL, 0, NULL, 0, "\ + This is a test for threads so we allow ther user to selection the number of \ +@@ -89,12 +89,12 @@ + /* Data structure to communicate with argp functions. */ + static struct argp argp = + { +- options, parse_opt ++ test_options, parse_opt + }; + + +-int +-main (void) ++static int ++do_test (void) + { + int argc = 2; + char *argv[3] = { (char *) "tst-argp1", (char *) "--help", NULL }; +@@ -113,3 +113,6 @@ + { + return ARGP_ERR_UNKNOWN; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff -u -udbrN glibc-2.3.2/config.h.in glibc-2.3.2-200304020432/config.h.in +--- glibc-2.3.2/config.h.in Tue Feb 4 09:35:22 2003 ++++ glibc-2.3.2-200304020432/config.h.in Mon Mar 10 10:10:43 2003 +@@ -58,6 +58,9 @@ + /* Define a symbol_name as a global .symbol_name for ld. */ + #undef HAVE_ASM_GLOBAL_DOT_NAME + ++/* Define if the assembler generates debugging information directly. */ ++#undef HAVE_CPP_ASM_DEBUGINFO ++ + /* Define if _Unwind_Find_FDE should be exported from glibc. */ + #undef EXPORT_UNWIND_FIND_FDE + +diff -u -udbrN glibc-2.3.2/config.make.in glibc-2.3.2-200304020432/config.make.in +--- glibc-2.3.2/config.make.in Thu Nov 14 23:53:32 2002 ++++ glibc-2.3.2-200304020432/config.make.in Wed Mar 26 02:15:05 2003 +@@ -1,5 +1,5 @@ + # @configure_input@ +-# From $Id: config.make.in,v 1.90 2002/11/14 03:59:36 roland Exp $. ++# From $Id: config.make.in,v 1.92 2003/03/26 01:15:05 roland Exp $. + # Don't edit this file. Put configuration parameters in configparms instead. + + version = @VERSION@ +@@ -50,6 +50,8 @@ + old-glibc-headers = @old_glibc_headers@ + unwind-find-fde = @libc_cv_gcc_unwind_find_fde@ + have-initfini-array = @libc_cv_initfinit_array@ ++have-cpp-asm-debuginfo = @libc_cv_cpp_asm_debuginfo@ ++enable-check-abi = @enable_check_abi@ + + static-libgcc = @libc_cv_gcc_static_libgcc@ + +diff -u -udbrN glibc-2.3.2/configure glibc-2.3.2-200304020432/configure +--- glibc-2.3.2/configure Wed Feb 26 10:20:48 2003 ++++ glibc-2.3.2-200304020432/configure Tue Apr 1 08:53:27 2003 +@@ -312,7 +312,7 @@ + # 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 oldest_abi subdirs force_install all_warnings build build_cpu build_vendor build_os host host_cpu host_vendor host_os base_machine sysnames INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S PWD_P CC MAKE MSGFMT MAKEINFO SED AUTOCONF CFLAGS LDFLAGS CPPFLAGS ac_ct_CC OBJEXT BUILD_CC cross_compiling CPP AR OBJDUMP RANLIB ac_ct_RANLIB MIG AS LD CCVERSION SYSINCLUDES libc_cv_gcc_static_libgcc BASH libc_cv_have_bash2 KSH libc_cv_have_ksh AWK PERL INSTALL_INFO OLD_DEBIAN_INSTALL_INFO BISON VERSIONING libc_cv_asm_protected_directive libc_cv_initfinit_array libc_cv_z_nodelete libc_cv_z_nodlopen libc_cv_z_initfirst libc_cv_Bgroup libc_cv_z_combreloc libc_cv_have_initfini no_whole_archive exceptions LIBGD 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 use_ldconfig ldd_rewrite_script gnu_ld gnu_as elf xcoff static shared pic_default profile omitfp bounded static_nss nopic_initfini DEFINES linux_doors 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 subdirs force_install all_warnings build build_cpu build_vendor build_os host host_cpu host_vendor host_os base_machine sysnames INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC OBJEXT BUILD_CC cross_compiling CPP AR OBJDUMP RANLIB ac_ct_RANLIB MIG AS LD PWD_P MAKE MSGFMT MAKEINFO SED AUTOCONF CCVERSION SYSINCLUDES libc_cv_gcc_static_libgcc BASH libc_cv_have_bash2 KSH libc_cv_have_ksh AWK PERL INSTALL_INFO OLD_DEBIAN_INSTALL_INFO BISON VERSIONING libc_cv_asm_protected_directive libc_cv_initfinit_array libc_cv_z_nodelete libc_cv_z_nodlopen libc_cv_z_initfirst libc_cv_Bgroup libc_cv_z_combreloc libc_cv_have_initfini libc_cv_cpp_asm_debuginfo no_whole_archive exceptions LIBGD 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 use_ldconfig ldd_rewrite_script gnu_ld gnu_as elf xcoff static shared pic_default profile omitfp bounded static_nss nopic_initfini DEFINES linux_doors mach_interface_list VERSION RELEASE LIBOBJS LTLIBOBJS' + ac_subst_files='' + + # Initialize some variables set by options. +@@ -851,6 +851,8 @@ + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-sanity-checks really do not use threads (should not be used except + in special situations) [default=yes] ++ --enable-check-abi do "make check-abi" in "make check" (no/warn/yes) ++ [default=no] + --enable-shared build shared library [default=yes if GNU ld & + ELF] + --enable-profile build profiled library [default=yes] +@@ -1479,6 +1481,15 @@ + enable_sanity=yes + fi; + ++ ++# Check whether --enable-check-abi or --disable-check-abi was given. ++if test "${enable_check_abi+set}" = set; then ++ enableval="$enable_check_abi" ++ enable_check_abi=$enableval ++else ++ enable_check_abi=no ++fi; ++ + static=yes + # Check whether --enable-shared or --disable-shared was given. + if test "${enable_shared+set}" = set; then +@@ -1822,8 +1833,33 @@ + m68k) base_machine=m68k machine=m68k/m68020 ;; + m88???) base_machine=m88k machine=m88k/$machine ;; + m88k) base_machine=m88k machine=m88k/m88100 ;; +-mips64*) base_machine=mips64 machine=mips/mips64/$machine ;; +-mips*) base_machine=mips machine=mips/$machine ;; ++mips64*) base_machine=mips64 ++ case "$CC $CPPFLAGS $CFLAGS " in ++ *" -mabi=n32 "*) mips_cc_abi=n32 ;; ++ *" -mabi=64 "*|*" -mabi=n64 "*) mips_cc_abi=64 ;; ++ *" -mabi=32 "*|*" -mabi=o32 "*) mips_cc_abi=32 ;; ++ *) mips_cc_abi=default ;; ++ esac ++ case $config_os in ++ *abin32*) mips_config_abi=n32 ;; ++ *abi64*|*abin64*) mips_config_abi=64 ;; ++ *abi32*|*abio32*) mips_config_abi=32 ;; ++ *) mips_config_abi=$mips_cc_abi ;; ++ esac ++ case $mips_config_abi in ++ default) machine=mips/mips64/n32 mips_config_abi=n32 ;; ++ n32) machine=mips/mips64/n32 ;; ++ 64) machine=mips/mips64/n64 ;; ++ 32) machine=mips/mips32/kern64 ;; ++ esac ++ machine=$machine/$config_machine ++ if test $mips_config_abi != $mips_cc_abi; then ++ # This won't make it to config.make, but we want to ++ # set this in case configure tests depend on it. ++ CPPFLAGS="$CPPFLAGS -mabi=$mips_config_abi" ++ fi ++ ;; ++mips*) base_machine=mips machine=mips/mips32/$machine ;; + powerpc) base_machine=powerpc machine=powerpc/powerpc32 ;; + powerpc64) base_machine=powerpc machine=powerpc/powerpc64 ;; + s390) base_machine=s390 machine=s390/s390-32 ;; +@@ -2170,442 +2206,6 @@ + fi + + +-# We need the physical current working directory. We cannot use the +-# "pwd -P" shell builtin since that's not portable. Instead we try to +-# find a pwd binary. Note that assigning to the PWD environment +-# variable might have some interesting side effects, so we don't do +-# that. +-# Extract the first word of "pwd", so it can be a program name with args. +-set dummy pwd; ac_word=$2 +-echo "$as_me:$LINENO: checking for $ac_word" >&5 +-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +-if test "${ac_cv_path_PWD_P+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- case $PWD_P in +- [\\/]* | ?:[\\/]*) +- ac_cv_path_PWD_P="$PWD_P" # Let the user override the test with a path. +- ;; +- *) +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_path_PWD_P="$as_dir/$ac_word$ac_exec_ext" +- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +-done +- +- test -z "$ac_cv_path_PWD_P" && ac_cv_path_PWD_P="no" +- ;; +-esac +-fi +-PWD_P=$ac_cv_path_PWD_P +- +-if test -n "$PWD_P"; then +- echo "$as_me:$LINENO: result: $PWD_P" >&5 +-echo "${ECHO_T}$PWD_P" >&6 +-else +- echo "$as_me:$LINENO: result: no" >&5 +-echo "${ECHO_T}no" >&6 +-fi +- +-if test "$PWD_P" = no; then +- { { echo "$as_me:$LINENO: error: *** A pwd binary could not be found." >&5 +-echo "$as_me: error: *** A pwd binary could not be found." >&2;} +- { (exit 1); exit 1; }; } +-fi +- +-# These programs are version sensitive. +- +-for ac_prog in ${ac_tool_prefix}gcc ${ac_tool_prefix}cc +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-echo "$as_me:$LINENO: checking for $ac_word" >&5 +-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +-if test "${ac_cv_prog_CC+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- if test -n "$CC"; then +- ac_cv_prog_CC="$CC" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_CC="$ac_prog" +- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +-done +- +-fi +-fi +-CC=$ac_cv_prog_CC +-if test -n "$CC"; then +- echo "$as_me:$LINENO: result: $CC" >&5 +-echo "${ECHO_T}$CC" >&6 +-else +- echo "$as_me:$LINENO: result: no" >&5 +-echo "${ECHO_T}no" >&6 +-fi +- +- test -n "$CC" && break +-done +- +-if test -z "$CC"; then +- ac_verc_fail=yes +-else +- # Found it, now check the version. +- echo "$as_me:$LINENO: checking version of $CC" >&5 +-echo $ECHO_N "checking version of $CC... $ECHO_C" >&6 +- ac_prog_version=`$CC -v 2>&1 | sed -n 's/^.*version \([egcygnustpi-]*[0-9.]*\).*$/\1/p'` +- case $ac_prog_version in +- '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; +- 3.[2-9]*) +- ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; +- *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; +- +- esac +- echo "$as_me:$LINENO: result: $ac_prog_version" >&5 +-echo "${ECHO_T}$ac_prog_version" >&6 +-fi +-if test $ac_verc_fail = yes; then +- critic_missing="$critic_missing gcc" +-fi +- +-for ac_prog in gnumake gmake make +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-echo "$as_me:$LINENO: checking for $ac_word" >&5 +-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +-if test "${ac_cv_prog_MAKE+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- if test -n "$MAKE"; then +- ac_cv_prog_MAKE="$MAKE" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_MAKE="$ac_prog" +- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +-done +- +-fi +-fi +-MAKE=$ac_cv_prog_MAKE +-if test -n "$MAKE"; then +- echo "$as_me:$LINENO: result: $MAKE" >&5 +-echo "${ECHO_T}$MAKE" >&6 +-else +- echo "$as_me:$LINENO: result: no" >&5 +-echo "${ECHO_T}no" >&6 +-fi +- +- test -n "$MAKE" && break +-done +- +-if test -z "$MAKE"; then +- ac_verc_fail=yes +-else +- # Found it, now check the version. +- echo "$as_me:$LINENO: checking version of $MAKE" >&5 +-echo $ECHO_N "checking version of $MAKE... $ECHO_C" >&6 +- ac_prog_version=`$MAKE --version 2>&1 | sed -n 's/^.*GNU Make[^0-9]*\([0-9][0-9.]*\).*$/\1/p'` +- case $ac_prog_version in +- '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; +- 3.79* | 3.[89]*) +- ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; +- *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; +- +- esac +- echo "$as_me:$LINENO: result: $ac_prog_version" >&5 +-echo "${ECHO_T}$ac_prog_version" >&6 +-fi +-if test $ac_verc_fail = yes; then +- critic_missing="$critic_missing make" +-fi +- +- +- +-if test -n "$critic_missing"; then +-{ { echo "$as_me:$LINENO: error: +-*** These critical programs are missing or too old:$critic_missing +-*** Check the INSTALL file for required versions." >&5 +-echo "$as_me: error: +-*** These critical programs are missing or too old:$critic_missing +-*** Check the INSTALL file for required versions." >&2;} +- { (exit 1); exit 1; }; } +-fi +- +- +-for ac_prog in gnumsgfmt gmsgfmt msgfmt +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-echo "$as_me:$LINENO: checking for $ac_word" >&5 +-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +-if test "${ac_cv_prog_MSGFMT+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- if test -n "$MSGFMT"; then +- ac_cv_prog_MSGFMT="$MSGFMT" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_MSGFMT="$ac_prog" +- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +-done +- +-fi +-fi +-MSGFMT=$ac_cv_prog_MSGFMT +-if test -n "$MSGFMT"; then +- echo "$as_me:$LINENO: result: $MSGFMT" >&5 +-echo "${ECHO_T}$MSGFMT" >&6 +-else +- echo "$as_me:$LINENO: result: no" >&5 +-echo "${ECHO_T}no" >&6 +-fi +- +- test -n "$MSGFMT" && break +-done +- +-if test -z "$MSGFMT"; then +- ac_verc_fail=yes +-else +- # Found it, now check the version. +- echo "$as_me:$LINENO: checking version of $MSGFMT" >&5 +-echo $ECHO_N "checking version of $MSGFMT... $ECHO_C" >&6 +- ac_prog_version=`$MSGFMT --version 2>&1 | sed -n 's/^.*GNU gettext.* \([0-9]*\.[0-9.]*\).*$/\1/p'` +- case $ac_prog_version in +- '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; +- 0.10.3[6-9]* | 0.10.[4-9][0-9]* | 0.1[1-9]* | 0.[2-9][0-9]* | [1-9].*) +- ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; +- *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; +- +- esac +- echo "$as_me:$LINENO: result: $ac_prog_version" >&5 +-echo "${ECHO_T}$ac_prog_version" >&6 +-fi +-if test $ac_verc_fail = yes; then +- MSGFMT=: aux_missing="$aux_missing msgfmt" +-fi +- +-for ac_prog in makeinfo +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-echo "$as_me:$LINENO: checking for $ac_word" >&5 +-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +-if test "${ac_cv_prog_MAKEINFO+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- if test -n "$MAKEINFO"; then +- ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_MAKEINFO="$ac_prog" +- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +-done +- +-fi +-fi +-MAKEINFO=$ac_cv_prog_MAKEINFO +-if test -n "$MAKEINFO"; then +- echo "$as_me:$LINENO: result: $MAKEINFO" >&5 +-echo "${ECHO_T}$MAKEINFO" >&6 +-else +- echo "$as_me:$LINENO: result: no" >&5 +-echo "${ECHO_T}no" >&6 +-fi +- +- test -n "$MAKEINFO" && break +-done +- +-if test -z "$MAKEINFO"; then +- ac_verc_fail=yes +-else +- # Found it, now check the version. +- echo "$as_me:$LINENO: checking version of $MAKEINFO" >&5 +-echo $ECHO_N "checking version of $MAKEINFO... $ECHO_C" >&6 +- ac_prog_version=`$MAKEINFO --version 2>&1 | sed -n 's/^.*GNU texinfo.* \([0-9][0-9.]*\).*$/\1/p'` +- case $ac_prog_version in +- '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; +- 4.*) +- ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; +- *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; +- +- esac +- echo "$as_me:$LINENO: result: $ac_prog_version" >&5 +-echo "${ECHO_T}$ac_prog_version" >&6 +-fi +-if test $ac_verc_fail = yes; then +- MAKEINFO=: aux_missing="$aux_missing makeinfo" +-fi +- +-for ac_prog in sed +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-echo "$as_me:$LINENO: checking for $ac_word" >&5 +-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +-if test "${ac_cv_prog_SED+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- if test -n "$SED"; then +- ac_cv_prog_SED="$SED" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_SED="$ac_prog" +- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +-done +- +-fi +-fi +-SED=$ac_cv_prog_SED +-if test -n "$SED"; then +- echo "$as_me:$LINENO: result: $SED" >&5 +-echo "${ECHO_T}$SED" >&6 +-else +- echo "$as_me:$LINENO: result: no" >&5 +-echo "${ECHO_T}no" >&6 +-fi +- +- test -n "$SED" && break +-done +- +-if test -z "$SED"; then +- ac_verc_fail=yes +-else +- # Found it, now check the version. +- echo "$as_me:$LINENO: checking version of $SED" >&5 +-echo $ECHO_N "checking version of $SED... $ECHO_C" >&6 +- ac_prog_version=`$SED --version 2>&1 | sed -n 's/^.*GNU sed version \([0-9]*\.[0-9.]*\).*$/\1/p'` +- case $ac_prog_version in +- '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; +- 3.0[2-9]*|3.[1-9]*|[4-9]*) +- ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; +- *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; +- +- esac +- echo "$as_me:$LINENO: result: $ac_prog_version" >&5 +-echo "${ECHO_T}$ac_prog_version" >&6 +-fi +-if test $ac_verc_fail = yes; then +- SED=: aux_missing="$aux_missing sed" +-fi +- +- +-if test "x$with_cvs" != xyes; then +- for ac_prog in autoconf +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-echo "$as_me:$LINENO: checking for $ac_word" >&5 +-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +-if test "${ac_cv_prog_AUTOCONF+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- if test -n "$AUTOCONF"; then +- ac_cv_prog_AUTOCONF="$AUTOCONF" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_AUTOCONF="$ac_prog" +- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +-done +- +-fi +-fi +-AUTOCONF=$ac_cv_prog_AUTOCONF +-if test -n "$AUTOCONF"; then +- echo "$as_me:$LINENO: result: $AUTOCONF" >&5 +-echo "${ECHO_T}$AUTOCONF" >&6 +-else +- echo "$as_me:$LINENO: result: no" >&5 +-echo "${ECHO_T}no" >&6 +-fi +- +- test -n "$AUTOCONF" && break +-done +-test -n "$AUTOCONF" || AUTOCONF="no" +- +- case "x$AUTOCONF" in +- xno|x|x:) AUTOCONF=no ;; +- *) +- echo "$as_me:$LINENO: checking whether $AUTOCONF${ACFLAGS:+ }$ACFLAGS works" >&5 +-echo $ECHO_N "checking whether $AUTOCONF${ACFLAGS:+ }$ACFLAGS works... $ECHO_C" >&6 +-if test "${libc_cv_autoconf_works+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- if (cd $srcdir; $AUTOCONF $ACFLAGS configure.in > /dev/null 2>&1); then +- libc_cv_autoconf_works=yes +- else +- libc_cv_autoconf_works=no +- fi +-fi +-echo "$as_me:$LINENO: result: $libc_cv_autoconf_works" >&5 +-echo "${ECHO_T}$libc_cv_autoconf_works" >&6 +- test $libc_cv_autoconf_works = yes || AUTOCONF=no +- ;; +- esac +- test "x$AUTOCONF" != xno || aux_missing="$aux_missing autoconf" +-fi +- + ac_ext=c + ac_cpp='$CPP $CPPFLAGS' + ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +@@ -3801,7 +3401,7 @@ + echo "${ECHO_T}$ac_prog_version" >&6 + fi + if test $ac_verc_fail = yes; then +- AS=: critic_missing=t ++ AS=: critic_missing="$critic_missing as" + fi + + for ac_prog in $LD +@@ -3862,9 +3462,441 @@ + echo "${ECHO_T}$ac_prog_version" >&6 + fi + if test $ac_verc_fail = yes; then +- LD=: critic_missing=t ++ LD=: critic_missing="$critic_missing ld" ++fi ++ ++ ++# We need the physical current working directory. We cannot use the ++# "pwd -P" shell builtin since that's not portable. Instead we try to ++# find a pwd binary. Note that assigning to the PWD environment ++# variable might have some interesting side effects, so we don't do ++# that. ++# Extract the first word of "pwd", so it can be a program name with args. ++set dummy pwd; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_path_PWD_P+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ case $PWD_P in ++ [\\/]* | ?:[\\/]*) ++ ac_cv_path_PWD_P="$PWD_P" # Let the user override the test with a path. ++ ;; ++ *) ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_path_PWD_P="$as_dir/$ac_word$ac_exec_ext" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++ test -z "$ac_cv_path_PWD_P" && ac_cv_path_PWD_P="no" ++ ;; ++esac + fi ++PWD_P=$ac_cv_path_PWD_P + ++if test -n "$PWD_P"; then ++ echo "$as_me:$LINENO: result: $PWD_P" >&5 ++echo "${ECHO_T}$PWD_P" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++if test "$PWD_P" = no; then ++ { { echo "$as_me:$LINENO: error: *** A pwd binary could not be found." >&5 ++echo "$as_me: error: *** A pwd binary could not be found." >&2;} ++ { (exit 1); exit 1; }; } ++fi ++ ++# These programs are version sensitive. ++ ++for ac_prog in ${ac_tool_prefix}gcc ${ac_tool_prefix}cc ++do ++ # Extract the first word of "$ac_prog", so it can be a program name with args. ++set dummy $ac_prog; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_CC+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$CC"; then ++ ac_cv_prog_CC="$CC" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_CC="$ac_prog" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++fi ++fi ++CC=$ac_cv_prog_CC ++if test -n "$CC"; then ++ echo "$as_me:$LINENO: result: $CC" >&5 ++echo "${ECHO_T}$CC" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ test -n "$CC" && break ++done ++ ++if test -z "$CC"; then ++ ac_verc_fail=yes ++else ++ # Found it, now check the version. ++ echo "$as_me:$LINENO: checking version of $CC" >&5 ++echo $ECHO_N "checking version of $CC... $ECHO_C" >&6 ++ ac_prog_version=`$CC -v 2>&1 | sed -n 's/^.*version \([egcygnustpi-]*[0-9.]*\).*$/\1/p'` ++ case $ac_prog_version in ++ '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; ++ 3.[2-9]*) ++ ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; ++ *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; ++ ++ esac ++ echo "$as_me:$LINENO: result: $ac_prog_version" >&5 ++echo "${ECHO_T}$ac_prog_version" >&6 ++fi ++if test $ac_verc_fail = yes; then ++ critic_missing="$critic_missing gcc" ++fi ++ ++for ac_prog in gnumake gmake make ++do ++ # Extract the first word of "$ac_prog", so it can be a program name with args. ++set dummy $ac_prog; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_MAKE+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$MAKE"; then ++ ac_cv_prog_MAKE="$MAKE" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_MAKE="$ac_prog" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++fi ++fi ++MAKE=$ac_cv_prog_MAKE ++if test -n "$MAKE"; then ++ echo "$as_me:$LINENO: result: $MAKE" >&5 ++echo "${ECHO_T}$MAKE" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ test -n "$MAKE" && break ++done ++ ++if test -z "$MAKE"; then ++ ac_verc_fail=yes ++else ++ # Found it, now check the version. ++ echo "$as_me:$LINENO: checking version of $MAKE" >&5 ++echo $ECHO_N "checking version of $MAKE... $ECHO_C" >&6 ++ ac_prog_version=`$MAKE --version 2>&1 | sed -n 's/^.*GNU Make[^0-9]*\([0-9][0-9.]*\).*$/\1/p'` ++ case $ac_prog_version in ++ '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; ++ 3.79* | 3.[89]*) ++ ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; ++ *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; ++ ++ esac ++ echo "$as_me:$LINENO: result: $ac_prog_version" >&5 ++echo "${ECHO_T}$ac_prog_version" >&6 ++fi ++if test $ac_verc_fail = yes; then ++ critic_missing="$critic_missing make" ++fi ++ ++ ++for ac_prog in gnumsgfmt gmsgfmt msgfmt ++do ++ # Extract the first word of "$ac_prog", so it can be a program name with args. ++set dummy $ac_prog; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_MSGFMT+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$MSGFMT"; then ++ ac_cv_prog_MSGFMT="$MSGFMT" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_MSGFMT="$ac_prog" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++fi ++fi ++MSGFMT=$ac_cv_prog_MSGFMT ++if test -n "$MSGFMT"; then ++ echo "$as_me:$LINENO: result: $MSGFMT" >&5 ++echo "${ECHO_T}$MSGFMT" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ test -n "$MSGFMT" && break ++done ++ ++if test -z "$MSGFMT"; then ++ ac_verc_fail=yes ++else ++ # Found it, now check the version. ++ echo "$as_me:$LINENO: checking version of $MSGFMT" >&5 ++echo $ECHO_N "checking version of $MSGFMT... $ECHO_C" >&6 ++ ac_prog_version=`$MSGFMT --version 2>&1 | sed -n 's/^.*GNU gettext.* \([0-9]*\.[0-9.]*\).*$/\1/p'` ++ case $ac_prog_version in ++ '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; ++ 0.10.3[6-9]* | 0.10.[4-9][0-9]* | 0.1[1-9]* | 0.[2-9][0-9]* | [1-9].*) ++ ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; ++ *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; ++ ++ esac ++ echo "$as_me:$LINENO: result: $ac_prog_version" >&5 ++echo "${ECHO_T}$ac_prog_version" >&6 ++fi ++if test $ac_verc_fail = yes; then ++ MSGFMT=: aux_missing="$aux_missing msgfmt" ++fi ++ ++for ac_prog in makeinfo ++do ++ # Extract the first word of "$ac_prog", so it can be a program name with args. ++set dummy $ac_prog; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_MAKEINFO+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$MAKEINFO"; then ++ ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_MAKEINFO="$ac_prog" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++fi ++fi ++MAKEINFO=$ac_cv_prog_MAKEINFO ++if test -n "$MAKEINFO"; then ++ echo "$as_me:$LINENO: result: $MAKEINFO" >&5 ++echo "${ECHO_T}$MAKEINFO" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ test -n "$MAKEINFO" && break ++done ++ ++if test -z "$MAKEINFO"; then ++ ac_verc_fail=yes ++else ++ # Found it, now check the version. ++ echo "$as_me:$LINENO: checking version of $MAKEINFO" >&5 ++echo $ECHO_N "checking version of $MAKEINFO... $ECHO_C" >&6 ++ ac_prog_version=`$MAKEINFO --version 2>&1 | sed -n 's/^.*GNU texinfo.* \([0-9][0-9.]*\).*$/\1/p'` ++ case $ac_prog_version in ++ '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; ++ 4.*) ++ ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; ++ *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; ++ ++ esac ++ echo "$as_me:$LINENO: result: $ac_prog_version" >&5 ++echo "${ECHO_T}$ac_prog_version" >&6 ++fi ++if test $ac_verc_fail = yes; then ++ MAKEINFO=: aux_missing="$aux_missing makeinfo" ++fi ++ ++for ac_prog in sed ++do ++ # Extract the first word of "$ac_prog", so it can be a program name with args. ++set dummy $ac_prog; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_SED+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$SED"; then ++ ac_cv_prog_SED="$SED" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_SED="$ac_prog" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++fi ++fi ++SED=$ac_cv_prog_SED ++if test -n "$SED"; then ++ echo "$as_me:$LINENO: result: $SED" >&5 ++echo "${ECHO_T}$SED" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ test -n "$SED" && break ++done ++ ++if test -z "$SED"; then ++ ac_verc_fail=yes ++else ++ # Found it, now check the version. ++ echo "$as_me:$LINENO: checking version of $SED" >&5 ++echo $ECHO_N "checking version of $SED... $ECHO_C" >&6 ++ ac_prog_version=`$SED --version 2>&1 | sed -n 's/^.*GNU sed version \([0-9]*\.[0-9.]*\).*$/\1/p'` ++ case $ac_prog_version in ++ '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; ++ 3.0[2-9]*|3.[1-9]*|[4-9]*) ++ ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; ++ *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; ++ ++ esac ++ echo "$as_me:$LINENO: result: $ac_prog_version" >&5 ++echo "${ECHO_T}$ac_prog_version" >&6 ++fi ++if test $ac_verc_fail = yes; then ++ SED=: aux_missing="$aux_missing sed" ++fi ++ ++ ++if test "x$with_cvs" != xyes; then ++ for ac_prog in autoconf ++do ++ # Extract the first word of "$ac_prog", so it can be a program name with args. ++set dummy $ac_prog; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_AUTOCONF+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$AUTOCONF"; then ++ ac_cv_prog_AUTOCONF="$AUTOCONF" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_AUTOCONF="$ac_prog" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++fi ++fi ++AUTOCONF=$ac_cv_prog_AUTOCONF ++if test -n "$AUTOCONF"; then ++ echo "$as_me:$LINENO: result: $AUTOCONF" >&5 ++echo "${ECHO_T}$AUTOCONF" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ test -n "$AUTOCONF" && break ++done ++test -n "$AUTOCONF" || AUTOCONF="no" ++ ++ case "x$AUTOCONF" in ++ xno|x|x:) AUTOCONF=no ;; ++ *) ++ echo "$as_me:$LINENO: checking whether $AUTOCONF${ACFLAGS:+ }$ACFLAGS works" >&5 ++echo $ECHO_N "checking whether $AUTOCONF${ACFLAGS:+ }$ACFLAGS works... $ECHO_C" >&6 ++if test "${libc_cv_autoconf_works+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if (cd $srcdir; $AUTOCONF $ACFLAGS configure.in > /dev/null 2>&1); then ++ libc_cv_autoconf_works=yes ++ else ++ libc_cv_autoconf_works=no ++ fi ++fi ++echo "$as_me:$LINENO: result: $libc_cv_autoconf_works" >&5 ++echo "${ECHO_T}$libc_cv_autoconf_works" >&6 ++ test $libc_cv_autoconf_works = yes || AUTOCONF=no ++ ;; ++ esac ++ test "x$AUTOCONF" != xno || aux_missing="$aux_missing autoconf" ++fi ++ ++test -n "$critic_missing" && { { echo "$as_me:$LINENO: error: ++*** These critical programs are missing or too old:$critic_missing ++*** Check the INSTALL file for required versions." >&5 ++echo "$as_me: error: ++*** These critical programs are missing or too old:$critic_missing ++*** Check the INSTALL file for required versions." >&2;} ++ { (exit 1); exit 1; }; } + + test -n "$aux_missing" && { echo "$as_me:$LINENO: WARNING: + *** These auxiliary programs are missing or incompatible versions:$aux_missing +@@ -4357,7 +4389,12 @@ + #include "confdefs.h" + /* Nothing whatsoever. */ + EOF +-if ${CC-cc} $CFLAGS -c conftest.S 2>/dev/null; then ++if { ac_try='${CC-cc} $CFLAGS -c conftest.S 1>&5' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then + libc_cv_need_minus_P=no + else + libc_cv_need_minus_P=yes +@@ -4380,7 +4417,12 @@ + .text + EOF + libc_cv_dot_text= +-if ${CC-cc} $CFLAGS -c conftest.s 2>/dev/null; then ++if { ac_try='${CC-cc} $CFLAGS -c conftest.s 1>&5' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then + libc_cv_dot_text=.text + fi + rm -f conftest* +@@ -4406,7 +4448,12 @@ + ${ac_globl} foo + foo: + EOF +- if ${CC-cc} $CFLAGS -c conftest.s 2>/dev/null; then ++ if { ac_try='${CC-cc} $CFLAGS -c conftest.s 1>&5' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then + libc_cv_asm_global_directive=${ac_globl} + fi + rm -f conftest* +@@ -4441,9 +4488,10 @@ + # (but it doesn't work), so we must do a linking check to be sure. + cat > conftest1.c <<\EOF + extern int glibc_conftest_frobozz; +-main () { printf ("%d\n", glibc_conftest_frobozz); } ++void _start() { glibc_conftest_frobozz = 1; } + EOF + if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \ ++ -nostartfiles -nostdlib \ + -o conftest conftest.s conftest1.c 1>&5 2>&5; then + libc_cv_asm_set_directive=yes + else +@@ -4475,7 +4523,12 @@ + foo: + .byte 1 + EOF +- if ${CC-cc} $CFLAGS -c conftest.s 2>/dev/null; then ++ if { ac_try='${CC-cc} $CFLAGS -c conftest.s 1>&5' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then + libc_cv_asm_type_prefix=${ac_try_prefix} + fi + rm -f conftest* +@@ -4692,7 +4745,12 @@ + int bar __attribute__ ((visibility ("protected"))) = 1; + EOF + libc_cv_visibility_attribute=no +- if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then ++ if { ac_try='${CC-cc} -Werror -S conftest.c -o conftest.s 1>&5' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then + if grep '\.hidden.*foo' conftest.s >/dev/null; then + if grep '\.protected.*bar' conftest.s >/dev/null; then + libc_cv_visibility_attribute=yes +@@ -4724,7 +4782,12 @@ + int bar (int x) { return x; } + EOF + libc_cv_broken_visibility_attribute=yes +- if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then ++ if { ac_try='${CC-cc} -Werror -S conftest.c -o conftest.s1>&5' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then + if grep '\.hidden[ _]foo' conftest.s >/dev/null; then + libc_cv_broken_visibility_attribute=no + fi +@@ -4756,7 +4819,12 @@ + int dfoo = 1; + EOF + libc_cv_broken_alias_attribute=yes +- if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then ++ if { ac_try='${CC-cc} -Werror -S conftest.c -o conftest.s 1>&5' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then + if grep 'xyzzy' conftest.s >/dev/null && + grep 'abccb' conftest.s >/dev/null; then + libc_cv_broken_alias_attribute=no +@@ -5128,7 +5196,7 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat > conftest.$ac_ext </dev/null; then ++if { ac_try='${CC-cc} $CFLAGS -c conftest.s 1>&5' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then + libc_cv_asm_weak_directive=yes + else + libc_cv_asm_weak_directive=no +@@ -5205,7 +5278,12 @@ + ${libc_cv_asm_global_directive} baz + baz: + EOF +- if ${CC-cc} $CFLAGS -c conftest.s 2>/dev/null; then ++ if { ac_try='${CC-cc} $CFLAGS -c conftest.s 1>&5' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then + libc_cv_asm_weakext_directive=yes + else + libc_cv_asm_weakext_directive=no +@@ -5272,6 +5350,57 @@ + ;; + esac + ++echo "$as_me:$LINENO: checking if -g produces usable source locations for assembler-with-cpp" >&5 ++echo $ECHO_N "checking if -g produces usable source locations for assembler-with-cpp... $ECHO_C" >&6 ++if test "${libc_cv_cpp_asm_debuginfo+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat > conftest.S <&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ ac_pattern='conftest\.S' ++ { ac_try='readelf --debug-dump=line conftest.o | ++ grep $ac_pattern 1>&5' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ libc_cv_cpp_asm_debuginfo=yes ++else ++ libc_cv_cpp_asm_debuginfo=no ++fi ++rm -f conftest* ++fi ++echo "$as_me:$LINENO: result: $libc_cv_cpp_asm_debuginfo" >&5 ++echo "${ECHO_T}$libc_cv_cpp_asm_debuginfo" >&6 ++if test $libc_cv_cpp_asm_debuginfo = yes; then ++ cat >>confdefs.h <<\_ACEOF ++#define HAVE_CPP_ASM_DEBUGINFO 1 ++_ACEOF ++ ++fi ++ + echo "$as_me:$LINENO: checking for ld --no-whole-archive" >&5 + echo $ECHO_N "checking for ld --no-whole-archive... $ECHO_C" >&6 + if test "${libc_cv_ld_no_whole_archive+set}" = set; then +@@ -5393,7 +5522,7 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat > conftest.c <&6 + else + cat > conftest.c <&6 + else + cat > conftest.c <&5 +-echo "${ECHO_T}running configure fragment for $dest" >&6 ++ echo "$as_me:$LINENO: result: running configure fragment for $dir" >&5 ++echo "${ECHO_T}running configure fragment for $dir" >&6 + . $dest/configure + fi + +@@ -7176,6 +7305,7 @@ + s,@LIBS@,$LIBS,;t t + s,@with_fp@,$with_fp,;t t + s,@with_cvs@,$with_cvs,;t t ++s,@enable_check_abi@,$enable_check_abi,;t t + s,@oldest_abi@,$oldest_abi,;t t + s,@subdirs@,$subdirs,;t t + s,@force_install@,$force_install,;t t +@@ -7194,13 +7324,7 @@ + s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t + s,@INSTALL_DATA@,$INSTALL_DATA,;t t + s,@LN_S@,$LN_S,;t t +-s,@PWD_P@,$PWD_P,;t t + s,@CC@,$CC,;t t +-s,@MAKE@,$MAKE,;t t +-s,@MSGFMT@,$MSGFMT,;t t +-s,@MAKEINFO@,$MAKEINFO,;t t +-s,@SED@,$SED,;t t +-s,@AUTOCONF@,$AUTOCONF,;t t + s,@CFLAGS@,$CFLAGS,;t t + s,@LDFLAGS@,$LDFLAGS,;t t + s,@CPPFLAGS@,$CPPFLAGS,;t t +@@ -7216,6 +7340,12 @@ + s,@MIG@,$MIG,;t t + s,@AS@,$AS,;t t + s,@LD@,$LD,;t t ++s,@PWD_P@,$PWD_P,;t t ++s,@MAKE@,$MAKE,;t t ++s,@MSGFMT@,$MSGFMT,;t t ++s,@MAKEINFO@,$MAKEINFO,;t t ++s,@SED@,$SED,;t t ++s,@AUTOCONF@,$AUTOCONF,;t t + s,@CCVERSION@,$CCVERSION,;t t + s,@SYSINCLUDES@,$SYSINCLUDES,;t t + s,@libc_cv_gcc_static_libgcc@,$libc_cv_gcc_static_libgcc,;t t +@@ -7237,6 +7367,7 @@ + s,@libc_cv_Bgroup@,$libc_cv_Bgroup,;t t + s,@libc_cv_z_combreloc@,$libc_cv_z_combreloc,;t t + s,@libc_cv_have_initfini@,$libc_cv_have_initfini,;t t ++s,@libc_cv_cpp_asm_debuginfo@,$libc_cv_cpp_asm_debuginfo,;t t + s,@no_whole_archive@,$no_whole_archive,;t t + s,@exceptions@,$exceptions,;t t + s,@LIBGD@,$LIBGD,;t t +diff -u -udbrN glibc-2.3.2/configure.in glibc-2.3.2-200304020432/configure.in +--- glibc-2.3.2/configure.in Wed Feb 26 01:46:31 2003 ++++ glibc-2.3.2-200304020432/configure.in Tue Apr 1 08:53:27 2003 +@@ -113,6 +113,14 @@ + [enable_sanity=$enableval], + [enable_sanity=yes]) + ++AC_SUBST(enable_check_abi) ++AC_ARG_ENABLE([check-abi], ++ AC_HELP_STRING([--enable-check-abi], ++ [do "make check-abi" in "make check" (no/warn/yes) ++ @<:@default=no@:>@]), ++ [enable_check_abi=$enableval], ++ [enable_check_abi=no]) ++ + dnl Arguments to enable or disable building the static, shared, profiled, + dnl and -fomit-frame-pointer libraries. + dnl I've disabled this for now since we cannot build glibc without static +@@ -378,8 +386,33 @@ + m68k) base_machine=m68k machine=m68k/m68020 ;; + m88???) base_machine=m88k machine=m88k/$machine ;; + m88k) base_machine=m88k machine=m88k/m88100 ;; +-mips64*) base_machine=mips64 machine=mips/mips64/$machine ;; +-mips*) base_machine=mips machine=mips/$machine ;; ++mips64*) base_machine=mips64 ++ case "$CC $CPPFLAGS $CFLAGS " in ++ *" -mabi=n32 "*) mips_cc_abi=n32 ;; ++ *" -mabi=64 "*|*" -mabi=n64 "*) mips_cc_abi=64 ;; ++ *" -mabi=32 "*|*" -mabi=o32 "*) mips_cc_abi=32 ;; ++ *) mips_cc_abi=default ;; ++ esac ++ case $config_os in ++ *abin32*) mips_config_abi=n32 ;; ++ *abi64*|*abin64*) mips_config_abi=64 ;; ++ *abi32*|*abio32*) mips_config_abi=32 ;; ++ *) mips_config_abi=$mips_cc_abi ;; ++ esac ++ case $mips_config_abi in ++ default) machine=mips/mips64/n32 mips_config_abi=n32 ;; ++ n32) machine=mips/mips64/n32 ;; ++ 64) machine=mips/mips64/n64 ;; ++ 32) machine=mips/mips32/kern64 ;; ++ esac ++ machine=$machine/$config_machine ++ if test $mips_config_abi != $mips_cc_abi; then ++ # This won't make it to config.make, but we want to ++ # set this in case configure tests depend on it. ++ CPPFLAGS="$CPPFLAGS -mabi=$mips_config_abi" ++ fi ++ ;; ++mips*) base_machine=mips machine=mips/mips32/$machine ;; + powerpc) base_machine=powerpc machine=powerpc/powerpc32 ;; + powerpc64) base_machine=powerpc machine=powerpc/powerpc64 ;; + s390) base_machine=s390 machine=s390/s390-32 ;; +@@ -637,6 +670,23 @@ + fi + AC_PROG_LN_S + ++AC_PROG_CC ++if test $host != $build; then ++ AC_CHECK_PROGS(BUILD_CC, gcc cc) ++fi ++AC_SUBST(cross_compiling) ++AC_PROG_CPP ++LIBC_PROG_BINUTILS ++AC_SUBST(MIG)dnl Needed by sysdeps/mach/configure.in ++ ++# Accept binutils 2.13 or newer. ++AC_CHECK_PROG_VER(AS, $AS, --version, ++ [GNU assembler.* \([0-9]*\.[0-9.]*\)], ++ [2.1[3-9]*], AS=: critic_missing="$critic_missing as") ++AC_CHECK_PROG_VER(LD, $LD, --version, ++ [GNU ld.* \([0-9][0-9]*\.[0-9.]*\)], ++ [2.1[3-9]*], LD=: critic_missing="$critic_missing ld") ++ + # We need the physical current working directory. We cannot use the + # "pwd -P" shell builtin since that's not portable. Instead we try to + # find a pwd binary. Note that assigning to the PWD environment +@@ -656,14 +706,6 @@ + [GNU Make[^0-9]*\([0-9][0-9.]*\)], + [3.79* | 3.[89]*], critic_missing="$critic_missing make") + +- +-if test -n "$critic_missing"; then +-AC_MSG_ERROR([ +-*** These critical programs are missing or too old:$critic_missing +-*** Check the INSTALL file for required versions.]) +-fi +- +- + AC_CHECK_PROG_VER(MSGFMT, gnumsgfmt gmsgfmt msgfmt, --version, + [GNU gettext.* \([0-9]*\.[0-9.]*\)], + [0.10.3[6-9]* | 0.10.[4-9][0-9]* | 0.1[1-9]* | 0.[2-9][0-9]* | [1-9].*], +@@ -695,22 +737,9 @@ + test "x$AUTOCONF" != xno || aux_missing="$aux_missing autoconf" + fi + +-AC_PROG_CC +-if test $host != $build; then +- AC_CHECK_PROGS(BUILD_CC, gcc cc) +-fi +-AC_SUBST(cross_compiling) +-AC_PROG_CPP +-LIBC_PROG_BINUTILS +-AC_SUBST(MIG)dnl Needed by sysdeps/mach/configure.in +- +-# Accept binutils 2.13 or newer. +-AC_CHECK_PROG_VER(AS, $AS, --version, +- [GNU assembler.* \([0-9]*\.[0-9.]*\)], +- [2.1[3-9]*], AS=: critic_missing=t) +-AC_CHECK_PROG_VER(LD, $LD, --version, +- [GNU ld.* \([0-9][0-9]*\.[0-9.]*\)], +- [2.1[3-9]*], LD=: critic_missing=t) ++test -n "$critic_missing" && AC_MSG_ERROR([ ++*** These critical programs are missing or too old:$critic_missing ++*** Check the INSTALL file for required versions.]) + + test -n "$aux_missing" && AC_MSG_WARN([ + *** These auxiliary programs are missing or incompatible versions:$aux_missing +@@ -889,7 +918,7 @@ + #include "confdefs.h" + /* Nothing whatsoever. */ + EOF +-if ${CC-cc} $CFLAGS -c conftest.S 2>/dev/null; then ++if AC_TRY_COMMAND(${CC-cc} $CFLAGS -c conftest.S 1>&AS_MESSAGE_LOG_FD); then + libc_cv_need_minus_P=no + else + libc_cv_need_minus_P=yes +@@ -906,7 +935,7 @@ + .text + EOF + libc_cv_dot_text= +-if ${CC-cc} $CFLAGS -c conftest.s 2>/dev/null; then ++if AC_TRY_COMMAND(${CC-cc} $CFLAGS -c conftest.s 1>&AS_MESSAGE_LOG_FD); then + libc_cv_dot_text=.text + fi + rm -f conftest*]) +@@ -925,7 +954,7 @@ + ${ac_globl} foo + foo: + EOF +- if ${CC-cc} $CFLAGS -c conftest.s 2>/dev/null; then ++ if AC_TRY_COMMAND(${CC-cc} $CFLAGS -c conftest.s 1>&AS_MESSAGE_LOG_FD); then + libc_cv_asm_global_directive=${ac_globl} + fi + rm -f conftest* +@@ -948,9 +977,10 @@ + # (but it doesn't work), so we must do a linking check to be sure. + cat > conftest1.c <<\EOF + extern int glibc_conftest_frobozz; +-main () { printf ("%d\n", glibc_conftest_frobozz); } ++void _start() { glibc_conftest_frobozz = 1; } + EOF + if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \ ++ -nostartfiles -nostdlib \ + -o conftest conftest.s conftest1.c 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + libc_cv_asm_set_directive=yes + else +@@ -973,7 +1003,7 @@ + foo: + .byte 1 + EOF +- if ${CC-cc} $CFLAGS -c conftest.s 2>/dev/null; then ++ if AC_TRY_COMMAND(${CC-cc} $CFLAGS -c conftest.s 1>&AS_MESSAGE_LOG_FD); then + libc_cv_asm_type_prefix=${ac_try_prefix} + fi + rm -f conftest* +@@ -1111,7 +1141,7 @@ + int bar __attribute__ ((visibility ("protected"))) = 1; + EOF + libc_cv_visibility_attribute=no +- if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then ++ if AC_TRY_COMMAND(${CC-cc} -Werror -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD); then + if grep '\.hidden.*foo' conftest.s >/dev/null; then + if grep '\.protected.*bar' conftest.s >/dev/null; then + libc_cv_visibility_attribute=yes +@@ -1134,7 +1164,7 @@ + int bar (int x) { return x; } + EOF + libc_cv_broken_visibility_attribute=yes +- if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then ++ if AC_TRY_COMMAND(${CC-cc} -Werror -S conftest.c -o conftest.s1>&AS_MESSAGE_LOG_FD); then + changequote(,)dnl + if grep '\.hidden[ _]foo' conftest.s >/dev/null; then + changequote([,])dnl +@@ -1159,7 +1189,7 @@ + int dfoo = 1; + EOF + libc_cv_broken_alias_attribute=yes +- if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then ++ if AC_TRY_COMMAND(${CC-cc} -Werror -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD); then + if grep 'xyzzy' conftest.s >/dev/null && + grep 'abccb' conftest.s >/dev/null; then + libc_cv_broken_alias_attribute=no +@@ -1398,7 +1428,7 @@ + .weak foo + .weak bar; bar = foo + EOF +-if ${CC-cc} $CFLAGS -c conftest.s 2>/dev/null; then ++if AC_TRY_COMMAND(${CC-cc} $CFLAGS -c conftest.s 1>&AS_MESSAGE_LOG_FD); then + libc_cv_asm_weak_directive=yes + else + libc_cv_asm_weak_directive=no +@@ -1418,7 +1448,7 @@ + ${libc_cv_asm_global_directive} baz + baz: + EOF +- if ${CC-cc} $CFLAGS -c conftest.s 2>/dev/null; then ++ if AC_TRY_COMMAND(${CC-cc} $CFLAGS -c conftest.s 1>&AS_MESSAGE_LOG_FD); then + libc_cv_asm_weakext_directive=yes + else + libc_cv_asm_weakext_directive=no +@@ -1462,6 +1492,38 @@ + ;; + esac + ++AC_CACHE_CHECK(if -g produces usable source locations for assembler-with-cpp, ++ libc_cv_cpp_asm_debuginfo, [dnl ++cat > conftest.S <&AS_MESSAGE_LOG_FD]) && ++ ac_pattern='conftest\.S' ++ AC_TRY_COMMAND([readelf --debug-dump=line conftest.o | ++ grep $ac_pattern 1>&AS_MESSAGE_LOG_FD]); then ++ libc_cv_cpp_asm_debuginfo=yes ++else ++ libc_cv_cpp_asm_debuginfo=no ++fi ++rm -f conftest*])AC_SUBST(libc_cv_cpp_asm_debuginfo) ++if test $libc_cv_cpp_asm_debuginfo = yes; then ++ AC_DEFINE(HAVE_CPP_ASM_DEBUGINFO) ++fi ++ + AC_CACHE_CHECK(for ld --no-whole-archive, libc_cv_ld_no_whole_archive, [dnl + cat > conftest.c <<\EOF + _start () {} +@@ -1732,7 +1794,7 @@ + *) dest=$srcdir/$dir ;; + esac + if test -r $dest/configure; then +- AC_MSG_RESULT(running configure fragment for $dest) ++ AC_MSG_RESULT(running configure fragment for $dir) + . $dest/configure + fi + [ +diff -u -udbrN glibc-2.3.2/csu/Makefile glibc-2.3.2-200304020432/csu/Makefile +--- glibc-2.3.2/csu/Makefile Tue Dec 31 23:24:37 2002 ++++ glibc-2.3.2-200304020432/csu/Makefile Sun Mar 23 00:00:17 2003 +@@ -1,5 +1,5 @@ + # Makefile for csu code for GNU C library. +-# Copyright (C) 1995,96,97,98,99,2000,01,2002 Free Software Foundation, Inc. ++# Copyright (C) 1995,96,97,98,99,2000,01,02,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 +@@ -41,6 +41,8 @@ + abi-note.S init.c munch-tmpl.c + generated = version-info.h + before-compile = $(objpfx)version-info.h ++ ++tests := tst-atomic tst-atomic-long + + all: # Make this the default target; it will be defined in Rules. + +diff -u -udbrN glibc-2.3.2/csu/tst-atomic-long.c glibc-2.3.2-200304020432/csu/tst-atomic-long.c +--- glibc-2.3.2/csu/tst-atomic-long.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/csu/tst-atomic-long.c Sun Mar 23 00:00:17 2003 +@@ -0,0 +1,28 @@ ++/* Tests for atomic.h macros. ++ Copyright (C) 2003 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Jakub Jelinek , 2003. ++ ++ 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 ++ ++#define atomic_t long ++#if __WORDSIZE == 64 ++# define TEST_ATOMIC64 1 ++#endif ++ ++#include "tst-atomic.c" +diff -u -udbrN glibc-2.3.2/csu/tst-atomic.c glibc-2.3.2-200304020432/csu/tst-atomic.c +--- glibc-2.3.2/csu/tst-atomic.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/csu/tst-atomic.c Wed Mar 26 05:01:47 2003 +@@ -0,0 +1,373 @@ ++/* Tests for atomic.h macros. ++ Copyright (C) 2003 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Jakub Jelinek , 2003. ++ ++ 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 ++ ++#ifndef atomic_t ++# define atomic_t int ++#endif ++ ++/* Test various atomic.h macros. */ ++static int ++do_test (void) ++{ ++ atomic_t mem; ++ int ret = 0; ++ ++#ifdef atomic_compare_and_exchange_val_acq ++ mem = 24; ++ if (atomic_compare_and_exchange_val_acq (&mem, 35, 24) != 24 ++ || mem != 35) ++ { ++ puts ("atomic_compare_and_exchange_val_acq test 1 failed"); ++ ret = 1; ++ } ++ ++ mem = 12; ++ if (atomic_compare_and_exchange_val_acq (&mem, 10, 15) != 12 ++ || mem != 12) ++ { ++ puts ("atomic_compare_and_exchange_val_acq test 2 failed"); ++ ret = 1; ++ } ++ ++ mem = -15; ++ if (atomic_compare_and_exchange_val_acq (&mem, -56, -15) != -15 ++ || mem != -56) ++ { ++ puts ("atomic_compare_and_exchange_val_acq test 3 failed"); ++ ret = 1; ++ } ++ ++ mem = -1; ++ if (atomic_compare_and_exchange_val_acq (&mem, 17, 0) != -1 ++ || mem != -1) ++ { ++ puts ("atomic_compare_and_exchange_val_acq test 4 failed"); ++ ret = 1; ++ } ++#endif ++ ++ mem = 24; ++ if (atomic_compare_and_exchange_bool_acq (&mem, 35, 24) ++ || mem != 35) ++ { ++ puts ("atomic_compare_and_exchange_bool_acq test 1 failed"); ++ ret = 1; ++ } ++ ++ mem = 12; ++ if (! atomic_compare_and_exchange_bool_acq (&mem, 10, 15) ++ || mem != 12) ++ { ++ puts ("atomic_compare_and_exchange_bool_acq test 2 failed"); ++ ret = 1; ++ } ++ ++ mem = -15; ++ if (atomic_compare_and_exchange_bool_acq (&mem, -56, -15) ++ || mem != -56) ++ { ++ puts ("atomic_compare_and_exchange_bool_acq test 3 failed"); ++ ret = 1; ++ } ++ ++ mem = -1; ++ if (! atomic_compare_and_exchange_bool_acq (&mem, 17, 0) ++ || mem != -1) ++ { ++ puts ("atomic_compare_and_exchange_bool_acq test 4 failed"); ++ ret = 1; ++ } ++ ++ mem = 64; ++ if (atomic_exchange (&mem, 31) != 64 ++ || mem != 31) ++ { ++ puts ("atomic_exchange test failed"); ++ ret = 1; ++ } ++ ++ mem = 2; ++ if (atomic_exchange_and_add (&mem, 11) != 2 ++ || mem != 13) ++ { ++ puts ("atomic_exchange_and_add test failed"); ++ ret = 1; ++ } ++ ++ mem = -21; ++ atomic_add (&mem, 22); ++ if (mem != 1) ++ { ++ puts ("atomic_add test failed"); ++ ret = 1; ++ } ++ ++ mem = -1; ++ atomic_increment (&mem); ++ if (mem != 0) ++ { ++ puts ("atomic_increment test failed"); ++ ret = 1; ++ } ++ ++ mem = 0; ++ if (atomic_increment_and_test (&mem) ++ || mem != 1) ++ { ++ puts ("atomic_increment_and_test test 1 failed"); ++ ret = 1; ++ } ++ ++ mem = 35; ++ if (atomic_increment_and_test (&mem) ++ || mem != 36) ++ { ++ puts ("atomic_increment_and_test test 2 failed"); ++ ret = 1; ++ } ++ ++ mem = -1; ++ if (! atomic_increment_and_test (&mem) ++ || mem != 0) ++ { ++ puts ("atomic_increment_and_test test 3 failed"); ++ ret = 1; ++ } ++ ++ mem = 17; ++ atomic_decrement (&mem); ++ if (mem != 16) ++ { ++ puts ("atomic_decrement test failed"); ++ ret = 1; ++ } ++ ++ mem = 0; ++ if (atomic_decrement_and_test (&mem) ++ || mem != -1) ++ { ++ puts ("atomic_decrement_and_test test 1 failed"); ++ ret = 1; ++ } ++ ++ mem = 15; ++ if (atomic_decrement_and_test (&mem) ++ || mem != 14) ++ { ++ puts ("atomic_decrement_and_test test 2 failed"); ++ ret = 1; ++ } ++ ++ mem = 1; ++ if (! atomic_decrement_and_test (&mem) ++ || mem != 0) ++ { ++ puts ("atomic_decrement_and_test test 3 failed"); ++ ret = 1; ++ } ++ ++ mem = 1; ++ if (atomic_decrement_if_positive (&mem) != 1 ++ || mem != 0) ++ { ++ puts ("atomic_decrement_if_positive test 1 failed"); ++ ret = 1; ++ } ++ ++ mem = 0; ++ if (atomic_decrement_if_positive (&mem) != 0 ++ || mem != 0) ++ { ++ puts ("atomic_decrement_if_positive test 2 failed"); ++ ret = 1; ++ } ++ ++ mem = -1; ++ if (atomic_decrement_if_positive (&mem) != -1 ++ || mem != -1) ++ { ++ puts ("atomic_decrement_if_positive test 3 failed"); ++ ret = 1; ++ } ++ ++ mem = -12; ++ if (! atomic_add_negative (&mem, 10) ++ || mem != -2) ++ { ++ puts ("atomic_add_negative test 1 failed"); ++ ret = 1; ++ } ++ ++ mem = 0; ++ if (atomic_add_negative (&mem, 100) ++ || mem != 100) ++ { ++ puts ("atomic_add_negative test 2 failed"); ++ ret = 1; ++ } ++ ++ mem = 15; ++ if (atomic_add_negative (&mem, -10) ++ || mem != 5) ++ { ++ puts ("atomic_add_negative test 3 failed"); ++ ret = 1; ++ } ++ ++ mem = -12; ++ if (atomic_add_negative (&mem, 14) ++ || mem != 2) ++ { ++ puts ("atomic_add_negative test 4 failed"); ++ ret = 1; ++ } ++ ++ mem = 0; ++ if (! atomic_add_negative (&mem, -1) ++ || mem != -1) ++ { ++ puts ("atomic_add_negative test 5 failed"); ++ ret = 1; ++ } ++ ++ mem = -31; ++ if (atomic_add_negative (&mem, 31) ++ || mem != 0) ++ { ++ puts ("atomic_add_negative test 6 failed"); ++ ret = 1; ++ } ++ ++ mem = -34; ++ if (atomic_add_zero (&mem, 31) ++ || mem != -3) ++ { ++ puts ("atomic_add_zero test 1 failed"); ++ ret = 1; ++ } ++ ++ mem = -36; ++ if (! atomic_add_zero (&mem, 36) ++ || mem != 0) ++ { ++ puts ("atomic_add_zero test 2 failed"); ++ ret = 1; ++ } ++ ++ mem = 113; ++ if (atomic_add_zero (&mem, -13) ++ || mem != 100) ++ { ++ puts ("atomic_add_zero test 3 failed"); ++ ret = 1; ++ } ++ ++ mem = -18; ++ if (atomic_add_zero (&mem, 20) ++ || mem != 2) ++ { ++ puts ("atomic_add_zero test 4 failed"); ++ ret = 1; ++ } ++ ++ mem = 10; ++ if (atomic_add_zero (&mem, -20) ++ || mem != -10) ++ { ++ puts ("atomic_add_zero test 5 failed"); ++ ret = 1; ++ } ++ ++ mem = 10; ++ if (! atomic_add_zero (&mem, -10) ++ || mem != 0) ++ { ++ puts ("atomic_add_zero test 6 failed"); ++ ret = 1; ++ } ++ ++ mem = 0; ++ atomic_bit_set (&mem, 1); ++ if (mem != 2) ++ { ++ puts ("atomic_bit_set test 1 failed"); ++ ret = 1; ++ } ++ ++ mem = 8; ++ atomic_bit_set (&mem, 3); ++ if (mem != 8) ++ { ++ puts ("atomic_bit_set test 2 failed"); ++ ret = 1; ++ } ++ ++#ifdef TEST_ATOMIC64 ++ mem = 16; ++ atomic_bit_set (&mem, 35); ++ if (mem != 0x800000010LL) ++ { ++ puts ("atomic_bit_set test 3 failed"); ++ ret = 1; ++ } ++#endif ++ ++ mem = 0; ++ if (atomic_bit_test_set (&mem, 1) ++ || mem != 2) ++ { ++ puts ("atomic_bit_test_set test 1 failed"); ++ ret = 1; ++ } ++ ++ mem = 8; ++ if (! atomic_bit_test_set (&mem, 3) ++ || mem != 8) ++ { ++ puts ("atomic_bit_test_set test 2 failed"); ++ ret = 1; ++ } ++ ++#ifdef TEST_ATOMIC64 ++ mem = 16; ++ if (atomic_bit_test_set (&mem, 35) ++ || mem != 0x800000010LL) ++ { ++ puts ("atomic_bit_test_set test 3 failed"); ++ ret = 1; ++ } ++ ++ mem = 0x100000000LL; ++ if (! atomic_bit_test_set (&mem, 32) ++ || mem != 0x100000000LL) ++ { ++ puts ("atomic_bit_test_set test 4 failed"); ++ ret = 1; ++ } ++#endif ++ ++ return ret; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff -u -udbrN glibc-2.3.2/dlfcn/Makefile glibc-2.3.2-200304020432/dlfcn/Makefile +--- glibc-2.3.2/dlfcn/Makefile Wed Feb 26 01:46:32 2003 ++++ glibc-2.3.2-200304020432/dlfcn/Makefile Sun Mar 16 00:14:46 2003 +@@ -19,7 +19,8 @@ + subdir := dlfcn + headers := bits/dlfcn.h dlfcn.h + extra-libs := libdl +-libdl-routines := dlopen dlclose dlsym dlvsym dlerror dladdr eval ++libdl-routines := dlopen dlclose dlsym dlvsym dlerror dladdr dladdr1 dlinfo \ ++ eval + distribute := dlopenold.c glreflib1.c glreflib2.c failtestmod.c eval.c \ + defaultmod1.c defaultmod2.c errmsg1mod.c modatexit.c \ + modcxaatexit.c modstatic.c \ +@@ -37,7 +38,7 @@ + + ifeq (yes,$(build-shared)) + tests = glrefmain failtest tst-dladdr default errmsg1 tstcxaatexit \ +- bug-dlopen1 bug-dlsym1 ++ bug-dlopen1 bug-dlsym1 tst-dlinfo + ifeq (yes,$(have-protected)) + tests += tstatexit + endif +@@ -73,6 +74,9 @@ + + $(objpfx)tst-dladdr: $(libdl) + $(objpfx)tst-dladdr.out: $(objpfx)glreflib1.so ++ ++$(objpfx)tst-dlinfo: $(libdl) ++$(objpfx)tst-dlinfo.out: $(objpfx)glreflib1.so + + LDFLAGS-default = $(LDFLAGS-rdynamic) + $(objpfx)default: $(libdl) $(objpfx)defaultmod1.so $(objpfx)defaultmod2.so +diff -u -udbrN glibc-2.3.2/dlfcn/Versions glibc-2.3.2-200304020432/dlfcn/Versions +--- glibc-2.3.2/dlfcn/Versions Wed Jul 7 20:25:24 1999 ++++ glibc-2.3.2-200304020432/dlfcn/Versions Sun Mar 16 00:14:44 2003 +@@ -5,4 +5,7 @@ + GLIBC_2.1 { + dlopen; dlvsym; + } ++ GLIBC_2.3.3 { ++ dladdr1; dlinfo; ++ } + } +diff -u -udbrN glibc-2.3.2/dlfcn/dladdr.c glibc-2.3.2-200304020432/dlfcn/dladdr.c +--- glibc-2.3.2/dlfcn/dladdr.c Sat Jul 7 21:20:52 2001 ++++ glibc-2.3.2-200304020432/dlfcn/dladdr.c Mon Mar 10 10:12:11 2003 +@@ -1,5 +1,5 @@ + /* Locate the shared object symbol nearest a given address. +- Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. ++ Copyright (C) 1996, 1997, 1998, 1999, 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 +@@ -22,5 +22,5 @@ + int + dladdr (const void *address, Dl_info *info) + { +- return _dl_addr (address, info); ++ return _dl_addr (address, info, NULL, NULL); + } +diff -u -udbrN glibc-2.3.2/dlfcn/dladdr1.c glibc-2.3.2-200304020432/dlfcn/dladdr1.c +--- glibc-2.3.2/dlfcn/dladdr1.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/dlfcn/dladdr1.c Mon Mar 10 10:12:11 2003 +@@ -0,0 +1,35 @@ ++/* Locate the shared object symbol nearest a given address. ++ Copyright (C) 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 ++ 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 ++ ++int ++dladdr1 (const void *address, Dl_info *info, void **extra, int flags) ++{ ++ switch (flags) ++ { ++ default: /* Make this an error? */ ++ case 0: ++ return _dl_addr (address, info, NULL, NULL); ++ case RTLD_DL_SYMENT: ++ return _dl_addr (address, info, NULL, (const ElfW(Sym) **) extra); ++ case RTLD_DL_LINKMAP: ++ return _dl_addr (address, info, (struct link_map **) extra, NULL); ++ } ++} +diff -u -udbrN glibc-2.3.2/dlfcn/dlerror.c glibc-2.3.2-200304020432/dlfcn/dlerror.c +--- glibc-2.3.2/dlfcn/dlerror.c Tue Nov 19 07:51:37 2002 ++++ glibc-2.3.2-200304020432/dlfcn/dlerror.c Sat Mar 15 21:06:37 2003 +@@ -1,5 +1,5 @@ + /* Return error detail for failing functions. +- Copyright (C) 1995,1996,1997,1998,1999,2000,2002 ++ Copyright (C) 1995,1996,1997,1998,1999,2000,2002, 2003 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + +@@ -69,9 +69,19 @@ + else if (result->errstring != NULL) + { + buf = (char *) result->errstring; +- if (__asprintf (&buf, result->errcode != 0 ? "%s: %s: %s" : "%s: %s", +- result->objname, _(result->errstring), +- strerror (result->errcode)) != -1) ++ int n; ++ if (result->errcode == 0) ++ n = __asprintf (&buf, "%s%s%s", ++ result->objname, ++ result->objname[0] == '\0' ? "" : ": ", ++ _(result->errstring)); ++ else ++ n = __asprintf (&buf, "%s%s%s: %s", ++ result->objname, ++ result->objname[0] == '\0' ? "" : ": ", ++ _(result->errstring), ++ strerror (result->errcode)); ++ if (n != -1) + { + /* We don't need the error string anymore. */ + if (strcmp (result->errstring, "out of memory") != 0) +diff -u -udbrN glibc-2.3.2/dlfcn/dlfcn.h glibc-2.3.2-200304020432/dlfcn/dlfcn.h +--- glibc-2.3.2/dlfcn/dlfcn.h Sat Oct 27 01:58:28 2001 ++++ glibc-2.3.2-200304020432/dlfcn/dlfcn.h Sun Mar 16 00:14:44 2003 +@@ -1,5 +1,5 @@ + /* User functions for run-time dynamic loading. +- Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. ++ Copyright (C) 1995-1999,2000,2001,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 +@@ -21,6 +21,8 @@ + #define _DLFCN_H 1 + + #include ++#define __need_size_t ++#include + + /* Collect various system dependent definitions and declarations. */ + #include +@@ -83,7 +85,74 @@ + /* Fill in *INFO with the following information about ADDRESS. + Returns 0 iff no shared object's segments contain that address. */ + extern int dladdr (__const void *__address, Dl_info *__info) __THROW; +-#endif ++ ++/* Same as `dladdr', but additionally sets *EXTRA_INFO according to FLAGS. */ ++extern int dladdr1 (__const void *__address, Dl_info *__info, ++ void **__extra_info, int __flags) __THROW; ++ ++/* These are the possible values for the FLAGS argument to `dladdr1'. ++ This indicates what extra information is stored at *EXTRA_INFO. ++ It may also be zero, in which case the EXTRA_INFO argument is not used. */ ++enum ++ { ++ /* Matching symbol table entry (const ElfNN_Sym *). */ ++ RTLD_DL_SYMENT = 1, ++ ++ /* The object containing the address (struct link_map *). */ ++ RTLD_DL_LINKMAP = 2 ++ }; ++ ++ ++/* Get information about the shared object HANDLE refers to. ++ REQUEST is from among the values below, and determines the use of ARG. ++ ++ On success, returns zero. On failure, returns -1 and records an error ++ message to be fetched with `dlerror'. */ ++extern int dlinfo (void *__restrict __handle, ++ int __request, void *__restrict __arg); ++ ++/* These are the possible values for the REQUEST argument to `dlinfo'. */ ++enum ++ { ++ /* Treat ARG as `struct link_map **'; ++ store the `struct link_map *' for HANDLE there. */ ++ RTLD_DI_LINKMAP = 2, ++ ++ /* Treat ARG as `Dl_serinfo *' (see below), and fill in to describe the ++ directories that will be searched for dependencies of this object. ++ RTLD_DI_SERINFOSIZE fills in just the `dls_cnt' and `dls_size' ++ entries to indicate the size of the buffer that must be passed to ++ RTLD_DI_SERINFO to fill in the full information. */ ++ RTLD_DI_SERINFO = 4, ++ RTLD_DI_SERINFOSIZE = 5, ++ ++ /* Treat ARG as `char *', and store there the directory name used to ++ expand $ORIGIN in this shared object's dependency file names. */ ++ RTLD_DI_ORIGIN = 6, ++ ++ RTLD_DI_LMID = 1, /* Unsupported, defined by Solaris. */ ++ RTLD_DI_CONFIGADDR = 3 /* Unsupported, defined by Solaris. */ ++ }; ++ ++ ++/* This is the type of elements in `Dl_serinfo', below. ++ The `dls_name' member points to space in the buffer passed to `dlinfo'. */ ++typedef struct ++{ ++ char *dls_name; /* Name of library search path directory. */ ++ unsigned int dls_flags; /* Indicates where this directory came from. */ ++} Dl_serpath; ++ ++/* This is the structure that must be passed (by reference) to `dlinfo' for ++ the RTLD_DI_SERINFO and RTLD_DI_SERINFOSIZE requests. */ ++typedef struct ++{ ++ size_t dls_size; /* Size in bytes of the whole buffer. */ ++ unsigned int dls_cnt; /* Number of elements in `dls_serpath'. */ ++ Dl_serpath dls_serpath[1]; /* Actually longer, dls_cnt elements. */ ++} Dl_serinfo; ++#endif /* __USE_GNU */ ++ + + __END_DECLS + +diff -u -udbrN glibc-2.3.2/dlfcn/dlinfo.c glibc-2.3.2-200304020432/dlfcn/dlinfo.c +--- glibc-2.3.2/dlfcn/dlinfo.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/dlfcn/dlinfo.c Sun Mar 16 00:14:44 2003 +@@ -0,0 +1,87 @@ ++/* dlinfo -- Get information from the dynamic linker. ++ Copyright (C) 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 ++ 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 ++ ++struct dlinfo_args ++{ ++ ElfW(Addr) caller; ++ void *handle; ++ int request; ++ void *arg; ++}; ++ ++static void ++dlinfo_doit (void *argsblock) ++{ ++ struct dlinfo_args *const args = argsblock; ++ struct link_map *l = args->handle; ++ ++#if 0 ++ if (args->handle == RTLD_SELF) ++ { ++ ++ /* Find the highest-addressed object that CALLER is not below. */ ++ for (l = GL(dl_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. */ ++ break; ++ ++ if (l == NULL) ++ _dl_signal_error (0, NULL, NULL, N_("\ ++RTLD_SELF used in code not dynamically loaded")); ++ } ++#endif ++ ++ switch (args->request) ++ { ++ case RTLD_DI_LMID: ++ case RTLD_DI_CONFIGADDR: ++ default: ++ _dl_signal_error (0, NULL, NULL, N_("unsupported dlinfo request")); ++ break; ++ ++ case RTLD_DI_LINKMAP: ++ *(struct link_map **) args->arg = l; ++ break; ++ ++ case RTLD_DI_SERINFO: ++ _dl_rtld_di_serinfo (l, args->arg, false); ++ break; ++ case RTLD_DI_SERINFOSIZE: ++ _dl_rtld_di_serinfo (l, args->arg, true); ++ break; ++ ++ case RTLD_DI_ORIGIN: ++ strcpy (args->arg, l->l_origin); ++ break; ++ } ++} ++ ++int ++dlinfo (void *handle, int request, void *arg) ++{ ++ struct dlinfo_args args = { (ElfW(Addr)) RETURN_ADDRESS (0), ++ handle, request, arg }; ++ return _dlerror_run (&dlinfo_doit, &args) ? -1 : 0; ++} +diff -u -udbrN glibc-2.3.2/dlfcn/tst-dlinfo.c glibc-2.3.2-200304020432/dlfcn/tst-dlinfo.c +--- glibc-2.3.2/dlfcn/tst-dlinfo.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/dlfcn/tst-dlinfo.c Sun Mar 16 00:14:48 2003 +@@ -0,0 +1,96 @@ ++/* Test for dlinfo. ++ Copyright (C) 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 ++ 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 ++ ++#define TEST_FUNCTION do_test () ++ ++static int ++do_test (void) ++{ ++ int status = 0; ++ ++ void *handle = dlopen ("glreflib1.so", RTLD_NOW); ++ if (handle == NULL) ++ error (EXIT_FAILURE, 0, "cannot load: glreflib1.so: %s", dlerror ()); ++ ++#define TRY(req, arg) \ ++ if (dlinfo (handle, req, arg) != 0) \ ++ { \ ++ printf ("dlinfo failed for %s: %s\n", #req, dlerror ()); \ ++ status = 1; \ ++ } \ ++ else ++ ++ struct link_map *l; ++ TRY (RTLD_DI_LINKMAP, &l) ++ { ++ if (l != handle) ++ { ++ printf ("bogus link_map? %p != %p\n", l, handle); ++ status = 1; ++ } ++ } ++ ++ char origin[8192]; /* >= PATH_MAX, in theory */ ++ TRY (RTLD_DI_ORIGIN, origin) ++ { ++ printf ("origin: %s\n", origin); ++ } ++ ++ Dl_serinfo counts; ++ TRY (RTLD_DI_SERINFOSIZE, &counts) ++ { ++ Dl_serinfo *buf = alloca (counts.dls_size); ++ buf->dls_cnt = counts.dls_cnt; ++ buf->dls_size = counts.dls_size; ++ printf ("%u library directories\n", buf->dls_cnt); ++ TRY (RTLD_DI_SERINFO, buf) ++ { ++ if (counts.dls_cnt != buf->dls_cnt) ++ { ++ printf ("??? became %u library directories\n", buf->dls_cnt); ++ status = 1; ++ } ++ for (unsigned int i = 0; i < buf->dls_cnt; ++i) ++ printf ("\t%#02x\t%s\n", ++ buf->dls_serpath[i].dls_flags, ++ buf->dls_serpath[i].dls_name); ++ } ++ } ++ ++ unsigned long int lmid = 0xdeadbeefUL; ++ if (dlinfo (handle, RTLD_DI_LMID, &lmid) != 0) ++ printf ("dlinfo refuses RTLD_DI_LMID: %s\n", dlerror ()); ++ else ++ { ++ printf ("dlinfo RTLD_DI_LMID worked? %#lx\n", lmid); ++ status = lmid == 0xdeadbeefUL; ++ } ++ ++#undef TRY ++ dlclose (handle); ++ ++ return status; ++} ++ ++#include "../test-skeleton.c" +diff -u -udbrN glibc-2.3.2/elf/Makefile glibc-2.3.2-200304020432/elf/Makefile +--- glibc-2.3.2/elf/Makefile Fri Feb 21 07:28:09 2003 ++++ glibc-2.3.2-200304020432/elf/Makefile Thu Mar 27 10:47:28 2003 +@@ -181,6 +181,9 @@ + + include ../Rules + ++check-abi: check-abi-ld ++update-abi: update-abi-ld ++ + ifeq (yes,$(build-shared)) + # Make sure these things are built in the `make lib' pass so they can be used + # to run programs during the `make others' pass. +@@ -210,7 +213,8 @@ + mv -f $@T $@ + + $(objpfx)librtld.mk: $(objpfx)librtld.map Makefile +- sed -n 's@^$(common-objpfx)\([^(]*\)(\([^)]*\.os\))$$@\1 \2@p' $< | \ ++ sed -n 's@^$(common-objpfx)\([^(]*\)(\([^)]*\.os\)) *.*$$@\1 \2@p' \ ++ $< | \ + while read lib file; do \ + case $$lib in \ + libc_pic.a) \ +diff -u -udbrN glibc-2.3.2/elf/Versions glibc-2.3.2-200304020432/elf/Versions +--- glibc-2.3.2/elf/Versions Wed Dec 4 19:22:02 2002 ++++ glibc-2.3.2-200304020432/elf/Versions Sun Mar 16 00:14:44 2003 +@@ -51,6 +51,6 @@ + _dl_unload_cache; + _rtld_global; _dl_tls_symaddr; _dl_allocate_tls; _dl_deallocate_tls; + _dl_get_tls_static_info; _dl_allocate_tls_init; +- _dl_get_origin; _dl_tls_setup; ++ _dl_get_origin; _dl_tls_setup; _dl_rtld_di_serinfo; + } + } +diff -u -udbrN glibc-2.3.2/elf/cache.c glibc-2.3.2-200304020432/elf/cache.c +--- glibc-2.3.2/elf/cache.c Sun Dec 29 20:14:59 2002 ++++ glibc-2.3.2-200304020432/elf/cache.c Sun Mar 16 02:03:52 2003 +@@ -1,4 +1,5 @@ +-/* Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ++/* Copyright (C) 1999, 2000, 2001, 2002, 2003 ++ Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Jaeger , 1999. + +@@ -86,6 +87,11 @@ + case FLAG_POWERPC_LIB64: + fputs(",64bit", stdout); + break; ++ case FLAG_MIPS64_LIBN32: ++ fputs(",N32", stdout); ++ break; ++ case FLAG_MIPS64_LIBN64: ++ fputs(",64bit", stdout); + case 0: + break; + default: +@@ -458,7 +464,7 @@ + { + struct cache_entry *new_entry, *ptr, *prev; + char *full_path; +- int len, i; ++ size_t len, i; + + new_entry = (struct cache_entry *) xmalloc (sizeof (struct cache_entry)); + +diff -u -udbrN glibc-2.3.2/elf/dl-addr.c glibc-2.3.2-200304020432/elf/dl-addr.c +--- glibc-2.3.2/elf/dl-addr.c Sat Sep 28 05:35:22 2002 ++++ glibc-2.3.2-200304020432/elf/dl-addr.c Mon Mar 10 10:12:11 2003 +@@ -1,5 +1,5 @@ + /* Locate the shared object symbol nearest a given address. +- Copyright (C) 1996-2000, 2001, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1996-2000,2001,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 +@@ -24,7 +24,8 @@ + + int + internal_function +-_dl_addr (const void *address, Dl_info *info) ++_dl_addr (const void *address, Dl_info *info, ++ struct link_map **mapp, const ElfW(Sym) **symbolp) + { + const ElfW(Addr) addr = DL_LOOKUP_ADDRESS (address); + struct link_map *l, *match; +@@ -92,6 +93,11 @@ + && (ELFW(ST_BIND) (symtab->st_info) == STB_GLOBAL + || ELFW(ST_BIND) (symtab->st_info) == STB_WEAK)) + matchsym = (ElfW(Sym) *) symtab; ++ ++ if (mapp) ++ *mapp = match; ++ if (symbolp) ++ *symbolp = matchsym; + + if (matchsym) + { +diff -u -udbrN glibc-2.3.2/elf/dl-close.c glibc-2.3.2-200304020432/elf/dl-close.c +--- glibc-2.3.2/elf/dl-close.c Mon Jan 27 21:44:03 2003 ++++ glibc-2.3.2-200304020432/elf/dl-close.c Sun Mar 16 02:03:52 2003 +@@ -371,7 +371,7 @@ + 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 (imap->l_tls_offset == tls_free_end) ++ if ((size_t) imap->l_tls_offset == tls_free_end) + /* Extend the contiguous chunk being reclaimed. */ + tls_free_end += imap->l_tls_blocksize; + else if (imap->l_tls_offset + imap->l_tls_blocksize +diff -u -udbrN glibc-2.3.2/elf/dl-conflict.c glibc-2.3.2-200304020432/elf/dl-conflict.c +--- glibc-2.3.2/elf/dl-conflict.c Thu Oct 17 19:05:51 2002 ++++ glibc-2.3.2-200304020432/elf/dl-conflict.c Fri Mar 14 06:34:36 2003 +@@ -1,5 +1,5 @@ + /* Resolve conflicts against already prelinked libraries. +- Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++ Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek , 2001. + +@@ -28,7 +28,7 @@ + #include + #include "dynamic-link.h" + +- ++#if ! ELF_MACHINE_NO_RELA + void + _dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict, + ElfW(Rela) *conflictend) +@@ -65,3 +65,4 @@ + elf_machine_rela (l, conflict, NULL, NULL, (void *) conflict->r_offset); + } + } ++#endif +diff -u -udbrN glibc-2.3.2/elf/dl-load.c glibc-2.3.2-200304020432/elf/dl-load.c +--- glibc-2.3.2/elf/dl-load.c Thu Jan 16 19:14:41 2003 ++++ glibc-2.3.2-200304020432/elf/dl-load.c Sun Mar 16 00:14:44 2003 +@@ -1,5 +1,5 @@ + /* Map in a shared object's segments from the file. +- Copyright (C) 1995,96,97,98,99,2000,2001,2002 Free Software Foundation, Inc. ++ Copyright (C) 1995-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 +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -97,19 +98,26 @@ + /* Type for the buffer we put the ELF header and hopefully the program + header. This buffer does not really have to be too large. In most + cases the program header follows the ELF header directly. If this +- is not the case all bets are off and we can make the header arbitrarily +- large and still won't get it read. This means the only question is +- how large are the ELF and program header combined. The ELF header +- in 64-bit files is 56 bytes long. Each program header entry is again +- 56 bytes long. I.e., even with a file which has 17 program header +- entries we only have to read 1kB. And 17 program header entries is +- plenty, normal files have < 10. If this heuristic should really fail +- for some file the code in `_dl_map_object_from_fd' knows how to +- recover. */ ++ is not the case all bets are off and we can make the header ++ arbitrarily large and still won't get it read. This means the only ++ question is how large are the ELF and program header combined. The ++ ELF header 32-bit files is 52 bytes long and in 64-bit files is 64 ++ bytes long. Each program header entry is again 32 and 56 bytes ++ long respectively. I.e., even with a file which has 7 program ++ header entries we only have to read 512B. Add to this a bit of ++ margin for program notes and reading 512B and 640B for 32-bit and ++ 64-bit files respecitvely is enough. If this heuristic should ++ really fail for some file the code in `_dl_map_object_from_fd' ++ knows how to recover. */ + struct filebuf + { + ssize_t len; +- char buf[1024] __attribute__ ((aligned (__alignof (ElfW(Ehdr))))); ++#if __WORDSIZE == 32 ++# define FILEBUF_SIZE 512 ++#else ++# define FILEBUF_SIZE 640 ++#endif ++ char buf[FILEBUF_SIZE] __attribute__ ((aligned (__alignof (ElfW(Ehdr))))); + }; + + /* This is the decomposed LD_LIBRARY_PATH search path. */ +@@ -568,6 +576,34 @@ + sps->malloced = 1; + } + ++/* Make sure cached path information is stored in *SP ++ and return true if there are any paths to search there. */ ++static inline bool ++cache_rpath (struct link_map *l, ++ struct r_search_path_struct *sp, ++ int tag, ++ const char *what) ++{ ++ if (sp->dirs == (void *) -1) ++ return false; ++ ++ if (sp->dirs != NULL) ++ return true; ++ ++ if (l->l_info[tag] == NULL) ++ { ++ /* There is no path. */ ++ sp->dirs = (void *) -1; ++ return false; ++ } ++ ++ /* Make sure the cache information is available. */ ++ decompose_rpath (sp, (const char *) (D_PTR (l, l_info[DT_STRTAB]) ++ + l->l_info[tag]->d_un.d_val), ++ l, what); ++ return true; ++} ++ + + void + internal_function +@@ -877,6 +913,7 @@ + int prot; + } loadcmds[l->l_phnum], *c; + size_t nloadcmds = 0; ++ bool has_holes = false; + + /* The struct is initialized to zero so this is not necessary: + l->l_ld = 0; +@@ -922,6 +959,11 @@ + c->allocend = ph->p_vaddr + ph->p_memsz; + c->mapoff = ph->p_offset & ~(ph->p_align - 1); + ++ /* Determine whether there is a gap between the last segment ++ and this one. */ ++ if (nloadcmds > 1 && c[-1].mapend != c->mapstart) ++ has_holes = true; ++ + /* Optimize a common case. */ + #if (PF_R | PF_W | PF_X) == 7 && (PROT_READ | PROT_WRITE | PROT_EXEC) == 7 + c->prot = (PF_TO_PROT +@@ -1014,6 +1056,15 @@ + break; + } + ++ if (__builtin_expect (nloadcmds == 0, 0)) ++ { ++ /* This only happens for a bogus object that will be caught with ++ another error below. But we don't want to go through the ++ calculations below using NLOADCMDS - 1. */ ++ errstring = N_("object file has no loadable segments"); ++ goto call_lose; ++ } ++ + /* Now process the load commands and map segments into memory. */ + c = loadcmds; + +@@ -1051,6 +1102,7 @@ + l->l_map_end = l->l_map_start + maplength; + l->l_addr = l->l_map_start - c->mapstart; + ++ if (has_holes) + /* Change protection on the excess portion to disallow all access; + the portions we do not remap later will be inaccessible as if + unallocated. Then jump into the normal segment-mapping loop to +@@ -1118,23 +1170,18 @@ + if (zeropage > zero) + { + /* Zero the final part of the last page of the segment. */ +- if ((c->prot & PROT_WRITE) == 0) ++ if (__builtin_expect ((c->prot & PROT_WRITE) == 0, 0)) + { + /* Dag nab it. */ +- if (__builtin_expect (__mprotect ((caddr_t) +- (zero +- & ~(GL(dl_pagesize) +- - 1)), +- GL(dl_pagesize), +- c->prot|PROT_WRITE) < 0, +- 0)) ++ if (__mprotect ((caddr_t) (zero & ~(GL(dl_pagesize) - 1)), ++ GL(dl_pagesize), c->prot|PROT_WRITE) < 0) + { + errstring = N_("cannot change memory protections"); + goto call_lose_errno; + } + } + memset ((void *) zero, '\0', zeropage - zero); +- if ((c->prot & PROT_WRITE) == 0) ++ if (__builtin_expect ((c->prot & PROT_WRITE) == 0, 0)) + __mprotect ((caddr_t) (zero & ~(GL(dl_pagesize) - 1)), + GL(dl_pagesize), c->prot); + } +@@ -1728,29 +1775,9 @@ + /* First try the DT_RPATH of the dependent object that caused NAME + to be loaded. Then that object's dependent, and on up. */ + for (l = loader; fd == -1 && l; l = l->l_loader) +- { +- if (l->l_rpath_dirs.dirs == NULL) +- { +- if (l->l_info[DT_RPATH] == NULL) +- { +- /* There is no path. */ +- l->l_rpath_dirs.dirs = (void *) -1; +- continue; +- } +- else +- { +- /* Make sure the cache information is available. */ +- size_t ptrval = (D_PTR (l, l_info[DT_STRTAB]) +- + l->l_info[DT_RPATH]->d_un.d_val); +- decompose_rpath (&l->l_rpath_dirs, +- (const char *) ptrval, l, "RPATH"); +- } +- } +- +- if (l->l_rpath_dirs.dirs != (void *) -1) ++ if (cache_rpath (l, &l->l_rpath_dirs, DT_RPATH, "RPATH")) + fd = open_path (name, namelen, preloaded, &l->l_rpath_dirs, + &realname, &fb); +- } + + /* If dynamically linked, try the DT_RPATH of the executable + itself. */ +@@ -1766,37 +1793,12 @@ + fd = open_path (name, namelen, preloaded, &env_path_list, + &realname, &fb); + +- /* Look at the RUNPATH information for this binary. +- +- Note that this is no real loop. 'while' is used only to enable +- us to use 'break' instead of a 'goto' to jump to the end. The +- loop is always left after the first round. */ +- while (fd == -1 && loader != NULL +- && loader->l_runpath_dirs.dirs != (void *) -1) +- { +- if (loader->l_runpath_dirs.dirs == NULL) +- { +- if (loader->l_info[DT_RUNPATH] == NULL) +- { +- /* No RUNPATH. */ +- loader->l_runpath_dirs.dirs = (void *) -1; +- break; +- } +- else +- { +- /* Make sure the cache information is available. */ +- size_t ptrval = (D_PTR (loader, l_info[DT_STRTAB]) +- + loader->l_info[DT_RUNPATH]->d_un.d_val); +- decompose_rpath (&loader->l_runpath_dirs, +- (const char *) ptrval, loader, "RUNPATH"); +- } +- } +- +- if (loader->l_runpath_dirs.dirs != (void *) -1) ++ /* Look at the RUNPATH information for this binary. */ ++ if (fd == -1 && loader != NULL ++ && cache_rpath (loader, &loader->l_runpath_dirs, ++ DT_RUNPATH, "RUNPATH")) + fd = open_path (name, namelen, preloaded, + &loader->l_runpath_dirs, &realname, &fb); +- break; +- } + + if (fd == -1 + && (__builtin_expect (! preloaded, 1) +@@ -1920,3 +1922,87 @@ + return _dl_map_object_from_fd (name, fd, &fb, realname, loader, type, mode); + } + INTDEF (_dl_map_object) ++ ++void ++internal_function ++_dl_rtld_di_serinfo (struct link_map *loader, Dl_serinfo *si, bool counting) ++{ ++ if (counting) ++ { ++ si->dls_cnt = 0; ++ si->dls_size = 0; ++ } ++ ++ unsigned int idx = 0; ++ char *allocptr = (char *) &si->dls_serpath[si->dls_cnt]; ++ inline void add_path (const struct r_search_path_struct *sps, ++ unsigned int flags) ++# define add_path(sps, flags) add_path(sps, 0) /* XXX */ ++ { ++ if (sps->dirs != (void *) -1) ++ { ++ struct r_search_path_elem **dirs = sps->dirs; ++ do ++ { ++ const struct r_search_path_elem *const r = *dirs++; ++ if (counting) ++ { ++ si->dls_cnt++; ++ si->dls_size += r->dirnamelen; ++ } ++ else ++ { ++ Dl_serpath *const sp = &si->dls_serpath[idx++]; ++ sp->dls_name = allocptr; ++ allocptr = __mempcpy (allocptr, ++ r->dirname, r->dirnamelen - 1); ++ *allocptr++ = '\0'; ++ sp->dls_flags = flags; ++ } ++ } ++ while (*dirs != NULL); ++ } ++ } ++ ++ /* When the object has the RUNPATH information we don't use any RPATHs. */ ++ if (loader->l_info[DT_RUNPATH] == NULL) ++ { ++ /* First try the DT_RPATH of the dependent object that caused NAME ++ to be loaded. Then that object's dependent, and on up. */ ++ ++ struct link_map *l = loader; ++ do ++ { ++ if (cache_rpath (l, &l->l_rpath_dirs, DT_RPATH, "RPATH")) ++ add_path (&l->l_rpath_dirs, XXX_RPATH); ++ l = l->l_loader; ++ } ++ while (l != NULL); ++ ++ /* If dynamically linked, try the DT_RPATH of the executable itself. */ ++ l = GL(dl_loaded); ++ if (l != NULL && l->l_type != lt_loaded && l != loader) ++ if (cache_rpath (l, &l->l_rpath_dirs, DT_RPATH, "RPATH")) ++ add_path (&l->l_rpath_dirs, XXX_RPATH); ++ } ++ ++ /* Try the LD_LIBRARY_PATH environment variable. */ ++ add_path (&env_path_list, XXX_ENV); ++ ++ /* Look at the RUNPATH information for this binary. */ ++ if (cache_rpath (loader, &loader->l_runpath_dirs, DT_RUNPATH, "RUNPATH")) ++ add_path (&loader->l_runpath_dirs, XXX_RUNPATH); ++ ++ /* XXX ++ Here is where ld.so.cache gets checked, but we don't have ++ a way to indicate that in the results for Dl_serinfo. */ ++ ++ /* Finally, try the default path. */ ++ if (!(loader->l_flags_1 & DF_1_NODEFLIB)) ++ add_path (&rtld_search_dirs, XXX_default); ++ ++ if (counting) ++ /* Count the struct size before the string area, which we didn't ++ know before we completed dls_cnt. */ ++ si->dls_size += (char *) &si->dls_serpath[si->dls_cnt] - (char *) si; ++} +diff -u -udbrN glibc-2.3.2/elf/dl-lookup.c glibc-2.3.2-200304020432/elf/dl-lookup.c +--- glibc-2.3.2/elf/dl-lookup.c Sat Jan 11 10:51:49 2003 ++++ glibc-2.3.2-200304020432/elf/dl-lookup.c Wed Mar 26 06:51:33 2003 +@@ -273,19 +273,32 @@ + { + /* It is very tricky. We need to figure out what value to + return for the protected symbol. */ ++ if (type_class == ELF_RTYPE_CLASS_PLT) ++ { ++ if (current_value.s != NULL && current_value.m != undef_map) ++ { ++ current_value.s = *ref; ++ current_value.m = undef_map; ++ } ++ } ++ else ++ { + struct sym_val protected_value = { NULL, NULL }; + + for (scope = symbol_scope; *scope; ++scope) +- if (_dl_do_lookup (undef_name, hash, *ref, &protected_value, *scope, +- 0, flags, NULL, ELF_RTYPE_CLASS_PLT)) ++ if (_dl_do_lookup (undef_name, hash, *ref, ++ &protected_value, *scope, 0, flags, ++ NULL, ELF_RTYPE_CLASS_PLT)) + break; + +- if (protected_value.s != NULL && protected_value.m != undef_map) ++ if (protected_value.s != NULL ++ && protected_value.m != undef_map) + { + current_value.s = *ref; + current_value.m = undef_map; + } + } ++ } + + /* We have to check whether this would bind UNDEF_MAP to an object + in the global scope which was dynamically loaded. In this case +@@ -465,18 +478,31 @@ + { + /* It is very tricky. We need to figure out what value to + return for the protected symbol. */ ++ if (type_class == ELF_RTYPE_CLASS_PLT) ++ { ++ if (current_value.s != NULL && current_value.m != undef_map) ++ { ++ current_value.s = *ref; ++ current_value.m = undef_map; ++ } ++ } ++ else ++ { + struct sym_val protected_value = { NULL, NULL }; + + for (scope = symbol_scope; *scope; ++scope) +- if (_dl_do_lookup_versioned (undef_name, hash, *ref, &protected_value, ++ if (_dl_do_lookup_versioned (undef_name, hash, *ref, ++ &protected_value, + *scope, 0, version, NULL, + ELF_RTYPE_CLASS_PLT)) + break; + +- if (protected_value.s != NULL && protected_value.m != undef_map) ++ if (protected_value.s != NULL ++ && protected_value.m != undef_map) + { + current_value.s = *ref; + current_value.m = undef_map; ++ } + } + } + +diff -u -udbrN glibc-2.3.2/elf/dl-profile.c glibc-2.3.2-200304020432/elf/dl-profile.c +--- glibc-2.3.2/elf/dl-profile.c Fri Aug 2 23:46:57 2002 ++++ glibc-2.3.2-200304020432/elf/dl-profile.c Thu Mar 20 08:07:22 2003 +@@ -1,5 +1,5 @@ + /* Profiling of shared libraries. +- Copyright (C) 1997,1998,1999,2000,2001,2002 Free Software Foundation, Inc. ++ Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1997. + Based on the BSD mcount implementation. +@@ -34,7 +34,7 @@ + #include + #include + #include +-#include ++#include + + /* The LD_PROFILE feature has to be implemented different to the + normal profiling using the gmon/ functions. The problem is that an +@@ -516,24 +516,24 @@ + size_t newfromidx; + to_index = (data[narcs].self_pc + / (hashfraction * sizeof (*tos))); +- newfromidx = 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; +- atomic_add (&narcs, 1); ++ atomic_increment (&narcs); + } + + /* If we still have no entry stop searching and insert. */ + if (*topcindex == 0) + { +- uint_fast32_t newarc = 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 = exchange_and_add (&fromidx, 1) + 1; ++ *topcindex = atomic_exchange_and_add (&fromidx, 1) + 1; + fromp = &froms[*topcindex]; + + fromp->here = &data[newarc]; +@@ -541,7 +541,7 @@ + data[newarc].self_pc = selfpc; + data[newarc].count = 0; + fromp->link = 0; +- atomic_add (&narcs, 1); ++ atomic_increment (&narcs); + + break; + } +@@ -554,7 +554,7 @@ + } + + /* Increment the counter. */ +- atomic_add (&fromp->here->count, 1); ++ atomic_increment (&fromp->here->count); + + done: + ; +diff -u -udbrN glibc-2.3.2/elf/dl-reloc.c glibc-2.3.2-200304020432/elf/dl-reloc.c +--- glibc-2.3.2/elf/dl-reloc.c Thu Jan 30 18:35:50 2003 ++++ glibc-2.3.2-200304020432/elf/dl-reloc.c Sat Mar 1 23:31:52 2003 +@@ -44,23 +44,31 @@ + static void __attribute_noinline__ + allocate_static_tls (struct link_map *map) + { +- size_t offset = roundup (GL(dl_tls_static_used), map->l_tls_align); +- if (offset + map->l_tls_blocksize ++ size_t offset, used, check; ++ + # if TLS_TCB_AT_TP +- + TLS_TCB_SIZE ++ offset = roundup (GL(dl_tls_static_used) + map->l_tls_blocksize, ++ map->l_tls_align); ++ used = offset; ++ check = offset + TLS_TCB_SIZE; + # elif TLS_DTV_AT_TP ++ offset = roundup (GL(dl_tls_static_used), map->l_tls_align); ++ used = offset + map->l_tls_blocksize; ++ check = used; + /* dl_tls_static_used includes the TCB at the beginning. */ + # else + # error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" + # endif +- > GL(dl_tls_static_size)) ++ ++ if (check > GL(dl_tls_static_size)) + { + const char *errstring = N_("\ + shared object cannot be dlopen()ed: static TLS memory too small"); + INTUSE(_dl_signal_error) (0, (map)->l_name, NULL, errstring); + } ++ + map->l_tls_offset = offset; +- GL(dl_tls_static_used) = offset + map->l_tls_blocksize; ++ GL(dl_tls_static_used) = used; + } + #endif + +diff -u -udbrN glibc-2.3.2/elf/elf.h glibc-2.3.2-200304020432/elf/elf.h +--- glibc-2.3.2/elf/elf.h Wed Feb 26 00:40:08 2003 ++++ glibc-2.3.2-200304020432/elf/elf.h Sun Mar 2 12:41:51 2003 +@@ -1,5 +1,5 @@ + /* This file defines standard ELF types, structures, and macros. +- Copyright (C) 1995-1999, 2000, 2001, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1995-1999,2000,2001,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 +@@ -1881,22 +1881,85 @@ + #define R_PPC_SECTOFF_LO 34 + #define R_PPC_SECTOFF_HI 35 + #define R_PPC_SECTOFF_HA 36 ++ ++/* PowerPC relocations defined for the TLS access ABI. */ ++#define R_PPC_TLS 67 /* none (sym+add)@tls */ ++#define R_PPC_DTPMOD32 68 /* word32 (sym+add)@dtpmod */ ++#define R_PPC_TPREL16 69 /* half16* (sym+add)@tprel */ ++#define R_PPC_TPREL16_LO 70 /* half16 (sym+add)@tprel@l */ ++#define R_PPC_TPREL16_HI 71 /* half16 (sym+add)@tprel@h */ ++#define R_PPC_TPREL16_HA 72 /* half16 (sym+add)@tprel@ha */ ++#define R_PPC_TPREL32 73 /* word32 (sym+add)@tprel */ ++#define R_PPC_DTPREL16 74 /* half16* (sym+add)@dtprel */ ++#define R_PPC_DTPREL16_LO 75 /* half16 (sym+add)@dtprel@l */ ++#define R_PPC_DTPREL16_HI 76 /* half16 (sym+add)@dtprel@h */ ++#define R_PPC_DTPREL16_HA 77 /* half16 (sym+add)@dtprel@ha */ ++#define R_PPC_DTPREL32 78 /* word32 (sym+add)@dtprel */ ++#define R_PPC_GOT_TLSGD16 79 /* half16* (sym+add)@got@tlsgd */ ++#define R_PPC_GOT_TLSGD16_LO 80 /* half16 (sym+add)@got@tlsgd@l */ ++#define R_PPC_GOT_TLSGD16_HI 81 /* half16 (sym+add)@got@tlsgd@h */ ++#define R_PPC_GOT_TLSGD16_HA 82 /* half16 (sym+add)@got@tlsgd@ha */ ++#define R_PPC_GOT_TLSLD16 83 /* half16* (sym+add)@got@tlsld */ ++#define R_PPC_GOT_TLSLD16_LO 84 /* half16 (sym+add)@got@tlsld@l */ ++#define R_PPC_GOT_TLSLD16_HI 85 /* half16 (sym+add)@got@tlsld@h */ ++#define R_PPC_GOT_TLSLD16_HA 86 /* half16 (sym+add)@got@tlsld@ha */ ++#define R_PPC_GOT_TPREL16 87 /* half16* (sym+add)@got@tprel */ ++#define R_PPC_GOT_TPREL16_LO 88 /* half16 (sym+add)@got@tprel@l */ ++#define R_PPC_GOT_TPREL16_HI 89 /* half16 (sym+add)@got@tprel@h */ ++#define R_PPC_GOT_TPREL16_HA 90 /* half16 (sym+add)@got@tprel@ha */ ++#define R_PPC_GOT_DTPREL16 91 /* half16* (sym+add)@got@dtprel */ ++#define R_PPC_GOT_DTPREL16_LO 92 /* half16* (sym+add)@got@dtprel@l */ ++#define R_PPC_GOT_DTPREL16_HI 93 /* half16* (sym+add)@got@dtprel@h */ ++#define R_PPC_GOT_DTPREL16_HA 94 /* half16* (sym+add)@got@dtprel@ha */ ++ + /* Keep this the last entry. */ +-#define R_PPC_NUM 37 ++#define R_PPC_NUM 95 ++ ++/* The remaining relocs are from the Embedded ELF ABI, and are not ++ in the SVR4 ELF ABI. */ ++#define R_PPC_EMB_NADDR32 101 ++#define R_PPC_EMB_NADDR16 102 ++#define R_PPC_EMB_NADDR16_LO 103 ++#define R_PPC_EMB_NADDR16_HI 104 ++#define R_PPC_EMB_NADDR16_HA 105 ++#define R_PPC_EMB_SDAI16 106 ++#define R_PPC_EMB_SDA2I16 107 ++#define R_PPC_EMB_SDA2REL 108 ++#define R_PPC_EMB_SDA21 109 /* 16 bit offset in SDA */ ++#define R_PPC_EMB_MRKREF 110 ++#define R_PPC_EMB_RELSEC16 111 ++#define R_PPC_EMB_RELST_LO 112 ++#define R_PPC_EMB_RELST_HI 113 ++#define R_PPC_EMB_RELST_HA 114 ++#define R_PPC_EMB_BIT_FLD 115 ++#define R_PPC_EMB_RELSDA 116 /* 16 bit relative offset in SDA */ ++ ++/* Diab tool relocations. */ ++#define R_PPC_DIAB_SDA21_LO 180 /* like EMB_SDA21, but lower 16 bit */ ++#define R_PPC_DIAB_SDA21_HI 181 /* like EMB_SDA21, but high 16 bit */ ++#define R_PPC_DIAB_SDA21_HA 182 /* like EMB_SDA21, adjusted high 16 */ ++#define R_PPC_DIAB_RELSDA_LO 183 /* like EMB_RELSDA, but lower 16 bit */ ++#define R_PPC_DIAB_RELSDA_HI 184 /* like EMB_RELSDA, but high 16 bit */ ++#define R_PPC_DIAB_RELSDA_HA 185 /* like EMB_RELSDA, adjusted high 16 */ ++ ++/* This is a phony reloc to handle any old fashioned TOC16 references ++ that may still be in object files. */ ++#define R_PPC_TOC16 255 ++ + + /* PowerPC64 relocations defined by the ABIs */ + #define R_PPC64_NONE R_PPC_NONE +-#define R_PPC64_ADDR32 R_PPC_ADDR32 /* 32bit absolute address. */ +-#define R_PPC64_ADDR24 R_PPC_ADDR24 /* 26bit address, word aligned. */ +-#define R_PPC64_ADDR16 R_PPC_ADDR16 /* 16bit absolute address. */ +-#define R_PPC64_ADDR16_LO R_PPC_ADDR16_LO /* lower 16bits of abs. address. */ +-#define R_PPC64_ADDR16_HI R_PPC_ADDR16_HI /* high 16bits of abs. address. */ ++#define R_PPC64_ADDR32 R_PPC_ADDR32 /* 32bit absolute address */ ++#define R_PPC64_ADDR24 R_PPC_ADDR24 /* 26bit address, word aligned */ ++#define R_PPC64_ADDR16 R_PPC_ADDR16 /* 16bit absolute address */ ++#define R_PPC64_ADDR16_LO R_PPC_ADDR16_LO /* lower 16bits of address */ ++#define R_PPC64_ADDR16_HI R_PPC_ADDR16_HI /* high 16bits of address. */ + #define R_PPC64_ADDR16_HA R_PPC_ADDR16_HA /* adjusted high 16bits. */ +-#define R_PPC64_ADDR14 R_PPC_ADDR14 /* 16bit address, word aligned. */ ++#define R_PPC64_ADDR14 R_PPC_ADDR14 /* 16bit address, word aligned */ + #define R_PPC64_ADDR14_BRTAKEN R_PPC_ADDR14_BRTAKEN + #define R_PPC64_ADDR14_BRNTAKEN R_PPC_ADDR14_BRNTAKEN +-#define R_PPC64_REL24 R_PPC_REL24 /* PC relative 26 bit, word aligned. */ +-#define R_PPC64_REL14 R_PPC_REL14 /* PC relative 16 bit. */ ++#define R_PPC64_REL24 R_PPC_REL24 /* PC-rel. 26 bit, word aligned */ ++#define R_PPC64_REL14 R_PPC_REL14 /* PC relative 16 bit */ + #define R_PPC64_REL14_BRTAKEN R_PPC_REL14_BRTAKEN + #define R_PPC64_REL14_BRNTAKEN R_PPC_REL14_BRNTAKEN + #define R_PPC64_GOT16 R_PPC_GOT16 +@@ -1922,116 +1985,87 @@ + #define R_PPC64_SECTOFF_LO R_PPC_SECTOFF_LO + #define R_PPC64_SECTOFF_HI R_PPC_SECTOFF_HI + #define R_PPC64_SECTOFF_HA R_PPC_SECTOFF_HA +-#define R_PPC64_ADDR30 37 /* word30 (S + A - P) >> 2. */ +-#define R_PPC64_ADDR64 38 /* doubleword64 S + A. */ +-#define R_PPC64_ADDR16_HIGHER 39 /* half16 #higher(S + A). */ +-#define R_PPC64_ADDR16_HIGHERA 40 /* half16 #highera(S + A). */ +-#define R_PPC64_ADDR16_HIGHEST 41 /* half16 #highest(S + A). */ +-#define R_PPC64_ADDR16_HIGHESTA 42 /* half16 #highesta(S + A). */ +-#define R_PPC64_UADDR64 43 /* doubleword64 S + A. */ +-#define R_PPC64_REL64 44 /* doubleword64 S + A - P. */ +-#define R_PPC64_PLT64 45 /* doubleword64 L + A. */ +-#define R_PPC64_PLTREL64 46 /* doubleword64 L + A - P. */ +-#define R_PPC64_TOC16 47 /* half16* S + A - .TOC. */ +-#define R_PPC64_TOC16_LO 48 /* half16 #lo(S + A - .TOC.). */ +-#define R_PPC64_TOC16_HI 49 /* half16 #hi(S + A - .TOC.). */ +-#define R_PPC64_TOC16_HA 50 /* half16 #ha(S + A - .TOC.). */ +-#define R_PPC64_TOC 51 /* doubleword64 .TOC. */ +-#define R_PPC64_PLTGOT16 52 /* half16* M + A. */ +-#define R_PPC64_PLTGOT16_LO 53 /* half16 #lo(M + A). */ +-#define R_PPC64_PLTGOT16_HI 54 /* half16 #hi(M + A). */ +-#define R_PPC64_PLTGOT16_HA 55 /* half16 #ha(M + A). */ ++#define R_PPC64_ADDR30 37 /* word30 (S + A - P) >> 2 */ ++#define R_PPC64_ADDR64 38 /* doubleword64 S + A */ ++#define R_PPC64_ADDR16_HIGHER 39 /* half16 #higher(S + A) */ ++#define R_PPC64_ADDR16_HIGHERA 40 /* half16 #highera(S + A) */ ++#define R_PPC64_ADDR16_HIGHEST 41 /* half16 #highest(S + A) */ ++#define R_PPC64_ADDR16_HIGHESTA 42 /* half16 #highesta(S + A) */ ++#define R_PPC64_UADDR64 43 /* doubleword64 S + A */ ++#define R_PPC64_REL64 44 /* doubleword64 S + A - P */ ++#define R_PPC64_PLT64 45 /* doubleword64 L + A */ ++#define R_PPC64_PLTREL64 46 /* doubleword64 L + A - P */ ++#define R_PPC64_TOC16 47 /* half16* S + A - .TOC */ ++#define R_PPC64_TOC16_LO 48 /* half16 #lo(S + A - .TOC.) */ ++#define R_PPC64_TOC16_HI 49 /* half16 #hi(S + A - .TOC.) */ ++#define R_PPC64_TOC16_HA 50 /* half16 #ha(S + A - .TOC.) */ ++#define R_PPC64_TOC 51 /* doubleword64 .TOC */ ++#define R_PPC64_PLTGOT16 52 /* half16* M + A */ ++#define R_PPC64_PLTGOT16_LO 53 /* half16 #lo(M + A) */ ++#define R_PPC64_PLTGOT16_HI 54 /* half16 #hi(M + A) */ ++#define R_PPC64_PLTGOT16_HA 55 /* half16 #ha(M + A) */ + +-#define R_PPC64_ADDR16_DS 56 /* half16ds* (S + A) >> 2. */ +-#define R_PPC64_ADDR16_LO_DS 57 /* half16ds #lo(S + A) >> 2. */ +-#define R_PPC64_GOT16_DS 58 /* half16ds* (G + A) >> 2. */ +-#define R_PPC64_GOT16_LO_DS 59 /* half16ds #lo(G + A) >> 2. */ +-#define R_PPC64_PLT16_LO_DS 60 /* half16ds #lo(L + A) >> 2. */ +-#define R_PPC64_SECTOFF_DS 61 /* half16ds* (R + A) >> 2. */ +-#define R_PPC64_SECTOFF_LO_DS 62 /* half16ds #lo(R + A) >> 2. */ +-#define R_PPC64_TOC16_DS 63 /* half16ds* (S + A - .TOC.) >> 2. */ +-#define R_PPC64_TOC16_LO_DS 64 /* half16ds #lo(S + A - .TOC.) >> 2. */ +-#define R_PPC64_PLTGOT16_DS 65 /* half16ds* (M + A) >> 2. */ +-#define R_PPC64_PLTGOT16_LO_DS 66 /* half16ds #lo(M + A) >> 2. */ ++#define R_PPC64_ADDR16_DS 56 /* half16ds* (S + A) >> 2 */ ++#define R_PPC64_ADDR16_LO_DS 57 /* half16ds #lo(S + A) >> 2 */ ++#define R_PPC64_GOT16_DS 58 /* half16ds* (G + A) >> 2 */ ++#define R_PPC64_GOT16_LO_DS 59 /* half16ds #lo(G + A) >> 2 */ ++#define R_PPC64_PLT16_LO_DS 60 /* half16ds #lo(L + A) >> 2 */ ++#define R_PPC64_SECTOFF_DS 61 /* half16ds* (R + A) >> 2 */ ++#define R_PPC64_SECTOFF_LO_DS 62 /* half16ds #lo(R + A) >> 2 */ ++#define R_PPC64_TOC16_DS 63 /* half16ds* (S + A - .TOC.) >> 2 */ ++#define R_PPC64_TOC16_LO_DS 64 /* half16ds #lo(S + A - .TOC.) >> 2 */ ++#define R_PPC64_PLTGOT16_DS 65 /* half16ds* (M + A) >> 2 */ ++#define R_PPC64_PLTGOT16_LO_DS 66 /* half16ds #lo(M + A) >> 2 */ + + /* PowerPC64 relocations defined for the TLS access ABI. */ +-#define R_PPC64_TLS 67 /* none (sym+add)@tls. */ +-#define R_PPC64_DTPMOD64 68 /* doubleword64 (sym+add)@dtpmod. */ +-#define R_PPC64_TPREL16 69 /* half16* (sym+add)@tprel. */ +-#define R_PPC64_TPREL16_LO 60 /* half16 (sym+add)@tprel@l. */ +-#define R_PPC64_TPREL16_HI 71 /* half16 (sym+add)@tprel@h. */ +-#define R_PPC64_TPREL16_HA 72 /* half16 (sym+add)@tprel@ha. */ +-#define R_PPC64_TPREL64 73 /* doubleword64 (sym+add)@tprel. */ +-#define R_PPC64_DTPREL16 74 /* half16* (sym+add)@dtprel. */ +-#define R_PPC64_DTPREL16_LO 75 /* half16 (sym+add)@dtprel@l. */ +-#define R_PPC64_DTPREL16_HI 76 /* half16 (sym+add)@dtprel@h. */ +-#define R_PPC64_DTPREL16_HA 77 /* half16 (sym+add)@dtprel@ha. */ +-#define R_PPC64_DTPREL64 78 /* doubleword64 (sym+add)@dtprel. */ +-#define R_PPC64_GOT_TLSGD16 79 /* half16* (sym+add)@got@tlsgd. */ +-#define R_PPC64_GOT_TLSGD16_LO 80 /* half16 (sym+add)@got@tlsgd@l. */ +-#define R_PPC64_GOT_TLSGD16_HI 81 /* half16 (sym+add)@got@tlsgd@h. */ +-#define R_PPC64_GOT_TLSGD16_HA 82 /* half16 (sym+add)@got@tlsgd@ha. */ +-#define R_PPC64_GOT_TLSLD16 83 /* half16* (sym+add)@got@tlsld. */ +-#define R_PPC64_GOT_TLSLD16_LO 84 /* half16 (sym+add)@got@tlsld@l. */ +-#define R_PPC64_GOT_TLSLD16_HI 85 /* half16 (sym+add)@got@tlsld@h. */ +-#define R_PPC64_GOT_TLSLD16_HA 86 /* half16 (sym+add)@got@tlsld@ha. */ +-#define R_PPC64_GOT_TPREL16_DS 87 /* half16ds* (sym+add)@got@tprel. */ +-#define R_PPC64_GOT_TPREL16_LO_DS 88 /* half16ds (sym+add)@got@tprel@l. */ +-#define R_PPC64_GOT_TPREL16_HI 89 /* half16 (sym+add)@got@tprel@h. */ +-#define R_PPC64_GOT_TPREL16_HA 90 /* half16 (sym+add)@got@tprel@ha. */ +-#define R_PPC64_GOT_DTPREL16_DS 91 /* half16ds* (sym+add)@got@dtprel. */ +-#define R_PPC64_GOT_DTPREL16_LO_DS 92 /* half16ds (sym+add)@got@dtprel@l. */ +-#define R_PPC64_GOT_DTPREL16_HI 93 /* half16 (sym+add)@got@dtprel@h. */ +-#define R_PPC64_GOT_DTPREL16_HA 94 /* half16 (sym+add)@got@dtprel@ha. */ +-#define R_PPC64_TPREL16_DS 95 /* half16ds* (sym+add)@tprel. */ +-#define R_PPC64_TPREL16_LO_DS 96 /* half16ds (sym+add)@tprel@l. */ +-#define R_PPC64_TPREL16_HIGHER 97 /* half16 (sym+add)@tprel@higher. */ +-#define R_PPC64_TPREL16_HIGHERA 98 /* half16 (sym+add)@tprel@highera. */ +-#define R_PPC64_TPREL16_HIGHEST 99 /* half16 (sym+add)@tprel@highest. */ +-#define R_PPC64_TPREL16_HIGHESTA 100 /* half16 (sym+add)@tprel@highesta. */ +-#define R_PPC64_DTPREL16_DS 101 /* half16ds* (sym+add)@dtprel. */ +-#define R_PPC64_DTPREL16_LO_DS 102 /* half16ds (sym+add)@dtprel@l. */ +-#define R_PPC64_DTPREL16_HIGHER 103 /* half16 (sym+add)@dtprel@higher. */ +-#define R_PPC64_DTPREL16_HIGHERA 104 /* half16 (sym+add)@dtprel@highera. */ +-#define R_PPC64_DTPREL16_HIGHEST 105 /* half16 (sym+add)@dtprel@highest. */ +-#define R_PPC64_DTPREL16_HIGHESTA 106 /* half16 (sym+add)@dtprel@highesta. */ ++#define R_PPC64_TLS 67 /* none (sym+add)@tls */ ++#define R_PPC64_DTPMOD64 68 /* doubleword64 (sym+add)@dtpmod */ ++#define R_PPC64_TPREL16 69 /* half16* (sym+add)@tprel */ ++#define R_PPC64_TPREL16_LO 70 /* half16 (sym+add)@tprel@l */ ++#define R_PPC64_TPREL16_HI 71 /* half16 (sym+add)@tprel@h */ ++#define R_PPC64_TPREL16_HA 72 /* half16 (sym+add)@tprel@ha */ ++#define R_PPC64_TPREL64 73 /* doubleword64 (sym+add)@tprel */ ++#define R_PPC64_DTPREL16 74 /* half16* (sym+add)@dtprel */ ++#define R_PPC64_DTPREL16_LO 75 /* half16 (sym+add)@dtprel@l */ ++#define R_PPC64_DTPREL16_HI 76 /* half16 (sym+add)@dtprel@h */ ++#define R_PPC64_DTPREL16_HA 77 /* half16 (sym+add)@dtprel@ha */ ++#define R_PPC64_DTPREL64 78 /* doubleword64 (sym+add)@dtprel */ ++#define R_PPC64_GOT_TLSGD16 79 /* half16* (sym+add)@got@tlsgd */ ++#define R_PPC64_GOT_TLSGD16_LO 80 /* half16 (sym+add)@got@tlsgd@l */ ++#define R_PPC64_GOT_TLSGD16_HI 81 /* half16 (sym+add)@got@tlsgd@h */ ++#define R_PPC64_GOT_TLSGD16_HA 82 /* half16 (sym+add)@got@tlsgd@ha */ ++#define R_PPC64_GOT_TLSLD16 83 /* half16* (sym+add)@got@tlsld */ ++#define R_PPC64_GOT_TLSLD16_LO 84 /* half16 (sym+add)@got@tlsld@l */ ++#define R_PPC64_GOT_TLSLD16_HI 85 /* half16 (sym+add)@got@tlsld@h */ ++#define R_PPC64_GOT_TLSLD16_HA 86 /* half16 (sym+add)@got@tlsld@ha */ ++#define R_PPC64_GOT_TPREL16_DS 87 /* half16ds* (sym+add)@got@tprel */ ++#define R_PPC64_GOT_TPREL16_LO_DS 88 /* half16ds (sym+add)@got@tprel@l */ ++#define R_PPC64_GOT_TPREL16_HI 89 /* half16 (sym+add)@got@tprel@h */ ++#define R_PPC64_GOT_TPREL16_HA 90 /* half16 (sym+add)@got@tprel@ha */ ++#define R_PPC64_GOT_DTPREL16_DS 91 /* half16ds* (sym+add)@got@dtprel */ ++#define R_PPC64_GOT_DTPREL16_LO_DS 92 /* half16ds (sym+add)@got@dtprel@l */ ++#define R_PPC64_GOT_DTPREL16_HI 93 /* half16 (sym+add)@got@dtprel@h */ ++#define R_PPC64_GOT_DTPREL16_HA 94 /* half16 (sym+add)@got@dtprel@ha */ ++#define R_PPC64_TPREL16_DS 95 /* half16ds* (sym+add)@tprel */ ++#define R_PPC64_TPREL16_LO_DS 96 /* half16ds (sym+add)@tprel@l */ ++#define R_PPC64_TPREL16_HIGHER 97 /* half16 (sym+add)@tprel@higher */ ++#define R_PPC64_TPREL16_HIGHERA 98 /* half16 (sym+add)@tprel@highera */ ++#define R_PPC64_TPREL16_HIGHEST 99 /* half16 (sym+add)@tprel@highest */ ++#define R_PPC64_TPREL16_HIGHESTA 100 /* half16 (sym+add)@tprel@highesta */ ++#define R_PPC64_DTPREL16_DS 101 /* half16ds* (sym+add)@dtprel */ ++#define R_PPC64_DTPREL16_LO_DS 102 /* half16ds (sym+add)@dtprel@l */ ++#define R_PPC64_DTPREL16_HIGHER 103 /* half16 (sym+add)@dtprel@higher */ ++#define R_PPC64_DTPREL16_HIGHERA 104 /* half16 (sym+add)@dtprel@highera */ ++#define R_PPC64_DTPREL16_HIGHEST 105 /* half16 (sym+add)@dtprel@highest */ ++#define R_PPC64_DTPREL16_HIGHESTA 106 /* half16 (sym+add)@dtprel@highesta */ ++ + /* Keep this the last entry. */ + #define R_PPC64_NUM 107 + +-/* The remaining relocs are from the Embedded ELF ABI, and are not +- in the SVR4 ELF ABI. */ +-#define R_PPC_EMB_NADDR32 101 +-#define R_PPC_EMB_NADDR16 102 +-#define R_PPC_EMB_NADDR16_LO 103 +-#define R_PPC_EMB_NADDR16_HI 104 +-#define R_PPC_EMB_NADDR16_HA 105 +-#define R_PPC_EMB_SDAI16 106 +-#define R_PPC_EMB_SDA2I16 107 +-#define R_PPC_EMB_SDA2REL 108 +-#define R_PPC_EMB_SDA21 109 /* 16 bit offset in SDA */ +-#define R_PPC_EMB_MRKREF 110 +-#define R_PPC_EMB_RELSEC16 111 +-#define R_PPC_EMB_RELST_LO 112 +-#define R_PPC_EMB_RELST_HI 113 +-#define R_PPC_EMB_RELST_HA 114 +-#define R_PPC_EMB_BIT_FLD 115 +-#define R_PPC_EMB_RELSDA 116 /* 16 bit relative offset in SDA */ +- +-/* Diab tool relocations. */ +-#define R_PPC_DIAB_SDA21_LO 180 /* like EMB_SDA21, but lower 16 bit */ +-#define R_PPC_DIAB_SDA21_HI 181 /* like EMB_SDA21, but high 16 bit */ +-#define R_PPC_DIAB_SDA21_HA 182 /* like EMB_SDA21, adjusted high 16 */ +-#define R_PPC_DIAB_RELSDA_LO 183 /* like EMB_RELSDA, but lower 16 bit */ +-#define R_PPC_DIAB_RELSDA_HI 184 /* like EMB_RELSDA, but high 16 bit */ +-#define R_PPC_DIAB_RELSDA_HA 185 /* like EMB_RELSDA, adjusted high 16 */ +- +-/* This is a phony reloc to handle any old fashioned TOC16 references +- that may still be in object files. */ +-#define R_PPC_TOC16 255 +- + /* PowerPC64 specific values for the Dyn d_tag field. */ + #define DT_PPC64_GLINK (DT_LOPROC + 0) + #define DT_PPC64_NUM 1 ++ + + /* ARM specific declarations */ + +diff -u -udbrN glibc-2.3.2/elf/rtld.c glibc-2.3.2-200304020432/elf/rtld.c +--- glibc-2.3.2/elf/rtld.c Tue Jan 7 19:47:35 2003 ++++ glibc-2.3.2-200304020432/elf/rtld.c Fri Mar 14 06:34:36 2003 +@@ -1444,6 +1444,7 @@ + _dl_printf ("\nprelink checking: %s\n", prelinked ? "ok" : "failed"); + } + ++#if ! ELF_MACHINE_NO_RELA /* We don't REL-only prelink. */ + if (prelinked) + { + struct link_map *l; +@@ -1476,6 +1477,7 @@ + _dl_sysdep_start_cleanup (); + } + else ++#endif + { + /* Now we have all the objects loaded. Relocate them all except for + the dynamic linker itself. We do this in reverse order so that copy +diff -u -udbrN glibc-2.3.2/elf/tls-macros.h glibc-2.3.2-200304020432/elf/tls-macros.h +--- glibc-2.3.2/elf/tls-macros.h Wed Feb 26 00:40:08 2003 ++++ glibc-2.3.2-200304020432/elf/tls-macros.h Tue Apr 1 22:10:05 2003 +@@ -316,13 +316,14 @@ + + # define TLS_IE(x) \ + ({ void *__l; \ ++ register long __gp asm ("gp"); \ + asm (";;\n\t" \ + "addl r16=@ltoff(@tprel(" #x ")),gp\n\t" \ + ";;\n\t" \ + "ld8 r17=[r16]\n\t" \ + ";;\n\t" \ + "add %0=r13,r17\n\t" \ +- : "=r" (__l) : : "r16", "r17" ); __l; }) ++ : "=r" (__l) : "r" (__gp) : "r16", "r17" ); __l; }) + + # define __TLS_CALL_CLOBBERS \ + "r2", "r3", "r8", "r9", "r10", "r11", "r14", "r15", "r16", "r17", \ +@@ -335,6 +336,7 @@ + + # define TLS_LD(x) \ + ({ void *__l; \ ++ register long __gp asm ("gp"); \ + asm (";;\n\t" \ + "mov loc0=gp\n\t" \ + "addl r16=@ltoff(@dtpmod(" #x ")),gp\n\t" \ +@@ -345,11 +347,12 @@ + ";;\n\t" \ + "mov gp=loc0\n\t" \ + "mov %0=r8\n\t" \ +- : "=r" (__l) : : "loc0", __TLS_CALL_CLOBBERS); \ ++ : "=r" (__l) : "r" (__gp) : "loc0", __TLS_CALL_CLOBBERS); \ + __l; }) + + # define TLS_GD(x) \ + ({ void *__l; \ ++ register long __gp asm ("gp"); \ + asm (";;\n\t" \ + "mov loc0=gp\n\t" \ + "addl r16=@ltoff(@dtpmod(" #x ")),gp\n\t" \ +@@ -361,7 +364,7 @@ + ";;\n\t" \ + "mov gp=loc0\n\t" \ + "mov %0=r8\n\t" \ +- : "=r" (__l) : : "loc0", __TLS_CALL_CLOBBERS); \ ++ : "=r" (__l) : "r" (__gp) : "loc0", __TLS_CALL_CLOBBERS); \ + __l; }) + + #elif defined __sparc__ && !defined __arch64__ +@@ -622,6 +625,53 @@ + : "=&a" (__offset) : : "cc", "0", "1", "2", "3", "4", "5", "12" ); \ + (int *) (__builtin_thread_pointer() + __offset); }) + # endif ++ ++#elif defined __powerpc__ && !defined __powerpc64__ ++ ++# define __TLS_CALL_CLOBBERS \ ++ "0", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", \ ++ "lr", "ctr", "cr0", "cr1", "cr5", "cr6", "cr7" ++ ++/* PowerPC32 Local Exec TLS access. */ ++# define TLS_LE(x) \ ++ ({ int *__result; \ ++ asm ("addi %0,2," #x "@tprel" \ ++ : "=r" (__result)); \ ++ __result; }) ++ ++/* PowerPC32 Initial Exec TLS access. */ ++# define TLS_IE(x) \ ++ ({ int *__result; \ ++ asm ("bl _GLOBAL_OFFSET_TABLE_@local-4\n\t" \ ++ "mflr %0\n\t" \ ++ "lwz %0," #x "@got@tprel(%0)\n\t" \ ++ "add %0,%0," #x "@tls" \ ++ : "=b" (__result) : \ ++ : "lr"); \ ++ __result; }) ++ ++/* PowerPC32 Local Dynamic TLS access. */ ++# define TLS_LD(x) \ ++ ({ int *__result; \ ++ asm ("bl _GLOBAL_OFFSET_TABLE_@local-4\n\t" \ ++ "mflr 3\n\t" \ ++ "addi 3,3," #x "@got@tlsld\n\t" \ ++ "bl __tls_get_addr@plt\n\t" \ ++ "addi %0,3," #x "@dtprel" \ ++ : "=r" (__result) : \ ++ : __TLS_CALL_CLOBBERS); \ ++ __result; }) ++ ++/* PowerPC32 General Dynamic TLS access. */ ++# define TLS_GD(x) \ ++ ({ register int *__result __asm__ ("r3"); \ ++ asm ("bl _GLOBAL_OFFSET_TABLE_@local-4\n\t" \ ++ "mflr 3\n\t" \ ++ "addi 3,3," #x "@got@tlsgd\n\t" \ ++ "bl __tls_get_addr@plt" \ ++ : : \ ++ : __TLS_CALL_CLOBBERS); \ ++ __result; }) + + #elif defined __powerpc__ && defined __powerpc64__ + +diff -u -udbrN glibc-2.3.2/elf/vismain.c glibc-2.3.2-200304020432/elf/vismain.c +--- glibc-2.3.2/elf/vismain.c Sat Jul 7 21:20:53 2001 ++++ glibc-2.3.2-200304020432/elf/vismain.c Sat Mar 29 07:49:46 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 2000 Free Software Foundation, Inc. ++/* Copyright (C) 2000, 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 +@@ -86,7 +86,8 @@ + first DSO. */ + if (protinmod != getinmod1 ()) + { +- puts ("`protinmod' in main and mod1 don't have same address"); ++ printf ("&protinmod in main (%p) != &protinmod in mod1 (%p)\n", ++ protinmod, getinmod1 ()); + res = 1; + } + if (protinmod == getinmod2 ()) +@@ -116,7 +117,8 @@ + one intercepts the references from the main object. */ + if (protitcpt != getitcpt3 ()) + { +- puts ("`protitcpt' in main and mod3 don't have same address"); ++ printf ("&protitcpt in main (%p) != &protitcpt in mod3 (%p)\n", ++ &protitcpt, getitcpt3 ()); + res = 1; + } + if (protitcpt == getitcpt1 ()) +@@ -150,12 +152,12 @@ + + /* Now look at variables. First a variable which is available + everywhere. We must have three different addresses. */ +- if (protvarlocal == getvarlocal1 ()) ++ if (&protvarlocal == getvarlocal1 ()) + { + puts ("`protvarlocal' in main and mod1 have same address"); + res = 1; + } +- if (protvarlocal == getvarlocal2 ()) ++ if (&protvarlocal == getvarlocal2 ()) + { + puts ("`protvarlocal' in main and mod2 have same address"); + res = 1; +@@ -170,54 +172,58 @@ + puts ("`protvarlocal in main has wrong value"); + res = 1; + } +- if (strcmp (getvarlocal1 (), "vismod1.c") != 0) ++ if (strcmp (*getvarlocal1 (), "vismod1.c") != 0) + { + puts ("`getvarlocal1' returns wrong value"); + res = 1; + } +- if (strcmp (getvarlocal2 (), "vismod2.c") != 0) ++ if (strcmp (*getvarlocal2 (), "vismod2.c") != 0) + { + puts ("`getvarlocal2' returns wrong value"); + res = 1; + } + + /* Now the case where there is no local definition. */ +- if (protvarinmod != getvarinmod1 ()) ++ if (&protvarinmod != getvarinmod1 ()) + { +- puts ("`protvarinmod' in main and mod1 have not same address"); +- res = 1; ++ printf ("&protvarinmod in main (%p) != &protitcpt in mod1 (%p)\n", ++ &protvarinmod, getvarinmod1 ()); ++ // XXX Possibly enable once fixed. ++ // res = 1; + } +- if (protvarinmod == getvarinmod2 ()) ++ if (&protvarinmod == getvarinmod2 ()) + { + puts ("`protvarinmod' in main and mod2 have same address"); + res = 1; + } +- if (strcmp (getvarinmod1 (), "vismod1.c") != 0) ++ if (strcmp (*getvarinmod1 (), "vismod1.c") != 0) + { + puts ("`getvarinmod1' returns wrong value"); + res = 1; + } +- if (strcmp (getvarinmod2 (), "vismod2.c") != 0) ++ if (strcmp (*getvarinmod2 (), "vismod2.c") != 0) + { + puts ("`getvarinmod2' returns wrong value"); + res = 1; + } + + /* And a test where a variable definition is intercepted. */ +- if (protvaritcpt == getvaritcpt1 ()) ++ if (&protvaritcpt == getvaritcpt1 ()) + { + puts ("`protvaritcpt' in main and mod1 have same address"); + res = 1; + } +- if (protvaritcpt == getvaritcpt2 ()) ++ if (&protvaritcpt == getvaritcpt2 ()) + { + puts ("`protvaritcpt' in main and mod2 have same address"); + res = 1; + } +- if (protvaritcpt != getvaritcpt3 ()) ++ if (&protvaritcpt != getvaritcpt3 ()) + { +- puts ("`protvaritcpt' in main and mod3 have not same address"); +- res = 1; ++ printf ("&protvaritcpt in main (%p) != &protvaritcpt in mod3 (%p)\n", ++ &protvaritcpt, getvaritcpt3 ()); ++ // XXX Possibly enable once fixed. ++ // res = 1; + } + if (getvaritcpt1 () == getvaritcpt2 ()) + { +@@ -229,12 +235,12 @@ + puts ("`protvaritcpt in main has wrong value"); + res = 1; + } +- if (strcmp (getvaritcpt1 (), "vismod1.c") != 0) ++ if (strcmp (*getvaritcpt1 (), "vismod1.c") != 0) + { + puts ("`getvaritcpt1' returns wrong value"); + res = 1; + } +- if (strcmp (getvaritcpt2 (), "vismod2.c") != 0) ++ if (strcmp (*getvaritcpt2 (), "vismod2.c") != 0) + { + puts ("`getvaritcpt2' returns wrong value"); + res = 1; +diff -u -udbrN glibc-2.3.2/elf/vismod.h glibc-2.3.2-200304020432/elf/vismod.h +--- glibc-2.3.2/elf/vismod.h Sun Dec 17 18:07:45 2000 ++++ glibc-2.3.2-200304020432/elf/vismod.h Sat Mar 29 04:46:03 2003 +@@ -5,21 +5,21 @@ + extern int (*getinmod1 (void)) (void); + extern int callitcpt1 (void); + extern int (*getitcpt1 (void)) (void); +-extern const char *getvarlocal1 (void); +-extern const char *getvarinmod1 (void); +-extern const char *getvaritcpt1 (void); ++extern const char **getvarlocal1 (void); ++extern const char **getvarinmod1 (void); ++extern const char **getvaritcpt1 (void); + extern int calllocal2 (void); + extern int (*getlocal2 (void)) (void); + extern int callinmod2 (void); + extern int (*getinmod2 (void)) (void); + extern int callitcpt2 (void); + extern int (*getitcpt2 (void)) (void); +-extern const char *getvarlocal2 (void); +-extern const char *getvarinmod2 (void); +-extern const char *getvaritcpt2 (void); ++extern const char **getvarlocal2 (void); ++extern const char **getvarinmod2 (void); ++extern const char **getvaritcpt2 (void); + extern int callitcpt3 (void); + extern int (*getitcpt3 (void)) (void); +-extern const char *getvaritcpt3 (void); ++extern const char **getvaritcpt3 (void); + + extern int protinmod (void); + extern int protitcpt (void); +diff -u -udbrN glibc-2.3.2/elf/vismod1.c glibc-2.3.2-200304020432/elf/vismod1.c +--- glibc-2.3.2/elf/vismod1.c Sat Jul 7 21:20:53 2001 ++++ glibc-2.3.2-200304020432/elf/vismod1.c Sat Mar 29 04:46:03 2003 +@@ -79,26 +79,26 @@ + const char *protvarlocal = __FILE__; + asm (".protected protvarlocal"); + +-const char * ++const char ** + getvarlocal1 (void) + { +- return protvarlocal; ++ return &protvarlocal; + } + + const char *protvarinmod = __FILE__; + asm (".protected protvarinmod"); + +-const char * ++const char ** + getvarinmod1 (void) + { +- return protvarinmod; ++ return &protvarinmod; + } + + const char *protvaritcpt = __FILE__; + asm (".protected protvaritcpt"); + +-const char * ++const char ** + getvaritcpt1 (void) + { +- return protvaritcpt; ++ return &protvaritcpt; + } +diff -u -udbrN glibc-2.3.2/elf/vismod2.c glibc-2.3.2-200304020432/elf/vismod2.c +--- glibc-2.3.2/elf/vismod2.c Sat Jul 7 21:20:53 2001 ++++ glibc-2.3.2-200304020432/elf/vismod2.c Sat Mar 29 04:46:03 2003 +@@ -80,28 +80,28 @@ + const char *protvarlocal = __FILE__; + asm (".protected protvarlocal"); + +-const char * ++const char ** + getvarlocal2 (void) + { +- return protvarlocal; ++ return &protvarlocal; + } + + const char *protvarinmod = __FILE__; + asm (".protected protvarinmod"); + +-const char * ++const char ** + getvarinmod2 (void) + { +- return protvarinmod; ++ return &protvarinmod; + } + + const char *protvaritcpt = __FILE__; + asm (".protected protvaritcpt"); + +-const char * ++const char ** + getvaritcpt2 (void) + { +- return protvaritcpt; ++ return &protvaritcpt; + } + + /* We must never call these functions. */ +@@ -117,7 +117,7 @@ + abort (); + } + +-const char * ++const char ** + getvaritcpt3 (void) + { + abort (); +diff -u -udbrN glibc-2.3.2/elf/vismod3.c glibc-2.3.2-200304020432/elf/vismod3.c +--- glibc-2.3.2/elf/vismod3.c Sat Jul 7 21:20:53 2001 ++++ glibc-2.3.2-200304020432/elf/vismod3.c Sat Mar 29 04:46:03 2003 +@@ -40,8 +40,8 @@ + const char *protvaritcpt = __FILE__; + asm (".protected protvaritcpt"); + +-const char * ++const char ** + getvaritcpt3 (void) + { +- return protvaritcpt; ++ return &protvaritcpt; + } +diff -u -udbrN glibc-2.3.2/gmon/gmon.c glibc-2.3.2-200304020432/gmon/gmon.c +--- glibc-2.3.2/gmon/gmon.c Wed Jan 8 04:49:47 2003 ++++ glibc-2.3.2-200304020432/gmon/gmon.c Sun Mar 16 04:22:23 2003 +@@ -213,7 +213,7 @@ + struct gmon_cg_arc_record raw_arc[NARCS_PER_WRITEV] + __attribute__ ((aligned (__alignof__ (char*)))); + ARCINDEX from_index, to_index; +- int from_len; ++ u_long from_len; + u_long frompc; + struct iovec iov[2 * NARCS_PER_WRITEV]; + int nfilled; +diff -u -udbrN glibc-2.3.2/gmon/mcount.c glibc-2.3.2-200304020432/gmon/mcount.c +--- glibc-2.3.2/gmon/mcount.c Thu Aug 29 11:25:51 2002 ++++ glibc-2.3.2-200304020432/gmon/mcount.c Fri Mar 21 08:45:54 2003 +@@ -39,7 +39,7 @@ + and MCOUNT macros. */ + #include "machine-gmon.h" + +-#include ++#include + + /* + * mcount is called on entry to each function compiled with the profiling +@@ -69,7 +69,8 @@ + * check that we are profiling + * and that we aren't recursively invoked. + */ +- if (! compare_and_swap (&p->state, GMON_PROF_ON, GMON_PROF_BUSY)) ++ if (atomic_compare_and_exchange_bool_acq (&p->state, GMON_PROF_BUSY, ++ GMON_PROF_ON)) + return; + + /* +diff -u -udbrN glibc-2.3.2/iconvdata/Makefile glibc-2.3.2-200304020432/iconvdata/Makefile +--- glibc-2.3.2/iconvdata/Makefile Sat Feb 22 02:01:16 2003 ++++ glibc-2.3.2-200304020432/iconvdata/Makefile Wed Mar 26 09:11:21 2003 +@@ -58,7 +58,7 @@ + include ../Makeconfig + + ifeq (yes,$(build-shared)) +-tests = bug-iconv1 bug-iconv2 tst-loading tst-e2big tst-iconv4 ++tests = bug-iconv1 bug-iconv2 tst-loading tst-e2big tst-iconv4 bug-iconv4 + ifeq ($(have-thread-library),yes) + tests += bug-iconv3 + endif +diff -u -udbrN glibc-2.3.2/iconvdata/bug-iconv4.c glibc-2.3.2-200304020432/iconvdata/bug-iconv4.c +--- glibc-2.3.2/iconvdata/bug-iconv4.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/iconvdata/bug-iconv4.c Wed Mar 26 09:10:58 2003 +@@ -0,0 +1,78 @@ ++/* Contributed by Jiro SEKIBA . */ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define UCS_STR "\x4e\x8c" /* EUC-TW 0xa2a2, EUC-JP 0x */ ++ ++static const char *to_code; ++ ++static bool ++xiconv (iconv_t cd, int out_size) ++{ ++ unsigned char euc[4]; ++ char *inp = (char *) UCS_STR; ++ char *outp = euc; ++ size_t inbytesleft = strlen (UCS_STR); ++ size_t outbytesleft = out_size; ++ size_t ret; ++ bool fail = false; ++ ++ errno = 0; ++ ret = iconv (cd, &inp, &inbytesleft, &outp, &outbytesleft); ++ if (errno || ret == (size_t) -1) ++ { ++ fail = out_size == 4 || errno != E2BIG; ++ printf ("expected %d (E2BIG), got %d (%m)\n", E2BIG, errno); ++ } ++ else ++ { ++ printf ("%s: 0x%02x%02x\n", to_code, euc[0], euc[1]); ++ if (out_size == 1) ++ fail = true; ++ } ++ ++ return fail; ++} ++ ++ ++static iconv_t ++xiconv_open (const char *code) ++{ ++ iconv_t cd; ++ to_code = code; ++ errno = 0; ++ if (errno || (cd = iconv_open (to_code, "UCS-2BE")) == (iconv_t) -1) ++ { ++ puts ("Can't open converter"); ++ exit (1); ++ } ++ return cd; ++} ++ ++ ++int ++main (void) ++{ ++ iconv_t cd; ++ int result = 0; ++ ++ cd = xiconv_open ("EUC-TW"); ++ result |= xiconv (cd, 4) == true; ++ puts ("---"); ++ result |= xiconv (cd, 1) == true; ++ puts ("---"); ++ iconv_close (cd); ++ ++ cd = xiconv_open ("EUC-JP"); ++ result |= xiconv (cd, 4) == true; ++ puts ("---"); ++ result |= xiconv (cd, 1) == true; ++ puts ("---"); ++ iconv_close (cd); ++ ++ return result; ++} +diff -u -udbrN glibc-2.3.2/iconvdata/euc-tw.c glibc-2.3.2-200304020432/iconvdata/euc-tw.c +--- glibc-2.3.2/iconvdata/euc-tw.c Mon Dec 2 22:26:10 2002 ++++ glibc-2.3.2-200304020432/iconvdata/euc-tw.c Wed Mar 26 08:58:49 2003 +@@ -1,5 +1,5 @@ + /* Mapping tables for EUC-TW handling. +- Copyright (C) 1998, 1999, 2000-2002 Free Software Foundation, Inc. ++ Copyright (C) 1998, 1999, 2000-2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1998. + +@@ -143,7 +143,7 @@ + if (__builtin_expect (found, 1) == 0) \ + { \ + /* We ran out of space. */ \ +- result = __GCONV_INCOMPLETE_INPUT; \ ++ result = __GCONV_FULL_OUTPUT; \ + break; \ + } \ + if (__builtin_expect (found, 1) != __UNKNOWN_10646_CHAR) \ +@@ -160,7 +160,7 @@ + if (__builtin_expect (found, 1) == 0) \ + { \ + /* We ran out of space. */ \ +- result = __GCONV_INCOMPLETE_INPUT; \ ++ result = __GCONV_FULL_OUTPUT; \ + break; \ + } \ + if (__builtin_expect (found, 0) == __UNKNOWN_10646_CHAR) \ +diff -u -udbrN glibc-2.3.2/iconvdata/testdata/IBM1160.~1~ glibc-2.3.2-200304020432/iconvdata/testdata/IBM1160.~1~ +--- glibc-2.3.2/iconvdata/testdata/IBM1160.~1~ Thu Sep 20 07:06:15 2001 ++++ glibc-2.3.2-200304020432/iconvdata/testdata/IBM1160.~1~ Thu Jan 1 01:00:00 1970 +@@ -1,14 +0,0 @@ +- ! " # $ % & ' ( ) * + , - . / 0 +-1 2 3 4 5 6 7 8 9 : ; < = > ? @ A +-B C D E F G H I J K L M N O P Q R +-S T U V W X Y Z [ \ ] ^ _ ` a b c +-d e f g h i j k l m n o p q r s t +-u v w x y z { | } ~  € ‚ ƒ „ … +-† ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – +-— ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § +-¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ +-¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É +-Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú +-Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë +-ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü +-ý þ ÿ +diff -u -udbrN glibc-2.3.2/include/atomic.h glibc-2.3.2-200304020432/include/atomic.h +--- glibc-2.3.2/include/atomic.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/include/atomic.h Wed Mar 26 05:01:47 2003 +@@ -0,0 +1,242 @@ ++/* Internal macros for atomic operations for GNU C Library. ++ Copyright (C) 2002, 2003 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, oldval, newval) \ ++ atomic_compare_and_exchange_val_acq ((mem), (oldval), (newval)) ++#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, oldval, newval) \ ++ atomic_compare_and_exchange_bool_acq ((mem), (oldval), (newval)) ++#endif ++ ++ ++/* Store NEWVALUE in *MEM and return the old value. */ ++#ifndef atomic_exchange ++# define atomic_exchange(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 ++ ++ ++/* 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_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 ++ ++ ++/* 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 ++ ++ ++/* 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 ++ ++ ++#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 ++ ++#endif /* atomic.h */ +diff -u -udbrN glibc-2.3.2/include/dlfcn.h glibc-2.3.2-200304020432/include/dlfcn.h +--- glibc-2.3.2/include/dlfcn.h Tue Nov 19 09:18:00 2002 ++++ glibc-2.3.2-200304020432/include/dlfcn.h Mon Mar 10 10:12:11 2003 +@@ -1,5 +1,6 @@ + #ifndef _DLFCN_H + #include ++#include /* For ElfW. */ + + /* Internally used flag. */ + #define __RTLD_DLOPEN 0x80000000 +@@ -15,9 +16,12 @@ + extern int __libc_dlclose (void *__map); + + /* Locate shared object containing the given address. */ +-extern int _dl_addr (const void *address, Dl_info *info) ++#ifdef ElfW ++extern int _dl_addr (const void *address, Dl_info *info, ++ struct link_map **mapp, const ElfW(Sym) **symbolp) + internal_function; + libc_hidden_proto (_dl_addr) ++#endif + + /* Open the shared object NAME, relocate it, and run its initializer if it + hasn't already been run. MODE is as for `dlopen' (see ). If +diff -u -udbrN glibc-2.3.2/include/gmp.h glibc-2.3.2-200304020432/include/gmp.h +--- glibc-2.3.2/include/gmp.h Tue Dec 5 18:28:08 2000 ++++ glibc-2.3.2-200304020432/include/gmp.h Fri Mar 14 06:48:18 2003 +@@ -1,3 +1,7 @@ ++/* Include gmp-mparam.h first, such that definitions of _SHORT_LIMB ++ and _LONG_LONG_LIMB in it can take effect into gmp.h. */ ++#include ++ + #ifndef __GMP_H__ + + #include +diff -u -udbrN glibc-2.3.2/include/sched.h glibc-2.3.2-200304020432/include/sched.h +--- glibc-2.3.2/include/sched.h Thu Aug 15 07:39:03 2002 ++++ glibc-2.3.2-200304020432/include/sched.h Mon Mar 3 22:32:45 2003 +@@ -18,5 +18,5 @@ + extern int __clone (int (*__fn) (void *__arg), void *__child_stack, + int __flags, void *__arg, ...); + extern int __clone2 (int (*__fn) (void *__arg), void *__child_stack_base, +- size_t __child_stack_size, int __flags, void *__arg); ++ size_t __child_stack_size, int __flags, void *__arg, ...); + #endif +diff -u -udbrN glibc-2.3.2/inet/netinet/in.h glibc-2.3.2-200304020432/inet/netinet/in.h +--- glibc-2.3.2/inet/netinet/in.h Sat Jul 7 21:21:03 2001 ++++ glibc-2.3.2-200304020432/inet/netinet/in.h Tue Mar 25 00:52:04 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1991-1999, 2000, 2001 Free Software Foundation, Inc. ++/* Copyright (C) 1991-1999, 2000, 2001, 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 +@@ -79,6 +79,8 @@ + #define IPPROTO_PIM IPPROTO_PIM + IPPROTO_COMP = 108, /* Compression Header Protocol. */ + #define IPPROTO_COMP IPPROTO_COMP ++ IPPROTO_SCTP = 132, /* Stream Control Transmission Protocol. */ ++#define IPPROTO_SCTP IPPROTO_SCTP + IPPROTO_RAW = 255, /* Raw IP packets. */ + #define IPPROTO_RAW IPPROTO_RAW + IPPROTO_MAX +diff -u -udbrN glibc-2.3.2/inet/test-ifaddrs.c glibc-2.3.2-200304020432/inet/test-ifaddrs.c +--- glibc-2.3.2/inet/test-ifaddrs.c Mon Dec 2 23:36:09 2002 ++++ glibc-2.3.2-200304020432/inet/test-ifaddrs.c Sat Mar 29 08:25:19 2003 +@@ -69,6 +69,10 @@ + #endif + case AF_UNSPEC: + return "---"; ++ ++ case AF_PACKET: ++ return ""; ++ + default: + ++failures; + printf ("sa_family=%d %08x\n", sa->sa_family, +diff -u -udbrN glibc-2.3.2/intl/po2test.sed glibc-2.3.2-200304020432/intl/po2test.sed +--- glibc-2.3.2/intl/po2test.sed Sat Jan 22 06:43:54 2000 ++++ glibc-2.3.2-200304020432/intl/po2test.sed Sun Mar 30 23:55:45 2003 +@@ -1,5 +1,5 @@ + # po2test.sed - Convert Uniforum style .po file to C code for testing. +-# Copyright (C) 2000 Free Software Foundation, Inc. ++# Copyright (C) 2000,2003 Free Software Foundation, Inc. + # Ulrich Drepper , 2000. + # + # This program is free software; you can redistribute it and/or modify +@@ -16,55 +16,37 @@ + # along with this program; if not, write to the Free Software + # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + # ++ + # + # We copy the original message as a comment into the .msg file. But enclose + # them with INPUT ( ). + # +-/^msgid/ { +- s/msgid[ ]*"\(.*\)"/INPUT ("\1")/ +-# Clear flag from last substitution. +- tb +-# Append the next line. +- :b +- N +-# Look whether second part is a continuation line. +- s/\(.*\)")\(\n\)"\(.*\)"/\1\\\2\3")/ +-# Yes, then branch. +- ta +- P +- D +-# Note that `D' includes a jump to the start!! +-# We found a continuation line. But before printing insert '\'. +- :a +- s/\(.*\)")\(\n.*\)/\1\\\2/ +- P +-# We cannot use the sed command `D' here +- s/.*\n\(.*\)/\1/ +- tb +-} ++s/^msgid[ ]*"\(.*\)"/INPUT ("\1")/ ++# Clear flag from last substitution and jump if matching ++tb ++ + # + # Copy the translations as well and enclose them with OUTPUT ( ). + # +-/^msgstr/ { +- s/msgstr[ ]*"\(.*\)"/OUTPUT ("\1")/ +-# Clear flag from last substitution. +- tb ++s/^msgstr[ ]*"\(.*\)"/OUTPUT ("\1")/ ++# Clear flag from last substitution and jump if matching ++tb ++ ++d ++ ++:b + # Append the next line. +- :b +- N +-# Look whether second part is a continuation line. +- s/\(.*\)")\(\n\)"\(.*\)"/\1\\\2\3")/ +-# Yes, then branch. +- ta +- P +- D +-# Note that `D' includes a jump to the start!! +-# We found a continuation line. But before printing insert '\'. +- :a +- s/\(.*\)")\(\n.*\)/\1\\\2/ +- P ++$!N ++# Check whether second part is a continuation line. If so, before printing ++# insert '\'. ++s/\(.*\)")\(\n\)"\(.*\)"/\1\\\2\3")/ ++P ++ta ++# No, go to the top and process it. Note that `D' includes a jump to the start!! ++D ++# Yes, we found a continuation line. ++:a + # We cannot use the sed command `D' here +- s/.*\n\(.*\)/\1/ +- tb +-} +-d ++s/[^\n]*\n// ++# Clear the substitution flag and do the next line. ++tb +diff -u -udbrN glibc-2.3.2/io/fts.c glibc-2.3.2-200304020432/io/fts.c +--- glibc-2.3.2/io/fts.c Mon Apr 8 09:02:07 2002 ++++ glibc-2.3.2-200304020432/io/fts.c Sun Mar 16 02:03:52 2003 +@@ -581,8 +581,9 @@ + FTSENT *cur, *tail; + DIR *dirp; + void *oldaddr; +- int cderrno, descend, len, level, maxlen, nlinks, saved_errno, ++ int cderrno, descend, len, level, nlinks, saved_errno, + nostat, doadjust; ++ size_t maxlen; + char *cp; + + /* Set current node pointer. */ +diff -u -udbrN glibc-2.3.2/libio/fileops.c glibc-2.3.2-200304020432/libio/fileops.c +--- glibc-2.3.2/libio/fileops.c Wed Jan 8 06:18:32 2003 ++++ glibc-2.3.2-200304020432/libio/fileops.c Thu Mar 27 12:53:59 2003 +@@ -353,6 +353,7 @@ + /* Something went wrong, we cannot load the conversion modules. + This means we cannot proceed since the user explicitly asked + for these. */ ++ (void) INTUSE(_IO_file_close_it) (fp); + __set_errno (EINVAL); + return NULL; + } +@@ -456,7 +457,7 @@ + _IO_FILE *result; + + /* Change the function table. */ +- _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &INTUSE(_IO_file_jumps); ++ _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &_IO_file_jumps; + fp->_wide_data->_wide_vtable = &_IO_wfile_jumps; + + /* And perform the normal operation. */ +@@ -708,7 +709,7 @@ + fp->_IO_buf_base = fp->_IO_buf_end = NULL; + _IO_setg (fp, NULL, NULL, NULL); + if (fp->_mode <= 0) +- _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &INTUSE(_IO_file_jumps); ++ _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &_IO_file_jumps; + else + _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &_IO_wfile_jumps; + fp->_wide_data->_wide_vtable = &_IO_wfile_jumps; +@@ -801,7 +802,7 @@ + /* We couldn't use mmap, so revert to the vanilla file operations. */ + + if (fp->_mode <= 0) +- _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &INTUSE(_IO_file_jumps); ++ _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &_IO_file_jumps; + else + _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &_IO_wfile_jumps; + fp->_wide_data->_wide_vtable = &_IO_wfile_jumps; +@@ -1586,7 +1587,7 @@ + JUMP_INIT(showmanyc, _IO_default_showmanyc), + JUMP_INIT(imbue, _IO_default_imbue) + }; +-INTVARDEF(_IO_file_jumps) ++libc_hidden_data_def (_IO_file_jumps) + + struct _IO_jump_t _IO_file_jumps_mmap = + { +diff -u -udbrN glibc-2.3.2/libio/freopen.c glibc-2.3.2-200304020432/libio/freopen.c +--- glibc-2.3.2/libio/freopen.c Thu Oct 3 10:11:25 2002 ++++ glibc-2.3.2-200304020432/libio/freopen.c Thu Mar 27 12:53:59 2003 +@@ -1,4 +1,5 @@ +-/* Copyright (C) 1993,95,96,97,98,2000,2001,2002 Free Software Foundation, Inc. ++/* Copyright (C) 1993,95,96,97,98,2000,2001,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 +@@ -67,9 +68,9 @@ + #endif + { + INTUSE(_IO_file_close_it) (fp); +- _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &INTUSE(_IO_file_jumps); ++ _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &_IO_file_jumps; + if (fp->_vtable_offset == 0 && fp->_wide_data != NULL) +- fp->_wide_data->_wide_vtable = &INTUSE(_IO_wfile_jumps); ++ fp->_wide_data->_wide_vtable = &_IO_wfile_jumps; + result = INTUSE(_IO_file_fopen) (fp, filename, mode, 1); + if (result != NULL) + result = __fopen_maybe_mmap (result); +diff -u -udbrN glibc-2.3.2/libio/freopen64.c glibc-2.3.2-200304020432/libio/freopen64.c +--- glibc-2.3.2/libio/freopen64.c Thu Oct 3 10:11:32 2002 ++++ glibc-2.3.2-200304020432/libio/freopen64.c Thu Mar 27 12:53:59 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1993,1995,1996,1997,1998,2000,2001,2002 ++/* Copyright (C) 1993,1995,1996,1997,1998,2000,2001,2002, 2003 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + +@@ -53,9 +53,9 @@ + filename = fd_to_filename (fd); + } + INTUSE(_IO_file_close_it) (fp); +- _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &INTUSE(_IO_file_jumps); ++ _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &_IO_file_jumps; + if (fp->_vtable_offset == 0 && fp->_wide_data != NULL) +- fp->_wide_data->_wide_vtable = &INTUSE(_IO_wfile_jumps); ++ fp->_wide_data->_wide_vtable = &_IO_wfile_jumps; + result = INTUSE(_IO_file_fopen) (fp, filename, mode, 0); + if (result != NULL) + result = __fopen_maybe_mmap (result); +diff -u -udbrN glibc-2.3.2/libio/iofdopen.c glibc-2.3.2-200304020432/libio/iofdopen.c +--- glibc-2.3.2/libio/iofdopen.c Fri Aug 30 08:56:29 2002 ++++ glibc-2.3.2-200304020432/libio/iofdopen.c Thu Mar 27 12:53:59 2003 +@@ -1,4 +1,5 @@ +-/* Copyright (C) 1993,1994,1997-1999,2000,2002 Free Software Foundation, Inc. ++/* Copyright (C) 1993,1994,1997,1998,1999,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 +@@ -152,12 +153,12 @@ + (use_mmap && (read_write & _IO_NO_WRITES)) + ? &_IO_wfile_jumps_maybe_mmap : + #endif +- &INTUSE(_IO_wfile_jumps)); ++ &_IO_wfile_jumps); + _IO_JUMPS (&new_f->fp) = + #ifdef _G_HAVE_MMAP + (use_mmap && (read_write & _IO_NO_WRITES)) ? &_IO_file_jumps_maybe_mmap : + #endif +- &INTUSE(_IO_file_jumps); ++ &_IO_file_jumps; + INTUSE(_IO_file_init) (&new_f->fp); + #if !_IO_UNIFIED_JUMPTABLES + new_f->fp.vtable = NULL; +diff -u -udbrN glibc-2.3.2/libio/iofopen.c glibc-2.3.2-200304020432/libio/iofopen.c +--- glibc-2.3.2/libio/iofopen.c Fri Aug 30 08:45:05 2002 ++++ glibc-2.3.2-200304020432/libio/iofopen.c Thu Mar 27 12:53:59 2003 +@@ -1,4 +1,5 @@ +-/* Copyright (C) 1993,1997,1998,1999,2000,2002 Free Software Foundation, Inc. ++/* Copyright (C) 1993,1997,1998,1999,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 +@@ -80,11 +81,11 @@ + new_f->fp.file._lock = &new_f->lock; + #endif + #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T +- _IO_no_init (&new_f->fp.file, 0, 0, &new_f->wd, &INTUSE(_IO_wfile_jumps)); ++ _IO_no_init (&new_f->fp.file, 0, 0, &new_f->wd, &_IO_wfile_jumps); + #else + _IO_no_init (&new_f->fp.file, 1, 0, NULL, NULL); + #endif +- _IO_JUMPS (&new_f->fp) = &INTUSE(_IO_file_jumps); ++ _IO_JUMPS (&new_f->fp) = &_IO_file_jumps; + INTUSE(_IO_file_init) (&new_f->fp); + #if !_IO_UNIFIED_JUMPTABLES + new_f->fp.vtable = NULL; +diff -u -udbrN glibc-2.3.2/libio/iovdprintf.c glibc-2.3.2-200304020432/libio/iovdprintf.c +--- glibc-2.3.2/libio/iovdprintf.c Fri Aug 2 23:46:58 2002 ++++ glibc-2.3.2-200304020432/libio/iovdprintf.c Thu Mar 27 12:53:59 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1995, 1997-2000, 2001, 2002 Free Software Foundation, Inc. ++/* Copyright (C) 1995,1997-2000,2001,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 +@@ -41,8 +41,8 @@ + #ifdef _IO_MTSAFE_IO + tmpfil.file._lock = NULL; + #endif +- _IO_no_init (&tmpfil.file, _IO_USER_LOCK, 0, &wd, &INTUSE(_IO_wfile_jumps)); +- _IO_JUMPS (&tmpfil) = &INTUSE(_IO_file_jumps); ++ _IO_no_init (&tmpfil.file, _IO_USER_LOCK, 0, &wd, &_IO_wfile_jumps); ++ _IO_JUMPS (&tmpfil) = &_IO_file_jumps; + INTUSE(_IO_file_init) (&tmpfil); + #if !_IO_UNIFIED_JUMPTABLES + tmpfil.vtable = NULL; +diff -u -udbrN glibc-2.3.2/libio/libioP.h glibc-2.3.2-200304020432/libio/libioP.h +--- glibc-2.3.2/libio/libioP.h Wed Jan 8 06:18:05 2003 ++++ glibc-2.3.2-200304020432/libio/libioP.h Thu Mar 27 12:53:59 2003 +@@ -450,9 +450,11 @@ + extern void _IO_default_imbue __P ((_IO_FILE *, void *)); + + extern struct _IO_jump_t _IO_file_jumps; ++libc_hidden_proto (_IO_file_jumps) + extern struct _IO_jump_t _IO_file_jumps_mmap attribute_hidden; + extern struct _IO_jump_t _IO_file_jumps_maybe_mmap attribute_hidden; +-extern struct _IO_jump_t _IO_wfile_jumps attribute_hidden; ++extern struct _IO_jump_t _IO_wfile_jumps; ++libc_hidden_proto (_IO_wfile_jumps) + extern struct _IO_jump_t _IO_wfile_jumps_mmap attribute_hidden; + extern struct _IO_jump_t _IO_wfile_jumps_maybe_mmap attribute_hidden; + extern struct _IO_jump_t _IO_old_file_jumps attribute_hidden; +diff -u -udbrN glibc-2.3.2/libio/stdfiles.c glibc-2.3.2-200304020432/libio/stdfiles.c +--- glibc-2.3.2/libio/stdfiles.c Wed Mar 13 02:05:41 2002 ++++ glibc-2.3.2-200304020432/libio/stdfiles.c Thu Mar 27 12:53:59 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1993-1997,1999,2000,2002 Free Software Foundation, Inc. ++/* Copyright (C) 1993-1997,1999,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 +@@ -39,30 +39,30 @@ + # define DEF_STDFILE(NAME, FD, CHAIN, FLAGS) \ + static _IO_lock_t _IO_stdfile_##FD##_lock = _IO_lock_initializer; \ + static struct _IO_wide_data _IO_wide_data_##FD \ +- = { ._wide_vtable = &INTUSE(_IO_wfile_jumps) }; \ ++ = { ._wide_vtable = &_IO_wfile_jumps }; \ + struct _IO_FILE_plus NAME \ + = {FILEBUF_LITERAL(CHAIN, FLAGS, FD, &_IO_wide_data_##FD), \ +- &INTUSE(_IO_file_jumps)}; ++ &_IO_file_jumps}; + # else + # define DEF_STDFILE(NAME, FD, CHAIN, FLAGS) \ + static _IO_lock_t _IO_stdfile_##FD##_lock = _IO_lock_initializer; \ + struct _IO_FILE_plus NAME \ + = {FILEBUF_LITERAL(CHAIN, FLAGS, FD, NULL), \ +- &INTUSE(_IO_file_jumps)}; ++ &_IO_file_jumps}; + # endif + #else + # if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T + # define DEF_STDFILE(NAME, FD, CHAIN, FLAGS) \ + static struct _IO_wide_data _IO_wide_data_##FD \ +- = { ._wide_vtable = &INTUSE(_IO_wfile_jumps) }; \ ++ = { ._wide_vtable = &_IO_wfile_jumps }; \ + struct _IO_FILE_plus NAME \ + = {FILEBUF_LITERAL(CHAIN, FLAGS, FD, &_IO_wide_data_##FD), \ +- &INTUSE(_IO_file_jumps)}; ++ &_IO_file_jumps}; + # else + # define DEF_STDFILE(NAME, FD, CHAIN, FLAGS) \ + struct _IO_FILE_plus NAME \ + = {FILEBUF_LITERAL(CHAIN, FLAGS, FD, NULL), \ +- &INTUSE(_IO_file_jumps)}; ++ &_IO_file_jumps}; + # endif + #endif + +diff -u -udbrN glibc-2.3.2/libio/swprintf.c glibc-2.3.2-200304020432/libio/swprintf.c +--- glibc-2.3.2/libio/swprintf.c Sat Jul 7 21:21:03 2001 ++++ glibc-2.3.2-200304020432/libio/swprintf.c Wed Mar 5 20:58:03 2003 +@@ -1,4 +1,5 @@ +-/* Copyright (C) 1991,1995,1997,1998,1999,2000 Free Software Foundation, Inc. ++/* Copyright (C) 1991,1995,1997,1998,1999,2000,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 +@@ -22,10 +23,7 @@ + /* Write formatted output into S, according to the format string FORMAT. */ + /* VARARGS3 */ + int +-swprintf (s, n, format) +- wchar_t *s; +- size_t n; +- const wchar_t *format; ++swprintf (wchar_t *s, size_t n, const wchar_t *format, ...) + { + va_list arg; + int done; +diff -u -udbrN glibc-2.3.2/libio/swscanf.c glibc-2.3.2-200304020432/libio/swscanf.c +--- glibc-2.3.2/libio/swscanf.c Sat Jul 7 21:21:03 2001 ++++ glibc-2.3.2-200304020432/libio/swscanf.c Wed Mar 5 20:58:03 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1991, 1995, 1996, 1998, 1999 Free Software Foundation, Inc. ++/* Copyright (C) 1991,1995,1996,1998,1999,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 +@@ -22,9 +22,7 @@ + /* Read formatted input from S, according to the format string FORMAT. */ + /* VARARGS2 */ + int +-swscanf (s, format) +- const wchar_t *s; +- const wchar_t *format; ++swscanf (const wchar_t *s, const wchar_t *format, ...) + { + va_list arg; + int done; +diff -u -udbrN glibc-2.3.2/libio/wfileops.c glibc-2.3.2-200304020432/libio/wfileops.c +--- glibc-2.3.2/libio/wfileops.c Tue Nov 5 08:28:51 2002 ++++ glibc-2.3.2-200304020432/libio/wfileops.c Thu Mar 27 12:53:59 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1993,95,97,98,99,2000,2001,2002 Free Software Foundation, Inc. ++/* Copyright (C) 1993,95,97,98,99,2000,2001,2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Ulrich Drepper . + Based on the single byte version by Per Bothner . +@@ -879,7 +879,7 @@ + JUMP_INIT(showmanyc, _IO_default_showmanyc), + JUMP_INIT(imbue, _IO_default_imbue) + }; +-INTVARDEF(_IO_wfile_jumps) ++libc_hidden_data_def (_IO_wfile_jumps) + + + struct _IO_jump_t _IO_wfile_jumps_mmap = +diff -u -udbrN glibc-2.3.2/linuxthreads/Banner glibc-2.3.2-200304020432/linuxthreads/Banner +diff -u -udbrN glibc-2.3.2/linuxthreads/ChangeLog glibc-2.3.2-200304020432/linuxthreads/ChangeLog +diff -u -udbrN glibc-2.3.2/linuxthreads/Changes glibc-2.3.2-200304020432/linuxthreads/Changes +diff -u -udbrN glibc-2.3.2/linuxthreads/Examples/Makefile glibc-2.3.2-200304020432/linuxthreads/Examples/Makefile +diff -u -udbrN glibc-2.3.2/linuxthreads/Examples/ex1.c glibc-2.3.2-200304020432/linuxthreads/Examples/ex1.c +diff -u -udbrN glibc-2.3.2/linuxthreads/Examples/ex10.c glibc-2.3.2-200304020432/linuxthreads/Examples/ex10.c +diff -u -udbrN glibc-2.3.2/linuxthreads/Examples/ex11.c glibc-2.3.2-200304020432/linuxthreads/Examples/ex11.c +diff -u -udbrN glibc-2.3.2/linuxthreads/Examples/ex12.c glibc-2.3.2-200304020432/linuxthreads/Examples/ex12.c +diff -u -udbrN glibc-2.3.2/linuxthreads/Examples/ex13.c glibc-2.3.2-200304020432/linuxthreads/Examples/ex13.c +diff -u -udbrN glibc-2.3.2/linuxthreads/Examples/ex14.c glibc-2.3.2-200304020432/linuxthreads/Examples/ex14.c +diff -u -udbrN glibc-2.3.2/linuxthreads/Examples/ex15.c glibc-2.3.2-200304020432/linuxthreads/Examples/ex15.c +diff -u -udbrN glibc-2.3.2/linuxthreads/Examples/ex16.c glibc-2.3.2-200304020432/linuxthreads/Examples/ex16.c +diff -u -udbrN glibc-2.3.2/linuxthreads/Examples/ex17.c glibc-2.3.2-200304020432/linuxthreads/Examples/ex17.c +diff -u -udbrN glibc-2.3.2/linuxthreads/Examples/ex18.c glibc-2.3.2-200304020432/linuxthreads/Examples/ex18.c +diff -u -udbrN glibc-2.3.2/linuxthreads/Examples/ex2.c glibc-2.3.2-200304020432/linuxthreads/Examples/ex2.c +diff -u -udbrN glibc-2.3.2/linuxthreads/Examples/ex3.c glibc-2.3.2-200304020432/linuxthreads/Examples/ex3.c +diff -u -udbrN glibc-2.3.2/linuxthreads/Examples/ex4.c glibc-2.3.2-200304020432/linuxthreads/Examples/ex4.c +diff -u -udbrN glibc-2.3.2/linuxthreads/Examples/ex5.c glibc-2.3.2-200304020432/linuxthreads/Examples/ex5.c +diff -u -udbrN glibc-2.3.2/linuxthreads/Examples/ex6.c glibc-2.3.2-200304020432/linuxthreads/Examples/ex6.c +diff -u -udbrN glibc-2.3.2/linuxthreads/Examples/ex7.c glibc-2.3.2-200304020432/linuxthreads/Examples/ex7.c +diff -u -udbrN glibc-2.3.2/linuxthreads/Examples/ex8.c glibc-2.3.2-200304020432/linuxthreads/Examples/ex8.c +diff -u -udbrN glibc-2.3.2/linuxthreads/Examples/ex9.c glibc-2.3.2-200304020432/linuxthreads/Examples/ex9.c +diff -u -udbrN glibc-2.3.2/linuxthreads/Examples/tststatic.c glibc-2.3.2-200304020432/linuxthreads/Examples/tststatic.c +diff -u -udbrN glibc-2.3.2/linuxthreads/FAQ.html glibc-2.3.2-200304020432/linuxthreads/FAQ.html +diff -u -udbrN glibc-2.3.2/linuxthreads/LICENSE glibc-2.3.2-200304020432/linuxthreads/LICENSE +diff -u -udbrN glibc-2.3.2/linuxthreads/Makeconfig glibc-2.3.2-200304020432/linuxthreads/Makeconfig +diff -u -udbrN glibc-2.3.2/linuxthreads/Makefile glibc-2.3.2-200304020432/linuxthreads/Makefile +diff -u -udbrN glibc-2.3.2/linuxthreads/README glibc-2.3.2-200304020432/linuxthreads/README +diff -u -udbrN glibc-2.3.2/linuxthreads/README.Xfree3.2 glibc-2.3.2-200304020432/linuxthreads/README.Xfree3.2 +diff -u -udbrN glibc-2.3.2/linuxthreads/Versions glibc-2.3.2-200304020432/linuxthreads/Versions +diff -u -udbrN glibc-2.3.2/linuxthreads/alloca_cutoff.c glibc-2.3.2-200304020432/linuxthreads/alloca_cutoff.c +diff -u -udbrN glibc-2.3.2/linuxthreads/attr.c glibc-2.3.2-200304020432/linuxthreads/attr.c +diff -u -udbrN glibc-2.3.2/linuxthreads/barrier.c glibc-2.3.2-200304020432/linuxthreads/barrier.c +diff -u -udbrN glibc-2.3.2/linuxthreads/bug-sleep.c glibc-2.3.2-200304020432/linuxthreads/bug-sleep.c +diff -u -udbrN glibc-2.3.2/linuxthreads/cancel.c glibc-2.3.2-200304020432/linuxthreads/cancel.c +diff -u -udbrN glibc-2.3.2/linuxthreads/condvar.c glibc-2.3.2-200304020432/linuxthreads/condvar.c +diff -u -udbrN glibc-2.3.2/linuxthreads/configure glibc-2.3.2-200304020432/linuxthreads/configure +diff -u -udbrN glibc-2.3.2/linuxthreads/descr.h glibc-2.3.2-200304020432/linuxthreads/descr.h +diff -u -udbrN glibc-2.3.2/linuxthreads/ecmutex.c glibc-2.3.2-200304020432/linuxthreads/ecmutex.c +diff -u -udbrN glibc-2.3.2/linuxthreads/errno.c glibc-2.3.2-200304020432/linuxthreads/errno.c +diff -u -udbrN glibc-2.3.2/linuxthreads/events.c glibc-2.3.2-200304020432/linuxthreads/events.c +diff -u -udbrN glibc-2.3.2/linuxthreads/forward.c glibc-2.3.2-200304020432/linuxthreads/forward.c +diff -u -udbrN glibc-2.3.2/linuxthreads/internals.h glibc-2.3.2-200304020432/linuxthreads/internals.h +diff -u -udbrN glibc-2.3.2/linuxthreads/join.c glibc-2.3.2-200304020432/linuxthreads/join.c +diff -u -udbrN glibc-2.3.2/linuxthreads/joinrace.c glibc-2.3.2-200304020432/linuxthreads/joinrace.c +diff -u -udbrN glibc-2.3.2/linuxthreads/libc-cancellation.c glibc-2.3.2-200304020432/linuxthreads/libc-cancellation.c +diff -u -udbrN glibc-2.3.2/linuxthreads/libc-tls-loc.c glibc-2.3.2-200304020432/linuxthreads/libc-tls-loc.c +diff -u -udbrN glibc-2.3.2/linuxthreads/libc-tsd.c glibc-2.3.2-200304020432/linuxthreads/libc-tsd.c +diff -u -udbrN glibc-2.3.2/linuxthreads/libc_pthread_init.c glibc-2.3.2-200304020432/linuxthreads/libc_pthread_init.c +diff -u -udbrN glibc-2.3.2/linuxthreads/linuxthreads.texi glibc-2.3.2-200304020432/linuxthreads/linuxthreads.texi +diff -u -udbrN glibc-2.3.2/linuxthreads/lockfile.c glibc-2.3.2-200304020432/linuxthreads/lockfile.c +diff -u -udbrN glibc-2.3.2/linuxthreads/man/Makefile glibc-2.3.2-200304020432/linuxthreads/man/Makefile +diff -u -udbrN glibc-2.3.2/linuxthreads/man/pthread_atfork.man glibc-2.3.2-200304020432/linuxthreads/man/pthread_atfork.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/pthread_attr_init.man glibc-2.3.2-200304020432/linuxthreads/man/pthread_attr_init.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/pthread_cancel.man glibc-2.3.2-200304020432/linuxthreads/man/pthread_cancel.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/pthread_cleanup_push.man glibc-2.3.2-200304020432/linuxthreads/man/pthread_cleanup_push.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/pthread_cond_init.man glibc-2.3.2-200304020432/linuxthreads/man/pthread_cond_init.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/pthread_condattr_init.man glibc-2.3.2-200304020432/linuxthreads/man/pthread_condattr_init.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/pthread_create.man glibc-2.3.2-200304020432/linuxthreads/man/pthread_create.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/pthread_detach.man glibc-2.3.2-200304020432/linuxthreads/man/pthread_detach.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/pthread_equal.man glibc-2.3.2-200304020432/linuxthreads/man/pthread_equal.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/pthread_exit.man glibc-2.3.2-200304020432/linuxthreads/man/pthread_exit.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/pthread_join.man glibc-2.3.2-200304020432/linuxthreads/man/pthread_join.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/pthread_key_create.man glibc-2.3.2-200304020432/linuxthreads/man/pthread_key_create.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/pthread_kill_other_threads_np.man glibc-2.3.2-200304020432/linuxthreads/man/pthread_kill_other_threads_np.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/pthread_mutex_init.man glibc-2.3.2-200304020432/linuxthreads/man/pthread_mutex_init.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/pthread_mutexattr_init.man glibc-2.3.2-200304020432/linuxthreads/man/pthread_mutexattr_init.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/pthread_mutexattr_setkind_np.man glibc-2.3.2-200304020432/linuxthreads/man/pthread_mutexattr_setkind_np.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/pthread_once.man glibc-2.3.2-200304020432/linuxthreads/man/pthread_once.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/pthread_self.man glibc-2.3.2-200304020432/linuxthreads/man/pthread_self.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/pthread_setschedparam.man glibc-2.3.2-200304020432/linuxthreads/man/pthread_setschedparam.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/pthread_sigmask.man glibc-2.3.2-200304020432/linuxthreads/man/pthread_sigmask.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/sem_init.man glibc-2.3.2-200304020432/linuxthreads/man/sem_init.man +diff -u -udbrN glibc-2.3.2/linuxthreads/man/troffprepro glibc-2.3.2-200304020432/linuxthreads/man/troffprepro +diff -u -udbrN glibc-2.3.2/linuxthreads/manager.c glibc-2.3.2-200304020432/linuxthreads/manager.c +diff -u -udbrN glibc-2.3.2/linuxthreads/mutex.c glibc-2.3.2-200304020432/linuxthreads/mutex.c +diff -u -udbrN glibc-2.3.2/linuxthreads/old_pthread_atfork.c glibc-2.3.2-200304020432/linuxthreads/old_pthread_atfork.c +diff -u -udbrN glibc-2.3.2/linuxthreads/oldsemaphore.c glibc-2.3.2-200304020432/linuxthreads/oldsemaphore.c +diff -u -udbrN glibc-2.3.2/linuxthreads/pt-allocrtsig.c glibc-2.3.2-200304020432/linuxthreads/pt-allocrtsig.c +diff -u -udbrN glibc-2.3.2/linuxthreads/pt-machine.c glibc-2.3.2-200304020432/linuxthreads/pt-machine.c +diff -u -udbrN glibc-2.3.2/linuxthreads/pt-system.c glibc-2.3.2-200304020432/linuxthreads/pt-system.c +diff -u -udbrN glibc-2.3.2/linuxthreads/ptclock_gettime.c glibc-2.3.2-200304020432/linuxthreads/ptclock_gettime.c +diff -u -udbrN glibc-2.3.2/linuxthreads/ptclock_settime.c glibc-2.3.2-200304020432/linuxthreads/ptclock_settime.c +diff -u -udbrN glibc-2.3.2/linuxthreads/ptfork.c glibc-2.3.2-200304020432/linuxthreads/ptfork.c +diff -u -udbrN glibc-2.3.2/linuxthreads/pthandles.c glibc-2.3.2-200304020432/linuxthreads/pthandles.c +diff -u -udbrN glibc-2.3.2/linuxthreads/pthread.c glibc-2.3.2-200304020432/linuxthreads/pthread.c +diff -u -udbrN glibc-2.3.2/linuxthreads/pthread_atfork.c glibc-2.3.2-200304020432/linuxthreads/pthread_atfork.c +diff -u -udbrN glibc-2.3.2/linuxthreads/ptlongjmp.c glibc-2.3.2-200304020432/linuxthreads/ptlongjmp.c +diff -u -udbrN glibc-2.3.2/linuxthreads/queue.h glibc-2.3.2-200304020432/linuxthreads/queue.h +diff -u -udbrN glibc-2.3.2/linuxthreads/restart.h glibc-2.3.2-200304020432/linuxthreads/restart.h +diff -u -udbrN glibc-2.3.2/linuxthreads/rwlock.c glibc-2.3.2-200304020432/linuxthreads/rwlock.c +diff -u -udbrN glibc-2.3.2/linuxthreads/semaphore.c glibc-2.3.2-200304020432/linuxthreads/semaphore.c +diff -u -udbrN glibc-2.3.2/linuxthreads/semaphore.h glibc-2.3.2-200304020432/linuxthreads/semaphore.h +diff -u -udbrN glibc-2.3.2/linuxthreads/shlib-versions glibc-2.3.2-200304020432/linuxthreads/shlib-versions +diff -u -udbrN glibc-2.3.2/linuxthreads/sighandler.c glibc-2.3.2-200304020432/linuxthreads/sighandler.c +diff -u -udbrN glibc-2.3.2/linuxthreads/signals.c glibc-2.3.2-200304020432/linuxthreads/signals.c +diff -u -udbrN glibc-2.3.2/linuxthreads/specific.c glibc-2.3.2-200304020432/linuxthreads/specific.c +diff -u -udbrN glibc-2.3.2/linuxthreads/spinlock.c glibc-2.3.2-200304020432/linuxthreads/spinlock.c +diff -u -udbrN glibc-2.3.2/linuxthreads/spinlock.h glibc-2.3.2-200304020432/linuxthreads/spinlock.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/alpha/elf/pt-initfini.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/alpha/elf/pt-initfini.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/alpha/pspinlock.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/alpha/pspinlock.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/alpha/pt-machine.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/alpha/pt-machine.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/alpha/tls.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/alpha/tls.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/arm/pspinlock.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/arm/pspinlock.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/arm/pt-machine.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/arm/pt-machine.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/cris/pspinlock.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/cris/pspinlock.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/cris/pt-machine.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/cris/pt-machine.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/hppa/pspinlock.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/hppa/pspinlock.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/hppa/pt-machine.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/hppa/pt-machine.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/i386/Makefile glibc-2.3.2-200304020432/linuxthreads/sysdeps/i386/Makefile +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/i386/i586/Versions glibc-2.3.2-200304020432/linuxthreads/sysdeps/i386/i586/Versions +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/i386/i686/Versions glibc-2.3.2-200304020432/linuxthreads/sysdeps/i386/i686/Versions +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/i386/i686/pt-machine.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/i386/i686/pt-machine.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/i386/pspinlock.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/i386/pspinlock.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/i386/pt-machine.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/i386/pt-machine.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/i386/tcb-offsets.sym glibc-2.3.2-200304020432/linuxthreads/sysdeps/i386/tcb-offsets.sym +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/i386/tls.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/i386/tls.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/i386/useldt.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/i386/useldt.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/ia64/Makefile glibc-2.3.2-200304020432/linuxthreads/sysdeps/ia64/Makefile +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/ia64/Versions glibc-2.3.2-200304020432/linuxthreads/sysdeps/ia64/Versions +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/ia64/pspinlock.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/ia64/pspinlock.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/ia64/pt-machine.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/ia64/pt-machine.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/ia64/tcb-offsets.sym glibc-2.3.2-200304020432/linuxthreads/sysdeps/ia64/tcb-offsets.sym +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/ia64/tls.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/ia64/tls.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/m68k/Makefile glibc-2.3.2-200304020432/linuxthreads/sysdeps/m68k/Makefile +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/m68k/pspinlock.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/m68k/pspinlock.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/m68k/pt-machine.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/m68k/pt-machine.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/mips/pspinlock.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/mips/pspinlock.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/mips/pt-machine.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/mips/pt-machine.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/powerpc/Makefile glibc-2.3.2-200304020432/linuxthreads/sysdeps/powerpc/Makefile +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/powerpc/powerpc32/pt-machine.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/powerpc/powerpc32/pt-machine.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/powerpc/powerpc64/pt-machine.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/powerpc/powerpc64/pt-machine.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/powerpc/pspinlock.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/powerpc/pspinlock.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/powerpc/tcb-offsets.sym glibc-2.3.2-200304020432/linuxthreads/sysdeps/powerpc/tcb-offsets.sym +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/powerpc/tls.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/powerpc/tls.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/Makefile glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/Makefile +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/Subdirs glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/Subdirs +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/bits/initspin.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/bits/initspin.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/bits/libc-lock.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/bits/libc-lock.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/bits/libc-tsd.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/bits/libc-tsd.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/bits/typesizes.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/bits/typesizes.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/errno-loc.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/errno-loc.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/flockfile.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/flockfile.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/ftrylockfile.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/ftrylockfile.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/funlockfile.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/funlockfile.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/getcpuclockid.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/getcpuclockid.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/herrno-loc.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/herrno-loc.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/list.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/list.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/posix-timer.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/posix-timer.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/pt-initfini.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/pt-initfini.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/pthread.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/pthread.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/res-state.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/res-state.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/semaphore.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/semaphore.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/sigaction.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/sigaction.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/tcb-offsets.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/tcb-offsets.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/timer_create.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/timer_create.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/timer_delete.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/timer_delete.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/timer_getoverr.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/timer_getoverr.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/timer_gettime.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/timer_gettime.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/timer_routines.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/timer_routines.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/timer_settime.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/timer_settime.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/pthread/tst-timer.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/pthread/tst-timer.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/s390/Makefile glibc-2.3.2-200304020432/linuxthreads/sysdeps/s390/Makefile +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/s390/pspinlock.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/s390/pspinlock.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/s390/s390-32/pt-machine.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/s390/s390-32/pt-machine.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/s390/s390-64/pt-machine.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/s390/s390-64/pt-machine.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/s390/tcb-offsets.sym glibc-2.3.2-200304020432/linuxthreads/sysdeps/s390/tcb-offsets.sym +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/s390/tls.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/s390/tls.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/sh/Makefile glibc-2.3.2-200304020432/linuxthreads/sysdeps/sh/Makefile +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/sh/pspinlock.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/sh/pspinlock.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/sh/pt-machine.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/sh/pt-machine.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/sh/tcb-offsets.sym glibc-2.3.2-200304020432/linuxthreads/sysdeps/sh/tcb-offsets.sym +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/sh/tls.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/sh/tls.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/sparc/Makefile glibc-2.3.2-200304020432/linuxthreads/sysdeps/sparc/Makefile +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/sparc/sparc32/pspinlock.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/sparc/sparc32/pspinlock.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/sparc/sparc32/sparcv9/Versions glibc-2.3.2-200304020432/linuxthreads/sysdeps/sparc/sparc32/sparcv9/Versions +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/sparc/sparc32/sparcv9/pspinlock.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/sparc/sparc32/sparcv9/pspinlock.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/sparc/sparc64/Versions glibc-2.3.2-200304020432/linuxthreads/sysdeps/sparc/sparc64/Versions +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/sparc/sparc64/pspinlock.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/sparc/sparc64/pspinlock.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/sparc/tcb-offsets.sym glibc-2.3.2-200304020432/linuxthreads/sysdeps/sparc/tcb-offsets.sym +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/sparc/tls.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/sparc/tls.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/Implies glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/Implies +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/Makefile glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/Makefile +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/Versions glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/Versions +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/allocalim.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/allocalim.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/allocrtsig.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/allocrtsig.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/alpha/Makefile glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/alpha/Makefile +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/alpha/aio_cancel.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/alpha/aio_cancel.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/alpha/pt-sigsuspend.S glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/alpha/pt-sigsuspend.S +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/arm/vfork.S glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/arm/vfork.S +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/bits/posix_opt.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/bits/posix_opt.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/execve.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/execve.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/fork.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/fork.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/fork.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/fork.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/hppa/aio_cancel.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/hppa/aio_cancel.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/hppa/bits/initspin.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/hppa/bits/initspin.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/hppa/pt-initfini.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/hppa/pt-initfini.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/i386/bits/posix_opt.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/i386/bits/posix_opt.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/i386/dl-sysdep.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/i386/dl-sysdep.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/i386/vfork.S glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/i386/vfork.S +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/ia64/Makefile glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/ia64/Makefile +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/ia64/fork.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/ia64/fork.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-initfini.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-initfini.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-sigsuspend.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-sigsuspend.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/ia64/vfork.S glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/ia64/vfork.S +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/jmp-unwind.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/jmp-unwind.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/m68k/vfork.S glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/m68k/vfork.S +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/mips/Makefile glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/mips/Makefile +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/powerpc/Makefile glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/powerpc/Makefile +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/pt-sigsuspend.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/pt-sigsuspend.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/raise.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/raise.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/register-atfork.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/register-atfork.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/pt-initfini.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/pt-initfini.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/vfork.S glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/vfork.S +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/pt-initfini.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/pt-initfini.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/pt-sigsuspend.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/pt-sigsuspend.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/vfork.S glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/vfork.S +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/sh/pt-initfini.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/sh/pt-initfini.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/sh/smp.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/sh/smp.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/sh/vfork.S glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/sh/vfork.S +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/sigwait.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/sigwait.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/smp.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/smp.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/sparc/Makefile glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/sparc/Makefile +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/sparc/aio_cancel.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/sparc/aio_cancel.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/sparc/fork.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/sparc/fork.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/pt-sigsuspend.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/pt-sigsuspend.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/unregister-atfork.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/unregister-atfork.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/x86_64/Makefile glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/x86_64/Makefile +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/x86_64/pt-sigsuspend.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/x86_64/pt-sigsuspend.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/x86_64/vfork.S glibc-2.3.2-200304020432/linuxthreads/sysdeps/unix/sysv/linux/x86_64/vfork.S +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/x86_64/pspinlock.c glibc-2.3.2-200304020432/linuxthreads/sysdeps/x86_64/pspinlock.c +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/x86_64/pt-machine.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/x86_64/pt-machine.h +diff -u -udbrN glibc-2.3.2/linuxthreads/sysdeps/x86_64/tls.h glibc-2.3.2-200304020432/linuxthreads/sysdeps/x86_64/tls.h +diff -u -udbrN glibc-2.3.2/linuxthreads/tst-cancel-static.c glibc-2.3.2-200304020432/linuxthreads/tst-cancel-static.c +diff -u -udbrN glibc-2.3.2/linuxthreads/tst-cancel-wrappers.sh glibc-2.3.2-200304020432/linuxthreads/tst-cancel-wrappers.sh +diff -u -udbrN glibc-2.3.2/linuxthreads/tst-cancel.c glibc-2.3.2-200304020432/linuxthreads/tst-cancel.c +diff -u -udbrN glibc-2.3.2/linuxthreads/tst-cancel1.c glibc-2.3.2-200304020432/linuxthreads/tst-cancel1.c +diff -u -udbrN glibc-2.3.2/linuxthreads/tst-cancel2.c glibc-2.3.2-200304020432/linuxthreads/tst-cancel2.c +diff -u -udbrN glibc-2.3.2/linuxthreads/tst-cancel3.c glibc-2.3.2-200304020432/linuxthreads/tst-cancel3.c +diff -u -udbrN glibc-2.3.2/linuxthreads/tst-cancel4.c glibc-2.3.2-200304020432/linuxthreads/tst-cancel4.c +diff -u -udbrN glibc-2.3.2/linuxthreads/tst-cancel5.c glibc-2.3.2-200304020432/linuxthreads/tst-cancel5.c +diff -u -udbrN glibc-2.3.2/linuxthreads/tst-cancel6.c glibc-2.3.2-200304020432/linuxthreads/tst-cancel6.c +diff -u -udbrN glibc-2.3.2/linuxthreads/tst-cancel7.c glibc-2.3.2-200304020432/linuxthreads/tst-cancel7.c +diff -u -udbrN glibc-2.3.2/linuxthreads/tst-context.c glibc-2.3.2-200304020432/linuxthreads/tst-context.c +diff -u -udbrN glibc-2.3.2/linuxthreads/tst-popen.c glibc-2.3.2-200304020432/linuxthreads/tst-popen.c +diff -u -udbrN glibc-2.3.2/linuxthreads/tst-popen2.c glibc-2.3.2-200304020432/linuxthreads/tst-popen2.c +diff -u -udbrN glibc-2.3.2/linuxthreads/tst-signal.c glibc-2.3.2-200304020432/linuxthreads/tst-signal.c +diff -u -udbrN glibc-2.3.2/linuxthreads/tst-signal.sh glibc-2.3.2-200304020432/linuxthreads/tst-signal.sh +diff -u -udbrN glibc-2.3.2/linuxthreads/tst-static-locale.c glibc-2.3.2-200304020432/linuxthreads/tst-static-locale.c +diff -u -udbrN glibc-2.3.2/linuxthreads/tststack.c glibc-2.3.2-200304020432/linuxthreads/tststack.c +diff -u -udbrN glibc-2.3.2/linuxthreads/unload.c glibc-2.3.2-200304020432/linuxthreads/unload.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/Banner glibc-2.3.2-200304020432/linuxthreads_db/Banner +diff -u -udbrN glibc-2.3.2/linuxthreads_db/ChangeLog glibc-2.3.2-200304020432/linuxthreads_db/ChangeLog +diff -u -udbrN glibc-2.3.2/linuxthreads_db/Makefile glibc-2.3.2-200304020432/linuxthreads_db/Makefile +diff -u -udbrN glibc-2.3.2/linuxthreads_db/Versions glibc-2.3.2-200304020432/linuxthreads_db/Versions +diff -u -udbrN glibc-2.3.2/linuxthreads_db/proc_service.h glibc-2.3.2-200304020432/linuxthreads_db/proc_service.h +diff -u -udbrN glibc-2.3.2/linuxthreads_db/shlib-versions glibc-2.3.2-200304020432/linuxthreads_db/shlib-versions +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_init.c glibc-2.3.2-200304020432/linuxthreads_db/td_init.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_log.c glibc-2.3.2-200304020432/linuxthreads_db/td_log.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_symbol_list.c glibc-2.3.2-200304020432/linuxthreads_db/td_symbol_list.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_ta_clear_event.c glibc-2.3.2-200304020432/linuxthreads_db/td_ta_clear_event.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_ta_delete.c glibc-2.3.2-200304020432/linuxthreads_db/td_ta_delete.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_ta_enable_stats.c glibc-2.3.2-200304020432/linuxthreads_db/td_ta_enable_stats.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_ta_event_addr.c glibc-2.3.2-200304020432/linuxthreads_db/td_ta_event_addr.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_ta_event_getmsg.c glibc-2.3.2-200304020432/linuxthreads_db/td_ta_event_getmsg.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_ta_get_nthreads.c glibc-2.3.2-200304020432/linuxthreads_db/td_ta_get_nthreads.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_ta_get_ph.c glibc-2.3.2-200304020432/linuxthreads_db/td_ta_get_ph.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_ta_get_stats.c glibc-2.3.2-200304020432/linuxthreads_db/td_ta_get_stats.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_ta_map_id2thr.c glibc-2.3.2-200304020432/linuxthreads_db/td_ta_map_id2thr.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_ta_map_lwp2thr.c glibc-2.3.2-200304020432/linuxthreads_db/td_ta_map_lwp2thr.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_ta_new.c glibc-2.3.2-200304020432/linuxthreads_db/td_ta_new.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_ta_reset_stats.c glibc-2.3.2-200304020432/linuxthreads_db/td_ta_reset_stats.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_ta_set_event.c glibc-2.3.2-200304020432/linuxthreads_db/td_ta_set_event.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_ta_setconcurrency.c glibc-2.3.2-200304020432/linuxthreads_db/td_ta_setconcurrency.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_ta_thr_iter.c glibc-2.3.2-200304020432/linuxthreads_db/td_ta_thr_iter.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_ta_tsd_iter.c glibc-2.3.2-200304020432/linuxthreads_db/td_ta_tsd_iter.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_clear_event.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_clear_event.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_dbresume.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_dbresume.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_dbsuspend.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_dbsuspend.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_event_enable.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_event_enable.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_event_getmsg.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_event_getmsg.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_get_info.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_get_info.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_getfpregs.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_getfpregs.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_getgregs.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_getgregs.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_getxregs.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_getxregs.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_getxregsize.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_getxregsize.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_set_event.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_set_event.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_setfpregs.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_setfpregs.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_setgregs.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_setgregs.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_setprio.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_setprio.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_setsigpending.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_setsigpending.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_setxregs.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_setxregs.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_sigsetmask.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_sigsetmask.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_tls_get_addr.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_tls_get_addr.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_tlsbase.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_tlsbase.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_tsd.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_tsd.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/td_thr_validate.c glibc-2.3.2-200304020432/linuxthreads_db/td_thr_validate.c +diff -u -udbrN glibc-2.3.2/linuxthreads_db/thread_db.h glibc-2.3.2-200304020432/linuxthreads_db/thread_db.h +diff -u -udbrN glibc-2.3.2/linuxthreads_db/thread_dbP.h glibc-2.3.2-200304020432/linuxthreads_db/thread_dbP.h +diff -u -udbrN glibc-2.3.2/locale/Versions glibc-2.3.2-200304020432/locale/Versions +--- glibc-2.3.2/locale/Versions Wed Aug 28 03:04:45 2002 ++++ glibc-2.3.2-200304020432/locale/Versions Mon Mar 3 10:45:12 2003 +@@ -59,13 +59,12 @@ + iswcntrl_l; iswctype_l; iswdigit_l; iswgraph_l; iswlower_l; + iswprint_l; iswpunct_l; iswspace_l; iswupper_l; iswxdigit_l; + isxdigit_l; strcasecmp_l; strcoll_l; strfmon_l; strncasecmp_l; +- strtod_l; strtof_l; strtol_l; strtold_l; strtoll_l; strtoul_l; +- strtoull_l; strxfrm_l; toascii_l; tolower_l; toupper_l; ++ strtod_l; strtof_l; strtol_l; strtold_l; strtoul_l; ++ strxfrm_l; toascii_l; tolower_l; toupper_l; + towctrans_l; towlower_l; towupper_l; wcscasecmp_l; wcscoll_l; + wcsncasecmp_l; wcstod_l; wcstof_l; wcstol_l; wcstold_l; + wcstoll_l; wcstoul_l; wcstoull_l; wcsxfrm_l; wctype_l; + wctrans_l; nl_langinfo_l; +- + } + GLIBC_PRIVATE { + # global variables +diff -u -udbrN glibc-2.3.2/locale/programs/locarchive.c glibc-2.3.2-200304020432/locale/programs/locarchive.c +--- glibc-2.3.2/locale/programs/locarchive.c Wed Oct 23 08:21:17 2002 ++++ glibc-2.3.2-200304020432/locale/programs/locarchive.c Sun Mar 16 02:03:52 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 2002 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. + +@@ -1402,8 +1402,7 @@ + struct locarhead *head; + struct namehashent *namehashtab; + struct nameent *names; +- int cnt; +- int used; ++ size_t cnt, used; + + /* Open the archive. This call never returns if we cannot + successfully open the archive. */ +diff -u -udbrN glibc-2.3.2/locale/tst-C-locale.c glibc-2.3.2-200304020432/locale/tst-C-locale.c +--- glibc-2.3.2/locale/tst-C-locale.c Tue Sep 3 20:39:41 2002 ++++ glibc-2.3.2-200304020432/locale/tst-C-locale.c Mon Mar 17 20:11:36 2003 +@@ -1,5 +1,5 @@ + /* Tests of C and POSIX locale contents. +- Copyright (C) 2000,01,02 Free Software Foundation, Inc. ++ Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 2000. + +@@ -450,8 +450,8 @@ + } + + +-int +-main (void) ++static int ++do_test (void) + { + int result; + +@@ -475,3 +475,6 @@ + + return result; + } ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff -u -udbrN glibc-2.3.2/localedata/ChangeLog glibc-2.3.2-200304020432/localedata/ChangeLog +--- glibc-2.3.2/localedata/ChangeLog Thu Jan 30 21:21:47 2003 ++++ glibc-2.3.2-200304020432/localedata/ChangeLog Mon Mar 17 11:16:36 2003 +@@ -1,3 +1,17 @@ ++2003-03-17 Ulrich Drepper ++ ++ * localedata/en_ZA: Changed %x for LC_TIME to use dd/mm/ccyy. ++ Added ^ to LC_MESSAGES regex "^[yY].*". ++ Confirmed LC_PAPER adn LC_MEASUREMENT settings. ++ Added country and language names to LC_ADDRESS. ++ Added missing info for LC_TELEPHONE. ++ Patch by Dwayne Bailey . ++ ++2003-03-14 Ulrich Drepper ++ ++ * localedata/mn_MN: New file. ++ Contributed by Sanlig Badral . ++ + 2003-01-30 Ulrich Drepper + + * Makefile (LOCALES): Add vi_VN.TCVN5712-1. +diff -u -udbrN glibc-2.3.2/localedata/locales/en_ZA glibc-2.3.2-200304020432/localedata/locales/en_ZA +--- glibc-2.3.2/localedata/locales/en_ZA Thu Oct 26 19:48:46 2000 ++++ glibc-2.3.2-200304020432/localedata/locales/en_ZA Mon Mar 17 11:08:52 2003 +@@ -2,44 +2,54 @@ + comment_char % + + % English language locale for South Africa +-% Source: RAP +-% Email: nic@sig.co.za +-% Tel: +27 83 7659503 +-% Fax: +27 12 3478098 ++% Source: Zuza Software Foundation ++% Email: dwayne@translate.org.za ++% Tel: +27 21 4487827 ++% Fax: +27 21 4489574 + % Language: en + % Territory: ZA +-% Revision: 1.0 +-% Date: 1999-03-28 ++% Revision: 1.1 ++% Date: 2003-03-14 + % Users: general + % Repertoiremap: mnemonic,ds + % Charset: ISO-8859-1 + % Distribution and use is free, also + % for commercial purposes. ++% ++% Changelog ++% 1.1 (2003-03-14): ++% - Updated maintainer to Zuza Sofware Foundation ++% - Changed %x for LC_TIME to use dd/mm/ccyy ++% - Added ^ to LC_MESSAGES regex "^[yY].*" ++% - Confirmed LC_PAPER and LC_MEASUREMENT settings ++% - Added country and language names to LC_ADDRESS ++% - Added missing info for LC_TELEPHONE + + LC_IDENTIFICATION + title "English locale for South Africa" +-source "RAP" +-address "" +-contact "" +-email "bug-glibc@gnu.org" +-tel "" +-fax "" ++source "Zuza Software Foundation" ++address "Box 13412, Mowbray, 7701, South Africa" ++contact "Dwayne Bailey" ++email "dwayne@translate.org.za" ++tel "+27 21 448 7827" ++fax "+27 21 448 9574" + language "English" + territory "South Africa" +-revision "1.0" +-date "2000-06-29" ++revision "1.1" ++date "2003-03-14" + % +-category "en_ZA:2000";LC_IDENTIFICATION ++category "en_ZA:2003";LC_IDENTIFICATION + category "en_ZA:2000";LC_CTYPE + category "en_ZA:2000";LC_COLLATE +-category "en_ZA:2000";LC_TIME ++category "en_ZA:2003";LC_TIME + category "en_ZA:2000";LC_NUMERIC + category "en_ZA:2000";LC_MONETARY +-category "en_ZA:2000";LC_MESSAGES ++category "en_ZA:2003";LC_MESSAGES + category "en_ZA:2000";LC_PAPER ++category "en_ZA:2000";LC_MEASUREMENT + category "en_ZA:2000";LC_NAME +-category "en_ZA:2000";LC_ADDRESS +-category "en_ZA:2000";LC_TELEPHONE ++category "en_ZA:2003";LC_ADDRESS ++category "en_ZA:2003";LC_TELEPHONE + + END LC_IDENTIFICATION + +@@ -106,7 +116,7 @@ + "";/ + "" + d_t_fmt "" +-d_fmt "" ++d_fmt "" + t_fmt "" + am_pm "";"" + t_fmt_ampm "" +@@ -116,25 +126,25 @@ + END LC_TIME + + LC_MESSAGES +-yesexpr "" +-noexpr "" ++yesexpr "" ++noexpr "" + END LC_MESSAGES + + LC_PAPER +-% FIXME + height 297 +-% FIXME + width 210 + END LC_PAPER + + LC_TELEPHONE + tel_int_fmt "/ + " ++tel_dom_fmt "" ++int_select "" + int_prefix "" ++ + END LC_TELEPHONE + + LC_MEASUREMENT +-% FIXME + measurement 1 + END LC_MEASUREMENT + +@@ -149,4 +159,7 @@ + / + / + " ++country_name "/ ++" ++lang_name "" + END LC_ADDRESS +diff -u -udbrN glibc-2.3.2/localedata/locales/mn_MN glibc-2.3.2-200304020432/localedata/locales/mn_MN +--- glibc-2.3.2/localedata/locales/mn_MN Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/localedata/locales/mn_MN Fri Mar 14 22:26:23 2003 +@@ -0,0 +1,196 @@ ++comment_char % ++escape_char / ++% Mongolian language (cyrillic) locale for Mongolia ++% Sanlig Badral ++% Revision: 0.9 (2003-2-27) ++% Charsets: UTF-8 ++% Distribution and use is free, also ++% for commercial purposes. ++ ++LC_IDENTIFICATION ++title "Mongolian locale for Mongolia" ++source "OPENMN" ++address "" ++contact "" ++email "bug-glibc@gnu.org" ++tel "" ++fax "" ++language "Mongolian" ++territory "Mongolia" ++revision "0.9" ++date "2003-02-27" ++ ++category "mn_MN:2000";LC_IDENTIFICATION ++category "mn_MN:2000";LC_CTYPE ++category "mn_MN:2000";LC_COLLATE ++category "mn_MN:2000";LC_TIME ++category "mn_MN:2000";LC_NUMERIC ++category "mn_MN:2000";LC_MONETARY ++category "mn_MN:2000";LC_MESSAGES ++category "mn_MN:2000";LC_PAPER ++category "mn_MN:2000";LC_NAME ++category "mn_MN:2000";LC_ADDRESS ++category "mn_MN:2000";LC_TELEPHONE ++ ++END LC_IDENTIFICATION ++ ++LC_COLLATE ++copy "iso14651_t1" ++ ++% iso14651_t1 is missing Mongolian ue(straight u), oe(barred o) ++% like russian, but with () after and ++% (straight u) after ++ ++collating-symbol ++collating-symbol ++ ++reorder-after ++ ++reorder-after ++ ++ ++reorder-after ++ ;;;IGNORE ++reorder-after ++ ;;;IGNORE ++ ++reorder-after ++ ;;;IGNORE ++reorder-after ++ ;;;IGNORE ++ ++reorder-end ++END LC_COLLATE ++ ++LC_CTYPE ++copy "i18n" ++END LC_CTYPE ++ ++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 3;3 ++END LC_NUMERIC ++ ++LC_TIME ++% Abbreviated weekday names (%a) ++abday "";"";/ ++ "";"";/ ++ "";"";/ ++ "" ++% Full weekday names (%A) ++day "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" ++% Abbreviated month names (%b) ++abmon "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"";/ ++ "";"" ++% Full month names (%B) ++mon "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "";/ ++ "" ++% Appropriate date and time representation ++% "%a %d %b %Y %T %Z" ++d_t_fmt "" ++ ++% Appropriate date representation ++% "%Y.%m.%d" ++d_fmt "" ++% Appropriate time representation ++% "%T" ++t_fmt "" ++% Appropriate 12 h time representation (%r) ++am_pm "";"" ++t_fmt_ampm "" ++% Full date and time representation ++% "%a %b %e %H:%M:%S %Z %Y" ++date_fmt "" ++END LC_TIME ++ ++LC_MESSAGES ++yesexpr "" ++noexpr "" ++END LC_MESSAGES ++ ++% Paper format ++LC_PAPER ++height 297 ++width 210 ++END LC_PAPER ++ ++LC_NAME ++name_fmt "/ ++" ++ ++name_miss "" ++name_mr "" ++name_mrs "" ++name_ms "" ++END LC_NAME ++ ++LC_ADDRESS ++postal_fmt "/ ++/ ++/ ++/ ++" ++ ++country_name "" ++country_post "" ++country_ab2 "" ++country_ab3 "" ++country_num 496 ++country_car "" ++country_isbn 99929 ++lang_name "" ++lang_ab "" ++lang_term "" ++lang_lib "" ++END LC_ADDRESS ++ ++LC_TELEPHONE ++tel_int_fmt "" ++tel_dom_fmt "" ++int_select "" ++int_prefix "" ++END LC_TELEPHONE ++ ++LC_MEASUREMENT ++measurement 1 ++END LC_MEASUREMENT +diff -u -udbrN glibc-2.3.2/malloc/memusagestat.c glibc-2.3.2-200304020432/malloc/memusagestat.c +--- glibc-2.3.2/malloc/memusagestat.c Sat Jul 7 21:21:06 2001 ++++ glibc-2.3.2-200304020432/malloc/memusagestat.c Sun Mar 23 00:00:25 2003 +@@ -405,7 +405,7 @@ + } + + +- snprintf (buf, sizeof (buf), "%llu", total); ++ snprintf (buf, sizeof (buf), "%llu", (unsigned long long) total); + gdImageString (im_out, gdFontSmall, xsize - 50, ysize - 14, buf, blue); + + if (!time_based) +diff -u -udbrN glibc-2.3.2/malloc/mtrace.c glibc-2.3.2-200304020432/malloc/mtrace.c +--- glibc-2.3.2/malloc/mtrace.c Tue Dec 31 22:18:43 2002 ++++ glibc-2.3.2-200304020432/malloc/mtrace.c Mon Mar 10 10:12:11 2003 +@@ -1,5 +1,5 @@ + /* More debugging hooks for `malloc'. +- Copyright (C) 1991-1994,1996-2001,2002 Free Software Foundation, Inc. ++ Copyright (C) 1991-1994,1996-2001,2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written April 2, 1991 by John Gilmore of Cygnus Support. + Based on mcheck.c by Mike Haertel. +@@ -103,7 +103,7 @@ + { + #ifdef HAVE_ELF + Dl_info info; +- if (_dl_addr (caller, &info)) ++ if (_dl_addr (caller, &info, NULL, NULL)) + { + char *buf = (char *) ""; + if (info.dli_sname != NULL) +diff -u -udbrN glibc-2.3.2/malloc/set-freeres.c glibc-2.3.2-200304020432/malloc/set-freeres.c +--- glibc-2.3.2/malloc/set-freeres.c Sat Nov 2 03:15:52 2002 ++++ glibc-2.3.2-200304020432/malloc/set-freeres.c Fri Mar 21 08:45:55 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1997, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ++/* Copyright (C) 1997,1999,2000,2001,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 +@@ -16,7 +16,7 @@ + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +-#include ++#include + #include + #include + #include +@@ -36,7 +36,7 @@ + protect for multiple executions since these are fatal. */ + static long int already_called; + +- if (compare_and_swap (&already_called, 0, 1)) ++ if (! atomic_compare_and_exchange_bool_acq (&already_called, 1, 0)) + { + void * const *p; + +diff -u -udbrN glibc-2.3.2/manual/add.c.texi glibc-2.3.2-200304020432/manual/add.c.texi +--- glibc-2.3.2/manual/add.c.texi Wed Dec 9 23:51:54 1998 ++++ glibc-2.3.2-200304020432/manual/add.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,30 +0,0 @@ +-#include +-#include +- +-int +-add_em_up (int count,...) +-@{ +- va_list ap; +- int i, sum; +- +- va_start (ap, count); /* @r{Initialize the argument list.} */ +- +- sum = 0; +- for (i = 0; i < count; i++) +- sum += va_arg (ap, int); /* @r{Get the next argument value.} */ +- +- va_end (ap); /* @r{Clean up.} */ +- return sum; +-@} +- +-int +-main (void) +-@{ +- /* @r{This call prints 16.} */ +- printf ("%d\n", add_em_up (3, 5, 5, 6)); +- +- /* @r{This call prints 55.} */ +- printf ("%d\n", add_em_up (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)); +- +- return 0; +-@} +diff -u -udbrN glibc-2.3.2/manual/argp-ex1.c.texi glibc-2.3.2-200304020432/manual/argp-ex1.c.texi +--- glibc-2.3.2/manual/argp-ex1.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/argp-ex1.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,14 +0,0 @@ +-/* @r{Argp example #1 -- a minimal program using argp} */ +- +-/* @r{This is (probably) the smallest possible program that +- uses argp. It won't do much except give an error +- messages and exit when there are any arguments, and print +- a (rather pointless) messages for --help.} */ +- +-#include +- +-int main (int argc, char **argv) +-@{ +- argp_parse (0, argc, argv, 0, 0, 0); +- exit (0); +-@} +diff -u -udbrN glibc-2.3.2/manual/argp-ex2.c.texi glibc-2.3.2-200304020432/manual/argp-ex2.c.texi +--- glibc-2.3.2/manual/argp-ex2.c.texi Mon Nov 5 21:54:48 2001 ++++ glibc-2.3.2-200304020432/manual/argp-ex2.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,44 +0,0 @@ +-/* @r{Argp example #2 -- a pretty minimal program using argp} */ +- +-/* @r{This program doesn't use any options or arguments, but uses +- argp to be compliant with the GNU standard command line +- format. +- +- In addition to making sure no arguments are given, and +- implementing a --help option, this example will have a +- --version option, and will put the given documentation string +- and bug address in the --help output, as per GNU standards. +- +- The variable ARGP contains the argument parser specification; +- adding fields to this structure is the way most parameters are +- passed to argp_parse (the first three fields are usually used, +- but not in this small program). There are also two global +- variables that argp knows about defined here, +- ARGP_PROGRAM_VERSION and ARGP_PROGRAM_BUG_ADDRESS (they are +- global variables because they will almost always be constant +- for a given program, even if it uses different argument +- parsers for various tasks).} */ +- +-#include +- +-const char *argp_program_version = +- "argp-ex2 1.0"; +-const char *argp_program_bug_address = +- ""; +- +-/* @r{Program documentation.} */ +-static char doc[] = +- "Argp example #2 -- a pretty minimal program using argp"; +- +-/* @r{Our argument parser. The @code{options}, @code{parser}, and +- @code{args_doc} fields are zero because we have neither options or +- arguments; @code{doc} and @code{argp_program_bug_address} will be +- used in the output for @samp{--help}, and the @samp{--version} +- option will print out @code{argp_program_version}.} */ +-static struct argp argp = @{ 0, 0, 0, doc @}; +- +-int main (int argc, char **argv) +-@{ +- argp_parse (&argp, argc, argv, 0, 0, 0); +- exit (0); +-@} +diff -u -udbrN glibc-2.3.2/manual/argp-ex3.c.texi glibc-2.3.2-200304020432/manual/argp-ex3.c.texi +--- glibc-2.3.2/manual/argp-ex3.c.texi Tue Feb 22 09:35:05 2000 ++++ glibc-2.3.2-200304020432/manual/argp-ex3.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,152 +0,0 @@ +-/* @r{Argp example #3 -- a program with options and arguments using argp} */ +- +-/* @r{This program uses the same features as example 2, and uses options and +- arguments. +- +- We now use the first four fields in ARGP, so here's a description of them: +- OPTIONS -- A pointer to a vector of struct argp_option (see below) +- PARSER -- A function to parse a single option, called by argp +- ARGS_DOC -- A string describing how the non-option arguments should look +- DOC -- A descriptive string about this program; if it contains a +- vertical tab character (\v), the part after it will be +- printed *following* the options +- +- The function PARSER takes the following arguments: +- KEY -- An integer specifying which option this is (taken +- from the KEY field in each struct argp_option), or +- a special key specifying something else; the only +- special keys we use here are ARGP_KEY_ARG, meaning +- a non-option argument, and ARGP_KEY_END, meaning +- that all arguments have been parsed +- ARG -- For an option KEY, the string value of its +- argument, or NULL if it has none +- STATE-- A pointer to a struct argp_state, containing +- various useful information about the parsing state; used here +- are the INPUT field, which reflects the INPUT argument to +- argp_parse, and the ARG_NUM field, which is the number of the +- current non-option argument being parsed +- It should return either 0, meaning success, ARGP_ERR_UNKNOWN, meaning the +- given KEY wasn't recognized, or an errno value indicating some other +- error. +- +- Note that in this example, main uses a structure to communicate with the +- parse_opt function, a pointer to which it passes in the INPUT argument to +- argp_parse. Of course, it's also possible to use global variables +- instead, but this is somewhat more flexible. +- +- The OPTIONS field contains a pointer to a vector of struct argp_option's; +- that structure has the following fields (if you assign your option +- structures using array initialization like this example, unspecified +- fields will be defaulted to 0, and need not be specified): +- NAME -- The name of this option's long option (may be zero) +- KEY -- The KEY to pass to the PARSER function when parsing this option, +- *and* the name of this option's short option, if it is a +- printable ascii character +- ARG -- The name of this option's argument, if any +- FLAGS -- Flags describing this option; some of them are: +- OPTION_ARG_OPTIONAL -- The argument to this option is optional +- OPTION_ALIAS -- This option is an alias for the +- previous option +- OPTION_HIDDEN -- Don't show this option in --help output +- DOC -- A documentation string for this option, shown in --help output +- +- An options vector should be terminated by an option with all fields zero.} */ +- +-#include +- +-const char *argp_program_version = +- "argp-ex3 1.0"; +-const char *argp_program_bug_address = +- ""; +- +-/* @r{Program documentation.} */ +-static char doc[] = +- "Argp example #3 -- a program with options and arguments using argp"; +- +-/* @r{A description of the arguments we accept.} */ +-static char args_doc[] = "ARG1 ARG2"; +- +-/* @r{The options we understand.} */ +-static struct argp_option options[] = @{ +- @{"verbose", 'v', 0, 0, "Produce verbose output" @}, +- @{"quiet", 'q', 0, 0, "Don't produce any output" @}, +- @{"silent", 's', 0, OPTION_ALIAS @}, +- @{"output", 'o', "FILE", 0, +- "Output to FILE instead of standard output" @}, +- @{ 0 @} +-@}; +- +-/* @r{Used by @code{main} to communicate with @code{parse_opt}.} */ +-struct arguments +-@{ +- char *args[2]; /* @r{@var{arg1} & @var{arg2}} */ +- int silent, verbose; +- char *output_file; +-@}; +- +-/* @r{Parse a single option.} */ +-static error_t +-parse_opt (int key, char *arg, struct argp_state *state) +-@{ +- /* @r{Get the @var{input} argument from @code{argp_parse}, which we +- know is a pointer to our arguments structure.} */ +- struct arguments *arguments = state->input; +- +- switch (key) +- @{ +- case 'q': case 's': +- arguments->silent = 1; +- break; +- case 'v': +- arguments->verbose = 1; +- break; +- case 'o': +- arguments->output_file = arg; +- break; +- +- case ARGP_KEY_ARG: +- if (state->arg_num >= 2) +- /* @r{Too many arguments.} */ +- argp_usage (state); +- +- arguments->args[state->arg_num] = arg; +- +- break; +- +- case ARGP_KEY_END: +- if (state->arg_num < 2) +- /* @r{Not enough arguments.} */ +- argp_usage (state); +- break; +- +- default: +- return ARGP_ERR_UNKNOWN; +- @} +- return 0; +-@} +- +-/* @r{Our argp parser.} */ +-static struct argp argp = @{ options, parse_opt, args_doc, doc @}; +- +-int main (int argc, char **argv) +-@{ +- struct arguments arguments; +- +- /* @r{Default values.} */ +- arguments.silent = 0; +- arguments.verbose = 0; +- arguments.output_file = "-"; +- +- /* @r{Parse our arguments; every option seen by @code{parse_opt} will +- be reflected in @code{arguments}.} */ +- argp_parse (&argp, argc, argv, 0, 0, &arguments); +- +- printf ("ARG1 = %s\nARG2 = %s\nOUTPUT_FILE = %s\n" +- "VERBOSE = %s\nSILENT = %s\n", +- arguments.args[0], arguments.args[1], +- arguments.output_file, +- arguments.verbose ? "yes" : "no", +- arguments.silent ? "yes" : "no"); +- +- exit (0); +-@} +diff -u -udbrN glibc-2.3.2/manual/argp-ex4.c.texi glibc-2.3.2-200304020432/manual/argp-ex4.c.texi +--- glibc-2.3.2/manual/argp-ex4.c.texi Tue Feb 22 09:35:05 2000 ++++ glibc-2.3.2-200304020432/manual/argp-ex4.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,167 +0,0 @@ +-/* @r{Argp example #4 -- a program with somewhat more complicated options} */ +- +-/* @r{This program uses the same features as example 3, but has more +- options, and somewhat more structure in the -help output. It +- also shows how you can `steal' the remainder of the input +- arguments past a certain point, for programs that accept a +- list of items. It also shows the special argp KEY value +- ARGP_KEY_NO_ARGS, which is only given if no non-option +- arguments were supplied to the program. +- +- For structuring the help output, two features are used, +- *headers* which are entries in the options vector with the +- first four fields being zero, and a two part documentation +- string (in the variable DOC), which allows documentation both +- before and after the options; the two parts of DOC are +- separated by a vertical-tab character ('\v', or '\013'). By +- convention, the documentation before the options is just a +- short string saying what the program does, and that afterwards +- is longer, describing the behavior in more detail. All +- documentation strings are automatically filled for output, +- although newlines may be included to force a line break at a +- particular point. All documentation strings are also passed to +- the `gettext' function, for possible translation into the +- current locale.} */ +- +-#include +-#include +-#include +- +-const char *argp_program_version = +- "argp-ex4 1.0"; +-const char *argp_program_bug_address = +- ""; +- +-/* @r{Program documentation.} */ +-static char doc[] = +- "Argp example #4 -- a program with somewhat more complicated\ +-options\ +-\vThis part of the documentation comes *after* the options;\ +- note that the text is automatically filled, but it's possible\ +- to force a line-break, e.g.\n<-- here."; +- +-/* @r{A description of the arguments we accept.} */ +-static char args_doc[] = "ARG1 [STRING...]"; +- +-/* @r{Keys for options without short-options.} */ +-#define OPT_ABORT 1 /* @r{--abort} */ +- +-/* @r{The options we understand.} */ +-static struct argp_option options[] = @{ +- @{"verbose", 'v', 0, 0, "Produce verbose output" @}, +- @{"quiet", 'q', 0, 0, "Don't produce any output" @}, +- @{"silent", 's', 0, OPTION_ALIAS @}, +- @{"output", 'o', "FILE", 0, +- "Output to FILE instead of standard output" @}, +- +- @{0,0,0,0, "The following options should be grouped together:" @}, +- @{"repeat", 'r', "COUNT", OPTION_ARG_OPTIONAL, +- "Repeat the output COUNT (default 10) times"@}, +- @{"abort", OPT_ABORT, 0, 0, "Abort before showing any output"@}, +- +- @{ 0 @} +-@}; +- +-/* @r{Used by @code{main} to communicate with @code{parse_opt}.} */ +-struct arguments +-@{ +- char *arg1; /* @r{@var{arg1}} */ +- char **strings; /* @r{[@var{string}@dots{}]} */ +- int silent, verbose, abort; /* @r{@samp{-s}, @samp{-v}, @samp{--abort}} */ +- char *output_file; /* @r{@var{file} arg to @samp{--output}} */ +- int repeat_count; /* @r{@var{count} arg to @samp{--repeat}} */ +-@}; +- +-/* @r{Parse a single option.} */ +-static error_t +-parse_opt (int key, char *arg, struct argp_state *state) +-@{ +- /* @r{Get the @code{input} argument from @code{argp_parse}, which we +- know is a pointer to our arguments structure.} */ +- struct arguments *arguments = state->input; +- +- switch (key) +- @{ +- case 'q': case 's': +- arguments->silent = 1; +- break; +- case 'v': +- arguments->verbose = 1; +- break; +- case 'o': +- arguments->output_file = arg; +- break; +- case 'r': +- arguments->repeat_count = arg ? atoi (arg) : 10; +- break; +- case OPT_ABORT: +- arguments->abort = 1; +- break; +- +- case ARGP_KEY_NO_ARGS: +- argp_usage (state); +- +- case ARGP_KEY_ARG: +- /* @r{Here we know that @code{state->arg_num == 0}, since we +- force argument parsing to end before any more arguments can +- get here.} */ +- arguments->arg1 = arg; +- +- /* @r{Now we consume all the rest of the arguments. +- @code{state->next} is the index in @code{state->argv} of the +- next argument to be parsed, which is the first @var{string} +- we're interested in, so we can just use +- @code{&state->argv[state->next]} as the value for +- arguments->strings. +- +- @emph{In addition}, by setting @code{state->next} to the end +- of the arguments, we can force argp to stop parsing here and +- return.} */ +- arguments->strings = &state->argv[state->next]; +- state->next = state->argc; +- +- break; +- +- default: +- return ARGP_ERR_UNKNOWN; +- @} +- return 0; +-@} +- +-/* @r{Our argp parser.} */ +-static struct argp argp = @{ options, parse_opt, args_doc, doc @}; +- +-int main (int argc, char **argv) +-@{ +- int i, j; +- struct arguments arguments; +- +- /* @r{Default values.} */ +- arguments.silent = 0; +- arguments.verbose = 0; +- arguments.output_file = "-"; +- arguments.repeat_count = 1; +- arguments.abort = 0; +- +- /* @r{Parse our arguments; every option seen by @code{parse_opt} will be +- reflected in @code{arguments}.} */ +- argp_parse (&argp, argc, argv, 0, 0, &arguments); +- +- if (arguments.abort) +- error (10, 0, "ABORTED"); +- +- for (i = 0; i < arguments.repeat_count; i++) +- @{ +- printf ("ARG1 = %s\n", arguments.arg1); +- printf ("STRINGS = "); +- for (j = 0; arguments.strings[j]; j++) +- printf (j == 0 ? "%s" : ", %s", arguments.strings[j]); +- printf ("\n"); +- printf ("OUTPUT_FILE = %s\nVERBOSE = %s\nSILENT = %s\n", +- arguments.output_file, +- arguments.verbose ? "yes" : "no", +- arguments.silent ? "yes" : "no"); +- @} +- +- exit (0); +-@} +diff -u -udbrN glibc-2.3.2/manual/atexit.c.texi glibc-2.3.2-200304020432/manual/atexit.c.texi +--- glibc-2.3.2/manual/atexit.c.texi Wed Dec 9 23:51:54 1998 ++++ glibc-2.3.2-200304020432/manual/atexit.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,15 +0,0 @@ +-#include +-#include +- +-void +-bye (void) +-@{ +- puts ("Goodbye, cruel world...."); +-@} +- +-int +-main (void) +-@{ +- atexit (bye); +- exit (EXIT_SUCCESS); +-@} +diff -u -udbrN glibc-2.3.2/manual/db.c.texi glibc-2.3.2-200304020432/manual/db.c.texi +--- glibc-2.3.2/manual/db.c.texi Wed Dec 9 23:51:54 1998 ++++ glibc-2.3.2-200304020432/manual/db.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,52 +0,0 @@ +-#include +-#include +-#include +-#include +-#include +- +-int +-main (void) +-@{ +- uid_t me; +- struct passwd *my_passwd; +- struct group *my_group; +- char **members; +- +- /* @r{Get information about the user ID.} */ +- me = getuid (); +- my_passwd = getpwuid (me); +- if (!my_passwd) +- @{ +- printf ("Couldn't find out about user %d.\n", (int) me); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Print the information.} */ +- printf ("I am %s.\n", my_passwd->pw_gecos); +- printf ("My login name is %s.\n", my_passwd->pw_name); +- printf ("My uid is %d.\n", (int) (my_passwd->pw_uid)); +- printf ("My home directory is %s.\n", my_passwd->pw_dir); +- printf ("My default shell is %s.\n", my_passwd->pw_shell); +- +- /* @r{Get information about the default group ID.} */ +- my_group = getgrgid (my_passwd->pw_gid); +- if (!my_group) +- @{ +- printf ("Couldn't find out about group %d.\n", +- (int) my_passwd->pw_gid); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Print the information.} */ +- printf ("My default group is %s (%d).\n", +- my_group->gr_name, (int) (my_passwd->pw_gid)); +- printf ("The members of this group are:\n"); +- members = my_group->gr_mem; +- while (*members) +- @{ +- printf (" %s\n", *(members)); +- members++; +- @} +- +- return EXIT_SUCCESS; +-@} +diff -u -udbrN glibc-2.3.2/manual/dir-add.info glibc-2.3.2-200304020432/manual/dir-add.info +--- glibc-2.3.2/manual/dir-add.info Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/dir-add.info Thu Jan 1 01:00:00 1970 +@@ -1,1707 +0,0 @@ +-INFO-DIR-SECTION GNU C library functions +-START-INFO-DIR-ENTRY +-* ALTWERASE: (libc)Local Modes. +-* ARGP_ERR_UNKNOWN: (libc)Argp Parser Functions. +-* ARG_MAX: (libc)General Limits. +-* BC_BASE_MAX: (libc)Utility Limits. +-* BC_DIM_MAX: (libc)Utility Limits. +-* BC_SCALE_MAX: (libc)Utility Limits. +-* BC_STRING_MAX: (libc)Utility Limits. +-* BRKINT: (libc)Input Modes. +-* BUFSIZ: (libc)Controlling Buffering. +-* CCTS_OFLOW: (libc)Control Modes. +-* CHILD_MAX: (libc)General Limits. +-* CIGNORE: (libc)Control Modes. +-* CLK_TCK: (libc)CPU Time. +-* CLOCAL: (libc)Control Modes. +-* CLOCKS_PER_SEC: (libc)CPU Time. +-* COLL_WEIGHTS_MAX: (libc)Utility Limits. +-* CREAD: (libc)Control Modes. +-* CRTS_IFLOW: (libc)Control Modes. +-* CS5: (libc)Control Modes. +-* CS6: (libc)Control Modes. +-* CS7: (libc)Control Modes. +-* CS8: (libc)Control Modes. +-* CSIZE: (libc)Control Modes. +-* CSTOPB: (libc)Control Modes. +-* DES_FAILED: (libc)DES Encryption. +-* DTTOIF: (libc)Directory Entries. +-* E2BIG: (libc)Error Codes. +-* EACCES: (libc)Error Codes. +-* EADDRINUSE: (libc)Error Codes. +-* EADDRNOTAVAIL: (libc)Error Codes. +-* EADV: (libc)Error Codes. +-* EAFNOSUPPORT: (libc)Error Codes. +-* EAGAIN: (libc)Error Codes. +-* EALREADY: (libc)Error Codes. +-* EAUTH: (libc)Error Codes. +-* EBACKGROUND: (libc)Error Codes. +-* EBADE: (libc)Error Codes. +-* EBADF: (libc)Error Codes. +-* EBADFD: (libc)Error Codes. +-* EBADMSG: (libc)Error Codes. +-* EBADR: (libc)Error Codes. +-* EBADRPC: (libc)Error Codes. +-* EBADRQC: (libc)Error Codes. +-* EBADSLT: (libc)Error Codes. +-* EBFONT: (libc)Error Codes. +-* EBUSY: (libc)Error Codes. +-* ECANCELED: (libc)Error Codes. +-* ECHILD: (libc)Error Codes. +-* ECHO: (libc)Local Modes. +-* ECHOCTL: (libc)Local Modes. +-* ECHOE: (libc)Local Modes. +-* ECHOK: (libc)Local Modes. +-* ECHOKE: (libc)Local Modes. +-* ECHONL: (libc)Local Modes. +-* ECHOPRT: (libc)Local Modes. +-* ECHRNG: (libc)Error Codes. +-* ECOMM: (libc)Error Codes. +-* ECONNABORTED: (libc)Error Codes. +-* ECONNREFUSED: (libc)Error Codes. +-* ECONNRESET: (libc)Error Codes. +-* ED: (libc)Error Codes. +-* EDEADLK: (libc)Error Codes. +-* EDEADLOCK: (libc)Error Codes. +-* EDESTADDRREQ: (libc)Error Codes. +-* EDIED: (libc)Error Codes. +-* EDOM: (libc)Error Codes. +-* EDOTDOT: (libc)Error Codes. +-* EDQUOT: (libc)Error Codes. +-* EEXIST: (libc)Error Codes. +-* EFAULT: (libc)Error Codes. +-* EFBIG: (libc)Error Codes. +-* EFTYPE: (libc)Error Codes. +-* EGRATUITOUS: (libc)Error Codes. +-* EGREGIOUS: (libc)Error Codes. +-* EHOSTDOWN: (libc)Error Codes. +-* EHOSTUNREACH: (libc)Error Codes. +-* EIDRM: (libc)Error Codes. +-* EIEIO: (libc)Error Codes. +-* EILSEQ: (libc)Error Codes. +-* EINPROGRESS: (libc)Error Codes. +-* EINTR: (libc)Error Codes. +-* EINVAL: (libc)Error Codes. +-* EIO: (libc)Error Codes. +-* EISCONN: (libc)Error Codes. +-* EISDIR: (libc)Error Codes. +-* EISNAM: (libc)Error Codes. +-* EL2HLT: (libc)Error Codes. +-* EL2NSYNC: (libc)Error Codes. +-* EL3HLT: (libc)Error Codes. +-* EL3RST: (libc)Error Codes. +-* ELIBACC: (libc)Error Codes. +-* ELIBBAD: (libc)Error Codes. +-* ELIBEXEC: (libc)Error Codes. +-* ELIBMAX: (libc)Error Codes. +-* ELIBSCN: (libc)Error Codes. +-* ELNRNG: (libc)Error Codes. +-* ELOOP: (libc)Error Codes. +-* EMEDIUMTYPE: (libc)Error Codes. +-* EMFILE: (libc)Error Codes. +-* EMLINK: (libc)Error Codes. +-* EMSGSIZE: (libc)Error Codes. +-* EMULTIHOP: (libc)Error Codes. +-* ENAMETOOLONG: (libc)Error Codes. +-* ENAVAIL: (libc)Error Codes. +-* ENEEDAUTH: (libc)Error Codes. +-* ENETDOWN: (libc)Error Codes. +-* ENETRESET: (libc)Error Codes. +-* ENETUNREACH: (libc)Error Codes. +-* ENFILE: (libc)Error Codes. +-* ENOANO: (libc)Error Codes. +-* ENOBUFS: (libc)Error Codes. +-* ENOCSI: (libc)Error Codes. +-* ENODATA: (libc)Error Codes. +-* ENODEV: (libc)Error Codes. +-* ENOENT: (libc)Error Codes. +-* ENOEXEC: (libc)Error Codes. +-* ENOLCK: (libc)Error Codes. +-* ENOLINK: (libc)Error Codes. +-* ENOMEDIUM: (libc)Error Codes. +-* ENOMEM: (libc)Error Codes. +-* ENOMSG: (libc)Error Codes. +-* ENONET: (libc)Error Codes. +-* ENOPKG: (libc)Error Codes. +-* ENOPROTOOPT: (libc)Error Codes. +-* ENOSPC: (libc)Error Codes. +-* ENOSR: (libc)Error Codes. +-* ENOSTR: (libc)Error Codes. +-* ENOSYS: (libc)Error Codes. +-* ENOTBLK: (libc)Error Codes. +-* ENOTCONN: (libc)Error Codes. +-* ENOTDIR: (libc)Error Codes. +-* ENOTEMPTY: (libc)Error Codes. +-* ENOTNAM: (libc)Error Codes. +-* ENOTSOCK: (libc)Error Codes. +-* ENOTSUP: (libc)Error Codes. +-* ENOTTY: (libc)Error Codes. +-* ENOTUNIQ: (libc)Error Codes. +-* ENXIO: (libc)Error Codes. +-* EOF: (libc)EOF and Errors. +-* EOPNOTSUPP: (libc)Error Codes. +-* EOVERFLOW: (libc)Error Codes. +-* EPERM: (libc)Error Codes. +-* EPFNOSUPPORT: (libc)Error Codes. +-* EPIPE: (libc)Error Codes. +-* EPROCLIM: (libc)Error Codes. +-* EPROCUNAVAIL: (libc)Error Codes. +-* EPROGMISMATCH: (libc)Error Codes. +-* EPROGUNAVAIL: (libc)Error Codes. +-* EPROTO: (libc)Error Codes. +-* EPROTONOSUPPORT: (libc)Error Codes. +-* EPROTOTYPE: (libc)Error Codes. +-* EQUIV_CLASS_MAX: (libc)Utility Limits. +-* ERANGE: (libc)Error Codes. +-* EREMCHG: (libc)Error Codes. +-* EREMOTE: (libc)Error Codes. +-* EREMOTEIO: (libc)Error Codes. +-* ERESTART: (libc)Error Codes. +-* EROFS: (libc)Error Codes. +-* ERPCMISMATCH: (libc)Error Codes. +-* ESHUTDOWN: (libc)Error Codes. +-* ESOCKTNOSUPPORT: (libc)Error Codes. +-* ESPIPE: (libc)Error Codes. +-* ESRCH: (libc)Error Codes. +-* ESRMNT: (libc)Error Codes. +-* ESTALE: (libc)Error Codes. +-* ESTRPIPE: (libc)Error Codes. +-* ETIME: (libc)Error Codes. +-* ETIMEDOUT: (libc)Error Codes. +-* ETOOMANYREFS: (libc)Error Codes. +-* ETXTBSY: (libc)Error Codes. +-* EUCLEAN: (libc)Error Codes. +-* EUNATCH: (libc)Error Codes. +-* EUSERS: (libc)Error Codes. +-* EWOULDBLOCK: (libc)Error Codes. +-* EXDEV: (libc)Error Codes. +-* EXFULL: (libc)Error Codes. +-* EXIT_FAILURE: (libc)Exit Status. +-* EXIT_SUCCESS: (libc)Exit Status. +-* EXPR_NEST_MAX: (libc)Utility Limits. +-* FD_CLOEXEC: (libc)Descriptor Flags. +-* FD_CLR: (libc)Waiting for I/O. +-* FD_ISSET: (libc)Waiting for I/O. +-* FD_SET: (libc)Waiting for I/O. +-* FD_SETSIZE: (libc)Waiting for I/O. +-* FD_ZERO: (libc)Waiting for I/O. +-* FILENAME_MAX: (libc)Limits for Files. +-* FLUSHO: (libc)Local Modes. +-* FOPEN_MAX: (libc)Opening Streams. +-* FP_ILOGB0: (libc)Exponents and Logarithms. +-* FP_ILOGBNAN: (libc)Exponents and Logarithms. +-* F_DUPFD: (libc)Duplicating Descriptors. +-* F_GETFD: (libc)Descriptor Flags. +-* F_GETFL: (libc)Getting File Status Flags. +-* F_GETLK: (libc)File Locks. +-* F_GETOWN: (libc)Interrupt Input. +-* F_OK: (libc)Testing File Access. +-* F_SETFD: (libc)Descriptor Flags. +-* F_SETFL: (libc)Getting File Status Flags. +-* F_SETLK: (libc)File Locks. +-* F_SETLKW: (libc)File Locks. +-* F_SETOWN: (libc)Interrupt Input. +-* HUGE_VAL: (libc)Math Error Reporting. +-* HUGE_VALF: (libc)Math Error Reporting. +-* HUGE_VALL: (libc)Math Error Reporting. +-* HUPCL: (libc)Control Modes. +-* I: (libc)Complex Numbers. +-* ICANON: (libc)Local Modes. +-* ICRNL: (libc)Input Modes. +-* IEXTEN: (libc)Local Modes. +-* IFNAMSIZ: (libc)Interface Naming. +-* IFTODT: (libc)Directory Entries. +-* IGNBRK: (libc)Input Modes. +-* IGNCR: (libc)Input Modes. +-* IGNPAR: (libc)Input Modes. +-* IMAXBEL: (libc)Input Modes. +-* INADDR_ANY: (libc)Host Address Data Type. +-* INADDR_BROADCAST: (libc)Host Address Data Type. +-* INADDR_LOOPBACK: (libc)Host Address Data Type. +-* INADDR_NONE: (libc)Host Address Data Type. +-* INFINITY: (libc)Infinity and NaN. +-* INLCR: (libc)Input Modes. +-* INPCK: (libc)Input Modes. +-* IPPORT_RESERVED: (libc)Ports. +-* IPPORT_USERRESERVED: (libc)Ports. +-* ISIG: (libc)Local Modes. +-* ISTRIP: (libc)Input Modes. +-* IXANY: (libc)Input Modes. +-* IXOFF: (libc)Input Modes. +-* IXON: (libc)Input Modes. +-* LINE_MAX: (libc)Utility Limits. +-* LINK_MAX: (libc)Limits for Files. +-* L_ctermid: (libc)Identifying the Terminal. +-* L_cuserid: (libc)Who Logged In. +-* L_tmpnam: (libc)Temporary Files. +-* MAXNAMLEN: (libc)Limits for Files. +-* MAXSYMLINKS: (libc)Symbolic Links. +-* MAX_CANON: (libc)Limits for Files. +-* MAX_INPUT: (libc)Limits for Files. +-* MB_CUR_MAX: (libc)Selecting the Conversion. +-* MB_LEN_MAX: (libc)Selecting the Conversion. +-* MDMBUF: (libc)Control Modes. +-* MSG_DONTROUTE: (libc)Socket Data Options. +-* MSG_OOB: (libc)Socket Data Options. +-* MSG_PEEK: (libc)Socket Data Options. +-* NAME_MAX: (libc)Limits for Files. +-* NAN: (libc)Infinity and NaN. +-* NCCS: (libc)Mode Data Types. +-* NGROUPS_MAX: (libc)General Limits. +-* NOFLSH: (libc)Local Modes. +-* NOKERNINFO: (libc)Local Modes. +-* NSIG: (libc)Standard Signals. +-* NULL: (libc)Null Pointer Constant. +-* ONLCR: (libc)Output Modes. +-* ONOEOT: (libc)Output Modes. +-* OPEN_MAX: (libc)General Limits. +-* OPOST: (libc)Output Modes. +-* OXTABS: (libc)Output Modes. +-* O_ACCMODE: (libc)Access Modes. +-* O_APPEND: (libc)Operating Modes. +-* O_ASYNC: (libc)Operating Modes. +-* O_CREAT: (libc)Open-time Flags. +-* O_EXCL: (libc)Open-time Flags. +-* O_EXEC: (libc)Access Modes. +-* O_EXLOCK: (libc)Open-time Flags. +-* O_FSYNC: (libc)Operating Modes. +-* O_IGNORE_CTTY: (libc)Open-time Flags. +-* O_NDELAY: (libc)Operating Modes. +-* O_NOATIME: (libc)Operating Modes. +-* O_NOCTTY: (libc)Open-time Flags. +-* O_NOLINK: (libc)Open-time Flags. +-* O_NONBLOCK: (libc)Open-time Flags. +-* O_NONBLOCK: (libc)Operating Modes. +-* O_NOTRANS: (libc)Open-time Flags. +-* O_RDONLY: (libc)Access Modes. +-* O_RDWR: (libc)Access Modes. +-* O_READ: (libc)Access Modes. +-* O_SHLOCK: (libc)Open-time Flags. +-* O_SYNC: (libc)Operating Modes. +-* O_TRUNC: (libc)Open-time Flags. +-* O_WRITE: (libc)Access Modes. +-* O_WRONLY: (libc)Access Modes. +-* PARENB: (libc)Control Modes. +-* PARMRK: (libc)Input Modes. +-* PARODD: (libc)Control Modes. +-* PATH_MAX: (libc)Limits for Files. +-* PA_FLAG_MASK: (libc)Parsing a Template String. +-* PENDIN: (libc)Local Modes. +-* PF_FILE: (libc)Local Namespace Details. +-* PF_INET6: (libc)Internet Namespace. +-* PF_INET: (libc)Internet Namespace. +-* PF_LOCAL: (libc)Local Namespace Details. +-* PF_UNIX: (libc)Local Namespace Details. +-* PIPE_BUF: (libc)Limits for Files. +-* P_tmpdir: (libc)Temporary Files. +-* RAND_MAX: (libc)ISO Random. +-* RE_DUP_MAX: (libc)General Limits. +-* RLIM_INFINITY: (libc)Limits on Resources. +-* R_OK: (libc)Testing File Access. +-* SA_NOCLDSTOP: (libc)Flags for Sigaction. +-* SA_ONSTACK: (libc)Flags for Sigaction. +-* SA_RESTART: (libc)Flags for Sigaction. +-* SEEK_CUR: (libc)File Positioning. +-* SEEK_END: (libc)File Positioning. +-* SEEK_SET: (libc)File Positioning. +-* SIGABRT: (libc)Program Error Signals. +-* SIGALRM: (libc)Alarm Signals. +-* SIGBUS: (libc)Program Error Signals. +-* SIGCHLD: (libc)Job Control Signals. +-* SIGCLD: (libc)Job Control Signals. +-* SIGCONT: (libc)Job Control Signals. +-* SIGEMT: (libc)Program Error Signals. +-* SIGFPE: (libc)Program Error Signals. +-* SIGHUP: (libc)Termination Signals. +-* SIGILL: (libc)Program Error Signals. +-* SIGINFO: (libc)Miscellaneous Signals. +-* SIGINT: (libc)Termination Signals. +-* SIGIO: (libc)Asynchronous I/O Signals. +-* SIGIOT: (libc)Program Error Signals. +-* SIGKILL: (libc)Termination Signals. +-* SIGLOST: (libc)Operation Error Signals. +-* SIGPIPE: (libc)Operation Error Signals. +-* SIGPOLL: (libc)Asynchronous I/O Signals. +-* SIGPROF: (libc)Alarm Signals. +-* SIGQUIT: (libc)Termination Signals. +-* SIGSEGV: (libc)Program Error Signals. +-* SIGSTOP: (libc)Job Control Signals. +-* SIGSYS: (libc)Program Error Signals. +-* SIGTERM: (libc)Termination Signals. +-* SIGTRAP: (libc)Program Error Signals. +-* SIGTSTP: (libc)Job Control Signals. +-* SIGTTIN: (libc)Job Control Signals. +-* SIGTTOU: (libc)Job Control Signals. +-* SIGURG: (libc)Asynchronous I/O Signals. +-* SIGUSR1: (libc)Miscellaneous Signals. +-* SIGUSR2: (libc)Miscellaneous Signals. +-* SIGVTALRM: (libc)Alarm Signals. +-* SIGWINCH: (libc)Miscellaneous Signals. +-* SIGXCPU: (libc)Operation Error Signals. +-* SIGXFSZ: (libc)Operation Error Signals. +-* SIG_ERR: (libc)Basic Signal Handling. +-* SOCK_DGRAM: (libc)Communication Styles. +-* SOCK_RAW: (libc)Communication Styles. +-* SOCK_RDM: (libc)Communication Styles. +-* SOCK_SEQPACKET: (libc)Communication Styles. +-* SOCK_STREAM: (libc)Communication Styles. +-* SOL_SOCKET: (libc)Socket-Level Options. +-* SSIZE_MAX: (libc)General Limits. +-* STREAM_MAX: (libc)General Limits. +-* SUN_LEN: (libc)Local Namespace Details. +-* SV_INTERRUPT: (libc)BSD Handler. +-* SV_ONSTACK: (libc)BSD Handler. +-* SV_RESETHAND: (libc)BSD Handler. +-* S_IFMT: (libc)Testing File Type. +-* S_ISBLK: (libc)Testing File Type. +-* S_ISCHR: (libc)Testing File Type. +-* S_ISDIR: (libc)Testing File Type. +-* S_ISFIFO: (libc)Testing File Type. +-* S_ISLNK: (libc)Testing File Type. +-* S_ISREG: (libc)Testing File Type. +-* S_ISSOCK: (libc)Testing File Type. +-* S_TYPEISMQ: (libc)Testing File Type. +-* S_TYPEISSEM: (libc)Testing File Type. +-* S_TYPEISSHM: (libc)Testing File Type. +-* TMP_MAX: (libc)Temporary Files. +-* TOSTOP: (libc)Local Modes. +-* TZNAME_MAX: (libc)General Limits. +-* VDISCARD: (libc)Other Special. +-* VDSUSP: (libc)Signal Characters. +-* VEOF: (libc)Editing Characters. +-* VEOL2: (libc)Editing Characters. +-* VEOL: (libc)Editing Characters. +-* VERASE: (libc)Editing Characters. +-* VINTR: (libc)Signal Characters. +-* VKILL: (libc)Editing Characters. +-* VLNEXT: (libc)Other Special. +-* VMIN: (libc)Noncanonical Input. +-* VQUIT: (libc)Signal Characters. +-* VREPRINT: (libc)Editing Characters. +-* VSTART: (libc)Start/Stop Characters. +-* VSTATUS: (libc)Other Special. +-* VSTOP: (libc)Start/Stop Characters. +-* VSUSP: (libc)Signal Characters. +-* VTIME: (libc)Noncanonical Input. +-* VWERASE: (libc)Editing Characters. +-* WCHAR_MAX: (libc)Extended Char Intro. +-* WCHAR_MIN: (libc)Extended Char Intro. +-* WCOREDUMP: (libc)Process Completion Status. +-* WEOF: (libc)EOF and Errors. +-* WEOF: (libc)Extended Char Intro. +-* WEXITSTATUS: (libc)Process Completion Status. +-* WIFEXITED: (libc)Process Completion Status. +-* WIFSIGNALED: (libc)Process Completion Status. +-* WIFSTOPPED: (libc)Process Completion Status. +-* WSTOPSIG: (libc)Process Completion Status. +-* WTERMSIG: (libc)Process Completion Status. +-* W_OK: (libc)Testing File Access. +-* X_OK: (libc)Testing File Access. +-* _Complex_I: (libc)Complex Numbers. +-* _Exit: (libc)Termination Internals. +-* _IOFBF: (libc)Controlling Buffering. +-* _IOLBF: (libc)Controlling Buffering. +-* _IONBF: (libc)Controlling Buffering. +-* _Imaginary_I: (libc)Complex Numbers. +-* _PATH_UTMP: (libc)Manipulating the Database. +-* _PATH_WTMP: (libc)Manipulating the Database. +-* _POSIX2_C_DEV: (libc)System Options. +-* _POSIX2_C_VERSION: (libc)Version Supported. +-* _POSIX2_FORT_DEV: (libc)System Options. +-* _POSIX2_FORT_RUN: (libc)System Options. +-* _POSIX2_LOCALEDEF: (libc)System Options. +-* _POSIX2_SW_DEV: (libc)System Options. +-* _POSIX_CHOWN_RESTRICTED: (libc)Options for Files. +-* _POSIX_JOB_CONTROL: (libc)System Options. +-* _POSIX_NO_TRUNC: (libc)Options for Files. +-* _POSIX_SAVED_IDS: (libc)System Options. +-* _POSIX_VDISABLE: (libc)Options for Files. +-* _POSIX_VERSION: (libc)Version Supported. +-* __fbufsize: (libc)Controlling Buffering. +-* __flbf: (libc)Controlling Buffering. +-* __fpending: (libc)Controlling Buffering. +-* __fpurge: (libc)Flushing Buffers. +-* __freadable: (libc)Opening Streams. +-* __freading: (libc)Opening Streams. +-* __fsetlocking: (libc)Streams and Threads. +-* __fwritable: (libc)Opening Streams. +-* __fwriting: (libc)Opening Streams. +-* __va_copy: (libc)Argument Macros. +-* _exit: (libc)Termination Internals. +-* _flushlbf: (libc)Flushing Buffers. +-* _tolower: (libc)Case Conversion. +-* _toupper: (libc)Case Conversion. +-* a64l: (libc)Encode Binary Data. +-* abort: (libc)Aborting a Program. +-* abs: (libc)Absolute Value. +-* accept: (libc)Accepting Connections. +-* access: (libc)Testing File Access. +-* acos: (libc)Inverse Trig Functions. +-* acosf: (libc)Inverse Trig Functions. +-* acosh: (libc)Hyperbolic Functions. +-* acoshf: (libc)Hyperbolic Functions. +-* acoshl: (libc)Hyperbolic Functions. +-* acosl: (libc)Inverse Trig Functions. +-* addmntent: (libc)mtab. +-* addseverity: (libc)Adding Severity Classes. +-* adjtime: (libc)High-Resolution Calendar. +-* adjtimex: (libc)High-Resolution Calendar. +-* aio_cancel64: (libc)Cancel AIO Operations. +-* aio_cancel: (libc)Cancel AIO Operations. +-* aio_error64: (libc)Status of AIO Operations. +-* aio_error: (libc)Status of AIO Operations. +-* aio_fsync64: (libc)Synchronizing AIO Operations. +-* aio_fsync: (libc)Synchronizing AIO Operations. +-* aio_init: (libc)Configuration of AIO. +-* aio_read64: (libc)Asynchronous Reads/Writes. +-* aio_read: (libc)Asynchronous Reads/Writes. +-* aio_return64: (libc)Status of AIO Operations. +-* aio_return: (libc)Status of AIO Operations. +-* aio_suspend64: (libc)Synchronizing AIO Operations. +-* aio_suspend: (libc)Synchronizing AIO Operations. +-* aio_write64: (libc)Asynchronous Reads/Writes. +-* aio_write: (libc)Asynchronous Reads/Writes. +-* alarm: (libc)Setting an Alarm. +-* alloca: (libc)Variable Size Automatic. +-* alphasort64: (libc)Scanning Directory Content. +-* alphasort: (libc)Scanning Directory Content. +-* argp_error: (libc)Argp Helper Functions. +-* argp_failure: (libc)Argp Helper Functions. +-* argp_help: (libc)Argp Help. +-* argp_parse: (libc)Argp. +-* argp_state_help: (libc)Argp Helper Functions. +-* argp_usage: (libc)Argp Helper Functions. +-* argz_add: (libc)Argz Functions. +-* argz_add_sep: (libc)Argz Functions. +-* argz_append: (libc)Argz Functions. +-* argz_count: (libc)Argz Functions. +-* argz_create: (libc)Argz Functions. +-* argz_create_sep: (libc)Argz Functions. +-* argz_delete: (libc)Argz Functions. +-* argz_extract: (libc)Argz Functions. +-* argz_insert: (libc)Argz Functions. +-* argz_next: (libc)Argz Functions. +-* argz_replace: (libc)Argz Functions. +-* argz_stringify: (libc)Argz Functions. +-* asctime: (libc)Formatting Calendar Time. +-* asctime_r: (libc)Formatting Calendar Time. +-* asin: (libc)Inverse Trig Functions. +-* asinf: (libc)Inverse Trig Functions. +-* asinh: (libc)Hyperbolic Functions. +-* asinhf: (libc)Hyperbolic Functions. +-* asinhl: (libc)Hyperbolic Functions. +-* asinl: (libc)Inverse Trig Functions. +-* asprintf: (libc)Dynamic Output. +-* assert: (libc)Consistency Checking. +-* assert_perror: (libc)Consistency Checking. +-* atan2: (libc)Inverse Trig Functions. +-* atan2f: (libc)Inverse Trig Functions. +-* atan2l: (libc)Inverse Trig Functions. +-* atan: (libc)Inverse Trig Functions. +-* atanf: (libc)Inverse Trig Functions. +-* atanh: (libc)Hyperbolic Functions. +-* atanhf: (libc)Hyperbolic Functions. +-* atanhl: (libc)Hyperbolic Functions. +-* atanl: (libc)Inverse Trig Functions. +-* atexit: (libc)Cleanups on Exit. +-* atof: (libc)Parsing of Floats. +-* atoi: (libc)Parsing of Integers. +-* atol: (libc)Parsing of Integers. +-* atoll: (libc)Parsing of Integers. +-* backtrace: (libc)Backtraces. +-* backtrace_symbols: (libc)Backtraces. +-* backtrace_symbols_fd: (libc)Backtraces. +-* basename: (libc)Finding Tokens in a String. +-* basename: (libc)Finding Tokens in a String. +-* bcmp: (libc)String/Array Comparison. +-* bcopy: (libc)Copying and Concatenation. +-* bind: (libc)Setting Address. +-* bind_textdomain_codeset: (libc)Charset conversion in gettext. +-* bindtextdomain: (libc)Locating gettext catalog. +-* brk: (libc)Resizing the Data Segment. +-* bsearch: (libc)Array Search Function. +-* btowc: (libc)Converting a Character. +-* bzero: (libc)Copying and Concatenation. +-* cabs: (libc)Absolute Value. +-* cabsf: (libc)Absolute Value. +-* cabsl: (libc)Absolute Value. +-* cacos: (libc)Inverse Trig Functions. +-* cacosf: (libc)Inverse Trig Functions. +-* cacosh: (libc)Hyperbolic Functions. +-* cacoshf: (libc)Hyperbolic Functions. +-* cacoshl: (libc)Hyperbolic Functions. +-* cacosl: (libc)Inverse Trig Functions. +-* calloc: (libc)Allocating Cleared Space. +-* canonicalize_file_name: (libc)Symbolic Links. +-* carg: (libc)Operations on Complex. +-* cargf: (libc)Operations on Complex. +-* cargl: (libc)Operations on Complex. +-* casin: (libc)Inverse Trig Functions. +-* casinf: (libc)Inverse Trig Functions. +-* casinh: (libc)Hyperbolic Functions. +-* casinhf: (libc)Hyperbolic Functions. +-* casinhl: (libc)Hyperbolic Functions. +-* casinl: (libc)Inverse Trig Functions. +-* catan: (libc)Inverse Trig Functions. +-* catanf: (libc)Inverse Trig Functions. +-* catanh: (libc)Hyperbolic Functions. +-* catanhf: (libc)Hyperbolic Functions. +-* catanhl: (libc)Hyperbolic Functions. +-* catanl: (libc)Inverse Trig Functions. +-* catclose: (libc)The catgets Functions. +-* catgets: (libc)The catgets Functions. +-* catopen: (libc)The catgets Functions. +-* cbc_crypt: (libc)DES Encryption. +-* cbrt: (libc)Exponents and Logarithms. +-* cbrtf: (libc)Exponents and Logarithms. +-* cbrtl: (libc)Exponents and Logarithms. +-* ccos: (libc)Trig Functions. +-* ccosf: (libc)Trig Functions. +-* ccosh: (libc)Hyperbolic Functions. +-* ccoshf: (libc)Hyperbolic Functions. +-* ccoshl: (libc)Hyperbolic Functions. +-* ccosl: (libc)Trig Functions. +-* ceil: (libc)Rounding Functions. +-* ceilf: (libc)Rounding Functions. +-* ceill: (libc)Rounding Functions. +-* cexp: (libc)Exponents and Logarithms. +-* cexpf: (libc)Exponents and Logarithms. +-* cexpl: (libc)Exponents and Logarithms. +-* cfgetispeed: (libc)Line Speed. +-* cfgetospeed: (libc)Line Speed. +-* cfmakeraw: (libc)Noncanonical Input. +-* cfree: (libc)Freeing after Malloc. +-* cfsetispeed: (libc)Line Speed. +-* cfsetospeed: (libc)Line Speed. +-* cfsetspeed: (libc)Line Speed. +-* chdir: (libc)Working Directory. +-* chmod: (libc)Setting Permissions. +-* chown: (libc)File Owner. +-* cimag: (libc)Operations on Complex. +-* cimagf: (libc)Operations on Complex. +-* cimagl: (libc)Operations on Complex. +-* clearenv: (libc)Environment Access. +-* clearerr: (libc)Error Recovery. +-* clearerr_unlocked: (libc)Error Recovery. +-* clock: (libc)CPU Time. +-* clog10: (libc)Exponents and Logarithms. +-* clog10f: (libc)Exponents and Logarithms. +-* clog10l: (libc)Exponents and Logarithms. +-* clog: (libc)Exponents and Logarithms. +-* clogf: (libc)Exponents and Logarithms. +-* clogl: (libc)Exponents and Logarithms. +-* close: (libc)Opening and Closing Files. +-* closedir: (libc)Reading/Closing Directory. +-* closelog: (libc)closelog. +-* confstr: (libc)String Parameters. +-* conj: (libc)Operations on Complex. +-* conjf: (libc)Operations on Complex. +-* conjl: (libc)Operations on Complex. +-* connect: (libc)Connecting. +-* copysign: (libc)FP Bit Twiddling. +-* copysignf: (libc)FP Bit Twiddling. +-* copysignl: (libc)FP Bit Twiddling. +-* cos: (libc)Trig Functions. +-* cosf: (libc)Trig Functions. +-* cosh: (libc)Hyperbolic Functions. +-* coshf: (libc)Hyperbolic Functions. +-* coshl: (libc)Hyperbolic Functions. +-* cosl: (libc)Trig Functions. +-* cpow: (libc)Exponents and Logarithms. +-* cpowf: (libc)Exponents and Logarithms. +-* cpowl: (libc)Exponents and Logarithms. +-* cproj: (libc)Operations on Complex. +-* cprojf: (libc)Operations on Complex. +-* cprojl: (libc)Operations on Complex. +-* creal: (libc)Operations on Complex. +-* crealf: (libc)Operations on Complex. +-* creall: (libc)Operations on Complex. +-* creat64: (libc)Opening and Closing Files. +-* creat: (libc)Opening and Closing Files. +-* crypt: (libc)crypt. +-* crypt_r: (libc)crypt. +-* csin: (libc)Trig Functions. +-* csinf: (libc)Trig Functions. +-* csinh: (libc)Hyperbolic Functions. +-* csinhf: (libc)Hyperbolic Functions. +-* csinhl: (libc)Hyperbolic Functions. +-* csinl: (libc)Trig Functions. +-* csqrt: (libc)Exponents and Logarithms. +-* csqrtf: (libc)Exponents and Logarithms. +-* csqrtl: (libc)Exponents and Logarithms. +-* ctan: (libc)Trig Functions. +-* ctanf: (libc)Trig Functions. +-* ctanh: (libc)Hyperbolic Functions. +-* ctanhf: (libc)Hyperbolic Functions. +-* ctanhl: (libc)Hyperbolic Functions. +-* ctanl: (libc)Trig Functions. +-* ctermid: (libc)Identifying the Terminal. +-* ctime: (libc)Formatting Calendar Time. +-* ctime_r: (libc)Formatting Calendar Time. +-* cuserid: (libc)Who Logged In. +-* dcgettext: (libc)Translation with gettext. +-* dcngettext: (libc)Advanced gettext functions. +-* des_setparity: (libc)DES Encryption. +-* dgettext: (libc)Translation with gettext. +-* difftime: (libc)Elapsed Time. +-* dirfd: (libc)Opening a Directory. +-* dirname: (libc)Finding Tokens in a String. +-* div: (libc)Integer Division. +-* dngettext: (libc)Advanced gettext functions. +-* drand48: (libc)SVID Random. +-* drand48_r: (libc)SVID Random. +-* drem: (libc)Remainder Functions. +-* dremf: (libc)Remainder Functions. +-* dreml: (libc)Remainder Functions. +-* dup2: (libc)Duplicating Descriptors. +-* dup: (libc)Duplicating Descriptors. +-* ecb_crypt: (libc)DES Encryption. +-* ecvt: (libc)System V Number Conversion. +-* ecvt_r: (libc)System V Number Conversion. +-* encrypt: (libc)DES Encryption. +-* encrypt_r: (libc)DES Encryption. +-* endfsent: (libc)fstab. +-* endgrent: (libc)Scanning All Groups. +-* endhostent: (libc)Host Names. +-* endmntent: (libc)mtab. +-* endnetent: (libc)Networks Database. +-* endnetgrent: (libc)Lookup Netgroup. +-* endprotoent: (libc)Protocols Database. +-* endpwent: (libc)Scanning All Users. +-* endservent: (libc)Services Database. +-* endutent: (libc)Manipulating the Database. +-* endutxent: (libc)XPG Functions. +-* envz_add: (libc)Envz Functions. +-* envz_entry: (libc)Envz Functions. +-* envz_get: (libc)Envz Functions. +-* envz_merge: (libc)Envz Functions. +-* envz_strip: (libc)Envz Functions. +-* erand48: (libc)SVID Random. +-* erand48_r: (libc)SVID Random. +-* erf: (libc)Special Functions. +-* erfc: (libc)Special Functions. +-* erfcf: (libc)Special Functions. +-* erfcl: (libc)Special Functions. +-* erff: (libc)Special Functions. +-* erfl: (libc)Special Functions. +-* err: (libc)Error Messages. +-* errno: (libc)Checking for Errors. +-* error: (libc)Error Messages. +-* error_at_line: (libc)Error Messages. +-* errx: (libc)Error Messages. +-* execl: (libc)Executing a File. +-* execle: (libc)Executing a File. +-* execlp: (libc)Executing a File. +-* execv: (libc)Executing a File. +-* execve: (libc)Executing a File. +-* execvp: (libc)Executing a File. +-* exit: (libc)Normal Termination. +-* exp10: (libc)Exponents and Logarithms. +-* exp10f: (libc)Exponents and Logarithms. +-* exp10l: (libc)Exponents and Logarithms. +-* exp2: (libc)Exponents and Logarithms. +-* exp2f: (libc)Exponents and Logarithms. +-* exp2l: (libc)Exponents and Logarithms. +-* exp: (libc)Exponents and Logarithms. +-* expf: (libc)Exponents and Logarithms. +-* expl: (libc)Exponents and Logarithms. +-* expm1: (libc)Exponents and Logarithms. +-* expm1f: (libc)Exponents and Logarithms. +-* expm1l: (libc)Exponents and Logarithms. +-* fabs: (libc)Absolute Value. +-* fabsf: (libc)Absolute Value. +-* fabsl: (libc)Absolute Value. +-* fchdir: (libc)Working Directory. +-* fchmod: (libc)Setting Permissions. +-* fchown: (libc)File Owner. +-* fclean: (libc)Cleaning Streams. +-* fclose: (libc)Closing Streams. +-* fcloseall: (libc)Closing Streams. +-* fcntl: (libc)Control Operations. +-* fcvt: (libc)System V Number Conversion. +-* fcvt_r: (libc)System V Number Conversion. +-* fdatasync: (libc)Synchronizing I/O. +-* fdim: (libc)Misc FP Arithmetic. +-* fdimf: (libc)Misc FP Arithmetic. +-* fdiml: (libc)Misc FP Arithmetic. +-* fdopen: (libc)Descriptors and Streams. +-* feclearexcept: (libc)Status bit operations. +-* fedisableexcept: (libc)Control Functions. +-* feenableexcept: (libc)Control Functions. +-* fegetenv: (libc)Control Functions. +-* fegetexcept: (libc)Control Functions. +-* fegetexceptflag: (libc)Status bit operations. +-* fegetround: (libc)Rounding. +-* feholdexcept: (libc)Control Functions. +-* feof: (libc)EOF and Errors. +-* feof_unlocked: (libc)EOF and Errors. +-* feraiseexcept: (libc)Status bit operations. +-* ferror: (libc)EOF and Errors. +-* ferror_unlocked: (libc)EOF and Errors. +-* fesetenv: (libc)Control Functions. +-* fesetexceptflag: (libc)Status bit operations. +-* fesetround: (libc)Rounding. +-* fetestexcept: (libc)Status bit operations. +-* feupdateenv: (libc)Control Functions. +-* fflush: (libc)Flushing Buffers. +-* fflush_unlocked: (libc)Flushing Buffers. +-* fgetc: (libc)Character Input. +-* fgetc_unlocked: (libc)Character Input. +-* fgetgrent: (libc)Scanning All Groups. +-* fgetgrent_r: (libc)Scanning All Groups. +-* fgetpos64: (libc)Portable Positioning. +-* fgetpos: (libc)Portable Positioning. +-* fgetpwent: (libc)Scanning All Users. +-* fgetpwent_r: (libc)Scanning All Users. +-* fgets: (libc)Line Input. +-* fgets_unlocked: (libc)Line Input. +-* fgetwc: (libc)Character Input. +-* fgetwc_unlocked: (libc)Character Input. +-* fgetws: (libc)Line Input. +-* fgetws_unlocked: (libc)Line Input. +-* fileno: (libc)Descriptors and Streams. +-* fileno_unlocked: (libc)Descriptors and Streams. +-* finite: (libc)Floating Point Classes. +-* finitef: (libc)Floating Point Classes. +-* finitel: (libc)Floating Point Classes. +-* flockfile: (libc)Streams and Threads. +-* floor: (libc)Rounding Functions. +-* floorf: (libc)Rounding Functions. +-* floorl: (libc)Rounding Functions. +-* fma: (libc)Misc FP Arithmetic. +-* fmaf: (libc)Misc FP Arithmetic. +-* fmal: (libc)Misc FP Arithmetic. +-* fmax: (libc)Misc FP Arithmetic. +-* fmaxf: (libc)Misc FP Arithmetic. +-* fmaxl: (libc)Misc FP Arithmetic. +-* fmemopen: (libc)String Streams. +-* fmin: (libc)Misc FP Arithmetic. +-* fminf: (libc)Misc FP Arithmetic. +-* fminl: (libc)Misc FP Arithmetic. +-* fmod: (libc)Remainder Functions. +-* fmodf: (libc)Remainder Functions. +-* fmodl: (libc)Remainder Functions. +-* fmtmsg: (libc)Printing Formatted Messages. +-* fnmatch: (libc)Wildcard Matching. +-* fopen64: (libc)Opening Streams. +-* fopen: (libc)Opening Streams. +-* fopencookie: (libc)Streams and Cookies. +-* fork: (libc)Creating a Process. +-* forkpty: (libc)Pseudo-Terminal Pairs. +-* fpathconf: (libc)Pathconf. +-* fpclassify: (libc)Floating Point Classes. +-* fprintf: (libc)Formatted Output Functions. +-* fputc: (libc)Simple Output. +-* fputc_unlocked: (libc)Simple Output. +-* fputs: (libc)Simple Output. +-* fputs_unlocked: (libc)Simple Output. +-* fputwc: (libc)Simple Output. +-* fputwc_unlocked: (libc)Simple Output. +-* fputws: (libc)Simple Output. +-* fputws_unlocked: (libc)Simple Output. +-* fread: (libc)Block Input/Output. +-* fread_unlocked: (libc)Block Input/Output. +-* free: (libc)Freeing after Malloc. +-* freopen64: (libc)Opening Streams. +-* freopen: (libc)Opening Streams. +-* frexp: (libc)Normalization Functions. +-* frexpf: (libc)Normalization Functions. +-* frexpl: (libc)Normalization Functions. +-* fscanf: (libc)Formatted Input Functions. +-* fseek: (libc)File Positioning. +-* fseeko64: (libc)File Positioning. +-* fseeko: (libc)File Positioning. +-* fsetpos64: (libc)Portable Positioning. +-* fsetpos: (libc)Portable Positioning. +-* fstat64: (libc)Reading Attributes. +-* fstat: (libc)Reading Attributes. +-* fsync: (libc)Synchronizing I/O. +-* ftell: (libc)File Positioning. +-* ftello64: (libc)File Positioning. +-* ftello: (libc)File Positioning. +-* ftruncate64: (libc)File Size. +-* ftruncate: (libc)File Size. +-* ftrylockfile: (libc)Streams and Threads. +-* ftw64: (libc)Working with Directory Trees. +-* ftw: (libc)Working with Directory Trees. +-* funlockfile: (libc)Streams and Threads. +-* futimes: (libc)File Times. +-* fwide: (libc)Streams and I18N. +-* fwprintf: (libc)Formatted Output Functions. +-* fwrite: (libc)Block Input/Output. +-* fwrite_unlocked: (libc)Block Input/Output. +-* fwscanf: (libc)Formatted Input Functions. +-* gamma: (libc)Special Functions. +-* gammaf: (libc)Special Functions. +-* gammal: (libc)Special Functions. +-* gcvt: (libc)System V Number Conversion. +-* get_avphys_pages: (libc)Query Memory Parameters. +-* get_current_dir_name: (libc)Working Directory. +-* get_nprocs: (libc)Processor Resources. +-* get_nprocs_conf: (libc)Processor Resources. +-* get_phys_pages: (libc)Query Memory Parameters. +-* getc: (libc)Character Input. +-* getc_unlocked: (libc)Character Input. +-* getchar: (libc)Character Input. +-* getchar_unlocked: (libc)Character Input. +-* getcontext: (libc)System V contexts. +-* getcwd: (libc)Working Directory. +-* getdate: (libc)General Time String Parsing. +-* getdate_r: (libc)General Time String Parsing. +-* getdelim: (libc)Line Input. +-* getdomainnname: (libc)Host Identification. +-* getegid: (libc)Reading Persona. +-* getenv: (libc)Environment Access. +-* geteuid: (libc)Reading Persona. +-* getfsent: (libc)fstab. +-* getfsfile: (libc)fstab. +-* getfsspec: (libc)fstab. +-* getgid: (libc)Reading Persona. +-* getgrent: (libc)Scanning All Groups. +-* getgrent_r: (libc)Scanning All Groups. +-* getgrgid: (libc)Lookup Group. +-* getgrgid_r: (libc)Lookup Group. +-* getgrnam: (libc)Lookup Group. +-* getgrnam_r: (libc)Lookup Group. +-* getgrouplist: (libc)Setting Groups. +-* getgroups: (libc)Reading Persona. +-* gethostbyaddr: (libc)Host Names. +-* gethostbyaddr_r: (libc)Host Names. +-* gethostbyname2: (libc)Host Names. +-* gethostbyname2_r: (libc)Host Names. +-* gethostbyname: (libc)Host Names. +-* gethostbyname_r: (libc)Host Names. +-* gethostent: (libc)Host Names. +-* gethostid: (libc)Host Identification. +-* gethostname: (libc)Host Identification. +-* getitimer: (libc)Setting an Alarm. +-* getline: (libc)Line Input. +-* getloadavg: (libc)Processor Resources. +-* getlogin: (libc)Who Logged In. +-* getmntent: (libc)mtab. +-* getmntent_r: (libc)mtab. +-* getnetbyaddr: (libc)Networks Database. +-* getnetbyname: (libc)Networks Database. +-* getnetent: (libc)Networks Database. +-* getnetgrent: (libc)Lookup Netgroup. +-* getnetgrent_r: (libc)Lookup Netgroup. +-* getopt: (libc)Using Getopt. +-* getopt_long: (libc)Getopt Long Options. +-* getopt_long_only: (libc)Getopt Long Options. +-* getpagesize: (libc)Query Memory Parameters. +-* getpass: (libc)getpass. +-* getpeername: (libc)Who is Connected. +-* getpgid: (libc)Process Group Functions. +-* getpgrp: (libc)Process Group Functions. +-* getpgrp: (libc)Process Group Functions. +-* getpid: (libc)Process Identification. +-* getppid: (libc)Process Identification. +-* getpriority: (libc)Traditional Scheduling Functions. +-* getprotobyname: (libc)Protocols Database. +-* getprotobynumber: (libc)Protocols Database. +-* getprotoent: (libc)Protocols Database. +-* getpt: (libc)Allocation. +-* getpwent: (libc)Scanning All Users. +-* getpwent_r: (libc)Scanning All Users. +-* getpwnam: (libc)Lookup User. +-* getpwnam_r: (libc)Lookup User. +-* getpwuid: (libc)Lookup User. +-* getpwuid_r: (libc)Lookup User. +-* getrlimit64: (libc)Limits on Resources. +-* getrlimit: (libc)Limits on Resources. +-* getrusage: (libc)Resource Usage. +-* gets: (libc)Line Input. +-* getservbyname: (libc)Services Database. +-* getservbyport: (libc)Services Database. +-* getservent: (libc)Services Database. +-* getsid: (libc)Process Group Functions. +-* getsockname: (libc)Reading Address. +-* getsockopt: (libc)Socket Option Functions. +-* getsubopt: (libc)Suboptions. +-* gettext: (libc)Translation with gettext. +-* gettimeofday: (libc)High-Resolution Calendar. +-* getuid: (libc)Reading Persona. +-* getumask: (libc)Setting Permissions. +-* getutent: (libc)Manipulating the Database. +-* getutent_r: (libc)Manipulating the Database. +-* getutid: (libc)Manipulating the Database. +-* getutid_r: (libc)Manipulating the Database. +-* getutline: (libc)Manipulating the Database. +-* getutline_r: (libc)Manipulating the Database. +-* getutmp: (libc)XPG Functions. +-* getutmpx: (libc)XPG Functions. +-* getutxent: (libc)XPG Functions. +-* getutxid: (libc)XPG Functions. +-* getutxline: (libc)XPG Functions. +-* getw: (libc)Character Input. +-* getwc: (libc)Character Input. +-* getwc_unlocked: (libc)Character Input. +-* getwchar: (libc)Character Input. +-* getwchar_unlocked: (libc)Character Input. +-* getwd: (libc)Working Directory. +-* glob64: (libc)Calling Glob. +-* glob: (libc)Calling Glob. +-* globfree64: (libc)More Flags for Globbing. +-* globfree: (libc)More Flags for Globbing. +-* gmtime: (libc)Broken-down Time. +-* gmtime_r: (libc)Broken-down Time. +-* grantpt: (libc)Allocation. +-* gsignal: (libc)Signaling Yourself. +-* gtty: (libc)BSD Terminal Modes. +-* hasmntopt: (libc)mtab. +-* hcreate: (libc)Hash Search Function. +-* hcreate_r: (libc)Hash Search Function. +-* hdestroy: (libc)Hash Search Function. +-* hdestroy_r: (libc)Hash Search Function. +-* hsearch: (libc)Hash Search Function. +-* hsearch_r: (libc)Hash Search Function. +-* htonl: (libc)Byte Order. +-* htons: (libc)Byte Order. +-* hypot: (libc)Exponents and Logarithms. +-* hypotf: (libc)Exponents and Logarithms. +-* hypotl: (libc)Exponents and Logarithms. +-* iconv: (libc)Generic Conversion Interface. +-* iconv_close: (libc)Generic Conversion Interface. +-* iconv_open: (libc)Generic Conversion Interface. +-* if_freenameindex: (libc)Interface Naming. +-* if_indextoname: (libc)Interface Naming. +-* if_nameindex: (libc)Interface Naming. +-* if_nametoindex: (libc)Interface Naming. +-* ilogb: (libc)Exponents and Logarithms. +-* ilogbf: (libc)Exponents and Logarithms. +-* ilogbl: (libc)Exponents and Logarithms. +-* imaxabs: (libc)Absolute Value. +-* imaxdiv: (libc)Integer Division. +-* in6addr_any: (libc)Host Address Data Type. +-* in6addr_loopback: (libc)Host Address Data Type. +-* index: (libc)Search Functions. +-* inet_addr: (libc)Host Address Functions. +-* inet_aton: (libc)Host Address Functions. +-* inet_lnaof: (libc)Host Address Functions. +-* inet_makeaddr: (libc)Host Address Functions. +-* inet_netof: (libc)Host Address Functions. +-* inet_network: (libc)Host Address Functions. +-* inet_ntoa: (libc)Host Address Functions. +-* inet_ntop: (libc)Host Address Functions. +-* inet_pton: (libc)Host Address Functions. +-* initgroups: (libc)Setting Groups. +-* initstate: (libc)BSD Random. +-* initstate_r: (libc)BSD Random. +-* innetgr: (libc)Netgroup Membership. +-* ioctl: (libc)IOCTLs. +-* isalnum: (libc)Classification of Characters. +-* isalpha: (libc)Classification of Characters. +-* isascii: (libc)Classification of Characters. +-* isatty: (libc)Is It a Terminal. +-* isblank: (libc)Classification of Characters. +-* iscntrl: (libc)Classification of Characters. +-* isdigit: (libc)Classification of Characters. +-* isfinite: (libc)Floating Point Classes. +-* isgraph: (libc)Classification of Characters. +-* isgreater: (libc)FP Comparison Functions. +-* isgreaterequal: (libc)FP Comparison Functions. +-* isinf: (libc)Floating Point Classes. +-* isinff: (libc)Floating Point Classes. +-* isinfl: (libc)Floating Point Classes. +-* isless: (libc)FP Comparison Functions. +-* islessequal: (libc)FP Comparison Functions. +-* islessgreater: (libc)FP Comparison Functions. +-* islower: (libc)Classification of Characters. +-* isnan: (libc)Floating Point Classes. +-* isnan: (libc)Floating Point Classes. +-* isnanf: (libc)Floating Point Classes. +-* isnanl: (libc)Floating Point Classes. +-* isnormal: (libc)Floating Point Classes. +-* isprint: (libc)Classification of Characters. +-* ispunct: (libc)Classification of Characters. +-* isspace: (libc)Classification of Characters. +-* isunordered: (libc)FP Comparison Functions. +-* isupper: (libc)Classification of Characters. +-* iswalnum: (libc)Classification of Wide Characters. +-* iswalpha: (libc)Classification of Wide Characters. +-* iswblank: (libc)Classification of Wide Characters. +-* iswcntrl: (libc)Classification of Wide Characters. +-* iswctype: (libc)Classification of Wide Characters. +-* iswdigit: (libc)Classification of Wide Characters. +-* iswgraph: (libc)Classification of Wide Characters. +-* iswlower: (libc)Classification of Wide Characters. +-* iswprint: (libc)Classification of Wide Characters. +-* iswpunct: (libc)Classification of Wide Characters. +-* iswspace: (libc)Classification of Wide Characters. +-* iswupper: (libc)Classification of Wide Characters. +-* iswxdigit: (libc)Classification of Wide Characters. +-* isxdigit: (libc)Classification of Characters. +-* j0: (libc)Special Functions. +-* j0f: (libc)Special Functions. +-* j0l: (libc)Special Functions. +-* j1: (libc)Special Functions. +-* j1f: (libc)Special Functions. +-* j1l: (libc)Special Functions. +-* jn: (libc)Special Functions. +-* jnf: (libc)Special Functions. +-* jnl: (libc)Special Functions. +-* jrand48: (libc)SVID Random. +-* jrand48_r: (libc)SVID Random. +-* kill: (libc)Signaling Another Process. +-* killpg: (libc)Signaling Another Process. +-* l64a: (libc)Encode Binary Data. +-* labs: (libc)Absolute Value. +-* lcong48: (libc)SVID Random. +-* lcong48_r: (libc)SVID Random. +-* ldexp: (libc)Normalization Functions. +-* ldexpf: (libc)Normalization Functions. +-* ldexpl: (libc)Normalization Functions. +-* ldiv: (libc)Integer Division. +-* lfind: (libc)Array Search Function. +-* lgamma: (libc)Special Functions. +-* lgamma_r: (libc)Special Functions. +-* lgammaf: (libc)Special Functions. +-* lgammaf_r: (libc)Special Functions. +-* lgammal: (libc)Special Functions. +-* lgammal_r: (libc)Special Functions. +-* link: (libc)Hard Links. +-* lio_listio64: (libc)Asynchronous Reads/Writes. +-* lio_listio: (libc)Asynchronous Reads/Writes. +-* listen: (libc)Listening. +-* llabs: (libc)Absolute Value. +-* lldiv: (libc)Integer Division. +-* llrint: (libc)Rounding Functions. +-* llrintf: (libc)Rounding Functions. +-* llrintl: (libc)Rounding Functions. +-* llround: (libc)Rounding Functions. +-* llroundf: (libc)Rounding Functions. +-* llroundl: (libc)Rounding Functions. +-* localeconv: (libc)The Lame Way to Locale Data. +-* localtime: (libc)Broken-down Time. +-* localtime_r: (libc)Broken-down Time. +-* log10: (libc)Exponents and Logarithms. +-* log10f: (libc)Exponents and Logarithms. +-* log10l: (libc)Exponents and Logarithms. +-* log1p: (libc)Exponents and Logarithms. +-* log1pf: (libc)Exponents and Logarithms. +-* log1pl: (libc)Exponents and Logarithms. +-* log2: (libc)Exponents and Logarithms. +-* log2f: (libc)Exponents and Logarithms. +-* log2l: (libc)Exponents and Logarithms. +-* log: (libc)Exponents and Logarithms. +-* logb: (libc)Exponents and Logarithms. +-* logbf: (libc)Exponents and Logarithms. +-* logbl: (libc)Exponents and Logarithms. +-* logf: (libc)Exponents and Logarithms. +-* login: (libc)Logging In and Out. +-* login_tty: (libc)Logging In and Out. +-* logl: (libc)Exponents and Logarithms. +-* logout: (libc)Logging In and Out. +-* logwtmp: (libc)Logging In and Out. +-* longjmp: (libc)Non-Local Details. +-* lrand48: (libc)SVID Random. +-* lrand48_r: (libc)SVID Random. +-* lrint: (libc)Rounding Functions. +-* lrintf: (libc)Rounding Functions. +-* lrintl: (libc)Rounding Functions. +-* lround: (libc)Rounding Functions. +-* lroundf: (libc)Rounding Functions. +-* lroundl: (libc)Rounding Functions. +-* lsearch: (libc)Array Search Function. +-* lseek64: (libc)File Position Primitive. +-* lseek: (libc)File Position Primitive. +-* lstat64: (libc)Reading Attributes. +-* lstat: (libc)Reading Attributes. +-* lutimes: (libc)File Times. +-* madvise: (libc)Memory-mapped I/O. +-* makecontext: (libc)System V contexts. +-* mallinfo: (libc)Statistics of Malloc. +-* malloc: (libc)Basic Allocation. +-* mallopt: (libc)Malloc Tunable Parameters. +-* mblen: (libc)Non-reentrant Character Conversion. +-* mbrlen: (libc)Converting a Character. +-* mbrtowc: (libc)Converting a Character. +-* mbsinit: (libc)Keeping the state. +-* mbsnrtowcs: (libc)Converting Strings. +-* mbsrtowcs: (libc)Converting Strings. +-* mbstowcs: (libc)Non-reentrant String Conversion. +-* mbtowc: (libc)Non-reentrant Character Conversion. +-* mcheck: (libc)Heap Consistency Checking. +-* memalign: (libc)Aligned Memory Blocks. +-* memccpy: (libc)Copying and Concatenation. +-* memchr: (libc)Search Functions. +-* memcmp: (libc)String/Array Comparison. +-* memcpy: (libc)Copying and Concatenation. +-* memfrob: (libc)Trivial Encryption. +-* memmem: (libc)Search Functions. +-* memmove: (libc)Copying and Concatenation. +-* mempcpy: (libc)Copying and Concatenation. +-* memrchr: (libc)Search Functions. +-* memset: (libc)Copying and Concatenation. +-* mkdir: (libc)Creating Directories. +-* mkdtemp: (libc)Temporary Files. +-* mkfifo: (libc)FIFO Special Files. +-* mknod: (libc)Making Special Files. +-* mkstemp: (libc)Temporary Files. +-* mktemp: (libc)Temporary Files. +-* mktime: (libc)Broken-down Time. +-* mlock: (libc)Page Lock Functions. +-* mlockall: (libc)Page Lock Functions. +-* mmap64: (libc)Memory-mapped I/O. +-* mmap: (libc)Memory-mapped I/O. +-* modf: (libc)Rounding Functions. +-* modff: (libc)Rounding Functions. +-* modfl: (libc)Rounding Functions. +-* mount: (libc)Mount-Unmount-Remount. +-* mprobe: (libc)Heap Consistency Checking. +-* mrand48: (libc)SVID Random. +-* mrand48_r: (libc)SVID Random. +-* mremap: (libc)Memory-mapped I/O. +-* msync: (libc)Memory-mapped I/O. +-* mtrace: (libc)Tracing malloc. +-* munlock: (libc)Page Lock Functions. +-* munlockall: (libc)Page Lock Functions. +-* munmap: (libc)Memory-mapped I/O. +-* muntrace: (libc)Tracing malloc. +-* nan: (libc)FP Bit Twiddling. +-* nanf: (libc)FP Bit Twiddling. +-* nanl: (libc)FP Bit Twiddling. +-* nanosleep: (libc)Sleeping. +-* nearbyint: (libc)Rounding Functions. +-* nearbyintf: (libc)Rounding Functions. +-* nearbyintl: (libc)Rounding Functions. +-* nextafter: (libc)FP Bit Twiddling. +-* nextafterf: (libc)FP Bit Twiddling. +-* nextafterl: (libc)FP Bit Twiddling. +-* nexttoward: (libc)FP Bit Twiddling. +-* nexttowardf: (libc)FP Bit Twiddling. +-* nexttowardl: (libc)FP Bit Twiddling. +-* nftw64: (libc)Working with Directory Trees. +-* nftw: (libc)Working with Directory Trees. +-* ngettext: (libc)Advanced gettext functions. +-* nice: (libc)Traditional Scheduling Functions. +-* nl_langinfo: (libc)The Elegant and Fast Way. +-* nrand48: (libc)SVID Random. +-* nrand48_r: (libc)SVID Random. +-* ntohl: (libc)Byte Order. +-* ntohs: (libc)Byte Order. +-* ntp_adjtime: (libc)High Accuracy Clock. +-* ntp_gettime: (libc)High Accuracy Clock. +-* obstack_1grow: (libc)Growing Objects. +-* obstack_1grow_fast: (libc)Extra Fast Growing. +-* obstack_alignment_mask: (libc)Obstacks Data Alignment. +-* obstack_alloc: (libc)Allocation in an Obstack. +-* obstack_base: (libc)Status of an Obstack. +-* obstack_blank: (libc)Growing Objects. +-* obstack_blank_fast: (libc)Extra Fast Growing. +-* obstack_chunk_size: (libc)Obstack Chunks. +-* obstack_copy0: (libc)Allocation in an Obstack. +-* obstack_copy: (libc)Allocation in an Obstack. +-* obstack_finish: (libc)Growing Objects. +-* obstack_free: (libc)Freeing Obstack Objects. +-* obstack_grow0: (libc)Growing Objects. +-* obstack_grow: (libc)Growing Objects. +-* obstack_init: (libc)Preparing for Obstacks. +-* obstack_int_grow: (libc)Growing Objects. +-* obstack_int_grow_fast: (libc)Extra Fast Growing. +-* obstack_next_free: (libc)Status of an Obstack. +-* obstack_object_size: (libc)Growing Objects. +-* obstack_object_size: (libc)Status of an Obstack. +-* obstack_printf: (libc)Dynamic Output. +-* obstack_ptr_grow: (libc)Growing Objects. +-* obstack_ptr_grow_fast: (libc)Extra Fast Growing. +-* obstack_room: (libc)Extra Fast Growing. +-* obstack_vprintf: (libc)Variable Arguments Output. +-* offsetof: (libc)Structure Measurement. +-* on_exit: (libc)Cleanups on Exit. +-* open64: (libc)Opening and Closing Files. +-* open: (libc)Opening and Closing Files. +-* open_memstream: (libc)String Streams. +-* open_obstack_stream: (libc)Obstack Streams. +-* opendir: (libc)Opening a Directory. +-* openlog: (libc)openlog. +-* openpty: (libc)Pseudo-Terminal Pairs. +-* parse_printf_format: (libc)Parsing a Template String. +-* pathconf: (libc)Pathconf. +-* pause: (libc)Using Pause. +-* pclose: (libc)Pipe to a Subprocess. +-* perror: (libc)Error Messages. +-* pipe: (libc)Creating a Pipe. +-* popen: (libc)Pipe to a Subprocess. +-* posix_memalign: (libc)Aligned Memory Blocks. +-* pow10: (libc)Exponents and Logarithms. +-* pow10f: (libc)Exponents and Logarithms. +-* pow10l: (libc)Exponents and Logarithms. +-* pow: (libc)Exponents and Logarithms. +-* powf: (libc)Exponents and Logarithms. +-* powl: (libc)Exponents and Logarithms. +-* pread64: (libc)I/O Primitives. +-* pread: (libc)I/O Primitives. +-* printf: (libc)Formatted Output Functions. +-* printf_size: (libc)Predefined Printf Handlers. +-* printf_size_info: (libc)Predefined Printf Handlers. +-* psignal: (libc)Signal Messages. +-* pthread_atfork: (libc)Threads and Fork. +-* pthread_attr_destroy: (libc)Thread Attributes. +-* pthread_attr_getattr: (libc)Thread Attributes. +-* pthread_attr_init: (libc)Thread Attributes. +-* pthread_attr_setattr: (libc)Thread Attributes. +-* pthread_cancel: (libc)Basic Thread Operations. +-* pthread_cleanup_pop: (libc)Cleanup Handlers. +-* pthread_cleanup_pop_restore_np: (libc)Cleanup Handlers. +-* pthread_cleanup_push: (libc)Cleanup Handlers. +-* pthread_cleanup_push_defer_np: (libc)Cleanup Handlers. +-* pthread_cond_broadcast: (libc)Condition Variables. +-* pthread_cond_destroy: (libc)Condition Variables. +-* pthread_cond_init: (libc)Condition Variables. +-* pthread_cond_signal: (libc)Condition Variables. +-* pthread_cond_timedwait: (libc)Condition Variables. +-* pthread_cond_wait: (libc)Condition Variables. +-* pthread_condattr_destroy: (libc)Condition Variables. +-* pthread_condattr_init: (libc)Condition Variables. +-* pthread_create: (libc)Basic Thread Operations. +-* pthread_detach: (libc)Miscellaneous Thread Functions. +-* pthread_equal: (libc)Miscellaneous Thread Functions. +-* pthread_exit: (libc)Basic Thread Operations. +-* pthread_getconcurrency: (libc)Miscellaneous Thread Functions. +-* pthread_getschedparam: (libc)Miscellaneous Thread Functions. +-* pthread_getspecific: (libc)Thread-Specific Data. +-* pthread_join: (libc)Basic Thread Operations. +-* pthread_key_create: (libc)Thread-Specific Data. +-* pthread_key_delete: (libc)Thread-Specific Data. +-* pthread_kill: (libc)Threads and Signal Handling. +-* pthread_kill_other_threads_np: (libc)Miscellaneous Thread Functions. +-* pthread_mutex_destroy: (libc)Mutexes. +-* pthread_mutex_init: (libc)Mutexes. +-* pthread_mutex_lock: (libc)Mutexes. +-* pthread_mutex_timedlock: (libc)Mutexes. +-* pthread_mutex_trylock: (libc)Mutexes. +-* pthread_mutex_unlock: (libc)Mutexes. +-* pthread_mutexattr_destroy: (libc)Mutexes. +-* pthread_mutexattr_gettype: (libc)Mutexes. +-* pthread_mutexattr_init: (libc)Mutexes. +-* pthread_mutexattr_settype: (libc)Mutexes. +-* pthread_once: (libc)Miscellaneous Thread Functions. +-* pthread_self: (libc)Miscellaneous Thread Functions. +-* pthread_setcancelstate: (libc)Cancellation. +-* pthread_setcanceltype: (libc)Cancellation. +-* pthread_setconcurrency: (libc)Miscellaneous Thread Functions. +-* pthread_setschedparam: (libc)Miscellaneous Thread Functions. +-* pthread_setspecific: (libc)Thread-Specific Data. +-* pthread_sigmask: (libc)Threads and Signal Handling. +-* pthread_testcancel: (libc)Cancellation. +-* ptsname: (libc)Allocation. +-* ptsname_r: (libc)Allocation. +-* putc: (libc)Simple Output. +-* putc_unlocked: (libc)Simple Output. +-* putchar: (libc)Simple Output. +-* putchar_unlocked: (libc)Simple Output. +-* putenv: (libc)Environment Access. +-* putpwent: (libc)Writing a User Entry. +-* puts: (libc)Simple Output. +-* pututline: (libc)Manipulating the Database. +-* pututxline: (libc)XPG Functions. +-* putw: (libc)Simple Output. +-* putwc: (libc)Simple Output. +-* putwc_unlocked: (libc)Simple Output. +-* putwchar: (libc)Simple Output. +-* putwchar_unlocked: (libc)Simple Output. +-* pwrite64: (libc)I/O Primitives. +-* pwrite: (libc)I/O Primitives. +-* qecvt: (libc)System V Number Conversion. +-* qecvt_r: (libc)System V Number Conversion. +-* qfcvt: (libc)System V Number Conversion. +-* qfcvt_r: (libc)System V Number Conversion. +-* qgcvt: (libc)System V Number Conversion. +-* qsort: (libc)Array Sort Function. +-* raise: (libc)Signaling Yourself. +-* rand: (libc)ISO Random. +-* rand_r: (libc)ISO Random. +-* random: (libc)BSD Random. +-* random_r: (libc)BSD Random. +-* rawmemchr: (libc)Search Functions. +-* read: (libc)I/O Primitives. +-* readdir64: (libc)Reading/Closing Directory. +-* readdir64_r: (libc)Reading/Closing Directory. +-* readdir: (libc)Reading/Closing Directory. +-* readdir_r: (libc)Reading/Closing Directory. +-* readlink: (libc)Symbolic Links. +-* readv: (libc)Scatter-Gather. +-* realloc: (libc)Changing Block Size. +-* realpath: (libc)Symbolic Links. +-* recv: (libc)Receiving Data. +-* recvfrom: (libc)Receiving Datagrams. +-* recvmsg: (libc)Receiving Datagrams. +-* regcomp: (libc)POSIX Regexp Compilation. +-* regerror: (libc)Regexp Cleanup. +-* regexec: (libc)Matching POSIX Regexps. +-* regfree: (libc)Regexp Cleanup. +-* register_printf_function: (libc)Registering New Conversions. +-* remainder: (libc)Remainder Functions. +-* remainderf: (libc)Remainder Functions. +-* remainderl: (libc)Remainder Functions. +-* remove: (libc)Deleting Files. +-* rename: (libc)Renaming Files. +-* rewind: (libc)File Positioning. +-* rewinddir: (libc)Random Access Directory. +-* rindex: (libc)Search Functions. +-* rint: (libc)Rounding Functions. +-* rintf: (libc)Rounding Functions. +-* rintl: (libc)Rounding Functions. +-* rmdir: (libc)Deleting Files. +-* round: (libc)Rounding Functions. +-* roundf: (libc)Rounding Functions. +-* roundl: (libc)Rounding Functions. +-* rpmatch: (libc)Yes-or-No Questions. +-* sbrk: (libc)Resizing the Data Segment. +-* scalb: (libc)Normalization Functions. +-* scalbf: (libc)Normalization Functions. +-* scalbl: (libc)Normalization Functions. +-* scalbln: (libc)Normalization Functions. +-* scalblnf: (libc)Normalization Functions. +-* scalblnl: (libc)Normalization Functions. +-* scalbn: (libc)Normalization Functions. +-* scalbnf: (libc)Normalization Functions. +-* scalbnl: (libc)Normalization Functions. +-* scandir64: (libc)Scanning Directory Content. +-* scandir: (libc)Scanning Directory Content. +-* scanf: (libc)Formatted Input Functions. +-* sched_get_priority_max: (libc)Basic Scheduling Functions. +-* sched_get_priority_min: (libc)Basic Scheduling Functions. +-* sched_getparam: (libc)Basic Scheduling Functions. +-* sched_getscheduler: (libc)Basic Scheduling Functions. +-* sched_rr_get_interval: (libc)Basic Scheduling Functions. +-* sched_setparam: (libc)Basic Scheduling Functions. +-* sched_setscheduler: (libc)Basic Scheduling Functions. +-* sched_yield: (libc)Basic Scheduling Functions. +-* seed48: (libc)SVID Random. +-* seed48_r: (libc)SVID Random. +-* seekdir: (libc)Random Access Directory. +-* select: (libc)Waiting for I/O. +-* sem_destroy: (libc)POSIX Semaphores. +-* sem_getvalue: (libc)POSIX Semaphores. +-* sem_init: (libc)POSIX Semaphores. +-* sem_post: (libc)POSIX Semaphores. +-* sem_trywait: (libc)POSIX Semaphores. +-* sem_wait: (libc)POSIX Semaphores. +-* send: (libc)Sending Data. +-* sendmsg: (libc)Receiving Datagrams. +-* sendto: (libc)Sending Datagrams. +-* setbuf: (libc)Controlling Buffering. +-* setbuffer: (libc)Controlling Buffering. +-* setcontext: (libc)System V contexts. +-* setdomainname: (libc)Host Identification. +-* setegid: (libc)Setting Groups. +-* setenv: (libc)Environment Access. +-* seteuid: (libc)Setting User ID. +-* setfsent: (libc)fstab. +-* setgid: (libc)Setting Groups. +-* setgrent: (libc)Scanning All Groups. +-* setgroups: (libc)Setting Groups. +-* sethostent: (libc)Host Names. +-* sethostid: (libc)Host Identification. +-* sethostname: (libc)Host Identification. +-* setitimer: (libc)Setting an Alarm. +-* setjmp: (libc)Non-Local Details. +-* setkey: (libc)DES Encryption. +-* setkey_r: (libc)DES Encryption. +-* setlinebuf: (libc)Controlling Buffering. +-* setlocale: (libc)Setting the Locale. +-* setlogmask: (libc)setlogmask. +-* setmntent: (libc)mtab. +-* setnetent: (libc)Networks Database. +-* setnetgrent: (libc)Lookup Netgroup. +-* setpgid: (libc)Process Group Functions. +-* setpgrp: (libc)Process Group Functions. +-* setpriority: (libc)Traditional Scheduling Functions. +-* setprotoent: (libc)Protocols Database. +-* setpwent: (libc)Scanning All Users. +-* setregid: (libc)Setting Groups. +-* setreuid: (libc)Setting User ID. +-* setrlimit64: (libc)Limits on Resources. +-* setrlimit: (libc)Limits on Resources. +-* setservent: (libc)Services Database. +-* setsid: (libc)Process Group Functions. +-* setsockopt: (libc)Socket Option Functions. +-* setstate: (libc)BSD Random. +-* setstate_r: (libc)BSD Random. +-* settimeofday: (libc)High-Resolution Calendar. +-* setuid: (libc)Setting User ID. +-* setutent: (libc)Manipulating the Database. +-* setutxent: (libc)XPG Functions. +-* setvbuf: (libc)Controlling Buffering. +-* shutdown: (libc)Closing a Socket. +-* sigaction: (libc)Advanced Signal Handling. +-* sigaddset: (libc)Signal Sets. +-* sigaltstack: (libc)Signal Stack. +-* sigblock: (libc)Blocking in BSD. +-* sigdelset: (libc)Signal Sets. +-* sigemptyset: (libc)Signal Sets. +-* sigfillset: (libc)Signal Sets. +-* siginterrupt: (libc)BSD Handler. +-* sigismember: (libc)Signal Sets. +-* siglongjmp: (libc)Non-Local Exits and Signals. +-* sigmask: (libc)Blocking in BSD. +-* signal: (libc)Basic Signal Handling. +-* signbit: (libc)FP Bit Twiddling. +-* significand: (libc)Normalization Functions. +-* significandf: (libc)Normalization Functions. +-* significandl: (libc)Normalization Functions. +-* sigpause: (libc)Blocking in BSD. +-* sigpending: (libc)Checking for Pending Signals. +-* sigprocmask: (libc)Process Signal Mask. +-* sigsetjmp: (libc)Non-Local Exits and Signals. +-* sigsetmask: (libc)Blocking in BSD. +-* sigstack: (libc)Signal Stack. +-* sigsuspend: (libc)Sigsuspend. +-* sigvec: (libc)BSD Handler. +-* sigwait: (libc)Threads and Signal Handling. +-* sin: (libc)Trig Functions. +-* sincos: (libc)Trig Functions. +-* sincosf: (libc)Trig Functions. +-* sincosl: (libc)Trig Functions. +-* sinf: (libc)Trig Functions. +-* sinh: (libc)Hyperbolic Functions. +-* sinhf: (libc)Hyperbolic Functions. +-* sinhl: (libc)Hyperbolic Functions. +-* sinl: (libc)Trig Functions. +-* sleep: (libc)Sleeping. +-* snprintf: (libc)Formatted Output Functions. +-* socket: (libc)Creating a Socket. +-* socketpair: (libc)Socket Pairs. +-* sprintf: (libc)Formatted Output Functions. +-* sqrt: (libc)Exponents and Logarithms. +-* sqrtf: (libc)Exponents and Logarithms. +-* sqrtl: (libc)Exponents and Logarithms. +-* srand48: (libc)SVID Random. +-* srand48_r: (libc)SVID Random. +-* srand: (libc)ISO Random. +-* srandom: (libc)BSD Random. +-* srandom_r: (libc)BSD Random. +-* sscanf: (libc)Formatted Input Functions. +-* ssignal: (libc)Basic Signal Handling. +-* stat64: (libc)Reading Attributes. +-* stat: (libc)Reading Attributes. +-* stime: (libc)Simple Calendar Time. +-* stpcpy: (libc)Copying and Concatenation. +-* stpncpy: (libc)Copying and Concatenation. +-* strcasecmp: (libc)String/Array Comparison. +-* strcasestr: (libc)Search Functions. +-* strcat: (libc)Copying and Concatenation. +-* strchr: (libc)Search Functions. +-* strchrnul: (libc)Search Functions. +-* strcmp: (libc)String/Array Comparison. +-* strcoll: (libc)Collation Functions. +-* strcpy: (libc)Copying and Concatenation. +-* strcspn: (libc)Search Functions. +-* strdup: (libc)Copying and Concatenation. +-* strdupa: (libc)Copying and Concatenation. +-* strerror: (libc)Error Messages. +-* strerror_r: (libc)Error Messages. +-* strfmon: (libc)Formatting Numbers. +-* strfry: (libc)strfry. +-* strftime: (libc)Formatting Calendar Time. +-* strlen: (libc)String Length. +-* strncasecmp: (libc)String/Array Comparison. +-* strncat: (libc)Copying and Concatenation. +-* strncmp: (libc)String/Array Comparison. +-* strncpy: (libc)Copying and Concatenation. +-* strndup: (libc)Copying and Concatenation. +-* strndupa: (libc)Copying and Concatenation. +-* strnlen: (libc)String Length. +-* strpbrk: (libc)Search Functions. +-* strptime: (libc)Low-Level Time String Parsing. +-* strrchr: (libc)Search Functions. +-* strsep: (libc)Finding Tokens in a String. +-* strsignal: (libc)Signal Messages. +-* strspn: (libc)Search Functions. +-* strstr: (libc)Search Functions. +-* strtod: (libc)Parsing of Floats. +-* strtof: (libc)Parsing of Floats. +-* strtoimax: (libc)Parsing of Integers. +-* strtok: (libc)Finding Tokens in a String. +-* strtok_r: (libc)Finding Tokens in a String. +-* strtol: (libc)Parsing of Integers. +-* strtold: (libc)Parsing of Floats. +-* strtoll: (libc)Parsing of Integers. +-* strtoq: (libc)Parsing of Integers. +-* strtoul: (libc)Parsing of Integers. +-* strtoull: (libc)Parsing of Integers. +-* strtoumax: (libc)Parsing of Integers. +-* strtouq: (libc)Parsing of Integers. +-* strverscmp: (libc)String/Array Comparison. +-* strxfrm: (libc)Collation Functions. +-* stty: (libc)BSD Terminal Modes. +-* swapcontext: (libc)System V contexts. +-* swprintf: (libc)Formatted Output Functions. +-* swscanf: (libc)Formatted Input Functions. +-* symlink: (libc)Symbolic Links. +-* sync: (libc)Synchronizing I/O. +-* syscall: (libc)System Calls. +-* sysconf: (libc)Sysconf Definition. +-* sysctl: (libc)System Parameters. +-* syslog: (libc)syslog; vsyslog. +-* system: (libc)Running a Command. +-* sysv_signal: (libc)Basic Signal Handling. +-* tan: (libc)Trig Functions. +-* tanf: (libc)Trig Functions. +-* tanh: (libc)Hyperbolic Functions. +-* tanhf: (libc)Hyperbolic Functions. +-* tanhl: (libc)Hyperbolic Functions. +-* tanl: (libc)Trig Functions. +-* tcdrain: (libc)Line Control. +-* tcflow: (libc)Line Control. +-* tcflush: (libc)Line Control. +-* tcgetattr: (libc)Mode Functions. +-* tcgetpgrp: (libc)Terminal Access Functions. +-* tcgetsid: (libc)Terminal Access Functions. +-* tcsendbreak: (libc)Line Control. +-* tcsetattr: (libc)Mode Functions. +-* tcsetpgrp: (libc)Terminal Access Functions. +-* tdelete: (libc)Tree Search Function. +-* tdestroy: (libc)Tree Search Function. +-* telldir: (libc)Random Access Directory. +-* tempnam: (libc)Temporary Files. +-* textdomain: (libc)Locating gettext catalog. +-* tfind: (libc)Tree Search Function. +-* tgamma: (libc)Special Functions. +-* tgammaf: (libc)Special Functions. +-* tgammal: (libc)Special Functions. +-* time: (libc)Simple Calendar Time. +-* timegm: (libc)Broken-down Time. +-* timelocal: (libc)Broken-down Time. +-* times: (libc)Processor Time. +-* tmpfile64: (libc)Temporary Files. +-* tmpfile: (libc)Temporary Files. +-* tmpnam: (libc)Temporary Files. +-* tmpnam_r: (libc)Temporary Files. +-* toascii: (libc)Case Conversion. +-* tolower: (libc)Case Conversion. +-* toupper: (libc)Case Conversion. +-* towctrans: (libc)Wide Character Case Conversion. +-* towlower: (libc)Wide Character Case Conversion. +-* towupper: (libc)Wide Character Case Conversion. +-* trunc: (libc)Rounding Functions. +-* truncate64: (libc)File Size. +-* truncate: (libc)File Size. +-* truncf: (libc)Rounding Functions. +-* truncl: (libc)Rounding Functions. +-* tsearch: (libc)Tree Search Function. +-* ttyname: (libc)Is It a Terminal. +-* ttyname_r: (libc)Is It a Terminal. +-* twalk: (libc)Tree Search Function. +-* tzset: (libc)Time Zone Functions. +-* ulimit: (libc)Limits on Resources. +-* umask: (libc)Setting Permissions. +-* umount2: (libc)Mount-Unmount-Remount. +-* umount: (libc)Mount-Unmount-Remount. +-* uname: (libc)Platform Type. +-* ungetc: (libc)How Unread. +-* ungetwc: (libc)How Unread. +-* unlink: (libc)Deleting Files. +-* unlockpt: (libc)Allocation. +-* unsetenv: (libc)Environment Access. +-* updwtmp: (libc)Manipulating the Database. +-* utime: (libc)File Times. +-* utimes: (libc)File Times. +-* utmpname: (libc)Manipulating the Database. +-* utmpxname: (libc)XPG Functions. +-* va_arg: (libc)Argument Macros. +-* va_end: (libc)Argument Macros. +-* va_start: (libc)Argument Macros. +-* va_start: (libc)Old Varargs. +-* valloc: (libc)Aligned Memory Blocks. +-* vasprintf: (libc)Variable Arguments Output. +-* verr: (libc)Error Messages. +-* verrx: (libc)Error Messages. +-* versionsort64: (libc)Scanning Directory Content. +-* versionsort: (libc)Scanning Directory Content. +-* vfork: (libc)Creating a Process. +-* vfprintf: (libc)Variable Arguments Output. +-* vfscanf: (libc)Variable Arguments Input. +-* vfwprintf: (libc)Variable Arguments Output. +-* vfwscanf: (libc)Variable Arguments Input. +-* vlimit: (libc)Limits on Resources. +-* vprintf: (libc)Variable Arguments Output. +-* vscanf: (libc)Variable Arguments Input. +-* vsnprintf: (libc)Variable Arguments Output. +-* vsprintf: (libc)Variable Arguments Output. +-* vsscanf: (libc)Variable Arguments Input. +-* vswprintf: (libc)Variable Arguments Output. +-* vswscanf: (libc)Variable Arguments Input. +-* vsyslog: (libc)syslog; vsyslog. +-* vtimes: (libc)Resource Usage. +-* vwarn: (libc)Error Messages. +-* vwarnx: (libc)Error Messages. +-* vwprintf: (libc)Variable Arguments Output. +-* vwscanf: (libc)Variable Arguments Input. +-* wait3: (libc)BSD Wait Functions. +-* wait4: (libc)Process Completion. +-* wait: (libc)Process Completion. +-* waitpid: (libc)Process Completion. +-* warn: (libc)Error Messages. +-* warnx: (libc)Error Messages. +-* wcpcpy: (libc)Copying and Concatenation. +-* wcpncpy: (libc)Copying and Concatenation. +-* wcrtomb: (libc)Converting a Character. +-* wcscasecmp: (libc)String/Array Comparison. +-* wcscat: (libc)Copying and Concatenation. +-* wcschr: (libc)Search Functions. +-* wcschrnul: (libc)Search Functions. +-* wcscmp: (libc)String/Array Comparison. +-* wcscoll: (libc)Collation Functions. +-* wcscpy: (libc)Copying and Concatenation. +-* wcscspn: (libc)Search Functions. +-* wcsdup: (libc)Copying and Concatenation. +-* wcsftime: (libc)Formatting Calendar Time. +-* wcslen: (libc)String Length. +-* wcsncasecmp: (libc)String/Array Comparison. +-* wcsncat: (libc)Copying and Concatenation. +-* wcsncmp: (libc)String/Array Comparison. +-* wcsncpy: (libc)Copying and Concatenation. +-* wcsnlen: (libc)String Length. +-* wcsnrtombs: (libc)Converting Strings. +-* wcspbrk: (libc)Search Functions. +-* wcsrchr: (libc)Search Functions. +-* wcsrtombs: (libc)Converting Strings. +-* wcsspn: (libc)Search Functions. +-* wcsstr: (libc)Search Functions. +-* wcstod: (libc)Parsing of Floats. +-* wcstof: (libc)Parsing of Floats. +-* wcstoimax: (libc)Parsing of Integers. +-* wcstok: (libc)Finding Tokens in a String. +-* wcstol: (libc)Parsing of Integers. +-* wcstold: (libc)Parsing of Floats. +-* wcstoll: (libc)Parsing of Integers. +-* wcstombs: (libc)Non-reentrant String Conversion. +-* wcstoq: (libc)Parsing of Integers. +-* wcstoul: (libc)Parsing of Integers. +-* wcstoull: (libc)Parsing of Integers. +-* wcstoumax: (libc)Parsing of Integers. +-* wcstouq: (libc)Parsing of Integers. +-* wcswcs: (libc)Search Functions. +-* wcsxfrm: (libc)Collation Functions. +-* wctob: (libc)Converting a Character. +-* wctomb: (libc)Non-reentrant Character Conversion. +-* wctrans: (libc)Wide Character Case Conversion. +-* wctype: (libc)Classification of Wide Characters. +-* wmemchr: (libc)Search Functions. +-* wmemcmp: (libc)String/Array Comparison. +-* wmemcpy: (libc)Copying and Concatenation. +-* wmemmove: (libc)Copying and Concatenation. +-* wmempcpy: (libc)Copying and Concatenation. +-* wmemset: (libc)Copying and Concatenation. +-* wordexp: (libc)Calling Wordexp. +-* wordfree: (libc)Calling Wordexp. +-* wprintf: (libc)Formatted Output Functions. +-* write: (libc)I/O Primitives. +-* writev: (libc)Scatter-Gather. +-* wscanf: (libc)Formatted Input Functions. +-* y0: (libc)Special Functions. +-* y0f: (libc)Special Functions. +-* y0l: (libc)Special Functions. +-* y1: (libc)Special Functions. +-* y1f: (libc)Special Functions. +-* y1l: (libc)Special Functions. +-* yn: (libc)Special Functions. +-* ynf: (libc)Special Functions. +-* ynl: (libc)Special Functions. +-* {(*__gconv_end_fct)}: (libc)glibc iconv Implementation. +-* {(*__gconv_fct)}: (libc)glibc iconv Implementation. +-* {(*__gconv_init_fct)}: (libc)glibc iconv Implementation. +-END-INFO-DIR-ENTRY +diff -u -udbrN glibc-2.3.2/manual/dir.c.texi glibc-2.3.2-200304020432/manual/dir.c.texi +--- glibc-2.3.2/manual/dir.c.texi Mon Nov 18 20:37:19 2002 ++++ glibc-2.3.2-200304020432/manual/dir.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,24 +0,0 @@ +-@group +-#include +-#include +-#include +-@end group +- +-int +-main (void) +-@{ +- DIR *dp; +- struct dirent *ep; +- +- dp = opendir ("./"); +- if (dp != NULL) +- @{ +- while (ep = readdir (dp)) +- puts (ep->d_name); +- (void) closedir (dp); +- @} +- else +- perror ("Couldn't open the directory"); +- +- return 0; +-@} +diff -u -udbrN glibc-2.3.2/manual/dir2.c.texi glibc-2.3.2-200304020432/manual/dir2.c.texi +--- glibc-2.3.2/manual/dir2.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/dir2.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,29 +0,0 @@ +-@group +-#include +-#include +-@end group +- +-static int +-one (struct dirent *unused) +-@{ +- return 1; +-@} +- +-int +-main (void) +-@{ +- struct dirent **eps; +- int n; +- +- n = scandir ("./", &eps, one, alphasort); +- if (n >= 0) +- @{ +- int cnt; +- for (cnt = 0; cnt < n; ++cnt) +- puts (eps[cnt]->d_name); +- @} +- else +- perror ("Couldn't open the directory"); +- +- return 0; +-@} +diff -u -udbrN glibc-2.3.2/manual/execinfo.c.texi glibc-2.3.2-200304020432/manual/execinfo.c.texi +--- glibc-2.3.2/manual/execinfo.c.texi Wed Jan 17 17:41:01 2001 ++++ glibc-2.3.2-200304020432/manual/execinfo.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,37 +0,0 @@ +-#include +-#include +-#include +- +-/* @r{Obtain a backtrace and print it to @code{stdout}.} */ +-void +-print_trace (void) +-@{ +- void *array[10]; +- size_t size; +- char **strings; +- size_t i; +- +- size = backtrace (array, 10); +- strings = backtrace_symbols (array, size); +- +- printf ("Obtained %zd stack frames.\n", size); +- +- for (i = 0; i < size; i++) +- printf ("%s\n", strings[i]); +- +- free (strings); +-@} +- +-/* @r{A dummy function to make the backtrace more interesting.} */ +-void +-dummy_function (void) +-@{ +- print_trace (); +-@} +- +-int +-main (void) +-@{ +- dummy_function (); +- return 0; +-@} +diff -u -udbrN glibc-2.3.2/manual/filecli.c.texi glibc-2.3.2-200304020432/manual/filecli.c.texi +--- glibc-2.3.2/manual/filecli.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/filecli.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,54 +0,0 @@ +-#include +-#include +-#include +-#include +-#include +-#include +- +-#define SERVER "/tmp/serversocket" +-#define CLIENT "/tmp/mysocket" +-#define MAXMSG 512 +-#define MESSAGE "Yow!!! Are we having fun yet?!?" +- +-int +-main (void) +-@{ +- extern int make_named_socket (const char *name); +- int sock; +- char message[MAXMSG]; +- struct sockaddr_un name; +- size_t size; +- int nbytes; +- +- /* @r{Make the socket.} */ +- sock = make_named_socket (CLIENT); +- +- /* @r{Initialize the server socket address.} */ +- name.sun_family = AF_LOCAL; +- strcpy (name.sun_path, SERVER); +- size = strlen (name.sun_path) + sizeof (name.sun_family); +- +- /* @r{Send the datagram.} */ +- nbytes = sendto (sock, MESSAGE, strlen (MESSAGE) + 1, 0, +- (struct sockaddr *) & name, size); +- if (nbytes < 0) +- @{ +- perror ("sendto (client)"); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Wait for a reply.} */ +- nbytes = recvfrom (sock, message, MAXMSG, 0, NULL, 0); +- if (nbytes < 0) +- @{ +- perror ("recfrom (client)"); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Print a diagnostic message.} */ +- fprintf (stderr, "Client: got message: %s\n", message); +- +- /* @r{Clean up.} */ +- remove (CLIENT); +- close (sock); +-@} +diff -u -udbrN glibc-2.3.2/manual/filesrv.c.texi glibc-2.3.2-200304020432/manual/filesrv.c.texi +--- glibc-2.3.2/manual/filesrv.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/filesrv.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,48 +0,0 @@ +-#include +-#include +-#include +-#include +-#include +- +-#define SERVER "/tmp/serversocket" +-#define MAXMSG 512 +- +-int +-main (void) +-@{ +- int sock; +- char message[MAXMSG]; +- struct sockaddr_un name; +- size_t size; +- int nbytes; +- +- /* @r{Remove the filename first, it's ok if the call fails} */ +- unlink (SERVER); +- +- /* @r{Make the socket, then loop endlessly.} */ +- sock = make_named_socket (SERVER); +- while (1) +- @{ +- /* @r{Wait for a datagram.} */ +- size = sizeof (name); +- nbytes = recvfrom (sock, message, MAXMSG, 0, +- (struct sockaddr *) & name, &size); +- if (nbytes < 0) +- @{ +- perror ("recfrom (server)"); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Give a diagnostic message.} */ +- fprintf (stderr, "Server: got message: %s\n", message); +- +- /* @r{Bounce the message back to the sender.} */ +- nbytes = sendto (sock, message, nbytes, 0, +- (struct sockaddr *) & name, size); +- if (nbytes < 0) +- @{ +- perror ("sendto (server)"); +- exit (EXIT_FAILURE); +- @} +- @} +-@} +diff -u -udbrN glibc-2.3.2/manual/fmtmsgexpl.c.texi glibc-2.3.2-200304020432/manual/fmtmsgexpl.c.texi +--- glibc-2.3.2/manual/fmtmsgexpl.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/fmtmsgexpl.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,12 +0,0 @@ +-#include +- +-int +-main (void) +-@{ +- addseverity (5, "NOTE2"); +- fmtmsg (MM_PRINT, "only1field", MM_INFO, "text2", "action2", "tag2"); +- fmtmsg (MM_PRINT, "UX:cat", 5, "invalid syntax", "refer to manual", +- "UX:cat:001"); +- fmtmsg (MM_PRINT, "label:foo", 6, "text", "action", "tag"); +- return 0; +-@} +diff -u -udbrN glibc-2.3.2/manual/genpass.c.texi glibc-2.3.2-200304020432/manual/genpass.c.texi +--- glibc-2.3.2/manual/genpass.c.texi Tue Apr 18 06:13:59 2000 ++++ glibc-2.3.2-200304020432/manual/genpass.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,32 +0,0 @@ +-#include +-#include +-#include +-#include +- +-int +-main(void) +-@{ +- unsigned long seed[2]; +- char salt[] = "$1$........"; +- const char *const seedchars = +- "./0123456789ABCDEFGHIJKLMNOPQRST" +- "UVWXYZabcdefghijklmnopqrstuvwxyz"; +- char *password; +- int i; +- +- /* @r{Generate a (not very) random seed. +- You should do it better than this...} */ +- seed[0] = time(NULL); +- seed[1] = getpid() ^ (seed[0] >> 14 & 0x30000); +- +- /* @r{Turn it into printable characters from `seedchars'.} */ +- for (i = 0; i < 8; i++) +- salt[3+i] = seedchars[(seed[i/5] >> (i%5)*6) & 0x3f]; +- +- /* @r{Read in the user's password and encrypt it.} */ +- password = crypt(getpass("Password:"), salt); +- +- /* @r{Print the results.} */ +- puts(password); +- return 0; +-@} +diff -u -udbrN glibc-2.3.2/manual/inetcli.c.texi glibc-2.3.2-200304020432/manual/inetcli.c.texi +--- glibc-2.3.2/manual/inetcli.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/inetcli.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,59 +0,0 @@ +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#define PORT 5555 +-#define MESSAGE "Yow!!! Are we having fun yet?!?" +-#define SERVERHOST "mescaline.gnu.org" +- +-void +-write_to_server (int filedes) +-@{ +- int nbytes; +- +- nbytes = write (filedes, MESSAGE, strlen (MESSAGE) + 1); +- if (nbytes < 0) +- @{ +- perror ("write"); +- exit (EXIT_FAILURE); +- @} +-@} +- +- +-int +-main (void) +-@{ +- extern void init_sockaddr (struct sockaddr_in *name, +- const char *hostname, +- uint16_t port); +- int sock; +- struct sockaddr_in servername; +- +- /* @r{Create the socket.} */ +- sock = socket (PF_INET, SOCK_STREAM, 0); +- if (sock < 0) +- @{ +- perror ("socket (client)"); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Connect to the server.} */ +- init_sockaddr (&servername, SERVERHOST, PORT); +- if (0 > connect (sock, +- (struct sockaddr *) &servername, +- sizeof (servername))) +- @{ +- perror ("connect (client)"); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Send data to the server.} */ +- write_to_server (sock); +- close (sock); +- exit (EXIT_SUCCESS); +-@} +diff -u -udbrN glibc-2.3.2/manual/inetsrv.c.texi glibc-2.3.2-200304020432/manual/inetsrv.c.texi +--- glibc-2.3.2/manual/inetsrv.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/inetsrv.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,103 +0,0 @@ +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#define PORT 5555 +-#define MAXMSG 512 +- +-int +-read_from_client (int filedes) +-@{ +- char buffer[MAXMSG]; +- int nbytes; +- +- nbytes = read (filedes, buffer, MAXMSG); +- if (nbytes < 0) +- @{ +- /* @r{Read error.} */ +- perror ("read"); +- exit (EXIT_FAILURE); +- @} +- else if (nbytes == 0) +- /* @r{End-of-file.} */ +- return -1; +- else +- @{ +- /* @r{Data read.} */ +- fprintf (stderr, "Server: got message: `%s'\n", buffer); +- return 0; +- @} +-@} +- +-int +-main (void) +-@{ +- extern int make_socket (uint16_t port); +- int sock; +- fd_set active_fd_set, read_fd_set; +- int i; +- struct sockaddr_in clientname; +- size_t size; +- +- /* @r{Create the socket and set it up to accept connections.} */ +- sock = make_socket (PORT); +- if (listen (sock, 1) < 0) +- @{ +- perror ("listen"); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Initialize the set of active sockets.} */ +- FD_ZERO (&active_fd_set); +- FD_SET (sock, &active_fd_set); +- +- while (1) +- @{ +- /* @r{Block until input arrives on one or more active sockets.} */ +- read_fd_set = active_fd_set; +- if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0) +- @{ +- perror ("select"); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Service all the sockets with input pending.} */ +- for (i = 0; i < FD_SETSIZE; ++i) +- if (FD_ISSET (i, &read_fd_set)) +- @{ +- if (i == sock) +- @{ +- /* @r{Connection request on original socket.} */ +- int new; +- size = sizeof (clientname); +- new = accept (sock, +- (struct sockaddr *) &clientname, +- &size); +- if (new < 0) +- @{ +- perror ("accept"); +- exit (EXIT_FAILURE); +- @} +- fprintf (stderr, +- "Server: connect from host %s, port %hd.\n", +- inet_ntoa (clientname.sin_addr), +- ntohs (clientname.sin_port)); +- FD_SET (new, &active_fd_set); +- @} +- else +- @{ +- /* @r{Data arriving on an already-connected socket.} */ +- if (read_from_client (i) < 0) +- @{ +- close (i); +- FD_CLR (i, &active_fd_set); +- @} +- @} +- @} +- @} +-@} +diff -u -udbrN glibc-2.3.2/manual/isockad.c.texi glibc-2.3.2-200304020432/manual/isockad.c.texi +--- glibc-2.3.2/manual/isockad.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/isockad.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,23 +0,0 @@ +-#include +-#include +-#include +-#include +-#include +- +-void +-init_sockaddr (struct sockaddr_in *name, +- const char *hostname, +- uint16_t port) +-@{ +- struct hostent *hostinfo; +- +- name->sin_family = AF_INET; +- name->sin_port = htons (port); +- hostinfo = gethostbyname (hostname); +- if (hostinfo == NULL) +- @{ +- fprintf (stderr, "Unknown host %s.\n", hostname); +- exit (EXIT_FAILURE); +- @} +- name->sin_addr = *(struct in_addr *) hostinfo->h_addr; +-@} +diff -u -udbrN glibc-2.3.2/manual/libc.cp glibc-2.3.2-200304020432/manual/libc.cp +--- glibc-2.3.2/manual/libc.cp Tue Feb 25 11:35:07 2003 ++++ glibc-2.3.2-200304020432/manual/libc.cp Thu Jan 1 01:00:00 1970 +@@ -1,1058 +0,0 @@ +-\entry{library}{1}{library} +-\entry{standards}{1}{standards} +-\entry{ISO C}{2}{ISO C} +-\entry{POSIX}{2}{POSIX} +-\entry{POSIX.1}{2}{POSIX.1} +-\entry{IEEE Std 1003.1}{2}{IEEE Std 1003.1} +-\entry{ISO/IEC 9945-1}{2}{ISO/IEC 9945-1} +-\entry{POSIX.2}{2}{POSIX.2} +-\entry{IEEE Std 1003.2}{2}{IEEE Std 1003.2} +-\entry{ISO/IEC 9945-2}{2}{ISO/IEC 9945-2} +-\entry{BSD Unix}{3}{BSD Unix} +-\entry{4.n BSD Unix}{3}{4.\var {n} BSD Unix} +-\entry{Berkeley Unix}{3}{Berkeley Unix} +-\entry{SunOS}{3}{SunOS} +-\entry{Unix, Berkeley}{3}{Unix, Berkeley} +-\entry{SVID}{3}{SVID} +-\entry{System V Unix}{3}{System V Unix} +-\entry{Unix, System V}{3}{Unix, System V} +-\entry{header files}{4}{header files} +-\entry{definition (compared to declaration)}{4}{definition (compared to declaration)} +-\entry{declaration (compared to definition)}{4}{declaration (compared to definition)} +-\entry{shadowing functions with macros}{5}{shadowing functions with macros} +-\entry{removing macros that shadow functions}{5}{removing macros that shadow functions} +-\entry{undefining macros that shadow functions}{5}{undefining macros that shadow functions} +-\entry{reserved names}{6}{reserved names} +-\entry{name space}{6}{name space} +-\entry{feature test macros}{7}{feature test macros} +-\entry{BSD compatibility library.}{8}{BSD compatibility library.} +-\entry{error reporting}{15}{error reporting} +-\entry{reporting errors}{15}{reporting errors} +-\entry{error codes}{15}{error codes} +-\entry{status codes}{15}{status codes} +-\entry{program name}{27}{program name} +-\entry{name of running program}{27}{name of running program} +-\entry{memory allocation}{31}{memory allocation} +-\entry{storage allocation}{31}{storage allocation} +-\entry{page frame}{31}{page frame} +-\entry{frame, real memory}{31}{frame, real memory} +-\entry{swap space}{31}{swap space} +-\entry{page, virtual memory}{31}{page, virtual memory} +-\entry{page fault}{31}{page fault} +-\entry{paging}{31}{paging} +-\entry{executable}{32}{executable} +-\entry{literals}{32}{literals} +-\entry{constants}{32}{constants} +-\entry{memory mapped I/O}{32}{memory mapped I/O} +-\entry{memory mapped file}{32}{memory mapped file} +-\entry{files, accessing}{32}{files, accessing} +-\entry{execing a program}{32}{execing a program} +-\entry{freeing memory}{32}{freeing memory} +-\entry{exiting a program}{32}{exiting a program} +-\entry{static memory allocation}{33}{static memory allocation} +-\entry{static storage class}{33}{static storage class} +-\entry{automatic memory allocation}{33}{automatic memory allocation} +-\entry{automatic storage class}{33}{automatic storage class} +-\entry{dynamic memory allocation}{33}{dynamic memory allocation} +-\entry{dynamic memory allocation}{33}{dynamic memory allocation} +-\entry{unconstrained memory allocation}{34}{unconstrained memory allocation} +-\entry{malloc function}{34}{\code {malloc} function} +-\entry{heap, dynamic allocation from}{34}{heap, dynamic allocation from} +-\entry{allocation of memory with malloc}{34}{allocation of memory with \code {malloc}} +-\entry{freeing memory allocated with malloc}{35}{freeing memory allocated with \code {malloc}} +-\entry{heap, freeing memory from}{35}{heap, freeing memory from} +-\entry{changing the size of a block (malloc)}{36}{changing the size of a block (\code {malloc})} +-\entry{efficiency and malloc}{37}{efficiency and \code {malloc}} +-\entry{page boundary}{38}{page boundary} +-\entry{alignment (with malloc)}{38}{alignment (with \code {malloc})} +-\entry{heap consistency checking}{39}{heap consistency checking} +-\entry{consistency checking, of heap}{39}{consistency checking, of heap} +-\entry{allocation hooks, for malloc}{41}{allocation hooks, for \code {malloc}} +-\entry{allocation statistics}{43}{allocation statistics} +-\entry{allocation debugging}{45}{allocation debugging} +-\entry{malloc debugger}{45}{malloc debugger} +-\entry{obstacks}{49}{obstacks} +-\entry{allocation (obstacks)}{51}{allocation (obstacks)} +-\entry{freeing (obstacks)}{52}{freeing (obstacks)} +-\entry{macros}{52}{macros} +-\entry{growing objects (in obstacks)}{53}{growing objects (in obstacks)} +-\entry{changing the size of a block (obstacks)}{53}{changing the size of a block (obstacks)} +-\entry{shrinking objects}{54}{shrinking objects} +-\entry{efficiency and obstacks}{55}{efficiency and obstacks} +-\entry{obstack status}{56}{obstack status} +-\entry{status of obstack}{56}{status of obstack} +-\entry{alignment (in obstacks)}{56}{alignment (in obstacks)} +-\entry{efficiency of chunks}{57}{efficiency of chunks} +-\entry{chunks}{57}{chunks} +-\entry{automatic freeing}{59}{automatic freeing} +-\entry{alloca function}{59}{\code {alloca} function} +-\entry{automatic storage with variable size}{59}{automatic storage with variable size} +-\entry{longjmp}{60}{longjmp} +-\entry{alloca disadvantages}{61}{\code {alloca} disadvantages} +-\entry{disadvantages of alloca}{61}{disadvantages of \code {alloca}} +-\entry{variable-sized arrays}{61}{variable-sized arrays} +-\entry{locking pages}{62}{locking pages} +-\entry{memory lock}{62}{memory lock} +-\entry{paging}{62}{paging} +-\entry{realtime processing}{62}{realtime processing} +-\entry{speed of execution}{62}{speed of execution} +-\entry{copy-on-write page fault}{63}{copy-on-write page fault} +-\entry{page fault, copy-on-write}{63}{page fault, copy-on-write} +-\entry{character testing}{67}{character testing} +-\entry{classification of characters}{67}{classification of characters} +-\entry{predicates on characters}{67}{predicates on characters} +-\entry{character predicates}{67}{character predicates} +-\entry{lower-case character}{67}{lower-case character} +-\entry{upper-case character}{67}{upper-case character} +-\entry{alphabetic character}{67}{alphabetic character} +-\entry{digit character}{67}{digit character} +-\entry{decimal digit character}{67}{decimal digit character} +-\entry{alphanumeric character}{68}{alphanumeric character} +-\entry{hexadecimal digit character}{68}{hexadecimal digit character} +-\entry{punctuation character}{68}{punctuation character} +-\entry{whitespace character}{68}{whitespace character} +-\entry{blank character}{68}{blank character} +-\entry{graphic character}{68}{graphic character} +-\entry{printing character}{68}{printing character} +-\entry{control character}{68}{control character} +-\entry{ASCII character}{68}{ASCII character} +-\entry{character case conversion}{69}{character case conversion} +-\entry{case conversion of characters}{69}{case conversion of characters} +-\entry{converting case of characters}{69}{converting case of characters} +-\entry{alphanumeric character}{70}{alphanumeric character} +-\entry{alphabetic character}{70}{alphabetic character} +-\entry{control character}{71}{control character} +-\entry{digit character}{71}{digit character} +-\entry{graphic character}{71}{graphic character} +-\entry{lower-case character}{71}{lower-case character} +-\entry{printing character}{71}{printing character} +-\entry{punctuation character}{72}{punctuation character} +-\entry{whitespace character}{72}{whitespace character} +-\entry{upper-case character}{72}{upper-case character} +-\entry{hexadecimal digit character}{72}{hexadecimal digit character} +-\entry{blank character}{72}{blank character} +-\entry{string, representation of}{75}{string, representation of} +-\entry{string}{75}{string} +-\entry{multibyte character string}{75}{multibyte character string} +-\entry{wide character string}{75}{wide character string} +-\entry{null character}{75}{null character} +-\entry{null wide character}{75}{null wide character} +-\entry{string literal}{75}{string literal} +-\entry{length of string}{76}{length of string} +-\entry{allocation size of string}{76}{allocation size of string} +-\entry{size of string}{76}{size of string} +-\entry{string length}{76}{string length} +-\entry{string allocation}{76}{string allocation} +-\entry{single-byte string}{76}{single-byte string} +-\entry{multibyte string}{76}{multibyte string} +-\entry{wide character string}{76}{wide character string} +-\entry{wint_t}{77}{wint_t} +-\entry{parameter promotion}{77}{parameter promotion} +-\entry{copying strings and arrays}{79}{copying strings and arrays} +-\entry{string copy functions}{79}{string copy functions} +-\entry{array copy functions}{79}{array copy functions} +-\entry{concatenating strings}{79}{concatenating strings} +-\entry{string concatenation functions}{79}{string concatenation functions} +-\entry{__va_copy}{85}{__va_copy} +-\entry{va_copy}{85}{va_copy} +-\entry{comparing strings and arrays}{89}{comparing strings and arrays} +-\entry{string comparison functions}{89}{string comparison functions} +-\entry{array comparison functions}{89}{array comparison functions} +-\entry{predicates on strings}{89}{predicates on strings} +-\entry{predicates on arrays}{89}{predicates on arrays} +-\entry{collating strings}{92}{collating strings} +-\entry{string collation functions}{92}{string collation functions} +-\entry{converting string to collation order}{93}{converting string to collation order} +-\entry{search functions (for strings)}{96}{search functions (for strings)} +-\entry{string search functions}{96}{string search functions} +-\entry{tokenizing strings}{100}{tokenizing strings} +-\entry{breaking a string into tokens}{100}{breaking a string into tokens} +-\entry{parsing tokens from a string}{100}{parsing tokens from a string} +-\entry{encryption}{105}{encryption} +-\entry{Rot13}{105}{Rot13} +-\entry{argz vectors (string vectors)}{107}{argz vectors (string vectors)} +-\entry{string vectors, null-character separated}{107}{string vectors, null-character separated} +-\entry{argument vectors, null-character separated}{107}{argument vectors, null-character separated} +-\entry{envz vectors (environment vectors)}{107}{envz vectors (environment vectors)} +-\entry{environment vectors, null-character separated}{107}{environment vectors, null-character separated} +-\entry{internal representation}{111}{internal representation} +-\entry{wide character}{111}{wide character} +-\entry{Unicode}{111}{Unicode} +-\entry{ISO 10646}{111}{ISO 10646} +-\entry{UCS-2}{111}{UCS-2} +-\entry{UCS-4}{111}{UCS-4} +-\entry{UTF-8}{111}{UTF-8} +-\entry{UTF-16}{111}{UTF-16} +-\entry{multibyte character}{113}{multibyte character} +-\entry{EBCDIC}{113}{EBCDIC} +-\entry{ISO 2022}{113}{ISO 2022} +-\entry{EUC}{113}{EUC} +-\entry{Shift_JIS}{113}{Shift_JIS} +-\entry{SJIS}{113}{SJIS} +-\entry{ISO 6937}{114}{ISO 6937} +-\entry{UTF-8}{114}{UTF-8} +-\entry{UTF-7}{114}{UTF-7} +-\entry{stateful}{116}{stateful} +-\entry{shift state}{116}{shift state} +-\entry{stateful}{119}{stateful} +-\entry{stateful}{124}{stateful} +-\entry{stateful}{134}{stateful} +-\entry{stateful}{136}{stateful} +-\entry{triangulation}{139}{triangulation} +-\entry{ISO-2022-JP}{139}{ISO-2022-JP} +-\entry{EUC-JP}{139}{EUC-JP} +-\entry{stateful}{148}{stateful} +-\entry{internationalization}{153}{internationalization} +-\entry{locales}{153}{locales} +-\entry{combining locales}{154}{combining locales} +-\entry{categories for locales}{154}{categories for locales} +-\entry{locale categories}{154}{locale categories} +-\entry{changing the locale}{155}{changing the locale} +-\entry{locale, changing}{155}{locale, changing} +-\entry{monetary value formatting}{158}{monetary value formatting} +-\entry{numeric value formatting}{158}{numeric value formatting} +-\entry{decimal-point separator}{158}{decimal-point separator} +-\entry{grouping of digits}{158}{grouping of digits} +-\entry{currency symbols}{159}{currency symbols} +-\entry{NLSPATH environment variable}{172}{NLSPATH environment variable} +-\entry{LC_ALL environment variable}{173}{LC_ALL environment variable} +-\entry{LC_MESSAGES environment variable}{173}{LC_MESSAGES environment variable} +-\entry{LANG environment variable}{173}{LANG environment variable} +-\entry{gencat}{176}{gencat} +-\entry{sgettext}{190}{sgettext} +-\entry{sgettext}{190}{sgettext} +-\entry{Comparison Function}{195}{Comparison Function} +-\entry{search function (for arrays)}{195}{search function (for arrays)} +-\entry{binary search function (for arrays)}{195}{binary search function (for arrays)} +-\entry{array search function}{195}{array search function} +-\entry{sort function (for arrays)}{196}{sort function (for arrays)} +-\entry{quick sort function (for arrays)}{196}{quick sort function (for arrays)} +-\entry{array sort function}{196}{array sort function} +-\entry{stable sorting}{196}{stable sorting} +-\entry{Kermit the frog}{199}{Kermit the frog} +-\entry{Korn Shell}{206}{Korn Shell} +-\entry{globbing}{206}{globbing} +-\entry{word expansion}{218}{word expansion} +-\entry{expansion of shell words}{218}{expansion of shell words} +-\entry{tilde expansion}{219}{tilde expansion} +-\entry{variable substitution}{219}{variable substitution} +-\entry{substitution of variables and commands}{219}{substitution of variables and commands} +-\entry{command substitution}{219}{command substitution} +-\entry{arithmetic expansion}{219}{arithmetic expansion} +-\entry{field splitting}{219}{field splitting} +-\entry{wildcard expansion}{219}{wildcard expansion} +-\entry{quote removal}{219}{quote removal} +-\entry{removal of quotes}{219}{removal of quotes} +-\entry{opening a file}{225}{opening a file} +-\entry{file position}{226}{file position} +-\entry{sequential-access files}{226}{sequential-access files} +-\entry{random-access files}{226}{random-access files} +-\entry{append-access files}{227}{append-access files} +-\entry{file name}{227}{file name} +-\entry{directory}{227}{directory} +-\entry{link}{227}{link} +-\entry{directory entry}{227}{directory entry} +-\entry{file name component}{227}{file name component} +-\entry{file name resolution}{228}{file name resolution} +-\entry{root directory}{228}{root directory} +-\entry{absolute file name}{228}{absolute file name} +-\entry{relative file name}{228}{relative file name} +-\entry{parent directory}{228}{parent directory} +-\entry{file name errors}{229}{file name errors} +-\entry{usual file name errors}{229}{usual file name errors} +-\entry{file pointer}{231}{file pointer} +-\entry{standard streams}{231}{standard streams} +-\entry{streams, standard}{231}{streams, standard} +-\entry{standard input stream}{231}{standard input stream} +-\entry{standard output stream}{231}{standard output stream} +-\entry{standard error stream}{232}{standard error stream} +-\entry{opening a stream}{232}{opening a stream} +-\entry{stream orientation}{233}{stream orientation} +-\entry{orientation, stream}{233}{orientation, stream} +-\entry{closing a stream}{235}{closing a stream} +-\entry{threads}{236}{threads} +-\entry{multi-threaded application}{236}{multi-threaded application} +-\entry{C++ streams}{239}{C++ streams} +-\entry{streams, C++}{239}{streams, C++} +-\entry{orientation, stream}{240}{orientation, stream} +-\entry{stream orientation}{240}{stream orientation} +-\entry{writing to a stream, by characters}{241}{writing to a stream, by characters} +-\entry{reading from a stream, by characters}{243}{reading from a stream, by characters} +-\entry{peeking at input}{247}{peeking at input} +-\entry{unreading characters}{247}{unreading characters} +-\entry{pushing input back}{247}{pushing input back} +-\entry{binary I/O to a stream}{249}{binary I/O to a stream} +-\entry{block I/O to a stream}{249}{block I/O to a stream} +-\entry{reading from a stream, by blocks}{249}{reading from a stream, by blocks} +-\entry{writing to a stream, by blocks}{249}{writing to a stream, by blocks} +-\entry{format string, for printf}{250}{format string, for \code {printf}} +-\entry{template, for printf}{250}{template, for \code {printf}} +-\entry{formatted output to a stream}{250}{formatted output to a stream} +-\entry{writing to a stream, formatted}{250}{writing to a stream, formatted} +-\entry{conversion specifications (printf)}{250}{conversion specifications (\code {printf})} +-\entry{flag character (printf)}{252}{flag character (\code {printf})} +-\entry{minimum field width (printf)}{252}{minimum field width (\code {printf})} +-\entry{precision (printf)}{252}{precision (\code {printf})} +-\entry{type modifier character (printf)}{252}{type modifier character (\code {printf})} +-\entry{output conversions, for printf}{252}{output conversions, for \code {printf}} +-\entry{parsing a template string}{263}{parsing a template string} +-\entry{customizing printf}{266}{customizing \code {printf}} +-\entry{defining new printf conversions}{266}{defining new \code {printf} conversions} +-\entry{extending printf}{266}{extending \code {printf}} +-\entry{formatted input from a stream}{272}{formatted input from a stream} +-\entry{reading from a stream, formatted}{272}{reading from a stream, formatted} +-\entry{format string, for scanf}{272}{format string, for \code {scanf}} +-\entry{template, for scanf}{272}{template, for \code {scanf}} +-\entry{conversion specifications (scanf)}{272}{conversion specifications (\code {scanf})} +-\entry{matching failure, in scanf}{272}{matching failure, in \code {scanf}} +-\entry{flag character (scanf)}{273}{flag character (\code {scanf})} +-\entry{maximum field width (scanf)}{273}{maximum field width (\code {scanf})} +-\entry{type modifier character (scanf)}{273}{type modifier character (\code {scanf})} +-\entry{input conversions, for scanf}{274}{input conversions, for \code {scanf}} +-\entry{end of file, on a stream}{281}{end of file, on a stream} +-\entry{text stream}{283}{text stream} +-\entry{binary stream}{283}{binary stream} +-\entry{lines (in a text file)}{283}{lines (in a text file)} +-\entry{file positioning on a stream}{284}{file positioning on a stream} +-\entry{positioning a stream}{284}{positioning a stream} +-\entry{seeking on a stream}{284}{seeking on a stream} +-\entry{buffering of streams}{288}{buffering of streams} +-\entry{unbuffered stream}{288}{unbuffered stream} +-\entry{line buffered stream}{288}{line buffered stream} +-\entry{fully buffered stream}{288}{fully buffered stream} +-\entry{flushing a stream}{289}{flushing a stream} +-\entry{buffering, controlling}{290}{buffering, controlling} +-\entry{stream, for I/O to a string}{292}{stream, for I/O to a string} +-\entry{string stream}{292}{string stream} +-\entry{custom streams}{295}{custom streams} +-\entry{programming your own streams}{295}{programming your own streams} +-\entry{cookie, for custom stream}{295}{cookie, for custom stream} +-\entry{hook functions (of custom streams)}{296}{hook functions (of custom streams)} +-\entry{formatted messages}{297}{formatted messages} +-\entry{severity class}{298}{severity class} +-\entry{severity class}{300}{severity class} +-\entry{opening a file descriptor}{303}{opening a file descriptor} +-\entry{closing a file descriptor}{303}{closing a file descriptor} +-\entry{reading from a file descriptor}{306}{reading from a file descriptor} +-\entry{end-of-file, on a file descriptor}{306}{end-of-file, on a file descriptor} +-\entry{writing to a file descriptor}{308}{writing to a file descriptor} +-\entry{file positioning on a file descriptor}{310}{file positioning on a file descriptor} +-\entry{positioning a file descriptor}{310}{positioning a file descriptor} +-\entry{seeking on a file descriptor}{310}{seeking on a file descriptor} +-\entry{sparse files}{311}{sparse files} +-\entry{holes in files}{311}{holes in files} +-\entry{streams, and file descriptors}{313}{streams, and file descriptors} +-\entry{converting file descriptor to stream}{313}{converting file descriptor to stream} +-\entry{extracting file descriptor from stream}{313}{extracting file descriptor from stream} +-\entry{standard file descriptors}{313}{standard file descriptors} +-\entry{file descriptors, standard}{313}{file descriptors, standard} +-\entry{standard input file descriptor}{313}{standard input file descriptor} +-\entry{standard output file descriptor}{313}{standard output file descriptor} +-\entry{standard error file descriptor}{313}{standard error file descriptor} +-\entry{channels}{314}{channels} +-\entry{streams and descriptors}{314}{streams and descriptors} +-\entry{descriptors and streams}{314}{descriptors and streams} +-\entry{mixing descriptors and streams}{314}{mixing descriptors and streams} +-\entry{linked channels}{314}{linked channels} +-\entry{cleaning up a stream}{314}{cleaning up a stream} +-\entry{independent channels}{314}{independent channels} +-\entry{scatter-gather}{315}{scatter-gather} +-\entry{waiting for input or output}{321}{waiting for input or output} +-\entry{multiplexing input}{321}{multiplexing input} +-\entry{input from multiple files}{321}{input from multiple files} +-\entry{file descriptor sets, for select}{321}{file descriptor sets, for \code {select}} +-\entry{synchronizing}{323}{synchronizing} +-\entry{synchronizing}{332}{synchronizing} +-\entry{control operations on files}{336}{control operations on files} +-\entry{fcntl function}{336}{\code {fcntl} function} +-\entry{duplicating file descriptors}{337}{duplicating file descriptors} +-\entry{redirecting input and output}{337}{redirecting input and output} +-\entry{file descriptor flags}{339}{file descriptor flags} +-\entry{close-on-exec (file descriptor flag)}{339}{close-on-exec (file descriptor flag)} +-\entry{file status flags}{340}{file status flags} +-\entry{file name translation flags}{341}{file name translation flags} +-\entry{flags, file name translation}{341}{flags, file name translation} +-\entry{open-time action flags}{342}{open-time action flags} +-\entry{flags, open-time action}{342}{flags, open-time action} +-\entry{create on open (file status flag)}{342}{create on open (file status flag)} +-\entry{non-blocking open}{342}{non-blocking open} +-\entry{controlling terminal, setting}{342}{controlling terminal, setting} +-\entry{symbolic link, opening}{342}{symbolic link, opening} +-\entry{file locks}{345}{file locks} +-\entry{record locking}{345}{record locking} +-\entry{exclusive lock}{345}{exclusive lock} +-\entry{write lock}{345}{write lock} +-\entry{shared lock}{345}{shared lock} +-\entry{read lock}{345}{read lock} +-\entry{interrupt-driven input}{348}{interrupt-driven input} +-\entry{generic i/o control operations}{349}{generic i/o control operations} +-\entry{IOCTLs}{349}{IOCTLs} +-\entry{current working directory}{351}{current working directory} +-\entry{working directory}{351}{working directory} +-\entry{change working directory}{351}{change working directory} +-\entry{accessing directories}{353}{accessing directories} +-\entry{reading from a directory}{353}{reading from a directory} +-\entry{directories, accessing}{353}{directories, accessing} +-\entry{directory stream}{353}{directory stream} +-\entry{directory hierarchy}{360}{directory hierarchy} +-\entry{hierarchy, directory}{360}{hierarchy, directory} +-\entry{tree, directory}{360}{tree, directory} +-\entry{hard link}{363}{hard link} +-\entry{link, hard}{363}{link, hard} +-\entry{multiple names for one file}{363}{multiple names for one file} +-\entry{file names, multiple}{363}{file names, multiple} +-\entry{soft link}{364}{soft link} +-\entry{link, soft}{364}{link, soft} +-\entry{symbolic link}{364}{symbolic link} +-\entry{link, symbolic}{364}{link, symbolic} +-\entry{deleting a file}{367}{deleting a file} +-\entry{removing a file}{367}{removing a file} +-\entry{unlinking a file}{367}{unlinking a file} +-\entry{directories, deleting}{368}{directories, deleting} +-\entry{deleting a directory}{368}{deleting a directory} +-\entry{renaming a file}{368}{renaming a file} +-\entry{creating a directory}{369}{creating a directory} +-\entry{directories, creating}{369}{directories, creating} +-\entry{status of a file}{370}{status of a file} +-\entry{attributes of a file}{370}{attributes of a file} +-\entry{file attributes}{370}{file attributes} +-\entry{inode number}{373}{inode number} +-\entry{file owner}{377}{file owner} +-\entry{owner of a file}{377}{owner of a file} +-\entry{group owner of a file}{377}{group owner of a file} +-\entry{file permission bits}{378}{file permission bits} +-\entry{sticky bit}{379}{sticky bit} +-\entry{permission to access a file}{380}{permission to access a file} +-\entry{access permission for a file}{380}{access permission for a file} +-\entry{file access permission}{380}{file access permission} +-\entry{file creation mask}{380}{file creation mask} +-\entry{umask}{380}{umask} +-\entry{testing access permission}{382}{testing access permission} +-\entry{access, testing for}{382}{access, testing for} +-\entry{setuid programs and file access}{382}{setuid programs and file access} +-\entry{file access time}{383}{file access time} +-\entry{file modification time}{383}{file modification time} +-\entry{file attribute modification time}{383}{file attribute modification time} +-\entry{creating special files}{388}{creating special files} +-\entry{special files}{388}{special files} +-\entry{TMPDIR environment variable}{390}{TMPDIR environment variable} +-\entry{pipe}{393}{pipe} +-\entry{FIFO special file}{393}{FIFO special file} +-\entry{creating a pipe}{393}{creating a pipe} +-\entry{opening a pipe}{393}{opening a pipe} +-\entry{interprocess communication, with pipes}{393}{interprocess communication, with pipes} +-\entry{creating a pipe to a subprocess}{395}{creating a pipe to a subprocess} +-\entry{pipe to a subprocess}{395}{pipe to a subprocess} +-\entry{filtering i/o through subprocess}{395}{filtering i/o through subprocess} +-\entry{creating a FIFO special file}{396}{creating a FIFO special file} +-\entry{interprocess communication, with FIFO}{396}{interprocess communication, with FIFO} +-\entry{socket}{399}{socket} +-\entry{interprocess communication, with sockets}{399}{interprocess communication, with sockets} +-\entry{communication style (of a socket)}{399}{communication style (of a socket)} +-\entry{style of communication (of a socket)}{399}{style of communication (of a socket)} +-\entry{packet}{399}{packet} +-\entry{byte stream}{399}{byte stream} +-\entry{stream (sockets)}{399}{stream (sockets)} +-\entry{loss of data on sockets}{399}{loss of data on sockets} +-\entry{data loss on sockets}{399}{data loss on sockets} +-\entry{namespace (of socket)}{399}{namespace (of socket)} +-\entry{domain (of socket)}{399}{domain (of socket)} +-\entry{socket namespace}{399}{socket namespace} +-\entry{socket domain}{399}{socket domain} +-\entry{network protocol}{399}{network protocol} +-\entry{protocol (of socket)}{399}{protocol (of socket)} +-\entry{socket protocol}{399}{socket protocol} +-\entry{protocol family}{399}{protocol family} +-\entry{address of socket}{401}{address of socket} +-\entry{name of socket}{401}{name of socket} +-\entry{binding a socket address}{401}{binding a socket address} +-\entry{socket address (name) binding}{401}{socket address (name) binding} +-\entry{local namespace, for sockets}{405}{local namespace, for sockets} +-\entry{Internet namespace, for sockets}{407}{Internet namespace, for sockets} +-\entry{host address, Internet}{409}{host address, Internet} +-\entry{Internet host address}{409}{Internet host address} +-\entry{network number}{409}{network number} +-\entry{local network address number}{409}{local network address number} +-\entry{standard dot notation, for Internet addresses}{409}{standard dot notation, for Internet addresses} +-\entry{dot notation, for Internet addresses}{409}{dot notation, for Internet addresses} +-\entry{hosts database}{413}{hosts database} +-\entry{converting host name to address}{413}{converting host name to address} +-\entry{converting host address to name}{413}{converting host address to name} +-\entry{port number}{416}{port number} +-\entry{services database}{417}{services database} +-\entry{converting service name to port number}{417}{converting service name to port number} +-\entry{converting port number to service name}{417}{converting port number to service name} +-\entry{byte order conversion, for socket}{418}{byte order conversion, for socket} +-\entry{converting byte order}{418}{converting byte order} +-\entry{big-endian}{418}{big-endian} +-\entry{little-endian}{418}{little-endian} +-\entry{network byte order}{418}{network byte order} +-\entry{protocols database}{419}{protocols database} +-\entry{TCP (Internet protocol)}{419}{TCP (Internet protocol)} +-\entry{creating a socket}{422}{creating a socket} +-\entry{socket, creating}{422}{socket, creating} +-\entry{opening a socket}{422}{opening a socket} +-\entry{socket, closing}{422}{socket, closing} +-\entry{closing a socket}{422}{closing a socket} +-\entry{shutting down a socket}{422}{shutting down a socket} +-\entry{socket shutdown}{422}{socket shutdown} +-\entry{creating a socket pair}{423}{creating a socket pair} +-\entry{socket pair}{423}{socket pair} +-\entry{opening a socket pair}{423}{opening a socket pair} +-\entry{connection}{424}{connection} +-\entry{client}{424}{client} +-\entry{server}{424}{server} +-\entry{connecting a socket}{424}{connecting a socket} +-\entry{socket, connecting}{424}{socket, connecting} +-\entry{socket, initiating a connection}{424}{socket, initiating a connection} +-\entry{socket, client actions}{424}{socket, client actions} +-\entry{listening (sockets)}{425}{listening (sockets)} +-\entry{sockets, server actions}{425}{sockets, server actions} +-\entry{sockets, listening}{425}{sockets, listening} +-\entry{sockets, accepting connections}{426}{sockets, accepting connections} +-\entry{accepting connections}{426}{accepting connections} +-\entry{reading from a socket}{427}{reading from a socket} +-\entry{writing to a socket}{427}{writing to a socket} +-\entry{out-of-band data}{433}{out-of-band data} +-\entry{high-priority data}{433}{high-priority data} +-\entry{urgent socket condition}{433}{urgent socket condition} +-\entry{datagram socket}{435}{datagram socket} +-\entry{sending a datagram}{436}{sending a datagram} +-\entry{transmitting datagrams}{436}{transmitting datagrams} +-\entry{datagrams, transmitting}{436}{datagrams, transmitting} +-\entry{receiving datagrams}{436}{receiving datagrams} +-\entry{socket options}{441}{socket options} +-\entry{level, for socket options}{441}{level, for socket options} +-\entry{socket option level}{441}{socket option level} +-\entry{networks database}{443}{networks database} +-\entry{converting network number to network name}{443}{converting network number to network name} +-\entry{converting network name to network number}{443}{converting network name to network number} +-\entry{terminal identification}{445}{terminal identification} +-\entry{identifying terminals}{445}{identifying terminals} +-\entry{terminal input queue}{446}{terminal input queue} +-\entry{typeahead buffer}{446}{typeahead buffer} +-\entry{terminal output queue}{446}{terminal output queue} +-\entry{canonical input processing}{446}{canonical input processing} +-\entry{noncanonical input processing}{446}{noncanonical input processing} +-\entry{terminal mode data types}{447}{terminal mode data types} +-\entry{terminal mode functions}{448}{terminal mode functions} +-\entry{parity checking}{450}{parity checking} +-\entry{break condition, detecting}{451}{break condition, detecting} +-\entry{modem status lines}{453}{modem status lines} +-\entry{carrier detect}{453}{carrier detect} +-\entry{modem disconnect}{453}{modem disconnect} +-\entry{echo of terminal input}{455}{echo of terminal input} +-\entry{interactive signals, from terminal}{456}{interactive signals, from terminal} +-\entry{line speed}{457}{line speed} +-\entry{baud rate}{457}{baud rate} +-\entry{terminal line speed}{457}{terminal line speed} +-\entry{terminal line speed}{457}{terminal line speed} +-\entry{EOF character}{458}{EOF character} +-\entry{EOL character}{459}{EOL character} +-\entry{EOL2 character}{459}{EOL2 character} +-\entry{ERASE character}{459}{ERASE character} +-\entry{WERASE character}{459}{WERASE character} +-\entry{KILL character}{460}{KILL character} +-\entry{REPRINT character}{460}{REPRINT character} +-\entry{INTR character}{460}{INTR character} +-\entry{interrupt character}{460}{interrupt character} +-\entry{QUIT character}{460}{QUIT character} +-\entry{SUSP character}{460}{SUSP character} +-\entry{suspend character}{460}{suspend character} +-\entry{DSUSP character}{461}{DSUSP character} +-\entry{delayed suspend character}{461}{delayed suspend character} +-\entry{START character}{461}{START character} +-\entry{STOP character}{461}{STOP character} +-\entry{LNEXT character}{462}{LNEXT character} +-\entry{DISCARD character}{462}{DISCARD character} +-\entry{STATUS character}{462}{STATUS character} +-\entry{MIN termios slot}{463}{MIN termios slot} +-\entry{TIME termios slot}{463}{TIME termios slot} +-\entry{terminal modes, BSD}{464}{terminal modes, BSD} +-\entry{terminal line control functions}{465}{terminal line control functions} +-\entry{break condition, generating}{465}{break condition, generating} +-\entry{flushing terminal output queue}{465}{flushing terminal output queue} +-\entry{terminal output queue, flushing}{465}{terminal output queue, flushing} +-\entry{clearing terminal input queue}{465}{clearing terminal input queue} +-\entry{terminal input queue, clearing}{465}{terminal input queue, clearing} +-\entry{flow control, terminal}{466}{flow control, terminal} +-\entry{terminal flow control}{466}{terminal flow control} +-\entry{pseudo-terminals}{468}{pseudo-terminals} +-\entry{allocating pseudo-terminals}{468}{allocating pseudo-terminals} +-\entry{opening a pseudo-terminal pair}{470}{opening a pseudo-terminal pair} +-\entry{constants}{479}{constants} +-\entry{mathematical constants}{479}{mathematical constants} +-\entry{trigonometric functions}{480}{trigonometric functions} +-\entry{pi (trigonometric constant)}{480}{pi (trigonometric constant)} +-\entry{complex trigonometric functions}{481}{complex trigonometric functions} +-\entry{inverse trigonometric functions}{481}{inverse trigonometric functions} +-\entry{inverse complex trigonometric functions}{482}{inverse complex trigonometric functions} +-\entry{exponentiation functions}{483}{exponentiation functions} +-\entry{power functions}{483}{power functions} +-\entry{logarithm functions}{483}{logarithm functions} +-\entry{square root function}{485}{square root function} +-\entry{cube root function}{485}{cube root function} +-\entry{complex exponentiation functions}{485}{complex exponentiation functions} +-\entry{complex logarithm functions}{485}{complex logarithm functions} +-\entry{hyperbolic functions}{486}{hyperbolic functions} +-\entry{hyperbolic functions}{487}{hyperbolic functions} +-\entry{inverse hyperbolic functions}{487}{inverse hyperbolic functions} +-\entry{inverse complex hyperbolic functions}{487}{inverse complex hyperbolic functions} +-\entry{special functions}{488}{special functions} +-\entry{Bessel functions}{488}{Bessel functions} +-\entry{gamma function}{488}{gamma function} +-\entry{math errors}{490}{math errors} +-\entry{ulps}{490}{ulps} +-\entry{random numbers}{508}{random numbers} +-\entry{pseudo-random numbers}{508}{pseudo-random numbers} +-\entry{seed (for random numbers)}{508}{seed (for random numbers)} +-\entry{Optimization}{515}{Optimization} +-\entry{integer}{517}{integer} +-\entry{signedness}{517}{signedness} +-\entry{maximum possible integer}{518}{maximum possible integer} +-\entry{minimum possible integer}{518}{minimum possible integer} +-\entry{integer division functions}{518}{integer division functions} +-\entry{floating point}{520}{floating point} +-\entry{IEEE 754}{520}{IEEE 754} +-\entry{IEEE floating point}{520}{IEEE floating point} +-\entry{floating-point classes}{520}{floating-point classes} +-\entry{classes, floating-point}{520}{classes, floating-point} +-\entry{exception}{522}{exception} +-\entry{signal}{522}{signal} +-\entry{zero divide}{522}{zero divide} +-\entry{division by zero}{522}{division by zero} +-\entry{inexact exception}{522}{inexact exception} +-\entry{invalid exception}{522}{invalid exception} +-\entry{overflow exception}{522}{overflow exception} +-\entry{underflow exception}{522}{underflow exception} +-\entry{infinity}{524}{infinity} +-\entry{not a number}{524}{not a number} +-\entry{NaN}{524}{NaN} +-\entry{errors, mathematical}{526}{errors, mathematical} +-\entry{domain error}{526}{domain error} +-\entry{range error}{526}{range error} +-\entry{absolute value functions}{530}{absolute value functions} +-\entry{normalization functions (floating-point)}{531}{normalization functions (floating-point)} +-\entry{converting floats to integers}{532}{converting floats to integers} +-\entry{FP arithmetic}{535}{FP arithmetic} +-\entry{NaN}{536}{NaN} +-\entry{unordered comparison}{536}{unordered comparison} +-\entry{minimum}{537}{minimum} +-\entry{maximum}{537}{maximum} +-\entry{positive difference}{537}{positive difference} +-\entry{multiply-add}{537}{multiply-add} +-\entry{butterfly}{538}{butterfly} +-\entry{complex numbers}{538}{complex numbers} +-\entry{project complex numbers}{539}{project complex numbers} +-\entry{conjugate complex numbers}{539}{conjugate complex numbers} +-\entry{decompose complex numbers}{539}{decompose complex numbers} +-\entry{parsing numbers (in formatted input)}{539}{parsing numbers (in formatted input)} +-\entry{converting strings to numbers}{539}{converting strings to numbers} +-\entry{number syntax, parsing}{539}{number syntax, parsing} +-\entry{syntax, for reading numbers}{539}{syntax, for reading numbers} +-\entry{gcvt_r}{546}{gcvt_r} +-\entry{time}{549}{time} +-\entry{calendar time}{549}{calendar time} +-\entry{date}{549}{date} +-\entry{interval}{549}{interval} +-\entry{elapsed time}{549}{elapsed time} +-\entry{time, elapsed}{549}{time, elapsed} +-\entry{period of time}{549}{period of time} +-\entry{CPU time}{549}{CPU time} +-\entry{processor time}{549}{processor time} +-\entry{elapsed time}{549}{elapsed time} +-\entry{timeval}{550}{timeval} +-\entry{timespec}{550}{timespec} +-\entry{CPU time}{551}{CPU time} +-\entry{clock ticks}{551}{clock ticks} +-\entry{ticks, clock}{551}{ticks, clock} +-\entry{processor time}{552}{processor time} +-\entry{CPU time}{552}{CPU time} +-\entry{child process}{552}{child process} +-\entry{simple time}{553}{simple time} +-\entry{high-resolution time}{553}{high-resolution time} +-\entry{local time}{553}{local time} +-\entry{broken-down time}{553}{broken-down time} +-\entry{Gregorian calendar}{553}{Gregorian calendar} +-\entry{calendar, Gregorian}{553}{calendar, Gregorian} +-\entry{epoch}{553}{epoch} +-\entry{broken-down time}{556}{broken-down time} +-\entry{calendar time and broken-down time}{556}{calendar time and broken-down time} +-\entry{leap second}{556}{leap second} +-\entry{Daylight Saving Time}{557}{Daylight Saving Time} +-\entry{summer time}{557}{summer time} +-\entry{time, high precision}{559}{time, high precision} +-\entry{clock, high accuracy}{559}{clock, high accuracy} +-\entry{time zone}{575}{time zone} +-\entry{time zone database}{576}{time zone database} +-\entry{setting an alarm}{578}{setting an alarm} +-\entry{interval timer, setting}{578}{interval timer, setting} +-\entry{alarms, setting}{578}{alarms, setting} +-\entry{timers, setting}{578}{timers, setting} +-\entry{real-time timer}{578}{real-time timer} +-\entry{timer, real-time}{578}{timer, real-time} +-\entry{virtual timer}{578}{virtual timer} +-\entry{timer, virtual}{578}{timer, virtual} +-\entry{profiling timer}{578}{profiling timer} +-\entry{timer, profiling}{578}{timer, profiling} +-\entry{resource limits}{585}{resource limits} +-\entry{limits on resource usage}{585}{limits on resource usage} +-\entry{usage limits}{585}{usage limits} +-\entry{limit}{585}{limit} +-\entry{current limit}{585}{current limit} +-\entry{soft limit}{585}{soft limit} +-\entry{maximum limit}{585}{maximum limit} +-\entry{hard limit}{585}{hard limit} +-\entry{process priority}{589}{process priority} +-\entry{cpu priority}{589}{cpu priority} +-\entry{priority of a process}{589}{priority of a process} +-\entry{absolute priority}{589}{absolute priority} +-\entry{priority, absolute}{589}{priority, absolute} +-\entry{realtime CPU scheduling}{589}{realtime CPU scheduling} +-\entry{ready to run}{590}{ready to run} +-\entry{preemptive scheduling}{590}{preemptive scheduling} +-\entry{runnable process}{590}{runnable process} +-\entry{realtime scheduling}{591}{realtime scheduling} +-\entry{scheduling, traditional}{595}{scheduling, traditional} +-\entry{address space}{598}{address space} +-\entry{physical memory}{598}{physical memory} +-\entry{physical address}{598}{physical address} +-\entry{shared memory}{598}{shared memory} +-\entry{thrashing}{598}{thrashing} +-\entry{memory page}{598}{memory page} +-\entry{page, memory}{598}{page, memory} +-\entry{sysconf}{599}{sysconf} +-\entry{sysconf}{599}{sysconf} +-\entry{sysconf}{600}{sysconf} +-\entry{sysconf}{600}{sysconf} +-\entry{load average}{600}{load average} +-\entry{non-local exits}{601}{non-local exits} +-\entry{long jumps}{601}{long jumps} +-\entry{signal}{611}{signal} +-\entry{generation of signals}{612}{generation of signals} +-\entry{delivery of signals}{612}{delivery of signals} +-\entry{pending signals}{612}{pending signals} +-\entry{blocked signals}{612}{blocked signals} +-\entry{specified action (for a signal)}{612}{specified action (for a signal)} +-\entry{default action (for a signal)}{612}{default action (for a signal)} +-\entry{signal action}{612}{signal action} +-\entry{catching signals}{612}{catching signals} +-\entry{signal names}{613}{signal names} +-\entry{names of signals}{613}{names of signals} +-\entry{signal number}{613}{signal number} +-\entry{program error signals}{613}{program error signals} +-\entry{exception}{614}{exception} +-\entry{floating-point exception}{614}{floating-point exception} +-\entry{illegal instruction}{615}{illegal instruction} +-\entry{segmentation violation}{615}{segmentation violation} +-\entry{bus error}{616}{bus error} +-\entry{abort signal}{616}{abort signal} +-\entry{program termination signals}{616}{program termination signals} +-\entry{termination signal}{616}{termination signal} +-\entry{interrupt signal}{616}{interrupt signal} +-\entry{quit signal}{616}{quit signal} +-\entry{quit signal}{616}{quit signal} +-\entry{kill signal}{617}{kill signal} +-\entry{hangup signal}{617}{hangup signal} +-\entry{alarm signal}{617}{alarm signal} +-\entry{virtual time alarm signal}{618}{virtual time alarm signal} +-\entry{profiling alarm signal}{618}{profiling alarm signal} +-\entry{input available signal}{618}{input available signal} +-\entry{output possible signal}{618}{output possible signal} +-\entry{urgent data signal}{618}{urgent data signal} +-\entry{job control signals}{618}{job control signals} +-\entry{child process signal}{618}{child process signal} +-\entry{continue signal}{619}{continue signal} +-\entry{stop signal}{619}{stop signal} +-\entry{interactive stop signal}{619}{interactive stop signal} +-\entry{terminal input signal}{619}{terminal input signal} +-\entry{terminal output signal}{619}{terminal output signal} +-\entry{pipe signal}{620}{pipe signal} +-\entry{broken pipe signal}{620}{broken pipe signal} +-\entry{lost resource signal}{620}{lost resource signal} +-\entry{user signals}{621}{user signals} +-\entry{signal messages}{621}{signal messages} +-\entry{signal actions}{622}{signal actions} +-\entry{establishing a handler}{622}{establishing a handler} +-\entry{signal function}{622}{\code {signal} function} +-\entry{default action for a signal}{622}{default action for a signal} +-\entry{ignore action for a signal}{622}{ignore action for a signal} +-\entry{sigaction function}{624}{\code {sigaction} function} +-\entry{signal flags}{627}{signal flags} +-\entry{flags for sigaction}{627}{flags for \code {sigaction}} +-\entry{sigaction flags}{627}{\code {sigaction} flags} +-\entry{initial signal actions}{627}{initial signal actions} +-\entry{signal handler function}{628}{signal handler function} +-\entry{non-local exit, from signal handler}{630}{non-local exit, from signal handler} +-\entry{race conditions, relating to signals}{631}{race conditions, relating to signals} +-\entry{handling multiple signals}{632}{handling multiple signals} +-\entry{successive signals}{632}{successive signals} +-\entry{merging of signals}{632}{merging of signals} +-\entry{restrictions on signal handler functions}{634}{restrictions on signal handler functions} +-\entry{volatile declarations}{634}{\code {volatile} declarations} +-\entry{reentrant functions}{635}{reentrant functions} +-\entry{EINTR, and restarting interrupted primitives}{639}{EINTR, and restarting interrupted primitives} +-\entry{restarting interrupted primitives}{639}{restarting interrupted primitives} +-\entry{interrupting primitives}{639}{interrupting primitives} +-\entry{primitives, interrupting}{639}{primitives, interrupting} +-\entry{sending signals}{639}{sending signals} +-\entry{raising signals}{639}{raising signals} +-\entry{signals, generating}{639}{signals, generating} +-\entry{killing a process}{640}{killing a process} +-\entry{interprocess communication, with signals}{642}{interprocess communication, with signals} +-\entry{blocking signals}{643}{blocking signals} +-\entry{signal set}{644}{signal set} +-\entry{signal mask}{645}{signal mask} +-\entry{process signal mask}{645}{process signal mask} +-\entry{blocking signals, in a handler}{646}{blocking signals, in a handler} +-\entry{pending signals, checking for}{647}{pending signals, checking for} +-\entry{blocked signals, checking for}{647}{blocked signals, checking for} +-\entry{checking for pending signals}{647}{checking for pending signals} +-\entry{timing error in signal handling}{649}{timing error in signal handling} +-\entry{waiting for a signal}{650}{waiting for a signal} +-\entry{pause function}{650}{\code {pause} function} +-\entry{process}{657}{process} +-\entry{program}{657}{program} +-\entry{address space}{657}{address space} +-\entry{thread of control}{657}{thread of control} +-\entry{program arguments}{657}{program arguments} +-\entry{command line arguments}{657}{command line arguments} +-\entry{arguments, to program}{657}{arguments, to program} +-\entry{program startup}{657}{program startup} +-\entry{startup of program}{657}{startup of program} +-\entry{invocation of program}{657}{invocation of program} +-\entry{main function}{657}{\code {main} function} +-\entry{argc (program argument count)}{657}{argc (program argument count)} +-\entry{argv (program argument vector)}{657}{argv (program argument vector)} +-\entry{program argument syntax}{658}{program argument syntax} +-\entry{syntax, for program arguments}{658}{syntax, for program arguments} +-\entry{command argument syntax}{658}{command argument syntax} +-\entry{long-named options}{658}{long-named options} +-\entry{program arguments, parsing}{659}{program arguments, parsing} +-\entry{command arguments, parsing}{659}{command arguments, parsing} +-\entry{parsing program arguments}{659}{parsing program arguments} +-\entry{argp (program argument parser)}{666}{argp (program argument parser)} +-\entry{argument parsing with argp}{666}{argument parsing with argp} +-\entry{option parsing with argp}{666}{option parsing with argp} +-\entry{argp parser functions}{671}{argp parser functions} +-\entry{usage messages, in argp}{673}{usage messages, in argp} +-\entry{syntax error messages, in argp}{674}{syntax error messages, in argp} +-\entry{error messages, in argp}{674}{error messages, in argp} +-\entry{ARGP_HELP_FMT environment variable}{688}{ARGP_HELP_FMT environment variable} +-\entry{environment variable}{691}{environment variable} +-\entry{environment}{691}{environment} +-\entry{environment access}{691}{environment access} +-\entry{environment representation}{691}{environment representation} +-\entry{standard environment variables}{693}{standard environment variables} +-\entry{HOME environment variable}{693}{\code {HOME} environment variable} +-\entry{home directory}{693}{home directory} +-\entry{LOGNAME environment variable}{693}{\code {LOGNAME} environment variable} +-\entry{PATH environment variable}{693}{\code {PATH} environment variable} +-\entry{TERM environment variable}{694}{\code {TERM} environment variable} +-\entry{TZ environment variable}{694}{\code {TZ} environment variable} +-\entry{LANG environment variable}{694}{\code {LANG} environment variable} +-\entry{LC_ALL environment variable}{694}{\code {LC_ALL} environment variable} +-\entry{LC_COLLATE environment variable}{694}{\code {LC_COLLATE} environment variable} +-\entry{LC_CTYPE environment variable}{694}{\code {LC_CTYPE} environment variable} +-\entry{LC_MESSAGES environment variable}{694}{\code {LC_MESSAGES} environment variable} +-\entry{LC_MONETARY environment variable}{694}{\code {LC_MONETARY} environment variable} +-\entry{LC_NUMERIC environment variable}{694}{\code {LC_NUMERIC} environment variable} +-\entry{LC_TIME environment variable}{694}{\code {LC_TIME} environment variable} +-\entry{NLSPATH environment variable}{694}{\code {NLSPATH} environment variable} +-\entry{_POSIX_OPTION_ORDER environment variable.}{695}{\code {_POSIX_OPTION_ORDER} environment variable.} +-\entry{system call}{695}{system call} +-\entry{kernel call}{695}{kernel call} +-\entry{system call number}{695}{system call number} +-\entry{errno}{695}{errno} +-\entry{program termination}{696}{program termination} +-\entry{process termination}{696}{process termination} +-\entry{exit status value}{696}{exit status value} +-\entry{exit status}{697}{exit status} +-\entry{aborting a program}{699}{aborting a program} +-\entry{process}{701}{process} +-\entry{child process}{701}{child process} +-\entry{parent process}{701}{parent process} +-\entry{running a command}{701}{running a command} +-\entry{process ID}{702}{process ID} +-\entry{process lifetime}{702}{process lifetime} +-\entry{creating a process}{702}{creating a process} +-\entry{forking a process}{702}{forking a process} +-\entry{child process}{702}{child process} +-\entry{parent process}{702}{parent process} +-\entry{process image}{702}{process image} +-\entry{executing a file}{704}{executing a file} +-\entry{exec functions}{704}{\code {exec} functions} +-\entry{process completion}{706}{process completion} +-\entry{waiting for completion of child process}{706}{waiting for completion of child process} +-\entry{testing exit status of child process}{706}{testing exit status of child process} +-\entry{process groups}{713}{process groups} +-\entry{job control}{713}{job control} +-\entry{job}{713}{job} +-\entry{session}{713}{session} +-\entry{shell}{713}{shell} +-\entry{session}{713}{session} +-\entry{session leader}{713}{session leader} +-\entry{controlling terminal}{713}{controlling terminal} +-\entry{foreground job}{713}{foreground job} +-\entry{background job}{713}{background job} +-\entry{stopped job}{714}{stopped job} +-\entry{job control is optional}{714}{job control is optional} +-\entry{controlling process}{714}{controlling process} +-\entry{controlling terminal, access to}{714}{controlling terminal, access to} +-\entry{SIGTTIN, from background job}{714}{\code {SIGTTIN}, from background job} +-\entry{SIGTTOU, from background job}{715}{\code {SIGTTOU}, from background job} +-\entry{orphaned process group}{715}{orphaned process group} +-\entry{job control, enabling}{717}{job control, enabling} +-\entry{subshell}{717}{subshell} +-\entry{job control, enabling}{717}{job control, enabling} +-\entry{launching jobs}{718}{launching jobs} +-\entry{process group leader}{719}{process group leader} +-\entry{process group ID}{719}{process group ID} +-\entry{race conditions, relating to job control}{719}{race conditions, relating to job control} +-\entry{foreground job, launching}{722}{foreground job, launching} +-\entry{background job, launching}{722}{background job, launching} +-\entry{stopped jobs, detecting}{723}{stopped jobs, detecting} +-\entry{terminated jobs, detecting}{723}{terminated jobs, detecting} +-\entry{SIGCHLD, handling of}{723}{\code {SIGCHLD}, handling of} +-\entry{stopped jobs, continuing}{726}{stopped jobs, continuing} +-\entry{process group functions}{728}{process group functions} +-\entry{job control functions}{728}{job control functions} +-\entry{controlling terminal, determining}{728}{controlling terminal, determining} +-\entry{BSD compatibility library}{729}{BSD compatibility library} +-\entry{Name Service Switch}{733}{Name Service Switch} +-\entry{NSS}{733}{NSS} +-\entry{databases}{733}{databases} +-\entry{ethers}{733}{ethers} +-\entry{group}{733}{group} +-\entry{hosts}{733}{hosts} +-\entry{netgroup}{733}{netgroup} +-\entry{networks}{733}{networks} +-\entry{protocols}{733}{protocols} +-\entry{passwd}{733}{passwd} +-\entry{rpc}{733}{rpc} +-\entry{services}{733}{services} +-\entry{shadow}{733}{shadow} +-\entry{/etc/nsswitch.conf}{734}{\file {/etc/nsswitch.conf}} +-\entry{nsswitch.conf}{734}{\file {nsswitch.conf}} +-\entry{DNS server unavailable}{735}{DNS server unavailable} +-\entry{nisplus, and completeness}{735}{nisplus, and completeness} +-\entry{nisplus, and booting}{735}{nisplus, and booting} +-\entry{bootstrapping, and services}{735}{bootstrapping, and services} +-\entry{default value, and NSS}{736}{default value, and NSS} +-\entry{optimizing NSS}{736}{optimizing NSS} +-\entry{reentrant NSS functions}{737}{reentrant NSS functions} +-\entry{login name}{743}{login name} +-\entry{user name}{743}{user name} +-\entry{user ID}{743}{user ID} +-\entry{group name}{743}{group name} +-\entry{group ID}{743}{group ID} +-\entry{persona}{743}{persona} +-\entry{effective user ID}{743}{effective user ID} +-\entry{effective group ID}{743}{effective group ID} +-\entry{supplementary group IDs}{743}{supplementary group IDs} +-\entry{real user ID}{743}{real user ID} +-\entry{real group ID}{743}{real group ID} +-\entry{setuid programs}{744}{\code {setuid} programs} +-\entry{saved set-user-ID}{744}{saved set-user-ID} +-\entry{saved set-group-ID}{744}{saved set-group-ID} +-\entry{_POSIX_SAVED_IDS}{744}{\code {_POSIX_SAVED_IDS}} +-\entry{login name, determining}{753}{login name, determining} +-\entry{user ID, determining}{753}{user ID, determining} +-\entry{user accounting database}{753}{user accounting database} +-\entry{user database}{761}{user database} +-\entry{password database}{761}{password database} +-\entry{converting user ID to user name}{762}{converting user ID to user name} +-\entry{converting user name to user ID}{762}{converting user name to user ID} +-\entry{scanning the user list}{762}{scanning the user list} +-\entry{group database}{764}{group database} +-\entry{converting group name to group ID}{764}{converting group name to group ID} +-\entry{converting group ID to group name}{764}{converting group ID to group name} +-\entry{scanning the group list}{765}{scanning the group list} +-\entry{Netgroup}{767}{Netgroup} +-\entry{host name}{771}{host name} +-\entry{DNS}{771}{DNS} +-\entry{Domain Name System}{771}{Domain Name System} +-\entry{hostname}{771}{hostname} +-\entry{domain name}{771}{domain name} +-\entry{FQDN}{771}{FQDN} +-\entry{YP}{771}{YP} +-\entry{NIS}{771}{NIS} +-\entry{NIS domain name}{771}{NIS domain name} +-\entry{YP domain name}{771}{YP domain name} +-\entry{/etc/hostname}{772}{/etc/hostname} +-\entry{NIS domain name}{772}{NIS domain name} +-\entry{YP domain name}{772}{YP domain name} +-\entry{NIS domain name}{772}{NIS domain name} +-\entry{YP domain name}{772}{YP domain name} +-\entry{POSIX capacity limits}{787}{POSIX capacity limits} +-\entry{limits, POSIX}{787}{limits, POSIX} +-\entry{capacity limits, POSIX}{787}{capacity limits, POSIX} +-\entry{limits, program argument size}{787}{limits, program argument size} +-\entry{limits, number of processes}{787}{limits, number of processes} +-\entry{limits, number of open files}{787}{limits, number of open files} +-\entry{limits, time zone name length}{787}{limits, time zone name length} +-\entry{limits, number of supplementary group IDs}{787}{limits, number of supplementary group IDs} +-\entry{POSIX optional features}{788}{POSIX optional features} +-\entry{optional POSIX features}{788}{optional POSIX features} +-\entry{limits, link count of files}{799}{limits, link count of files} +-\entry{limits, terminal input queue}{799}{limits, terminal input queue} +-\entry{limits, file name length}{800}{limits, file name length} +-\entry{limits, pipe buffer size}{800}{limits, pipe buffer size} +-\entry{backtrace}{817}{backtrace} +-\entry{backtrace_symbols}{817}{backtrace_symbols} +-\entry{backtrace_fd}{817}{backtrace_fd} +-\entry{consistency checking}{841}{consistency checking} +-\entry{impossible events}{841}{impossible events} +-\entry{assertions}{841}{assertions} +-\entry{variable number of arguments}{842}{variable number of arguments} +-\entry{variadic functions}{842}{variadic functions} +-\entry{optional arguments}{842}{optional arguments} +-\entry{function prototypes (variadic)}{843}{function prototypes (variadic)} +-\entry{prototypes for variadic functions}{843}{prototypes for variadic functions} +-\entry{variadic function prototypes}{843}{variadic function prototypes} +-\entry{variadic function argument access}{844}{variadic function argument access} +-\entry{arguments (variadic functions)}{844}{arguments (variadic functions)} +-\entry{number of arguments passed}{844}{number of arguments passed} +-\entry{how many arguments}{844}{how many arguments} +-\entry{arguments, how many}{844}{arguments, how many} +-\entry{variadic functions, calling}{845}{variadic functions, calling} +-\entry{calling variadic functions}{845}{calling variadic functions} +-\entry{declaring variadic functions}{845}{declaring variadic functions} +-\entry{default argument promotions}{845}{default argument promotions} +-\entry{argument promotion}{845}{argument promotion} +-\entry{null pointer constant}{848}{null pointer constant} +-\entry{integer type width}{850}{integer type width} +-\entry{width of integer type}{850}{width of integer type} +-\entry{type measurements, integer}{850}{type measurements, integer} +-\entry{integer type range}{850}{integer type range} +-\entry{range of integer type}{850}{range of integer type} +-\entry{limits, integer types}{850}{limits, integer types} +-\entry{floating type measurements}{851}{floating type measurements} +-\entry{measurements of floating types}{851}{measurements of floating types} +-\entry{type measurements, floating}{851}{type measurements, floating} +-\entry{limits, floating types}{851}{limits, floating types} +-\entry{sign (of floating point number)}{852}{sign (of floating point number)} +-\entry{base (of floating point number)}{852}{base (of floating point number)} +-\entry{radix (of floating point number)}{852}{radix (of floating point number)} +-\entry{exponent (of floating point number)}{852}{exponent (of floating point number)} +-\entry{bias (of floating point number exponent)}{852}{bias (of floating point number exponent)} +-\entry{mantissa (of floating point number)}{852}{mantissa (of floating point number)} +-\entry{significand (of floating point number)}{852}{significand (of floating point number)} +-\entry{precision (of floating point number)}{852}{precision (of floating point number)} +-\entry{hidden bit (of floating point number mantissa)}{852}{hidden bit (of floating point number mantissa)} +-\entry{normalized floating point number}{852}{normalized floating point number} +-\entry{IEEE floating point representation}{856}{IEEE floating point representation} +-\entry{floating point, IEEE}{856}{floating point, IEEE} +-\entry{configuring}{993}{configuring} +-\entry{compiling}{993}{compiling} +-\entry{installing}{996}{installing} +-\entry{installation tools}{997}{installation tools} +-\entry{tools, for installing library}{997}{tools, for installing library} +-\entry{configurations, all supported}{998}{configurations, all supported} +-\entry{upgrading from libc5}{999}{upgrading from libc5} +-\entry{kernel header files}{999}{kernel header files} +-\entry{reporting bugs}{1000}{reporting bugs} +-\entry{bugs, reporting}{1000}{bugs, reporting} +-\entry{free documentation}{1015}{free documentation} +-\entry{LGPL, Lesser General Public License}{1017}{LGPL, Lesser General Public License} +-\entry{FDL, GNU Free Documentation License}{1027}{FDL, GNU Free Documentation License} +diff -u -udbrN glibc-2.3.2/manual/libc.cps glibc-2.3.2-200304020432/manual/libc.cps +--- glibc-2.3.2/manual/libc.cps Tue Feb 25 11:34:58 2003 ++++ glibc-2.3.2-200304020432/manual/libc.cps Thu Jan 1 01:00:00 1970 +@@ -1,1034 +0,0 @@ +-\initial {/} +-\entry {/etc/hostname}{772} +-\entry {\file {/etc/nsswitch.conf}}{734} +-\initial {_} +-\entry {__va_copy}{85} +-\entry {\code {_POSIX_OPTION_ORDER} environment variable.}{695} +-\entry {\code {_POSIX_SAVED_IDS}}{744} +-\initial {4} +-\entry {4.\var {n} BSD Unix}{3} +-\initial {A} +-\entry {abort signal}{616} +-\entry {aborting a program}{699} +-\entry {absolute file name}{228} +-\entry {absolute priority}{589} +-\entry {absolute value functions}{530} +-\entry {accepting connections}{426} +-\entry {access permission for a file}{380} +-\entry {access, testing for}{382} +-\entry {accessing directories}{353} +-\entry {address of socket}{401} +-\entry {address space}{598, 657} +-\entry {alarm signal}{617} +-\entry {alarms, setting}{578} +-\entry {alignment (in obstacks)}{56} +-\entry {alignment (with \code {malloc})}{38} +-\entry {\code {alloca} disadvantages}{61} +-\entry {\code {alloca} function}{59} +-\entry {allocating pseudo-terminals}{468} +-\entry {allocation (obstacks)}{51} +-\entry {allocation debugging}{45} +-\entry {allocation hooks, for \code {malloc}}{41} +-\entry {allocation of memory with \code {malloc}}{34} +-\entry {allocation size of string}{76} +-\entry {allocation statistics}{43} +-\entry {alphabetic character}{67, 70} +-\entry {alphanumeric character}{68, 70} +-\entry {append-access files}{227} +-\entry {argc (program argument count)}{657} +-\entry {argp (program argument parser)}{666} +-\entry {argp parser functions}{671} +-\entry {ARGP_HELP_FMT environment variable}{688} +-\entry {argument parsing with argp}{666} +-\entry {argument promotion}{845} +-\entry {argument vectors, null-character separated}{107} +-\entry {arguments (variadic functions)}{844} +-\entry {arguments, how many}{844} +-\entry {arguments, to program}{657} +-\entry {argv (program argument vector)}{657} +-\entry {argz vectors (string vectors)}{107} +-\entry {arithmetic expansion}{219} +-\entry {array comparison functions}{89} +-\entry {array copy functions}{79} +-\entry {array search function}{195} +-\entry {array sort function}{196} +-\entry {ASCII character}{68} +-\entry {assertions}{841} +-\entry {attributes of a file}{370} +-\entry {automatic freeing}{59} +-\entry {automatic memory allocation}{33} +-\entry {automatic storage class}{33} +-\entry {automatic storage with variable size}{59} +-\initial {B} +-\entry {background job}{713} +-\entry {background job, launching}{722} +-\entry {backtrace}{817} +-\entry {backtrace_fd}{817} +-\entry {backtrace_symbols}{817} +-\entry {base (of floating point number)}{852} +-\entry {baud rate}{457} +-\entry {Berkeley Unix}{3} +-\entry {Bessel functions}{488} +-\entry {bias (of floating point number exponent)}{852} +-\entry {big-endian}{418} +-\entry {binary I/O to a stream}{249} +-\entry {binary search function (for arrays)}{195} +-\entry {binary stream}{283} +-\entry {binding a socket address}{401} +-\entry {blank character}{68, 72} +-\entry {block I/O to a stream}{249} +-\entry {blocked signals}{612} +-\entry {blocked signals, checking for}{647} +-\entry {blocking signals}{643} +-\entry {blocking signals, in a handler}{646} +-\entry {bootstrapping, and services}{735} +-\entry {break condition, detecting}{451} +-\entry {break condition, generating}{465} +-\entry {breaking a string into tokens}{100} +-\entry {broken pipe signal}{620} +-\entry {broken-down time}{553, 556} +-\entry {BSD compatibility library}{729} +-\entry {BSD compatibility library.}{8} +-\entry {BSD Unix}{3} +-\entry {buffering of streams}{288} +-\entry {buffering, controlling}{290} +-\entry {bugs, reporting}{1000} +-\entry {bus error}{616} +-\entry {butterfly}{538} +-\entry {byte order conversion, for socket}{418} +-\entry {byte stream}{399} +-\initial {C} +-\entry {C++ streams}{239} +-\entry {calendar time}{549} +-\entry {calendar time and broken-down time}{556} +-\entry {calendar, Gregorian}{553} +-\entry {calling variadic functions}{845} +-\entry {canonical input processing}{446} +-\entry {capacity limits, POSIX}{787} +-\entry {carrier detect}{453} +-\entry {case conversion of characters}{69} +-\entry {catching signals}{612} +-\entry {categories for locales}{154} +-\entry {change working directory}{351} +-\entry {changing the locale}{155} +-\entry {changing the size of a block (\code {malloc})}{36} +-\entry {changing the size of a block (obstacks)}{53} +-\entry {channels}{314} +-\entry {character case conversion}{69} +-\entry {character predicates}{67} +-\entry {character testing}{67} +-\entry {checking for pending signals}{647} +-\entry {child process}{552, 701, 702} +-\entry {child process signal}{618} +-\entry {chunks}{57} +-\entry {classes, floating-point}{520} +-\entry {classification of characters}{67} +-\entry {cleaning up a stream}{314} +-\entry {clearing terminal input queue}{465} +-\entry {client}{424} +-\entry {clock ticks}{551} +-\entry {clock, high accuracy}{559} +-\entry {close-on-exec (file descriptor flag)}{339} +-\entry {closing a file descriptor}{303} +-\entry {closing a socket}{422} +-\entry {closing a stream}{235} +-\entry {collating strings}{92} +-\entry {combining locales}{154} +-\entry {command argument syntax}{658} +-\entry {command arguments, parsing}{659} +-\entry {command line arguments}{657} +-\entry {command substitution}{219} +-\entry {communication style (of a socket)}{399} +-\entry {comparing strings and arrays}{89} +-\entry {Comparison Function}{195} +-\entry {compiling}{993} +-\entry {complex exponentiation functions}{485} +-\entry {complex logarithm functions}{485} +-\entry {complex numbers}{538} +-\entry {complex trigonometric functions}{481} +-\entry {concatenating strings}{79} +-\entry {configurations, all supported}{998} +-\entry {configuring}{993} +-\entry {conjugate complex numbers}{539} +-\entry {connecting a socket}{424} +-\entry {connection}{424} +-\entry {consistency checking}{841} +-\entry {consistency checking, of heap}{39} +-\entry {constants}{32, 479} +-\entry {continue signal}{619} +-\entry {control character}{68, 71} +-\entry {control operations on files}{336} +-\entry {controlling process}{714} +-\entry {controlling terminal}{713} +-\entry {controlling terminal, access to}{714} +-\entry {controlling terminal, determining}{728} +-\entry {controlling terminal, setting}{342} +-\entry {conversion specifications (\code {printf})}{250} +-\entry {conversion specifications (\code {scanf})}{272} +-\entry {converting byte order}{418} +-\entry {converting case of characters}{69} +-\entry {converting file descriptor to stream}{313} +-\entry {converting floats to integers}{532} +-\entry {converting group ID to group name}{764} +-\entry {converting group name to group ID}{764} +-\entry {converting host address to name}{413} +-\entry {converting host name to address}{413} +-\entry {converting network name to network number}{443} +-\entry {converting network number to network name}{443} +-\entry {converting port number to service name}{417} +-\entry {converting service name to port number}{417} +-\entry {converting string to collation order}{93} +-\entry {converting strings to numbers}{539} +-\entry {converting user ID to user name}{762} +-\entry {converting user name to user ID}{762} +-\entry {cookie, for custom stream}{295} +-\entry {copy-on-write page fault}{63} +-\entry {copying strings and arrays}{79} +-\entry {cpu priority}{589} +-\entry {CPU time}{549, 551, 552} +-\entry {create on open (file status flag)}{342} +-\entry {creating a directory}{369} +-\entry {creating a FIFO special file}{396} +-\entry {creating a pipe}{393} +-\entry {creating a pipe to a subprocess}{395} +-\entry {creating a process}{702} +-\entry {creating a socket}{422} +-\entry {creating a socket pair}{423} +-\entry {creating special files}{388} +-\entry {cube root function}{485} +-\entry {currency symbols}{159} +-\entry {current limit}{585} +-\entry {current working directory}{351} +-\entry {custom streams}{295} +-\entry {customizing \code {printf}}{266} +-\initial {D} +-\entry {data loss on sockets}{399} +-\entry {databases}{733} +-\entry {datagram socket}{435} +-\entry {datagrams, transmitting}{436} +-\entry {date}{549} +-\entry {Daylight Saving Time}{557} +-\entry {decimal digit character}{67} +-\entry {decimal-point separator}{158} +-\entry {declaration (compared to definition)}{4} +-\entry {declaring variadic functions}{845} +-\entry {decompose complex numbers}{539} +-\entry {default action (for a signal)}{612} +-\entry {default action for a signal}{622} +-\entry {default argument promotions}{845} +-\entry {default value, and NSS}{736} +-\entry {defining new \code {printf} conversions}{266} +-\entry {definition (compared to declaration)}{4} +-\entry {delayed suspend character}{461} +-\entry {deleting a directory}{368} +-\entry {deleting a file}{367} +-\entry {delivery of signals}{612} +-\entry {descriptors and streams}{314} +-\entry {digit character}{67, 71} +-\entry {directories, accessing}{353} +-\entry {directories, creating}{369} +-\entry {directories, deleting}{368} +-\entry {directory}{227} +-\entry {directory entry}{227} +-\entry {directory hierarchy}{360} +-\entry {directory stream}{353} +-\entry {disadvantages of \code {alloca}}{61} +-\entry {DISCARD character}{462} +-\entry {division by zero}{522} +-\entry {DNS}{771} +-\entry {DNS server unavailable}{735} +-\entry {domain (of socket)}{399} +-\entry {domain error}{526} +-\entry {domain name}{771} +-\entry {Domain Name System}{771} +-\entry {dot notation, for Internet addresses}{409} +-\entry {DSUSP character}{461} +-\entry {duplicating file descriptors}{337} +-\entry {dynamic memory allocation}{33} +-\initial {E} +-\entry {EBCDIC}{113} +-\entry {echo of terminal input}{455} +-\entry {effective group ID}{743} +-\entry {effective user ID}{743} +-\entry {efficiency and \code {malloc}}{37} +-\entry {efficiency and obstacks}{55} +-\entry {efficiency of chunks}{57} +-\entry {EINTR, and restarting interrupted primitives}{639} +-\entry {elapsed time}{549} +-\entry {encryption}{105} +-\entry {end of file, on a stream}{281} +-\entry {end-of-file, on a file descriptor}{306} +-\entry {environment}{691} +-\entry {environment access}{691} +-\entry {environment representation}{691} +-\entry {environment variable}{691} +-\entry {environment vectors, null-character separated}{107} +-\entry {envz vectors (environment vectors)}{107} +-\entry {EOF character}{458} +-\entry {EOL character}{459} +-\entry {EOL2 character}{459} +-\entry {epoch}{553} +-\entry {ERASE character}{459} +-\entry {errno}{695} +-\entry {error codes}{15} +-\entry {error messages, in argp}{674} +-\entry {error reporting}{15} +-\entry {errors, mathematical}{526} +-\entry {establishing a handler}{622} +-\entry {ethers}{733} +-\entry {EUC}{113} +-\entry {EUC-JP}{139} +-\entry {exception}{522, 614} +-\entry {exclusive lock}{345} +-\entry {\code {exec} functions}{704} +-\entry {execing a program}{32} +-\entry {executable}{32} +-\entry {executing a file}{704} +-\entry {exit status}{697} +-\entry {exit status value}{696} +-\entry {exiting a program}{32} +-\entry {expansion of shell words}{218} +-\entry {exponent (of floating point number)}{852} +-\entry {exponentiation functions}{483} +-\entry {extending \code {printf}}{266} +-\entry {extracting file descriptor from stream}{313} +-\initial {F} +-\entry {\code {fcntl} function}{336} +-\entry {FDL, GNU Free Documentation License}{1027} +-\entry {feature test macros}{7} +-\entry {field splitting}{219} +-\entry {FIFO special file}{393} +-\entry {file access permission}{380} +-\entry {file access time}{383} +-\entry {file attribute modification time}{383} +-\entry {file attributes}{370} +-\entry {file creation mask}{380} +-\entry {file descriptor flags}{339} +-\entry {file descriptor sets, for \code {select}}{321} +-\entry {file descriptors, standard}{313} +-\entry {file locks}{345} +-\entry {file modification time}{383} +-\entry {file name}{227} +-\entry {file name component}{227} +-\entry {file name errors}{229} +-\entry {file name resolution}{228} +-\entry {file name translation flags}{341} +-\entry {file names, multiple}{363} +-\entry {file owner}{377} +-\entry {file permission bits}{378} +-\entry {file pointer}{231} +-\entry {file position}{226} +-\entry {file positioning on a file descriptor}{310} +-\entry {file positioning on a stream}{284} +-\entry {file status flags}{340} +-\entry {files, accessing}{32} +-\entry {filtering i/o through subprocess}{395} +-\entry {flag character (\code {printf})}{252} +-\entry {flag character (\code {scanf})}{273} +-\entry {flags for \code {sigaction}}{627} +-\entry {flags, file name translation}{341} +-\entry {flags, open-time action}{342} +-\entry {floating point}{520} +-\entry {floating point, IEEE}{856} +-\entry {floating type measurements}{851} +-\entry {floating-point classes}{520} +-\entry {floating-point exception}{614} +-\entry {flow control, terminal}{466} +-\entry {flushing a stream}{289} +-\entry {flushing terminal output queue}{465} +-\entry {foreground job}{713} +-\entry {foreground job, launching}{722} +-\entry {forking a process}{702} +-\entry {format string, for \code {printf}}{250} +-\entry {format string, for \code {scanf}}{272} +-\entry {formatted input from a stream}{272} +-\entry {formatted messages}{297} +-\entry {formatted output to a stream}{250} +-\entry {FP arithmetic}{535} +-\entry {FQDN}{771} +-\entry {frame, real memory}{31} +-\entry {free documentation}{1015} +-\entry {freeing (obstacks)}{52} +-\entry {freeing memory}{32} +-\entry {freeing memory allocated with \code {malloc}}{35} +-\entry {fully buffered stream}{288} +-\entry {function prototypes (variadic)}{843} +-\initial {G} +-\entry {gamma function}{488} +-\entry {gcvt_r}{546} +-\entry {gencat}{176} +-\entry {generation of signals}{612} +-\entry {generic i/o control operations}{349} +-\entry {globbing}{206} +-\entry {graphic character}{68, 71} +-\entry {Gregorian calendar}{553} +-\entry {group}{733} +-\entry {group database}{764} +-\entry {group ID}{743} +-\entry {group name}{743} +-\entry {group owner of a file}{377} +-\entry {grouping of digits}{158} +-\entry {growing objects (in obstacks)}{53} +-\initial {H} +-\entry {handling multiple signals}{632} +-\entry {hangup signal}{617} +-\entry {hard limit}{585} +-\entry {hard link}{363} +-\entry {header files}{4} +-\entry {heap consistency checking}{39} +-\entry {heap, dynamic allocation from}{34} +-\entry {heap, freeing memory from}{35} +-\entry {hexadecimal digit character}{68, 72} +-\entry {hidden bit (of floating point number mantissa)}{852} +-\entry {hierarchy, directory}{360} +-\entry {high-priority data}{433} +-\entry {high-resolution time}{553} +-\entry {holes in files}{311} +-\entry {home directory}{693} +-\entry {\code {HOME} environment variable}{693} +-\entry {hook functions (of custom streams)}{296} +-\entry {host address, Internet}{409} +-\entry {host name}{771} +-\entry {hostname}{771} +-\entry {hosts}{733} +-\entry {hosts database}{413} +-\entry {how many arguments}{844} +-\entry {hyperbolic functions}{486, 487} +-\initial {I} +-\entry {identifying terminals}{445} +-\entry {IEEE 754}{520} +-\entry {IEEE floating point}{520} +-\entry {IEEE floating point representation}{856} +-\entry {IEEE Std 1003.1}{2} +-\entry {IEEE Std 1003.2}{2} +-\entry {ignore action for a signal}{622} +-\entry {illegal instruction}{615} +-\entry {impossible events}{841} +-\entry {independent channels}{314} +-\entry {inexact exception}{522} +-\entry {infinity}{524} +-\entry {initial signal actions}{627} +-\entry {inode number}{373} +-\entry {input available signal}{618} +-\entry {input conversions, for \code {scanf}}{274} +-\entry {input from multiple files}{321} +-\entry {installation tools}{997} +-\entry {installing}{996} +-\entry {integer}{517} +-\entry {integer division functions}{518} +-\entry {integer type range}{850} +-\entry {integer type width}{850} +-\entry {interactive signals, from terminal}{456} +-\entry {interactive stop signal}{619} +-\entry {internal representation}{111} +-\entry {internationalization}{153} +-\entry {Internet host address}{409} +-\entry {Internet namespace, for sockets}{407} +-\entry {interprocess communication, with FIFO}{396} +-\entry {interprocess communication, with pipes}{393} +-\entry {interprocess communication, with signals}{642} +-\entry {interprocess communication, with sockets}{399} +-\entry {interrupt character}{460} +-\entry {interrupt signal}{616} +-\entry {interrupt-driven input}{348} +-\entry {interrupting primitives}{639} +-\entry {interval}{549} +-\entry {interval timer, setting}{578} +-\entry {INTR character}{460} +-\entry {invalid exception}{522} +-\entry {inverse complex hyperbolic functions}{487} +-\entry {inverse complex trigonometric functions}{482} +-\entry {inverse hyperbolic functions}{487} +-\entry {inverse trigonometric functions}{481} +-\entry {invocation of program}{657} +-\entry {IOCTLs}{349} +-\entry {ISO 10646}{111} +-\entry {ISO 2022}{113} +-\entry {ISO 6937}{114} +-\entry {ISO C}{2} +-\entry {ISO-2022-JP}{139} +-\entry {ISO/IEC 9945-1}{2} +-\entry {ISO/IEC 9945-2}{2} +-\initial {J} +-\entry {job}{713} +-\entry {job control}{713} +-\entry {job control functions}{728} +-\entry {job control is optional}{714} +-\entry {job control signals}{618} +-\entry {job control, enabling}{717} +-\initial {K} +-\entry {Kermit the frog}{199} +-\entry {kernel call}{695} +-\entry {kernel header files}{999} +-\entry {KILL character}{460} +-\entry {kill signal}{617} +-\entry {killing a process}{640} +-\entry {Korn Shell}{206} +-\initial {L} +-\entry {LANG environment variable}{173} +-\entry {\code {LANG} environment variable}{694} +-\entry {launching jobs}{718} +-\entry {LC_ALL environment variable}{173} +-\entry {\code {LC_ALL} environment variable}{694} +-\entry {\code {LC_COLLATE} environment variable}{694} +-\entry {\code {LC_CTYPE} environment variable}{694} +-\entry {LC_MESSAGES environment variable}{173} +-\entry {\code {LC_MESSAGES} environment variable}{694} +-\entry {\code {LC_MONETARY} environment variable}{694} +-\entry {\code {LC_NUMERIC} environment variable}{694} +-\entry {\code {LC_TIME} environment variable}{694} +-\entry {leap second}{556} +-\entry {length of string}{76} +-\entry {level, for socket options}{441} +-\entry {LGPL, Lesser General Public License}{1017} +-\entry {library}{1} +-\entry {limit}{585} +-\entry {limits on resource usage}{585} +-\entry {limits, file name length}{800} +-\entry {limits, floating types}{851} +-\entry {limits, integer types}{850} +-\entry {limits, link count of files}{799} +-\entry {limits, number of open files}{787} +-\entry {limits, number of processes}{787} +-\entry {limits, number of supplementary group IDs}{787} +-\entry {limits, pipe buffer size}{800} +-\entry {limits, POSIX}{787} +-\entry {limits, program argument size}{787} +-\entry {limits, terminal input queue}{799} +-\entry {limits, time zone name length}{787} +-\entry {line buffered stream}{288} +-\entry {line speed}{457} +-\entry {lines (in a text file)}{283} +-\entry {link}{227} +-\entry {link, hard}{363} +-\entry {link, soft}{364} +-\entry {link, symbolic}{364} +-\entry {linked channels}{314} +-\entry {listening (sockets)}{425} +-\entry {literals}{32} +-\entry {little-endian}{418} +-\entry {LNEXT character}{462} +-\entry {load average}{600} +-\entry {local namespace, for sockets}{405} +-\entry {local network address number}{409} +-\entry {local time}{553} +-\entry {locale categories}{154} +-\entry {locale, changing}{155} +-\entry {locales}{153} +-\entry {locking pages}{62} +-\entry {logarithm functions}{483} +-\entry {login name}{743} +-\entry {login name, determining}{753} +-\entry {\code {LOGNAME} environment variable}{693} +-\entry {long jumps}{601} +-\entry {long-named options}{658} +-\entry {longjmp}{60} +-\entry {loss of data on sockets}{399} +-\entry {lost resource signal}{620} +-\entry {lower-case character}{67, 71} +-\initial {M} +-\entry {macros}{52} +-\entry {\code {main} function}{657} +-\entry {malloc debugger}{45} +-\entry {\code {malloc} function}{34} +-\entry {mantissa (of floating point number)}{852} +-\entry {matching failure, in \code {scanf}}{272} +-\entry {math errors}{490} +-\entry {mathematical constants}{479} +-\entry {maximum}{537} +-\entry {maximum field width (\code {scanf})}{273} +-\entry {maximum limit}{585} +-\entry {maximum possible integer}{518} +-\entry {measurements of floating types}{851} +-\entry {memory allocation}{31} +-\entry {memory lock}{62} +-\entry {memory mapped file}{32} +-\entry {memory mapped I/O}{32} +-\entry {memory page}{598} +-\entry {merging of signals}{632} +-\entry {MIN termios slot}{463} +-\entry {minimum}{537} +-\entry {minimum field width (\code {printf})}{252} +-\entry {minimum possible integer}{518} +-\entry {mixing descriptors and streams}{314} +-\entry {modem disconnect}{453} +-\entry {modem status lines}{453} +-\entry {monetary value formatting}{158} +-\entry {multi-threaded application}{236} +-\entry {multibyte character}{113} +-\entry {multibyte character string}{75} +-\entry {multibyte string}{76} +-\entry {multiple names for one file}{363} +-\entry {multiplexing input}{321} +-\entry {multiply-add}{537} +-\initial {N} +-\entry {name of running program}{27} +-\entry {name of socket}{401} +-\entry {Name Service Switch}{733} +-\entry {name space}{6} +-\entry {names of signals}{613} +-\entry {namespace (of socket)}{399} +-\entry {NaN}{524, 536} +-\entry {netgroup}{733} +-\entry {Netgroup}{767} +-\entry {network byte order}{418} +-\entry {network number}{409} +-\entry {network protocol}{399} +-\entry {networks}{733} +-\entry {networks database}{443} +-\entry {NIS}{771} +-\entry {NIS domain name}{771, 772} +-\entry {nisplus, and booting}{735} +-\entry {nisplus, and completeness}{735} +-\entry {NLSPATH environment variable}{172} +-\entry {\code {NLSPATH} environment variable}{694} +-\entry {non-blocking open}{342} +-\entry {non-local exit, from signal handler}{630} +-\entry {non-local exits}{601} +-\entry {noncanonical input processing}{446} +-\entry {normalization functions (floating-point)}{531} +-\entry {normalized floating point number}{852} +-\entry {not a number}{524} +-\entry {NSS}{733} +-\entry {\file {nsswitch.conf}}{734} +-\entry {null character}{75} +-\entry {null pointer constant}{848} +-\entry {null wide character}{75} +-\entry {number of arguments passed}{844} +-\entry {number syntax, parsing}{539} +-\entry {numeric value formatting}{158} +-\initial {O} +-\entry {obstack status}{56} +-\entry {obstacks}{49} +-\entry {open-time action flags}{342} +-\entry {opening a file}{225} +-\entry {opening a file descriptor}{303} +-\entry {opening a pipe}{393} +-\entry {opening a pseudo-terminal pair}{470} +-\entry {opening a socket}{422} +-\entry {opening a socket pair}{423} +-\entry {opening a stream}{232} +-\entry {Optimization}{515} +-\entry {optimizing NSS}{736} +-\entry {option parsing with argp}{666} +-\entry {optional arguments}{842} +-\entry {optional POSIX features}{788} +-\entry {orientation, stream}{233, 240} +-\entry {orphaned process group}{715} +-\entry {out-of-band data}{433} +-\entry {output conversions, for \code {printf}}{252} +-\entry {output possible signal}{618} +-\entry {overflow exception}{522} +-\entry {owner of a file}{377} +-\initial {P} +-\entry {packet}{399} +-\entry {page boundary}{38} +-\entry {page fault}{31} +-\entry {page fault, copy-on-write}{63} +-\entry {page frame}{31} +-\entry {page, memory}{598} +-\entry {page, virtual memory}{31} +-\entry {paging}{31, 62} +-\entry {parameter promotion}{77} +-\entry {parent directory}{228} +-\entry {parent process}{701, 702} +-\entry {parity checking}{450} +-\entry {parsing a template string}{263} +-\entry {parsing numbers (in formatted input)}{539} +-\entry {parsing program arguments}{659} +-\entry {parsing tokens from a string}{100} +-\entry {passwd}{733} +-\entry {password database}{761} +-\entry {\code {PATH} environment variable}{693} +-\entry {\code {pause} function}{650} +-\entry {peeking at input}{247} +-\entry {pending signals}{612} +-\entry {pending signals, checking for}{647} +-\entry {period of time}{549} +-\entry {permission to access a file}{380} +-\entry {persona}{743} +-\entry {physical address}{598} +-\entry {physical memory}{598} +-\entry {pi (trigonometric constant)}{480} +-\entry {pipe}{393} +-\entry {pipe signal}{620} +-\entry {pipe to a subprocess}{395} +-\entry {port number}{416} +-\entry {positioning a file descriptor}{310} +-\entry {positioning a stream}{284} +-\entry {positive difference}{537} +-\entry {POSIX}{2} +-\entry {POSIX capacity limits}{787} +-\entry {POSIX optional features}{788} +-\entry {POSIX.1}{2} +-\entry {POSIX.2}{2} +-\entry {power functions}{483} +-\entry {precision (of floating point number)}{852} +-\entry {precision (\code {printf})}{252} +-\entry {predicates on arrays}{89} +-\entry {predicates on characters}{67} +-\entry {predicates on strings}{89} +-\entry {preemptive scheduling}{590} +-\entry {primitives, interrupting}{639} +-\entry {printing character}{68, 71} +-\entry {priority of a process}{589} +-\entry {priority, absolute}{589} +-\entry {process}{657, 701} +-\entry {process completion}{706} +-\entry {process group functions}{728} +-\entry {process group ID}{719} +-\entry {process group leader}{719} +-\entry {process groups}{713} +-\entry {process ID}{702} +-\entry {process image}{702} +-\entry {process lifetime}{702} +-\entry {process priority}{589} +-\entry {process signal mask}{645} +-\entry {process termination}{696} +-\entry {processor time}{549, 552} +-\entry {profiling alarm signal}{618} +-\entry {profiling timer}{578} +-\entry {program}{657} +-\entry {program argument syntax}{658} +-\entry {program arguments}{657} +-\entry {program arguments, parsing}{659} +-\entry {program error signals}{613} +-\entry {program name}{27} +-\entry {program startup}{657} +-\entry {program termination}{696} +-\entry {program termination signals}{616} +-\entry {programming your own streams}{295} +-\entry {project complex numbers}{539} +-\entry {protocol (of socket)}{399} +-\entry {protocol family}{399} +-\entry {protocols}{733} +-\entry {protocols database}{419} +-\entry {prototypes for variadic functions}{843} +-\entry {pseudo-random numbers}{508} +-\entry {pseudo-terminals}{468} +-\entry {punctuation character}{68, 72} +-\entry {pushing input back}{247} +-\initial {Q} +-\entry {quick sort function (for arrays)}{196} +-\entry {QUIT character}{460} +-\entry {quit signal}{616} +-\entry {quote removal}{219} +-\initial {R} +-\entry {race conditions, relating to job control}{719} +-\entry {race conditions, relating to signals}{631} +-\entry {radix (of floating point number)}{852} +-\entry {raising signals}{639} +-\entry {random numbers}{508} +-\entry {random-access files}{226} +-\entry {range error}{526} +-\entry {range of integer type}{850} +-\entry {read lock}{345} +-\entry {reading from a directory}{353} +-\entry {reading from a file descriptor}{306} +-\entry {reading from a socket}{427} +-\entry {reading from a stream, by blocks}{249} +-\entry {reading from a stream, by characters}{243} +-\entry {reading from a stream, formatted}{272} +-\entry {ready to run}{590} +-\entry {real group ID}{743} +-\entry {real user ID}{743} +-\entry {real-time timer}{578} +-\entry {realtime CPU scheduling}{589} +-\entry {realtime processing}{62} +-\entry {realtime scheduling}{591} +-\entry {receiving datagrams}{436} +-\entry {record locking}{345} +-\entry {redirecting input and output}{337} +-\entry {reentrant functions}{635} +-\entry {reentrant NSS functions}{737} +-\entry {relative file name}{228} +-\entry {removal of quotes}{219} +-\entry {removing a file}{367} +-\entry {removing macros that shadow functions}{5} +-\entry {renaming a file}{368} +-\entry {reporting bugs}{1000} +-\entry {reporting errors}{15} +-\entry {REPRINT character}{460} +-\entry {reserved names}{6} +-\entry {resource limits}{585} +-\entry {restarting interrupted primitives}{639} +-\entry {restrictions on signal handler functions}{634} +-\entry {root directory}{228} +-\entry {Rot13}{105} +-\entry {rpc}{733} +-\entry {runnable process}{590} +-\entry {running a command}{701} +-\initial {S} +-\entry {saved set-group-ID}{744} +-\entry {saved set-user-ID}{744} +-\entry {scanning the group list}{765} +-\entry {scanning the user list}{762} +-\entry {scatter-gather}{315} +-\entry {scheduling, traditional}{595} +-\entry {search function (for arrays)}{195} +-\entry {search functions (for strings)}{96} +-\entry {seed (for random numbers)}{508} +-\entry {seeking on a file descriptor}{310} +-\entry {seeking on a stream}{284} +-\entry {segmentation violation}{615} +-\entry {sending a datagram}{436} +-\entry {sending signals}{639} +-\entry {sequential-access files}{226} +-\entry {server}{424} +-\entry {services}{733} +-\entry {services database}{417} +-\entry {session}{713} +-\entry {session leader}{713} +-\entry {setting an alarm}{578} +-\entry {\code {setuid} programs}{744} +-\entry {setuid programs and file access}{382} +-\entry {severity class}{298, 300} +-\entry {sgettext}{190} +-\entry {shadow}{733} +-\entry {shadowing functions with macros}{5} +-\entry {shared lock}{345} +-\entry {shared memory}{598} +-\entry {shell}{713} +-\entry {shift state}{116} +-\entry {Shift_JIS}{113} +-\entry {shrinking objects}{54} +-\entry {shutting down a socket}{422} +-\entry {\code {sigaction} flags}{627} +-\entry {\code {sigaction} function}{624} +-\entry {\code {SIGCHLD}, handling of}{723} +-\entry {sign (of floating point number)}{852} +-\entry {signal}{522, 611} +-\entry {signal action}{612} +-\entry {signal actions}{622} +-\entry {signal flags}{627} +-\entry {\code {signal} function}{622} +-\entry {signal handler function}{628} +-\entry {signal mask}{645} +-\entry {signal messages}{621} +-\entry {signal names}{613} +-\entry {signal number}{613} +-\entry {signal set}{644} +-\entry {signals, generating}{639} +-\entry {signedness}{517} +-\entry {significand (of floating point number)}{852} +-\entry {\code {SIGTTIN}, from background job}{714} +-\entry {\code {SIGTTOU}, from background job}{715} +-\entry {simple time}{553} +-\entry {single-byte string}{76} +-\entry {size of string}{76} +-\entry {SJIS}{113} +-\entry {socket}{399} +-\entry {socket address (name) binding}{401} +-\entry {socket domain}{399} +-\entry {socket namespace}{399} +-\entry {socket option level}{441} +-\entry {socket options}{441} +-\entry {socket pair}{423} +-\entry {socket protocol}{399} +-\entry {socket shutdown}{422} +-\entry {socket, client actions}{424} +-\entry {socket, closing}{422} +-\entry {socket, connecting}{424} +-\entry {socket, creating}{422} +-\entry {socket, initiating a connection}{424} +-\entry {sockets, accepting connections}{426} +-\entry {sockets, listening}{425} +-\entry {sockets, server actions}{425} +-\entry {soft limit}{585} +-\entry {soft link}{364} +-\entry {sort function (for arrays)}{196} +-\entry {sparse files}{311} +-\entry {special files}{388} +-\entry {special functions}{488} +-\entry {specified action (for a signal)}{612} +-\entry {speed of execution}{62} +-\entry {square root function}{485} +-\entry {stable sorting}{196} +-\entry {standard dot notation, for Internet addresses}{409} +-\entry {standard environment variables}{693} +-\entry {standard error file descriptor}{313} +-\entry {standard error stream}{232} +-\entry {standard file descriptors}{313} +-\entry {standard input file descriptor}{313} +-\entry {standard input stream}{231} +-\entry {standard output file descriptor}{313} +-\entry {standard output stream}{231} +-\entry {standard streams}{231} +-\entry {standards}{1} +-\entry {START character}{461} +-\entry {startup of program}{657} +-\entry {stateful}{116, 119, 124, 134, 136, 148} +-\entry {static memory allocation}{33} +-\entry {static storage class}{33} +-\entry {STATUS character}{462} +-\entry {status codes}{15} +-\entry {status of a file}{370} +-\entry {status of obstack}{56} +-\entry {sticky bit}{379} +-\entry {STOP character}{461} +-\entry {stop signal}{619} +-\entry {stopped job}{714} +-\entry {stopped jobs, continuing}{726} +-\entry {stopped jobs, detecting}{723} +-\entry {storage allocation}{31} +-\entry {stream (sockets)}{399} +-\entry {stream orientation}{233, 240} +-\entry {stream, for I/O to a string}{292} +-\entry {streams and descriptors}{314} +-\entry {streams, and file descriptors}{313} +-\entry {streams, C++}{239} +-\entry {streams, standard}{231} +-\entry {string}{75} +-\entry {string allocation}{76} +-\entry {string collation functions}{92} +-\entry {string comparison functions}{89} +-\entry {string concatenation functions}{79} +-\entry {string copy functions}{79} +-\entry {string length}{76} +-\entry {string literal}{75} +-\entry {string search functions}{96} +-\entry {string stream}{292} +-\entry {string vectors, null-character separated}{107} +-\entry {string, representation of}{75} +-\entry {style of communication (of a socket)}{399} +-\entry {subshell}{717} +-\entry {substitution of variables and commands}{219} +-\entry {successive signals}{632} +-\entry {summer time}{557} +-\entry {SunOS}{3} +-\entry {supplementary group IDs}{743} +-\entry {SUSP character}{460} +-\entry {suspend character}{460} +-\entry {SVID}{3} +-\entry {swap space}{31} +-\entry {symbolic link}{364} +-\entry {symbolic link, opening}{342} +-\entry {synchronizing}{323, 332} +-\entry {syntax error messages, in argp}{674} +-\entry {syntax, for program arguments}{658} +-\entry {syntax, for reading numbers}{539} +-\entry {sysconf}{599, 600} +-\entry {system call}{695} +-\entry {system call number}{695} +-\entry {System V Unix}{3} +-\initial {T} +-\entry {TCP (Internet protocol)}{419} +-\entry {template, for \code {printf}}{250} +-\entry {template, for \code {scanf}}{272} +-\entry {\code {TERM} environment variable}{694} +-\entry {terminal flow control}{466} +-\entry {terminal identification}{445} +-\entry {terminal input queue}{446} +-\entry {terminal input queue, clearing}{465} +-\entry {terminal input signal}{619} +-\entry {terminal line control functions}{465} +-\entry {terminal line speed}{457} +-\entry {terminal mode data types}{447} +-\entry {terminal mode functions}{448} +-\entry {terminal modes, BSD}{464} +-\entry {terminal output queue}{446} +-\entry {terminal output queue, flushing}{465} +-\entry {terminal output signal}{619} +-\entry {terminated jobs, detecting}{723} +-\entry {termination signal}{616} +-\entry {testing access permission}{382} +-\entry {testing exit status of child process}{706} +-\entry {text stream}{283} +-\entry {thrashing}{598} +-\entry {thread of control}{657} +-\entry {threads}{236} +-\entry {ticks, clock}{551} +-\entry {tilde expansion}{219} +-\entry {time}{549} +-\entry {TIME termios slot}{463} +-\entry {time zone}{575} +-\entry {time zone database}{576} +-\entry {time, elapsed}{549} +-\entry {time, high precision}{559} +-\entry {timer, profiling}{578} +-\entry {timer, real-time}{578} +-\entry {timer, virtual}{578} +-\entry {timers, setting}{578} +-\entry {timespec}{550} +-\entry {timeval}{550} +-\entry {timing error in signal handling}{649} +-\entry {TMPDIR environment variable}{390} +-\entry {tokenizing strings}{100} +-\entry {tools, for installing library}{997} +-\entry {transmitting datagrams}{436} +-\entry {tree, directory}{360} +-\entry {triangulation}{139} +-\entry {trigonometric functions}{480} +-\entry {type measurements, floating}{851} +-\entry {type measurements, integer}{850} +-\entry {type modifier character (\code {printf})}{252} +-\entry {type modifier character (\code {scanf})}{273} +-\entry {typeahead buffer}{446} +-\entry {\code {TZ} environment variable}{694} +-\initial {U} +-\entry {UCS-2}{111} +-\entry {UCS-4}{111} +-\entry {ulps}{490} +-\entry {umask}{380} +-\entry {unbuffered stream}{288} +-\entry {unconstrained memory allocation}{34} +-\entry {undefining macros that shadow functions}{5} +-\entry {underflow exception}{522} +-\entry {Unicode}{111} +-\entry {Unix, Berkeley}{3} +-\entry {Unix, System V}{3} +-\entry {unlinking a file}{367} +-\entry {unordered comparison}{536} +-\entry {unreading characters}{247} +-\entry {upgrading from libc5}{999} +-\entry {upper-case character}{67, 72} +-\entry {urgent data signal}{618} +-\entry {urgent socket condition}{433} +-\entry {usage limits}{585} +-\entry {usage messages, in argp}{673} +-\entry {user accounting database}{753} +-\entry {user database}{761} +-\entry {user ID}{743} +-\entry {user ID, determining}{753} +-\entry {user name}{743} +-\entry {user signals}{621} +-\entry {usual file name errors}{229} +-\entry {UTF-16}{111} +-\entry {UTF-7}{114} +-\entry {UTF-8}{111, 114} +-\initial {V} +-\entry {va_copy}{85} +-\entry {variable number of arguments}{842} +-\entry {variable substitution}{219} +-\entry {variable-sized arrays}{61} +-\entry {variadic function argument access}{844} +-\entry {variadic function prototypes}{843} +-\entry {variadic functions}{842} +-\entry {variadic functions, calling}{845} +-\entry {virtual time alarm signal}{618} +-\entry {virtual timer}{578} +-\entry {\code {volatile} declarations}{634} +-\initial {W} +-\entry {waiting for a signal}{650} +-\entry {waiting for completion of child process}{706} +-\entry {waiting for input or output}{321} +-\entry {WERASE character}{459} +-\entry {whitespace character}{68, 72} +-\entry {wide character}{111} +-\entry {wide character string}{75, 76} +-\entry {width of integer type}{850} +-\entry {wildcard expansion}{219} +-\entry {wint_t}{77} +-\entry {word expansion}{218} +-\entry {working directory}{351} +-\entry {write lock}{345} +-\entry {writing to a file descriptor}{308} +-\entry {writing to a socket}{427} +-\entry {writing to a stream, by blocks}{249} +-\entry {writing to a stream, by characters}{241} +-\entry {writing to a stream, formatted}{250} +-\initial {Y} +-\entry {YP}{771} +-\entry {YP domain name}{771, 772} +-\initial {Z} +-\entry {zero divide}{522} +diff -u -udbrN glibc-2.3.2/manual/libc.fn glibc-2.3.2-200304020432/manual/libc.fn +--- glibc-2.3.2/manual/libc.fn Tue Feb 25 11:35:07 2003 ++++ glibc-2.3.2-200304020432/manual/libc.fn Thu Jan 1 01:00:00 1970 +@@ -1,1335 +0,0 @@ +-\entry{strerror}{26}{\code {strerror}} +-\entry{strerror_r}{26}{\code {strerror_r}} +-\entry{perror}{26}{\code {perror}} +-\entry{error}{28}{\code {error}} +-\entry{error_at_line}{28}{\code {error_at_line}} +-\entry{warn}{30}{\code {warn}} +-\entry{vwarn}{30}{\code {vwarn}} +-\entry{warnx}{30}{\code {warnx}} +-\entry{vwarnx}{30}{\code {vwarnx}} +-\entry{err}{30}{\code {err}} +-\entry{verr}{30}{\code {verr}} +-\entry{errx}{30}{\code {errx}} +-\entry{verrx}{30}{\code {verrx}} +-\entry{malloc}{34}{\code {malloc}} +-\entry{free}{35}{\code {free}} +-\entry{cfree}{36}{\code {cfree}} +-\entry{realloc}{36}{\code {realloc}} +-\entry{calloc}{37}{\code {calloc}} +-\entry{memalign}{38}{\code {memalign}} +-\entry{posix_memalign}{38}{\code {posix_memalign}} +-\entry{valloc}{38}{\code {valloc}} +-\entry{mallopt}{39}{\code {mallopt}} +-\entry{mcheck}{39}{\code {mcheck}} +-\entry{mprobe}{40}{\code {mprobe}} +-\entry{mallinfo}{44}{\code {mallinfo}} +-\entry{mtrace}{45}{\code {mtrace}} +-\entry{muntrace}{46}{\code {muntrace}} +-\entry{obstack_chunk_alloc}{50}{\code {obstack_chunk_alloc}} +-\entry{obstack_chunk_free}{50}{\code {obstack_chunk_free}} +-\entry{obstack_init}{50}{\code {obstack_init}} +-\entry{obstack_alloc}{51}{\code {obstack_alloc}} +-\entry{obstack_copy}{51}{\code {obstack_copy}} +-\entry{obstack_copy0}{52}{\code {obstack_copy0}} +-\entry{obstack_free}{52}{\code {obstack_free}} +-\entry{obstack_blank}{53}{\code {obstack_blank}} +-\entry{obstack_grow}{53}{\code {obstack_grow}} +-\entry{obstack_grow0}{54}{\code {obstack_grow0}} +-\entry{obstack_1grow}{54}{\code {obstack_1grow}} +-\entry{obstack_ptr_grow}{54}{\code {obstack_ptr_grow}} +-\entry{obstack_int_grow}{54}{\code {obstack_int_grow}} +-\entry{obstack_finish}{54}{\code {obstack_finish}} +-\entry{obstack_object_size}{54}{\code {obstack_object_size}} +-\entry{obstack_room}{55}{\code {obstack_room}} +-\entry{obstack_1grow_fast}{55}{\code {obstack_1grow_fast}} +-\entry{obstack_ptr_grow_fast}{55}{\code {obstack_ptr_grow_fast}} +-\entry{obstack_int_grow_fast}{55}{\code {obstack_int_grow_fast}} +-\entry{obstack_blank_fast}{55}{\code {obstack_blank_fast}} +-\entry{obstack_base}{56}{\code {obstack_base}} +-\entry{obstack_next_free}{56}{\code {obstack_next_free}} +-\entry{obstack_object_size}{56}{\code {obstack_object_size}} +-\entry{obstack_alignment_mask}{57}{\code {obstack_alignment_mask}} +-\entry{obstack_chunk_size}{57}{\code {obstack_chunk_size}} +-\entry{alloca}{59}{\code {alloca}} +-\entry{brk}{62}{\code {brk}} +-\entry{sbrk}{62}{\code {sbrk}} +-\entry{mlock}{64}{\code {mlock}} +-\entry{munlock}{64}{\code {munlock}} +-\entry{mlockall}{64}{\code {mlockall}} +-\entry{munlockall}{65}{\code {munlockall}} +-\entry{islower}{67}{\code {islower}} +-\entry{isupper}{67}{\code {isupper}} +-\entry{isalpha}{67}{\code {isalpha}} +-\entry{isdigit}{68}{\code {isdigit}} +-\entry{isalnum}{68}{\code {isalnum}} +-\entry{isxdigit}{68}{\code {isxdigit}} +-\entry{ispunct}{68}{\code {ispunct}} +-\entry{isspace}{68}{\code {isspace}} +-\entry{isblank}{68}{\code {isblank}} +-\entry{isgraph}{68}{\code {isgraph}} +-\entry{isprint}{68}{\code {isprint}} +-\entry{iscntrl}{68}{\code {iscntrl}} +-\entry{isascii}{68}{\code {isascii}} +-\entry{tolower}{69}{\code {tolower}} +-\entry{toupper}{69}{\code {toupper}} +-\entry{toascii}{69}{\code {toascii}} +-\entry{_tolower}{69}{\code {_tolower}} +-\entry{_toupper}{69}{\code {_toupper}} +-\entry{wctype}{70}{\code {wctype}} +-\entry{iswctype}{70}{\code {iswctype}} +-\entry{iswalnum}{70}{\code {iswalnum}} +-\entry{iswalpha}{70}{\code {iswalpha}} +-\entry{iswcntrl}{71}{\code {iswcntrl}} +-\entry{iswdigit}{71}{\code {iswdigit}} +-\entry{iswgraph}{71}{\code {iswgraph}} +-\entry{iswlower}{71}{\code {iswlower}} +-\entry{iswprint}{71}{\code {iswprint}} +-\entry{iswpunct}{72}{\code {iswpunct}} +-\entry{iswspace}{72}{\code {iswspace}} +-\entry{iswupper}{72}{\code {iswupper}} +-\entry{iswxdigit}{72}{\code {iswxdigit}} +-\entry{iswblank}{72}{\code {iswblank}} +-\entry{wctrans}{74}{\code {wctrans}} +-\entry{towctrans}{74}{\code {towctrans}} +-\entry{towlower}{74}{\code {towlower}} +-\entry{towupper}{74}{\code {towupper}} +-\entry{strlen}{77}{\code {strlen}} +-\entry{wcslen}{78}{\code {wcslen}} +-\entry{strnlen}{78}{\code {strnlen}} +-\entry{wcsnlen}{79}{\code {wcsnlen}} +-\entry{memcpy}{79}{\code {memcpy}} +-\entry{wmemcpy}{79}{\code {wmemcpy}} +-\entry{mempcpy}{80}{\code {mempcpy}} +-\entry{wmempcpy}{80}{\code {wmempcpy}} +-\entry{memmove}{80}{\code {memmove}} +-\entry{wmemmove}{81}{\code {wmemmove}} +-\entry{memccpy}{81}{\code {memccpy}} +-\entry{memset}{81}{\code {memset}} +-\entry{wmemset}{81}{\code {wmemset}} +-\entry{strcpy}{81}{\code {strcpy}} +-\entry{wcscpy}{81}{\code {wcscpy}} +-\entry{strncpy}{81}{\code {strncpy}} +-\entry{wcsncpy}{82}{\code {wcsncpy}} +-\entry{strdup}{82}{\code {strdup}} +-\entry{wcsdup}{82}{\code {wcsdup}} +-\entry{strndup}{82}{\code {strndup}} +-\entry{stpcpy}{83}{\code {stpcpy}} +-\entry{wcpcpy}{83}{\code {wcpcpy}} +-\entry{stpncpy}{83}{\code {stpncpy}} +-\entry{wcpncpy}{84}{\code {wcpncpy}} +-\entry{strdupa}{84}{\code {strdupa}} +-\entry{strndupa}{85}{\code {strndupa}} +-\entry{strcat}{85}{\code {strcat}} +-\entry{wcscat}{85}{\code {wcscat}} +-\entry{strncat}{87}{\code {strncat}} +-\entry{wcsncat}{88}{\code {wcsncat}} +-\entry{bcopy}{88}{\code {bcopy}} +-\entry{bzero}{89}{\code {bzero}} +-\entry{memcmp}{89}{\code {memcmp}} +-\entry{wmemcmp}{89}{\code {wmemcmp}} +-\entry{strcmp}{90}{\code {strcmp}} +-\entry{wcscmp}{90}{\code {wcscmp}} +-\entry{strcasecmp}{90}{\code {strcasecmp}} +-\entry{wcscasecmp}{90}{\code {wcscasecmp}} +-\entry{strncmp}{91}{\code {strncmp}} +-\entry{wcsncmp}{91}{\code {wcsncmp}} +-\entry{strncasecmp}{91}{\code {strncasecmp}} +-\entry{wcsncasecmp}{91}{\code {wcsncasecmp}} +-\entry{strverscmp}{91}{\code {strverscmp}} +-\entry{bcmp}{92}{\code {bcmp}} +-\entry{strcoll}{93}{\code {strcoll}} +-\entry{wcscoll}{93}{\code {wcscoll}} +-\entry{strxfrm}{93}{\code {strxfrm}} +-\entry{wcsxfrm}{94}{\code {wcsxfrm}} +-\entry{memchr}{96}{\code {memchr}} +-\entry{wmemchr}{96}{\code {wmemchr}} +-\entry{rawmemchr}{96}{\code {rawmemchr}} +-\entry{memrchr}{97}{\code {memrchr}} +-\entry{strchr}{97}{\code {strchr}} +-\entry{wcschr}{97}{\code {wcschr}} +-\entry{strchrnul}{97}{\code {strchrnul}} +-\entry{wcschrnul}{97}{\code {wcschrnul}} +-\entry{strrchr}{98}{\code {strrchr}} +-\entry{wcsrchr}{98}{\code {wcsrchr}} +-\entry{strstr}{98}{\code {strstr}} +-\entry{wcsstr}{98}{\code {wcsstr}} +-\entry{wcswcs}{98}{\code {wcswcs}} +-\entry{strcasestr}{98}{\code {strcasestr}} +-\entry{memmem}{99}{\code {memmem}} +-\entry{strspn}{99}{\code {strspn}} +-\entry{wcsspn}{99}{\code {wcsspn}} +-\entry{strcspn}{99}{\code {strcspn}} +-\entry{wcscspn}{99}{\code {wcscspn}} +-\entry{strpbrk}{99}{\code {strpbrk}} +-\entry{wcspbrk}{100}{\code {wcspbrk}} +-\entry{index}{100}{\code {index}} +-\entry{rindex}{100}{\code {rindex}} +-\entry{strtok}{100}{\code {strtok}} +-\entry{wcstok}{101}{\code {wcstok}} +-\entry{strtok_r}{102}{\code {strtok_r}} +-\entry{strsep}{102}{\code {strsep}} +-\entry{basename}{103}{\code {basename}} +-\entry{basename}{104}{\code {basename}} +-\entry{dirname}{104}{\code {dirname}} +-\entry{strfry}{105}{\code {strfry}} +-\entry{memfrob}{105}{\code {memfrob}} +-\entry{l64a}{105}{\code {l64a}} +-\entry{a64l}{106}{\code {a64l}} +-\entry{argz_create}{108}{\code {argz_create}} +-\entry{argz_create_sep}{108}{\code {argz_create_sep}} +-\entry{argz_count}{108}{\code {argz_count}} +-\entry{argz_extract}{108}{\code {argz_extract}} +-\entry{argz_stringify}{108}{\code {argz_stringify}} +-\entry{argz_add}{108}{\code {argz_add}} +-\entry{argz_add_sep}{108}{\code {argz_add_sep}} +-\entry{argz_append}{108}{\code {argz_append}} +-\entry{argz_delete}{109}{\code {argz_delete}} +-\entry{argz_insert}{109}{\code {argz_insert}} +-\entry{argz_next}{109}{\code {argz_next}} +-\entry{argz_replace}{109}{\code {argz_replace}} +-\entry{envz_entry}{110}{\code {envz_entry}} +-\entry{envz_get}{110}{\code {envz_get}} +-\entry{envz_add}{110}{\code {envz_add}} +-\entry{envz_merge}{110}{\code {envz_merge}} +-\entry{envz_strip}{110}{\code {envz_strip}} +-\entry{mbsinit}{117}{\code {mbsinit}} +-\entry{btowc}{118}{\code {btowc}} +-\entry{wctob}{118}{\code {wctob}} +-\entry{mbrtowc}{119}{\code {mbrtowc}} +-\entry{mbrlen}{120}{\code {mbrlen}} +-\entry{wcrtomb}{121}{\code {wcrtomb}} +-\entry{mbsrtowcs}{123}{\code {mbsrtowcs}} +-\entry{wcsrtombs}{124}{\code {wcsrtombs}} +-\entry{mbsnrtowcs}{125}{\code {mbsnrtowcs}} +-\entry{wcsnrtombs}{126}{\code {wcsnrtombs}} +-\entry{mbtowc}{128}{\code {mbtowc}} +-\entry{wctomb}{128}{\code {wctomb}} +-\entry{mblen}{129}{\code {mblen}} +-\entry{mbstowcs}{129}{\code {mbstowcs}} +-\entry{wcstombs}{130}{\code {wcstombs}} +-\entry{iconv_open}{132}{\code {iconv_open}} +-\entry{iconv_close}{133}{\code {iconv_close}} +-\entry{iconv}{134}{\code {iconv}} +-\entry{setlocale}{155}{\code {setlocale}} +-\entry{localeconv}{158}{\code {localeconv}} +-\entry{nl_langinfo}{161}{\code {nl_langinfo}} +-\entry{strfmon}{167}{\code {strfmon}} +-\entry{rpmatch}{170}{\code {rpmatch}} +-\entry{catopen}{171}{\code {catopen}} +-\entry{catgets}{174}{\code {catgets}} +-\entry{catclose}{174}{\code {catclose}} +-\entry{gettext}{181}{\code {gettext}} +-\entry{dgettext}{182}{\code {dgettext}} +-\entry{dcgettext}{182}{\code {dcgettext}} +-\entry{textdomain}{184}{\code {textdomain}} +-\entry{bindtextdomain}{184}{\code {bindtextdomain}} +-\entry{ngettext}{186}{\code {ngettext}} +-\entry{dngettext}{186}{\code {dngettext}} +-\entry{dcngettext}{186}{\code {dcngettext}} +-\entry{bind_textdomain_codeset}{189}{\code {bind_textdomain_codeset}} +-\entry{lfind}{195}{\code {lfind}} +-\entry{lsearch}{196}{\code {lsearch}} +-\entry{bsearch}{196}{\code {bsearch}} +-\entry{qsort}{196}{\code {qsort}} +-\entry{hcreate}{199}{\code {hcreate}} +-\entry{hdestroy}{200}{\code {hdestroy}} +-\entry{hsearch}{200}{\code {hsearch}} +-\entry{hcreate_r}{201}{\code {hcreate_r}} +-\entry{hdestroy_r}{201}{\code {hdestroy_r}} +-\entry{hsearch_r}{201}{\code {hsearch_r}} +-\entry{tsearch}{202}{\code {tsearch}} +-\entry{tfind}{202}{\code {tfind}} +-\entry{tdelete}{202}{\code {tdelete}} +-\entry{tdestroy}{203}{\code {tdestroy}} +-\entry{twalk}{203}{\code {twalk}} +-\entry{fnmatch}{205}{\code {fnmatch}} +-\entry{glob}{209}{\code {glob}} +-\entry{glob64}{209}{\code {glob64}} +-\entry{globfree}{213}{\code {globfree}} +-\entry{globfree64}{213}{\code {globfree64}} +-\entry{regcomp}{214}{\code {regcomp}} +-\entry{regexec}{216}{\code {regexec}} +-\entry{regfree}{218}{\code {regfree}} +-\entry{regerror}{218}{\code {regerror}} +-\entry{wordexp}{220}{\code {wordexp}} +-\entry{wordfree}{220}{\code {wordfree}} +-\entry{fopen}{232}{\code {fopen}} +-\entry{fopen64}{233}{\code {fopen64}} +-\entry{freopen}{234}{\code {freopen}} +-\entry{freopen64}{234}{\code {freopen64}} +-\entry{__freadable}{235}{\code {__freadable}} +-\entry{__fwritable}{235}{\code {__fwritable}} +-\entry{__freading}{235}{\code {__freading}} +-\entry{__fwriting}{235}{\code {__fwriting}} +-\entry{fclose}{235}{\code {fclose}} +-\entry{fcloseall}{236}{\code {fcloseall}} +-\entry{flockfile}{236}{\code {flockfile}} +-\entry{ftrylockfile}{237}{\code {ftrylockfile}} +-\entry{funlockfile}{237}{\code {funlockfile}} +-\entry{__fsetlocking}{238}{\code {__fsetlocking}} +-\entry{fwide}{240}{\code {fwide}} +-\entry{fputc}{241}{\code {fputc}} +-\entry{fputwc}{241}{\code {fputwc}} +-\entry{fputc_unlocked}{241}{\code {fputc_unlocked}} +-\entry{fputwc_unlocked}{241}{\code {fputwc_unlocked}} +-\entry{putc}{241}{\code {putc}} +-\entry{putwc}{242}{\code {putwc}} +-\entry{putc_unlocked}{242}{\code {putc_unlocked}} +-\entry{putwc_unlocked}{242}{\code {putwc_unlocked}} +-\entry{putchar}{242}{\code {putchar}} +-\entry{putwchar}{242}{\code {putwchar}} +-\entry{putchar_unlocked}{242}{\code {putchar_unlocked}} +-\entry{putwchar_unlocked}{242}{\code {putwchar_unlocked}} +-\entry{fputs}{242}{\code {fputs}} +-\entry{fputws}{242}{\code {fputws}} +-\entry{fputs_unlocked}{243}{\code {fputs_unlocked}} +-\entry{fputws_unlocked}{243}{\code {fputws_unlocked}} +-\entry{puts}{243}{\code {puts}} +-\entry{putw}{243}{\code {putw}} +-\entry{fgetc}{243}{\code {fgetc}} +-\entry{fgetwc}{243}{\code {fgetwc}} +-\entry{fgetc_unlocked}{244}{\code {fgetc_unlocked}} +-\entry{fgetwc_unlocked}{244}{\code {fgetwc_unlocked}} +-\entry{getc}{244}{\code {getc}} +-\entry{getwc}{244}{\code {getwc}} +-\entry{getc_unlocked}{244}{\code {getc_unlocked}} +-\entry{getwc_unlocked}{244}{\code {getwc_unlocked}} +-\entry{getchar}{244}{\code {getchar}} +-\entry{getwchar}{244}{\code {getwchar}} +-\entry{getchar_unlocked}{244}{\code {getchar_unlocked}} +-\entry{getwchar_unlocked}{244}{\code {getwchar_unlocked}} +-\entry{getw}{245}{\code {getw}} +-\entry{getline}{245}{\code {getline}} +-\entry{getdelim}{246}{\code {getdelim}} +-\entry{fgets}{246}{\code {fgets}} +-\entry{fgetws}{246}{\code {fgetws}} +-\entry{fgets_unlocked}{247}{\code {fgets_unlocked}} +-\entry{fgetws_unlocked}{247}{\code {fgetws_unlocked}} +-\entry{gets}{247}{\code {gets}} +-\entry{ungetc}{248}{\code {ungetc}} +-\entry{ungetwc}{248}{\code {ungetwc}} +-\entry{fread}{249}{\code {fread}} +-\entry{fread_unlocked}{249}{\code {fread_unlocked}} +-\entry{fwrite}{250}{\code {fwrite}} +-\entry{fwrite_unlocked}{250}{\code {fwrite_unlocked}} +-\entry{printf}{259}{\code {printf}} +-\entry{wprintf}{259}{\code {wprintf}} +-\entry{fprintf}{259}{\code {fprintf}} +-\entry{fwprintf}{259}{\code {fwprintf}} +-\entry{sprintf}{259}{\code {sprintf}} +-\entry{swprintf}{259}{\code {swprintf}} +-\entry{snprintf}{260}{\code {snprintf}} +-\entry{asprintf}{261}{\code {asprintf}} +-\entry{obstack_printf}{261}{\code {obstack_printf}} +-\entry{vprintf}{262}{\code {vprintf}} +-\entry{vwprintf}{262}{\code {vwprintf}} +-\entry{vfprintf}{262}{\code {vfprintf}} +-\entry{vfwprintf}{262}{\code {vfwprintf}} +-\entry{vsprintf}{262}{\code {vsprintf}} +-\entry{vswprintf}{262}{\code {vswprintf}} +-\entry{vsnprintf}{263}{\code {vsnprintf}} +-\entry{vasprintf}{263}{\code {vasprintf}} +-\entry{obstack_vprintf}{263}{\code {obstack_vprintf}} +-\entry{parse_printf_format}{264}{\code {parse_printf_format}} +-\entry{register_printf_function}{267}{\code {register_printf_function}} +-\entry{printf_size}{271}{\code {printf_size}} +-\entry{printf_size_info}{271}{\code {printf_size_info}} +-\entry{scanf}{279}{\code {scanf}} +-\entry{wscanf}{280}{\code {wscanf}} +-\entry{fscanf}{280}{\code {fscanf}} +-\entry{fwscanf}{280}{\code {fwscanf}} +-\entry{sscanf}{280}{\code {sscanf}} +-\entry{swscanf}{280}{\code {swscanf}} +-\entry{vscanf}{281}{\code {vscanf}} +-\entry{vwscanf}{281}{\code {vwscanf}} +-\entry{vfscanf}{281}{\code {vfscanf}} +-\entry{vfwscanf}{281}{\code {vfwscanf}} +-\entry{vsscanf}{281}{\code {vsscanf}} +-\entry{vswscanf}{281}{\code {vswscanf}} +-\entry{feof}{282}{\code {feof}} +-\entry{feof_unlocked}{282}{\code {feof_unlocked}} +-\entry{ferror}{282}{\code {ferror}} +-\entry{ferror_unlocked}{282}{\code {ferror_unlocked}} +-\entry{clearerr}{282}{\code {clearerr}} +-\entry{clearerr_unlocked}{283}{\code {clearerr_unlocked}} +-\entry{ftell}{284}{\code {ftell}} +-\entry{ftello}{284}{\code {ftello}} +-\entry{ftello64}{285}{\code {ftello64}} +-\entry{fseek}{285}{\code {fseek}} +-\entry{fseeko}{285}{\code {fseeko}} +-\entry{fseeko64}{285}{\code {fseeko64}} +-\entry{rewind}{286}{\code {rewind}} +-\entry{fgetpos}{287}{\code {fgetpos}} +-\entry{fgetpos64}{287}{\code {fgetpos64}} +-\entry{fsetpos}{288}{\code {fsetpos}} +-\entry{fsetpos64}{288}{\code {fsetpos64}} +-\entry{fflush}{289}{\code {fflush}} +-\entry{fflush_unlocked}{289}{\code {fflush_unlocked}} +-\entry{_flushlbf}{289}{\code {_flushlbf}} +-\entry{__fpurge}{290}{\code {__fpurge}} +-\entry{setvbuf}{290}{\code {setvbuf}} +-\entry{setbuf}{291}{\code {setbuf}} +-\entry{setbuffer}{291}{\code {setbuffer}} +-\entry{setlinebuf}{291}{\code {setlinebuf}} +-\entry{__flbf}{291}{\code {__flbf}} +-\entry{__fbufsize}{292}{\code {__fbufsize}} +-\entry{__fpending}{292}{\code {__fpending}} +-\entry{fmemopen}{292}{\code {fmemopen}} +-\entry{open_memstream}{293}{\code {open_memstream}} +-\entry{open_obstack_stream}{294}{\code {open_obstack_stream}} +-\entry{fopencookie}{296}{\code {fopencookie}} +-\entry{fmtmsg}{298}{\code {fmtmsg}} +-\entry{addseverity}{300}{\code {addseverity}} +-\entry{open}{303}{\code {open}} +-\entry{open64}{304}{\code {open64}} +-\entry{creat}{304}{\code {creat}} +-\entry{creat64}{305}{\code {creat64}} +-\entry{close}{305}{\code {close}} +-\entry{read}{306}{\code {read}} +-\entry{pread}{307}{\code {pread}} +-\entry{pread64}{307}{\code {pread64}} +-\entry{write}{308}{\code {write}} +-\entry{pwrite}{309}{\code {pwrite}} +-\entry{pwrite64}{310}{\code {pwrite64}} +-\entry{lseek}{310}{\code {lseek}} +-\entry{lseek64}{311}{\code {lseek64}} +-\entry{fdopen}{313}{\code {fdopen}} +-\entry{fileno}{313}{\code {fileno}} +-\entry{fileno_unlocked}{313}{\code {fileno_unlocked}} +-\entry{fclean}{315}{\code {fclean}} +-\entry{readv}{316}{\code {readv}} +-\entry{writev}{316}{\code {writev}} +-\entry{mmap}{317}{\code {mmap}} +-\entry{mmap64}{318}{\code {mmap64}} +-\entry{munmap}{318}{\code {munmap}} +-\entry{msync}{319}{\code {msync}} +-\entry{mremap}{319}{\code {mremap}} +-\entry{madvise}{320}{\code {madvise}} +-\entry{FD_ZERO}{321}{\code {FD_ZERO}} +-\entry{FD_SET}{321}{\code {FD_SET}} +-\entry{FD_CLR}{321}{\code {FD_CLR}} +-\entry{FD_ISSET}{322}{\code {FD_ISSET}} +-\entry{select}{322}{\code {select}} +-\entry{sync}{323}{\code {sync}} +-\entry{fsync}{324}{\code {fsync}} +-\entry{fdatasync}{324}{\code {fdatasync}} +-\entry{aio_read}{327}{\code {aio_read}} +-\entry{aio_read64}{328}{\code {aio_read64}} +-\entry{aio_write}{328}{\code {aio_write}} +-\entry{aio_write64}{329}{\code {aio_write64}} +-\entry{lio_listio}{330}{\code {lio_listio}} +-\entry{lio_listio64}{331}{\code {lio_listio64}} +-\entry{aio_error}{331}{\code {aio_error}} +-\entry{aio_error64}{331}{\code {aio_error64}} +-\entry{aio_return}{332}{\code {aio_return}} +-\entry{aio_return64}{332}{\code {aio_return64}} +-\entry{aio_fsync}{332}{\code {aio_fsync}} +-\entry{aio_fsync64}{333}{\code {aio_fsync64}} +-\entry{aio_suspend}{333}{\code {aio_suspend}} +-\entry{aio_suspend64}{334}{\code {aio_suspend64}} +-\entry{aio_cancel}{334}{\code {aio_cancel}} +-\entry{aio_cancel64}{335}{\code {aio_cancel64}} +-\entry{aio_init}{336}{\code {aio_init}} +-\entry{fcntl}{336}{\code {fcntl}} +-\entry{dup}{337}{\code {dup}} +-\entry{dup2}{337}{\code {dup2}} +-\entry{ioctl}{349}{\code {ioctl}} +-\entry{getcwd}{351}{\code {getcwd}} +-\entry{getwd}{352}{\code {getwd}} +-\entry{get_current_dir_name}{352}{\code {get_current_dir_name}} +-\entry{chdir}{352}{\code {chdir}} +-\entry{fchdir}{352}{\code {fchdir}} +-\entry{IFTODT}{354}{\code {IFTODT}} +-\entry{DTTOIF}{354}{\code {DTTOIF}} +-\entry{opendir}{354}{\code {opendir}} +-\entry{dirfd}{355}{\code {dirfd}} +-\entry{readdir}{355}{\code {readdir}} +-\entry{readdir_r}{355}{\code {readdir_r}} +-\entry{readdir64}{356}{\code {readdir64}} +-\entry{readdir64_r}{356}{\code {readdir64_r}} +-\entry{closedir}{356}{\code {closedir}} +-\entry{rewinddir}{357}{\code {rewinddir}} +-\entry{telldir}{357}{\code {telldir}} +-\entry{seekdir}{357}{\code {seekdir}} +-\entry{scandir}{358}{\code {scandir}} +-\entry{alphasort}{358}{\code {alphasort}} +-\entry{versionsort}{358}{\code {versionsort}} +-\entry{scandir64}{358}{\code {scandir64}} +-\entry{alphasort64}{359}{\code {alphasort64}} +-\entry{versionsort64}{359}{\code {versionsort64}} +-\entry{ftw}{361}{\code {ftw}} +-\entry{ftw64}{362}{\code {ftw64}} +-\entry{nftw}{362}{\code {nftw}} +-\entry{nftw64}{363}{\code {nftw64}} +-\entry{link}{364}{\code {link}} +-\entry{symlink}{365}{\code {symlink}} +-\entry{readlink}{365}{\code {readlink}} +-\entry{canonicalize_file_name}{366}{\code {canonicalize_file_name}} +-\entry{realpath}{367}{\code {realpath}} +-\entry{unlink}{367}{\code {unlink}} +-\entry{rmdir}{368}{\code {rmdir}} +-\entry{remove}{368}{\code {remove}} +-\entry{rename}{368}{\code {rename}} +-\entry{mkdir}{369}{\code {mkdir}} +-\entry{stat}{374}{\code {stat}} +-\entry{stat64}{374}{\code {stat64}} +-\entry{fstat}{375}{\code {fstat}} +-\entry{fstat64}{375}{\code {fstat64}} +-\entry{lstat}{375}{\code {lstat}} +-\entry{lstat64}{375}{\code {lstat64}} +-\entry{S_ISDIR}{376}{\code {S_ISDIR}} +-\entry{S_ISCHR}{376}{\code {S_ISCHR}} +-\entry{S_ISBLK}{376}{\code {S_ISBLK}} +-\entry{S_ISREG}{376}{\code {S_ISREG}} +-\entry{S_ISFIFO}{376}{\code {S_ISFIFO}} +-\entry{S_ISLNK}{376}{\code {S_ISLNK}} +-\entry{S_ISSOCK}{376}{\code {S_ISSOCK}} +-\entry{S_TYPEISMQ}{377}{\code {S_TYPEISMQ}} +-\entry{S_TYPEISSEM}{377}{\code {S_TYPEISSEM}} +-\entry{S_TYPEISSHM}{377}{\code {S_TYPEISSHM}} +-\entry{chown}{377}{\code {chown}} +-\entry{fchown}{378}{\code {fchown}} +-\entry{chmod}{381}{\code {chmod}} +-\entry{umask}{381}{\code {umask}} +-\entry{getumask}{381}{\code {getumask}} +-\entry{chmod}{381}{\code {chmod}} +-\entry{fchmod}{382}{\code {fchmod}} +-\entry{access}{383}{\code {access}} +-\entry{utime}{384}{\code {utime}} +-\entry{utimes}{385}{\code {utimes}} +-\entry{lutimes}{385}{\code {lutimes}} +-\entry{futimes}{385}{\code {futimes}} +-\entry{truncate}{386}{\code {truncate}} +-\entry{truncate64}{386}{\code {truncate64}} +-\entry{ftruncate}{386}{\code {ftruncate}} +-\entry{ftruncate64}{387}{\code {ftruncate64}} +-\entry{mknod}{388}{\code {mknod}} +-\entry{tmpfile}{389}{\code {tmpfile}} +-\entry{tmpfile64}{389}{\code {tmpfile64}} +-\entry{tmpnam}{389}{\code {tmpnam}} +-\entry{tmpnam_r}{389}{\code {tmpnam_r}} +-\entry{tempnam}{390}{\code {tempnam}} +-\entry{mktemp}{390}{\code {mktemp}} +-\entry{mkstemp}{391}{\code {mkstemp}} +-\entry{mkdtemp}{391}{\code {mkdtemp}} +-\entry{pipe}{393}{\code {pipe}} +-\entry{popen}{395}{\code {popen}} +-\entry{pclose}{395}{\code {pclose}} +-\entry{mkfifo}{396}{\code {mkfifo}} +-\entry{bind}{403}{\code {bind}} +-\entry{getsockname}{403}{\code {getsockname}} +-\entry{if_nametoindex}{404}{\code {if_nametoindex}} +-\entry{if_indextoname}{404}{\code {if_indextoname}} +-\entry{if_nameindex}{405}{\code {if_nameindex}} +-\entry{if_freenameindex}{405}{\code {if_freenameindex}} +-\entry{SUN_LEN}{406}{\code {SUN_LEN}} +-\entry{inet_aton}{412}{\code {inet_aton}} +-\entry{inet_addr}{412}{\code {inet_addr}} +-\entry{inet_network}{412}{\code {inet_network}} +-\entry{inet_ntoa}{412}{\code {inet_ntoa}} +-\entry{inet_makeaddr}{412}{\code {inet_makeaddr}} +-\entry{inet_lnaof}{412}{\code {inet_lnaof}} +-\entry{inet_netof}{412}{\code {inet_netof}} +-\entry{inet_pton}{412}{\code {inet_pton}} +-\entry{inet_ntop}{413}{\code {inet_ntop}} +-\entry{gethostbyname}{414}{\code {gethostbyname}} +-\entry{gethostbyname2}{414}{\code {gethostbyname2}} +-\entry{gethostbyaddr}{414}{\code {gethostbyaddr}} +-\entry{gethostbyname_r}{415}{\code {gethostbyname_r}} +-\entry{gethostbyname2_r}{415}{\code {gethostbyname2_r}} +-\entry{gethostbyaddr_r}{415}{\code {gethostbyaddr_r}} +-\entry{sethostent}{416}{\code {sethostent}} +-\entry{gethostent}{416}{\code {gethostent}} +-\entry{endhostent}{416}{\code {endhostent}} +-\entry{getservbyname}{417}{\code {getservbyname}} +-\entry{getservbyport}{418}{\code {getservbyport}} +-\entry{setservent}{418}{\code {setservent}} +-\entry{getservent}{418}{\code {getservent}} +-\entry{endservent}{418}{\code {endservent}} +-\entry{htons}{418}{\code {htons}} +-\entry{ntohs}{419}{\code {ntohs}} +-\entry{htonl}{419}{\code {htonl}} +-\entry{ntohl}{419}{\code {ntohl}} +-\entry{getprotobyname}{420}{\code {getprotobyname}} +-\entry{getprotobynumber}{420}{\code {getprotobynumber}} +-\entry{setprotoent}{420}{\code {setprotoent}} +-\entry{getprotoent}{420}{\code {getprotoent}} +-\entry{endprotoent}{420}{\code {endprotoent}} +-\entry{socket}{422}{\code {socket}} +-\entry{shutdown}{422}{\code {shutdown}} +-\entry{socketpair}{423}{\code {socketpair}} +-\entry{connect}{424}{\code {connect}} +-\entry{listen}{425}{\code {listen}} +-\entry{accept}{426}{\code {accept}} +-\entry{getpeername}{427}{\code {getpeername}} +-\entry{send}{428}{\code {send}} +-\entry{recv}{429}{\code {recv}} +-\entry{sendto}{436}{\code {sendto}} +-\entry{recvfrom}{436}{\code {recvfrom}} +-\entry{getsockopt}{441}{\code {getsockopt}} +-\entry{setsockopt}{441}{\code {setsockopt}} +-\entry{getnetbyname}{443}{\code {getnetbyname}} +-\entry{getnetbyaddr}{444}{\code {getnetbyaddr}} +-\entry{setnetent}{444}{\code {setnetent}} +-\entry{getnetent}{444}{\code {getnetent}} +-\entry{endnetent}{444}{\code {endnetent}} +-\entry{isatty}{445}{\code {isatty}} +-\entry{ttyname}{445}{\code {ttyname}} +-\entry{ttyname_r}{445}{\code {ttyname_r}} +-\entry{tcgetattr}{448}{\code {tcgetattr}} +-\entry{tcsetattr}{448}{\code {tcsetattr}} +-\entry{cfgetospeed}{457}{\code {cfgetospeed}} +-\entry{cfgetispeed}{457}{\code {cfgetispeed}} +-\entry{cfsetospeed}{457}{\code {cfsetospeed}} +-\entry{cfsetispeed}{457}{\code {cfsetispeed}} +-\entry{cfsetspeed}{457}{\code {cfsetspeed}} +-\entry{cfmakeraw}{464}{\code {cfmakeraw}} +-\entry{gtty}{464}{\code {gtty}} +-\entry{stty}{464}{\code {stty}} +-\entry{tcsendbreak}{465}{\code {tcsendbreak}} +-\entry{tcdrain}{465}{\code {tcdrain}} +-\entry{tcflush}{465}{\code {tcflush}} +-\entry{tcflow}{466}{\code {tcflow}} +-\entry{getpt}{468}{\code {getpt}} +-\entry{grantpt}{468}{\code {grantpt}} +-\entry{unlockpt}{469}{\code {unlockpt}} +-\entry{ptsname}{469}{\code {ptsname}} +-\entry{ptsname_r}{469}{\code {ptsname_r}} +-\entry{openpty}{470}{\code {openpty}} +-\entry{forkpty}{470}{\code {forkpty}} +-\entry{openlog}{472}{\code {openlog}} +-\entry{syslog}{474}{\code {syslog}} +-\entry{vsyslog}{476}{\code {vsyslog}} +-\entry{closelog}{476}{\code {closelog}} +-\entry{setlogmask}{477}{\code {setlogmask}} +-\entry{sin}{480}{\code {sin}} +-\entry{sinf}{480}{\code {sinf}} +-\entry{sinl}{480}{\code {sinl}} +-\entry{cos}{480}{\code {cos}} +-\entry{cosf}{480}{\code {cosf}} +-\entry{cosl}{480}{\code {cosl}} +-\entry{tan}{480}{\code {tan}} +-\entry{tanf}{480}{\code {tanf}} +-\entry{tanl}{480}{\code {tanl}} +-\entry{sincos}{480}{\code {sincos}} +-\entry{sincosf}{480}{\code {sincosf}} +-\entry{sincosl}{480}{\code {sincosl}} +-\entry{csin}{481}{\code {csin}} +-\entry{csinf}{481}{\code {csinf}} +-\entry{csinl}{481}{\code {csinl}} +-\entry{ccos}{481}{\code {ccos}} +-\entry{ccosf}{481}{\code {ccosf}} +-\entry{ccosl}{481}{\code {ccosl}} +-\entry{ctan}{481}{\code {ctan}} +-\entry{ctanf}{481}{\code {ctanf}} +-\entry{ctanl}{481}{\code {ctanl}} +-\entry{asin}{481}{\code {asin}} +-\entry{asinf}{481}{\code {asinf}} +-\entry{asinl}{481}{\code {asinl}} +-\entry{acos}{482}{\code {acos}} +-\entry{acosf}{482}{\code {acosf}} +-\entry{acosl}{482}{\code {acosl}} +-\entry{atan}{482}{\code {atan}} +-\entry{atanf}{482}{\code {atanf}} +-\entry{atanl}{482}{\code {atanl}} +-\entry{atan2}{482}{\code {atan2}} +-\entry{atan2f}{482}{\code {atan2f}} +-\entry{atan2l}{482}{\code {atan2l}} +-\entry{casin}{482}{\code {casin}} +-\entry{casinf}{482}{\code {casinf}} +-\entry{casinl}{482}{\code {casinl}} +-\entry{cacos}{482}{\code {cacos}} +-\entry{cacosf}{482}{\code {cacosf}} +-\entry{cacosl}{482}{\code {cacosl}} +-\entry{catan}{482}{\code {catan}} +-\entry{catanf}{482}{\code {catanf}} +-\entry{catanl}{482}{\code {catanl}} +-\entry{exp}{483}{\code {exp}} +-\entry{expf}{483}{\code {expf}} +-\entry{expl}{483}{\code {expl}} +-\entry{exp2}{483}{\code {exp2}} +-\entry{exp2f}{483}{\code {exp2f}} +-\entry{exp2l}{483}{\code {exp2l}} +-\entry{exp10}{483}{\code {exp10}} +-\entry{exp10f}{483}{\code {exp10f}} +-\entry{exp10l}{483}{\code {exp10l}} +-\entry{pow10}{483}{\code {pow10}} +-\entry{pow10f}{483}{\code {pow10f}} +-\entry{pow10l}{483}{\code {pow10l}} +-\entry{log}{483}{\code {log}} +-\entry{logf}{483}{\code {logf}} +-\entry{logl}{483}{\code {logl}} +-\entry{log10}{483}{\code {log10}} +-\entry{log10f}{483}{\code {log10f}} +-\entry{log10l}{483}{\code {log10l}} +-\entry{log2}{483}{\code {log2}} +-\entry{log2f}{483}{\code {log2f}} +-\entry{log2l}{483}{\code {log2l}} +-\entry{logb}{483}{\code {logb}} +-\entry{logbf}{484}{\code {logbf}} +-\entry{logbl}{484}{\code {logbl}} +-\entry{ilogb}{484}{\code {ilogb}} +-\entry{ilogbf}{484}{\code {ilogbf}} +-\entry{ilogbl}{484}{\code {ilogbl}} +-\entry{pow}{484}{\code {pow}} +-\entry{powf}{484}{\code {powf}} +-\entry{powl}{484}{\code {powl}} +-\entry{sqrt}{485}{\code {sqrt}} +-\entry{sqrtf}{485}{\code {sqrtf}} +-\entry{sqrtl}{485}{\code {sqrtl}} +-\entry{cbrt}{485}{\code {cbrt}} +-\entry{cbrtf}{485}{\code {cbrtf}} +-\entry{cbrtl}{485}{\code {cbrtl}} +-\entry{hypot}{485}{\code {hypot}} +-\entry{hypotf}{485}{\code {hypotf}} +-\entry{hypotl}{485}{\code {hypotl}} +-\entry{expm1}{485}{\code {expm1}} +-\entry{expm1f}{485}{\code {expm1f}} +-\entry{expm1l}{485}{\code {expm1l}} +-\entry{log1p}{485}{\code {log1p}} +-\entry{log1pf}{485}{\code {log1pf}} +-\entry{log1pl}{485}{\code {log1pl}} +-\entry{cexp}{485}{\code {cexp}} +-\entry{cexpf}{485}{\code {cexpf}} +-\entry{cexpl}{485}{\code {cexpl}} +-\entry{clog}{485}{\code {clog}} +-\entry{clogf}{486}{\code {clogf}} +-\entry{clogl}{486}{\code {clogl}} +-\entry{clog10}{486}{\code {clog10}} +-\entry{clog10f}{486}{\code {clog10f}} +-\entry{clog10l}{486}{\code {clog10l}} +-\entry{csqrt}{486}{\code {csqrt}} +-\entry{csqrtf}{486}{\code {csqrtf}} +-\entry{csqrtl}{486}{\code {csqrtl}} +-\entry{cpow}{486}{\code {cpow}} +-\entry{cpowf}{486}{\code {cpowf}} +-\entry{cpowl}{486}{\code {cpowl}} +-\entry{sinh}{486}{\code {sinh}} +-\entry{sinhf}{486}{\code {sinhf}} +-\entry{sinhl}{486}{\code {sinhl}} +-\entry{cosh}{486}{\code {cosh}} +-\entry{coshf}{486}{\code {coshf}} +-\entry{coshl}{486}{\code {coshl}} +-\entry{tanh}{487}{\code {tanh}} +-\entry{tanhf}{487}{\code {tanhf}} +-\entry{tanhl}{487}{\code {tanhl}} +-\entry{csinh}{487}{\code {csinh}} +-\entry{csinhf}{487}{\code {csinhf}} +-\entry{csinhl}{487}{\code {csinhl}} +-\entry{ccosh}{487}{\code {ccosh}} +-\entry{ccoshf}{487}{\code {ccoshf}} +-\entry{ccoshl}{487}{\code {ccoshl}} +-\entry{ctanh}{487}{\code {ctanh}} +-\entry{ctanhf}{487}{\code {ctanhf}} +-\entry{ctanhl}{487}{\code {ctanhl}} +-\entry{asinh}{487}{\code {asinh}} +-\entry{asinhf}{487}{\code {asinhf}} +-\entry{asinhl}{487}{\code {asinhl}} +-\entry{acosh}{487}{\code {acosh}} +-\entry{acoshf}{487}{\code {acoshf}} +-\entry{acoshl}{487}{\code {acoshl}} +-\entry{atanh}{487}{\code {atanh}} +-\entry{atanhf}{487}{\code {atanhf}} +-\entry{atanhl}{487}{\code {atanhl}} +-\entry{casinh}{487}{\code {casinh}} +-\entry{casinhf}{487}{\code {casinhf}} +-\entry{casinhl}{487}{\code {casinhl}} +-\entry{cacosh}{488}{\code {cacosh}} +-\entry{cacoshf}{488}{\code {cacoshf}} +-\entry{cacoshl}{488}{\code {cacoshl}} +-\entry{catanh}{488}{\code {catanh}} +-\entry{catanhf}{488}{\code {catanhf}} +-\entry{catanhl}{488}{\code {catanhl}} +-\entry{erf}{488}{\code {erf}} +-\entry{erff}{488}{\code {erff}} +-\entry{erfl}{488}{\code {erfl}} +-\entry{erfc}{488}{\code {erfc}} +-\entry{erfcf}{488}{\code {erfcf}} +-\entry{erfcl}{488}{\code {erfcl}} +-\entry{lgamma}{488}{\code {lgamma}} +-\entry{lgammaf}{488}{\code {lgammaf}} +-\entry{lgammal}{488}{\code {lgammal}} +-\entry{lgamma_r}{489}{\code {lgamma_r}} +-\entry{lgammaf_r}{489}{\code {lgammaf_r}} +-\entry{lgammal_r}{489}{\code {lgammal_r}} +-\entry{gamma}{489}{\code {gamma}} +-\entry{gammaf}{489}{\code {gammaf}} +-\entry{gammal}{489}{\code {gammal}} +-\entry{tgamma}{489}{\code {tgamma}} +-\entry{tgammaf}{489}{\code {tgammaf}} +-\entry{tgammal}{489}{\code {tgammal}} +-\entry{j0}{489}{\code {j0}} +-\entry{j0f}{489}{\code {j0f}} +-\entry{j0l}{489}{\code {j0l}} +-\entry{j1}{489}{\code {j1}} +-\entry{j1f}{489}{\code {j1f}} +-\entry{j1l}{489}{\code {j1l}} +-\entry{jn}{489}{\code {jn}} +-\entry{jnf}{489}{\code {jnf}} +-\entry{jnl}{489}{\code {jnl}} +-\entry{y0}{489}{\code {y0}} +-\entry{y0f}{489}{\code {y0f}} +-\entry{y0l}{489}{\code {y0l}} +-\entry{y1}{490}{\code {y1}} +-\entry{y1f}{490}{\code {y1f}} +-\entry{y1l}{490}{\code {y1l}} +-\entry{yn}{490}{\code {yn}} +-\entry{ynf}{490}{\code {ynf}} +-\entry{ynl}{490}{\code {ynl}} +-\entry{rand}{508}{\code {rand}} +-\entry{srand}{508}{\code {srand}} +-\entry{rand_r}{509}{\code {rand_r}} +-\entry{random}{509}{\code {random}} +-\entry{srandom}{509}{\code {srandom}} +-\entry{initstate}{509}{\code {initstate}} +-\entry{setstate}{509}{\code {setstate}} +-\entry{random_r}{510}{\code {random_r}} +-\entry{srandom_r}{510}{\code {srandom_r}} +-\entry{initstate_r}{510}{\code {initstate_r}} +-\entry{setstate_r}{510}{\code {setstate_r}} +-\entry{drand48}{511}{\code {drand48}} +-\entry{erand48}{511}{\code {erand48}} +-\entry{lrand48}{511}{\code {lrand48}} +-\entry{nrand48}{511}{\code {nrand48}} +-\entry{mrand48}{511}{\code {mrand48}} +-\entry{jrand48}{512}{\code {jrand48}} +-\entry{srand48}{512}{\code {srand48}} +-\entry{seed48}{512}{\code {seed48}} +-\entry{lcong48}{512}{\code {lcong48}} +-\entry{drand48_r}{513}{\code {drand48_r}} +-\entry{erand48_r}{513}{\code {erand48_r}} +-\entry{lrand48_r}{513}{\code {lrand48_r}} +-\entry{nrand48_r}{513}{\code {nrand48_r}} +-\entry{mrand48_r}{514}{\code {mrand48_r}} +-\entry{jrand48_r}{514}{\code {jrand48_r}} +-\entry{srand48_r}{514}{\code {srand48_r}} +-\entry{seed48_r}{514}{\code {seed48_r}} +-\entry{lcong48_r}{515}{\code {lcong48_r}} +-\entry{div}{519}{\code {div}} +-\entry{ldiv}{519}{\code {ldiv}} +-\entry{lldiv}{519}{\code {lldiv}} +-\entry{imaxdiv}{520}{\code {imaxdiv}} +-\entry{fpclassify}{520}{\code {fpclassify}} +-\entry{isfinite}{521}{\code {isfinite}} +-\entry{isnormal}{521}{\code {isnormal}} +-\entry{isnan}{521}{\code {isnan}} +-\entry{isinf}{521}{\code {isinf}} +-\entry{isinff}{521}{\code {isinff}} +-\entry{isinfl}{521}{\code {isinfl}} +-\entry{isnan}{522}{\code {isnan}} +-\entry{isnanf}{522}{\code {isnanf}} +-\entry{isnanl}{522}{\code {isnanl}} +-\entry{finite}{522}{\code {finite}} +-\entry{finitef}{522}{\code {finitef}} +-\entry{finitel}{522}{\code {finitel}} +-\entry{matherr}{522}{\code {matherr}} +-\entry{feclearexcept}{525}{\code {feclearexcept}} +-\entry{feraiseexcept}{525}{\code {feraiseexcept}} +-\entry{fetestexcept}{526}{\code {fetestexcept}} +-\entry{fegetexceptflag}{526}{\code {fegetexceptflag}} +-\entry{fesetexceptflag}{526}{\code {fesetexceptflag}} +-\entry{fegetround}{528}{\code {fegetround}} +-\entry{fesetround}{528}{\code {fesetround}} +-\entry{fegetenv}{529}{\code {fegetenv}} +-\entry{feholdexcept}{529}{\code {feholdexcept}} +-\entry{fesetenv}{529}{\code {fesetenv}} +-\entry{feupdateenv}{530}{\code {feupdateenv}} +-\entry{feenableexcept}{530}{\code {feenableexcept}} +-\entry{fedisableexcept}{530}{\code {fedisableexcept}} +-\entry{fegetexcept}{530}{\code {fegetexcept}} +-\entry{abs}{531}{\code {abs}} +-\entry{labs}{531}{\code {labs}} +-\entry{llabs}{531}{\code {llabs}} +-\entry{imaxabs}{531}{\code {imaxabs}} +-\entry{fabs}{531}{\code {fabs}} +-\entry{fabsf}{531}{\code {fabsf}} +-\entry{fabsl}{531}{\code {fabsl}} +-\entry{cabs}{531}{\code {cabs}} +-\entry{cabsf}{531}{\code {cabsf}} +-\entry{cabsl}{531}{\code {cabsl}} +-\entry{frexp}{531}{\code {frexp}} +-\entry{frexpf}{531}{\code {frexpf}} +-\entry{frexpl}{531}{\code {frexpl}} +-\entry{ldexp}{532}{\code {ldexp}} +-\entry{ldexpf}{532}{\code {ldexpf}} +-\entry{ldexpl}{532}{\code {ldexpl}} +-\entry{scalb}{532}{\code {scalb}} +-\entry{scalbf}{532}{\code {scalbf}} +-\entry{scalbl}{532}{\code {scalbl}} +-\entry{scalbn}{532}{\code {scalbn}} +-\entry{scalbnf}{532}{\code {scalbnf}} +-\entry{scalbnl}{532}{\code {scalbnl}} +-\entry{scalbln}{532}{\code {scalbln}} +-\entry{scalblnf}{532}{\code {scalblnf}} +-\entry{scalblnl}{532}{\code {scalblnl}} +-\entry{significand}{532}{\code {significand}} +-\entry{significandf}{532}{\code {significandf}} +-\entry{significandl}{532}{\code {significandl}} +-\entry{ceil}{533}{\code {ceil}} +-\entry{ceilf}{533}{\code {ceilf}} +-\entry{ceill}{533}{\code {ceill}} +-\entry{floor}{533}{\code {floor}} +-\entry{floorf}{533}{\code {floorf}} +-\entry{floorl}{533}{\code {floorl}} +-\entry{trunc}{533}{\code {trunc}} +-\entry{truncf}{533}{\code {truncf}} +-\entry{truncl}{533}{\code {truncl}} +-\entry{rint}{533}{\code {rint}} +-\entry{rintf}{533}{\code {rintf}} +-\entry{rintl}{533}{\code {rintl}} +-\entry{nearbyint}{533}{\code {nearbyint}} +-\entry{nearbyintf}{533}{\code {nearbyintf}} +-\entry{nearbyintl}{533}{\code {nearbyintl}} +-\entry{round}{533}{\code {round}} +-\entry{roundf}{533}{\code {roundf}} +-\entry{roundl}{533}{\code {roundl}} +-\entry{lrint}{533}{\code {lrint}} +-\entry{lrintf}{533}{\code {lrintf}} +-\entry{lrintl}{533}{\code {lrintl}} +-\entry{llrint}{533}{\code {llrint}} +-\entry{llrintf}{534}{\code {llrintf}} +-\entry{llrintl}{534}{\code {llrintl}} +-\entry{lround}{534}{\code {lround}} +-\entry{lroundf}{534}{\code {lroundf}} +-\entry{lroundl}{534}{\code {lroundl}} +-\entry{llround}{534}{\code {llround}} +-\entry{llroundf}{534}{\code {llroundf}} +-\entry{llroundl}{534}{\code {llroundl}} +-\entry{modf}{534}{\code {modf}} +-\entry{modff}{534}{\code {modff}} +-\entry{modfl}{534}{\code {modfl}} +-\entry{fmod}{534}{\code {fmod}} +-\entry{fmodf}{534}{\code {fmodf}} +-\entry{fmodl}{534}{\code {fmodl}} +-\entry{drem}{534}{\code {drem}} +-\entry{dremf}{535}{\code {dremf}} +-\entry{dreml}{535}{\code {dreml}} +-\entry{remainder}{535}{\code {remainder}} +-\entry{remainderf}{535}{\code {remainderf}} +-\entry{remainderl}{535}{\code {remainderl}} +-\entry{copysign}{535}{\code {copysign}} +-\entry{copysignf}{535}{\code {copysignf}} +-\entry{copysignl}{535}{\code {copysignl}} +-\entry{signbit}{535}{\code {signbit}} +-\entry{nextafter}{535}{\code {nextafter}} +-\entry{nextafterf}{535}{\code {nextafterf}} +-\entry{nextafterl}{535}{\code {nextafterl}} +-\entry{nexttoward}{536}{\code {nexttoward}} +-\entry{nexttowardf}{536}{\code {nexttowardf}} +-\entry{nexttowardl}{536}{\code {nexttowardl}} +-\entry{nan}{536}{\code {nan}} +-\entry{nanf}{536}{\code {nanf}} +-\entry{nanl}{536}{\code {nanl}} +-\entry{isgreater}{536}{\code {isgreater}} +-\entry{isgreaterequal}{536}{\code {isgreaterequal}} +-\entry{isless}{536}{\code {isless}} +-\entry{islessequal}{537}{\code {islessequal}} +-\entry{islessgreater}{537}{\code {islessgreater}} +-\entry{isunordered}{537}{\code {isunordered}} +-\entry{fmin}{537}{\code {fmin}} +-\entry{fminf}{537}{\code {fminf}} +-\entry{fminl}{537}{\code {fminl}} +-\entry{fmax}{537}{\code {fmax}} +-\entry{fmaxf}{537}{\code {fmaxf}} +-\entry{fmaxl}{537}{\code {fmaxl}} +-\entry{fdim}{537}{\code {fdim}} +-\entry{fdimf}{537}{\code {fdimf}} +-\entry{fdiml}{537}{\code {fdiml}} +-\entry{fma}{538}{\code {fma}} +-\entry{fmaf}{538}{\code {fmaf}} +-\entry{fmal}{538}{\code {fmal}} +-\entry{creal}{539}{\code {creal}} +-\entry{crealf}{539}{\code {crealf}} +-\entry{creall}{539}{\code {creall}} +-\entry{cimag}{539}{\code {cimag}} +-\entry{cimagf}{539}{\code {cimagf}} +-\entry{cimagl}{539}{\code {cimagl}} +-\entry{conj}{539}{\code {conj}} +-\entry{conjf}{539}{\code {conjf}} +-\entry{conjl}{539}{\code {conjl}} +-\entry{carg}{539}{\code {carg}} +-\entry{cargf}{539}{\code {cargf}} +-\entry{cargl}{539}{\code {cargl}} +-\entry{cproj}{539}{\code {cproj}} +-\entry{cprojf}{539}{\code {cprojf}} +-\entry{cprojl}{539}{\code {cprojl}} +-\entry{strtol}{540}{\code {strtol}} +-\entry{wcstol}{540}{\code {wcstol}} +-\entry{strtoul}{541}{\code {strtoul}} +-\entry{wcstoul}{541}{\code {wcstoul}} +-\entry{strtoll}{541}{\code {strtoll}} +-\entry{wcstoll}{541}{\code {wcstoll}} +-\entry{strtoq}{541}{\code {strtoq}} +-\entry{wcstoq}{541}{\code {wcstoq}} +-\entry{strtoull}{542}{\code {strtoull}} +-\entry{wcstoull}{542}{\code {wcstoull}} +-\entry{strtouq}{542}{\code {strtouq}} +-\entry{wcstouq}{542}{\code {wcstouq}} +-\entry{strtoimax}{542}{\code {strtoimax}} +-\entry{wcstoimax}{542}{\code {wcstoimax}} +-\entry{strtoumax}{542}{\code {strtoumax}} +-\entry{wcstoumax}{543}{\code {wcstoumax}} +-\entry{atol}{543}{\code {atol}} +-\entry{atoi}{543}{\code {atoi}} +-\entry{atoll}{543}{\code {atoll}} +-\entry{strtod}{544}{\code {strtod}} +-\entry{strtof}{545}{\code {strtof}} +-\entry{strtold}{545}{\code {strtold}} +-\entry{wcstod}{545}{\code {wcstod}} +-\entry{wcstof}{545}{\code {wcstof}} +-\entry{wcstold}{545}{\code {wcstold}} +-\entry{atof}{545}{\code {atof}} +-\entry{ecvt}{546}{\code {ecvt}} +-\entry{fcvt}{546}{\code {fcvt}} +-\entry{gcvt}{546}{\code {gcvt}} +-\entry{qecvt}{546}{\code {qecvt}} +-\entry{qfcvt}{546}{\code {qfcvt}} +-\entry{qgcvt}{546}{\code {qgcvt}} +-\entry{ecvt_r}{547}{\code {ecvt_r}} +-\entry{fcvt_r}{547}{\code {fcvt_r}} +-\entry{qecvt_r}{547}{\code {qecvt_r}} +-\entry{qfcvt_r}{547}{\code {qfcvt_r}} +-\entry{difftime}{549}{\code {difftime}} +-\entry{clock}{552}{\code {clock}} +-\entry{times}{553}{\code {times}} +-\entry{time}{554}{\code {time}} +-\entry{stime}{554}{\code {stime}} +-\entry{gettimeofday}{555}{\code {gettimeofday}} +-\entry{settimeofday}{555}{\code {settimeofday}} +-\entry{adjtime}{555}{\code {adjtime}} +-\entry{adjtimex}{556}{\code {adjtimex}} +-\entry{localtime}{557}{\code {localtime}} +-\entry{localtime_r}{558}{\code {localtime_r}} +-\entry{gmtime}{558}{\code {gmtime}} +-\entry{gmtime_r}{558}{\code {gmtime_r}} +-\entry{mktime}{558}{\code {mktime}} +-\entry{timelocal}{558}{\code {timelocal}} +-\entry{timegm}{559}{\code {timegm}} +-\entry{ntp_gettime}{559}{\code {ntp_gettime}} +-\entry{ntp_adjtime}{561}{\code {ntp_adjtime}} +-\entry{asctime}{562}{\code {asctime}} +-\entry{asctime_r}{562}{\code {asctime_r}} +-\entry{ctime}{562}{\code {ctime}} +-\entry{ctime_r}{562}{\code {ctime_r}} +-\entry{strftime}{563}{\code {strftime}} +-\entry{wcsftime}{567}{\code {wcsftime}} +-\entry{strptime}{567}{\code {strptime}} +-\entry{getdate}{573}{\code {getdate}} +-\entry{getdate_r}{574}{\code {getdate_r}} +-\entry{tzset}{577}{\code {tzset}} +-\entry{setitimer}{579}{\code {setitimer}} +-\entry{getitimer}{579}{\code {getitimer}} +-\entry{alarm}{579}{\code {alarm}} +-\entry{sleep}{580}{\code {sleep}} +-\entry{nanosleep}{581}{\code {nanosleep}} +-\entry{getrusage}{583}{\code {getrusage}} +-\entry{vtimes}{584}{\code {vtimes}} +-\entry{getrlimit}{586}{\code {getrlimit}} +-\entry{getrlimit64}{586}{\code {getrlimit64}} +-\entry{setrlimit}{586}{\code {setrlimit}} +-\entry{setrlimit64}{586}{\code {setrlimit64}} +-\entry{ulimit}{588}{\code {ulimit}} +-\entry{vlimit}{588}{\code {vlimit}} +-\entry{sched_setscheduler}{593}{\code {sched_setscheduler}} +-\entry{sched_getscheduler}{593}{\code {sched_getscheduler}} +-\entry{sched_setparam}{594}{\code {sched_setparam}} +-\entry{sched_getparam}{594}{\code {sched_getparam}} +-\entry{sched_get_priority_min}{594}{\code {sched_get_priority_min}} +-\entry{sched_get_priority_max}{594}{\code {sched_get_priority_max}} +-\entry{sched_rr_get_interval}{594}{\code {sched_rr_get_interval}} +-\entry{sched_yield}{594}{\code {sched_yield}} +-\entry{getpriority}{597}{\code {getpriority}} +-\entry{setpriority}{597}{\code {setpriority}} +-\entry{nice}{597}{\code {nice}} +-\entry{getpagesize}{599}{\code {getpagesize}} +-\entry{get_phys_pages}{599}{\code {get_phys_pages}} +-\entry{get_avphys_pages}{600}{\code {get_avphys_pages}} +-\entry{get_nprocs_conf}{600}{\code {get_nprocs_conf}} +-\entry{get_nprocs}{600}{\code {get_nprocs}} +-\entry{getloadavg}{600}{\code {getloadavg}} +-\entry{setjmp}{602}{\code {setjmp}} +-\entry{longjmp}{602}{\code {longjmp}} +-\entry{sigsetjmp}{603}{\code {sigsetjmp}} +-\entry{siglongjmp}{604}{\code {siglongjmp}} +-\entry{getcontext}{604}{\code {getcontext}} +-\entry{makecontext}{605}{\code {makecontext}} +-\entry{setcontext}{605}{\code {setcontext}} +-\entry{swapcontext}{606}{\code {swapcontext}} +-\entry{strsignal}{621}{\code {strsignal}} +-\entry{psignal}{621}{\code {psignal}} +-\entry{signal}{622}{\code {signal}} +-\entry{sysv_signal}{624}{\code {sysv_signal}} +-\entry{ssignal}{624}{\code {ssignal}} +-\entry{sigaction}{625}{\code {sigaction}} +-\entry{TEMP_FAILURE_RETRY}{638}{\code {TEMP_FAILURE_RETRY}} +-\entry{raise}{639}{\code {raise}} +-\entry{gsignal}{639}{\code {gsignal}} +-\entry{kill}{640}{\code {kill}} +-\entry{killpg}{641}{\code {killpg}} +-\entry{sigemptyset}{644}{\code {sigemptyset}} +-\entry{sigfillset}{644}{\code {sigfillset}} +-\entry{sigaddset}{644}{\code {sigaddset}} +-\entry{sigdelset}{644}{\code {sigdelset}} +-\entry{sigismember}{645}{\code {sigismember}} +-\entry{sigprocmask}{645}{\code {sigprocmask}} +-\entry{sigpending}{647}{\code {sigpending}} +-\entry{pause}{650}{\code {pause}} +-\entry{sigsuspend}{651}{\code {sigsuspend}} +-\entry{sigaltstack}{653}{\code {sigaltstack}} +-\entry{sigstack}{653}{\code {sigstack}} +-\entry{sigvec}{655}{\code {sigvec}} +-\entry{siginterrupt}{655}{\code {siginterrupt}} +-\entry{sigmask}{655}{\code {sigmask}} +-\entry{sigblock}{655}{\code {sigblock}} +-\entry{sigsetmask}{655}{\code {sigsetmask}} +-\entry{sigpause}{656}{\code {sigpause}} +-\entry{main}{657}{\code {main}} +-\entry{getopt}{659}{\code {getopt}} +-\entry{getopt_long}{663}{\code {getopt_long}} +-\entry{getopt_long_only}{663}{\code {getopt_long_only}} +-\entry{argp_parse}{666}{\code {argp_parse}} +-\entry{argp_usage}{674}{\code {argp_usage}} +-\entry{argp_error}{674}{\code {argp_error}} +-\entry{argp_failure}{674}{\code {argp_failure}} +-\entry{argp_state_help}{674}{\code {argp_state_help}} +-\entry{argp_help}{679}{\code {argp_help}} +-\entry{getsubopt}{689}{\code {getsubopt}} +-\entry{getenv}{691}{\code {getenv}} +-\entry{putenv}{692}{\code {putenv}} +-\entry{setenv}{692}{\code {setenv}} +-\entry{unsetenv}{692}{\code {unsetenv}} +-\entry{clearenv}{692}{\code {clearenv}} +-\entry{syscall}{695}{\code {syscall}} +-\entry{exit}{696}{\code {exit}} +-\entry{atexit}{698}{\code {atexit}} +-\entry{on_exit}{698}{\code {on_exit}} +-\entry{abort}{699}{\code {abort}} +-\entry{_exit}{699}{\code {_exit}} +-\entry{_Exit}{699}{\code {_Exit}} +-\entry{system}{701}{\code {system}} +-\entry{getpid}{702}{\code {getpid}} +-\entry{getppid}{702}{\code {getppid}} +-\entry{fork}{703}{\code {fork}} +-\entry{vfork}{703}{\code {vfork}} +-\entry{execv}{704}{\code {execv}} +-\entry{execl}{704}{\code {execl}} +-\entry{execve}{704}{\code {execve}} +-\entry{execle}{704}{\code {execle}} +-\entry{execvp}{705}{\code {execvp}} +-\entry{execlp}{705}{\code {execlp}} +-\entry{waitpid}{706}{\code {waitpid}} +-\entry{wait}{708}{\code {wait}} +-\entry{wait4}{708}{\code {wait4}} +-\entry{WIFEXITED}{709}{\code {WIFEXITED}} +-\entry{WEXITSTATUS}{709}{\code {WEXITSTATUS}} +-\entry{WIFSIGNALED}{709}{\code {WIFSIGNALED}} +-\entry{WTERMSIG}{709}{\code {WTERMSIG}} +-\entry{WCOREDUMP}{709}{\code {WCOREDUMP}} +-\entry{WIFSTOPPED}{709}{\code {WIFSTOPPED}} +-\entry{WSTOPSIG}{709}{\code {WSTOPSIG}} +-\entry{wait3}{710}{\code {wait3}} +-\entry{ctermid}{728}{\code {ctermid}} +-\entry{setsid}{728}{\code {setsid}} +-\entry{getsid}{729}{\code {getsid}} +-\entry{getpgrp}{729}{\code {getpgrp}} +-\entry{getpgrp}{729}{\code {getpgrp}} +-\entry{getpgid}{729}{\code {getpgid}} +-\entry{setpgid}{729}{\code {setpgid}} +-\entry{setpgrp}{730}{\code {setpgrp}} +-\entry{tcgetpgrp}{730}{\code {tcgetpgrp}} +-\entry{tcsetpgrp}{730}{\code {tcsetpgrp}} +-\entry{tcgetsid}{731}{\code {tcgetsid}} +-\entry{success}{735}{\code {success}} +-\entry{notfound}{735}{\code {notfound}} +-\entry{unavail}{735}{\code {unavail}} +-\entry{tryagain}{735}{\code {tryagain}} +-\entry{getuid}{745}{\code {getuid}} +-\entry{getgid}{745}{\code {getgid}} +-\entry{geteuid}{745}{\code {geteuid}} +-\entry{getegid}{745}{\code {getegid}} +-\entry{getgroups}{745}{\code {getgroups}} +-\entry{seteuid}{746}{\code {seteuid}} +-\entry{setuid}{746}{\code {setuid}} +-\entry{setreuid}{746}{\code {setreuid}} +-\entry{setegid}{747}{\code {setegid}} +-\entry{setgid}{747}{\code {setgid}} +-\entry{setregid}{747}{\code {setregid}} +-\entry{setgroups}{748}{\code {setgroups}} +-\entry{initgroups}{748}{\code {initgroups}} +-\entry{getgrouplist}{748}{\code {getgrouplist}} +-\entry{getlogin}{753}{\code {getlogin}} +-\entry{cuserid}{753}{\code {cuserid}} +-\entry{setutent}{755}{\code {setutent}} +-\entry{getutent}{755}{\code {getutent}} +-\entry{endutent}{756}{\code {endutent}} +-\entry{getutid}{756}{\code {getutid}} +-\entry{getutline}{756}{\code {getutline}} +-\entry{pututline}{756}{\code {pututline}} +-\entry{getutent_r}{757}{\code {getutent_r}} +-\entry{getutid_r}{757}{\code {getutid_r}} +-\entry{getutline_r}{757}{\code {getutline_r}} +-\entry{utmpname}{757}{\code {utmpname}} +-\entry{updwtmp}{758}{\code {updwtmp}} +-\entry{setutxent}{759}{\code {setutxent}} +-\entry{getutxent}{759}{\code {getutxent}} +-\entry{endutxent}{759}{\code {endutxent}} +-\entry{getutxid}{759}{\code {getutxid}} +-\entry{getutxline}{760}{\code {getutxline}} +-\entry{pututxline}{760}{\code {pututxline}} +-\entry{utmpxname}{760}{\code {utmpxname}} +-\entry{getutmp}{760}{\code {getutmp}} +-\entry{getutmpx}{760}{\code {getutmpx}} +-\entry{login_tty}{760}{\code {login_tty}} +-\entry{login}{760}{\code {login}} +-\entry{logout}{761}{\code {logout}} +-\entry{logwtmp}{761}{\code {logwtmp}} +-\entry{getpwuid}{762}{\code {getpwuid}} +-\entry{getpwuid_r}{762}{\code {getpwuid_r}} +-\entry{getpwnam}{762}{\code {getpwnam}} +-\entry{getpwnam_r}{762}{\code {getpwnam_r}} +-\entry{fgetpwent}{762}{\code {fgetpwent}} +-\entry{fgetpwent_r}{763}{\code {fgetpwent_r}} +-\entry{setpwent}{763}{\code {setpwent}} +-\entry{getpwent}{763}{\code {getpwent}} +-\entry{getpwent_r}{763}{\code {getpwent_r}} +-\entry{endpwent}{763}{\code {endpwent}} +-\entry{putpwent}{763}{\code {putpwent}} +-\entry{getgrgid}{764}{\code {getgrgid}} +-\entry{getgrgid_r}{764}{\code {getgrgid_r}} +-\entry{getgrnam}{765}{\code {getgrnam}} +-\entry{getgrnam_r}{765}{\code {getgrnam_r}} +-\entry{fgetgrent}{765}{\code {fgetgrent}} +-\entry{fgetgrent_r}{765}{\code {fgetgrent_r}} +-\entry{setgrent}{766}{\code {setgrent}} +-\entry{getgrent}{766}{\code {getgrent}} +-\entry{getgrent_r}{766}{\code {getgrent_r}} +-\entry{endgrent}{766}{\code {endgrent}} +-\entry{setnetgrent}{768}{\code {setnetgrent}} +-\entry{getnetgrent}{768}{\code {getnetgrent}} +-\entry{getnetgrent_r}{769}{\code {getnetgrent_r}} +-\entry{endnetgrent}{769}{\code {endnetgrent}} +-\entry{innetgr}{769}{\code {innetgr}} +-\entry{gethostname}{771}{\code {gethostname}} +-\entry{sethostname}{772}{\code {sethostname}} +-\entry{getdomainnname}{772}{\code {getdomainnname}} +-\entry{setdomainname}{772}{\code {setdomainname}} +-\entry{gethostid}{772}{\code {gethostid}} +-\entry{sethostid}{773}{\code {sethostid}} +-\entry{uname}{774}{\code {uname}} +-\entry{setfsent}{776}{\code {setfsent}} +-\entry{endfsent}{776}{\code {endfsent}} +-\entry{getfsent}{777}{\code {getfsent}} +-\entry{getfsspec}{777}{\code {getfsspec}} +-\entry{getfsfile}{777}{\code {getfsfile}} +-\entry{setmntent}{779}{\code {setmntent}} +-\entry{endmntent}{779}{\code {endmntent}} +-\entry{getmntent}{779}{\code {getmntent}} +-\entry{getmntent_r}{780}{\code {getmntent_r}} +-\entry{addmntent}{780}{\code {addmntent}} +-\entry{hasmntopt}{780}{\code {hasmntopt}} +-\entry{mount}{781}{\code {mount}} +-\entry{umount2}{783}{\code {umount2}} +-\entry{umount}{784}{\code {umount}} +-\entry{sysctl}{784}{\code {sysctl}} +-\entry{sysconf}{790}{\code {sysconf}} +-\entry{pathconf}{802}{\code {pathconf}} +-\entry{fpathconf}{803}{\code {fpathconf}} +-\entry{confstr}{805}{\code {confstr}} +-\entry{getpass}{810}{\code {getpass}} +-\entry{crypt}{811}{\code {crypt}} +-\entry{crypt_r}{812}{\code {crypt_r}} +-\entry{setkey}{813}{\code {setkey}} +-\entry{encrypt}{813}{\code {encrypt}} +-\entry{setkey_r}{813}{\code {setkey_r}} +-\entry{encrypt_r}{813}{\code {encrypt_r}} +-\entry{ecb_crypt}{814}{\code {ecb_crypt}} +-\entry{DES_FAILED}{814}{\code {DES_FAILED}} +-\entry{cbc_crypt}{814}{\code {cbc_crypt}} +-\entry{des_setparity}{815}{\code {des_setparity}} +-\entry{backtrace}{817}{\code {backtrace}} +-\entry{backtrace_symbols}{817}{\code {backtrace_symbols}} +-\entry{backtrace_symbols_fd}{818}{\code {backtrace_symbols_fd}} +-\entry{pthread_create}{819}{\code {pthread_create}} +-\entry{pthread_exit}{819}{\code {pthread_exit}} +-\entry{pthread_cancel}{819}{\code {pthread_cancel}} +-\entry{pthread_join}{820}{\code {pthread_join}} +-\entry{pthread_attr_init}{820}{\code {pthread_attr_init}} +-\entry{pthread_attr_destroy}{821}{\code {pthread_attr_destroy}} +-\entry{pthread_attr_setdetachstate}{821}{\code {pthread_attr_setdetachstate}} +-\entry{pthread_attr_setguardsize}{821}{\code {pthread_attr_setguardsize}} +-\entry{pthread_attr_setinheritsched}{821}{\code {pthread_attr_setinheritsched}} +-\entry{pthread_attr_setschedparam}{821}{\code {pthread_attr_setschedparam}} +-\entry{pthread_attr_setschedpolicy}{821}{\code {pthread_attr_setschedpolicy}} +-\entry{pthread_attr_setscope}{821}{\code {pthread_attr_setscope}} +-\entry{pthread_attr_setstack}{821}{\code {pthread_attr_setstack}} +-\entry{pthread_attr_setstackaddr}{821}{\code {pthread_attr_setstackaddr}} +-\entry{pthread_attr_setstacksize}{821}{\code {pthread_attr_setstacksize}} +-\entry{pthread_attr_setattr}{821}{\code {pthread_attr_setattr}} +-\entry{pthread_attr_getdetachstate}{821}{\code {pthread_attr_getdetachstate}} +-\entry{pthread_attr_getguardsize}{821}{\code {pthread_attr_getguardsize}} +-\entry{pthread_attr_getinheritsched}{821}{\code {pthread_attr_getinheritsched}} +-\entry{pthread_attr_getschedparam}{821}{\code {pthread_attr_getschedparam}} +-\entry{pthread_attr_getschedpolicy}{821}{\code {pthread_attr_getschedpolicy}} +-\entry{pthread_attr_getscope}{821}{\code {pthread_attr_getscope}} +-\entry{pthread_attr_getstack}{821}{\code {pthread_attr_getstack}} +-\entry{pthread_attr_getstackaddr}{821}{\code {pthread_attr_getstackaddr}} +-\entry{pthread_attr_getstacksize}{821}{\code {pthread_attr_getstacksize}} +-\entry{pthread_attr_getattr}{821}{\code {pthread_attr_getattr}} +-\entry{pthread_setcancelstate}{823}{\code {pthread_setcancelstate}} +-\entry{pthread_setcanceltype}{823}{\code {pthread_setcanceltype}} +-\entry{pthread_testcancel}{824}{\code {pthread_testcancel}} +-\entry{pthread_cleanup_push}{825}{\code {pthread_cleanup_push}} +-\entry{pthread_cleanup_pop}{825}{\code {pthread_cleanup_pop}} +-\entry{pthread_cleanup_push_defer_np}{825}{\code {pthread_cleanup_push_defer_np}} +-\entry{pthread_cleanup_pop_restore_np}{825}{\code {pthread_cleanup_pop_restore_np}} +-\entry{pthread_mutex_init}{826}{\code {pthread_mutex_init}} +-\entry{pthread_mutex_lock}{826}{\code {pthread_mutex_lock}} +-\entry{pthread_mutex_trylock}{827}{\code {pthread_mutex_trylock}} +-\entry{pthread_mutex_timedlock}{827}{\code {pthread_mutex_timedlock}} +-\entry{pthread_mutex_unlock}{827}{\code {pthread_mutex_unlock}} +-\entry{pthread_mutex_destroy}{827}{\code {pthread_mutex_destroy}} +-\entry{pthread_mutexattr_init}{828}{\code {pthread_mutexattr_init}} +-\entry{pthread_mutexattr_destroy}{828}{\code {pthread_mutexattr_destroy}} +-\entry{pthread_mutexattr_settype}{828}{\code {pthread_mutexattr_settype}} +-\entry{pthread_mutexattr_gettype}{829}{\code {pthread_mutexattr_gettype}} +-\entry{pthread_cond_init}{829}{\code {pthread_cond_init}} +-\entry{pthread_cond_signal}{829}{\code {pthread_cond_signal}} +-\entry{pthread_cond_broadcast}{829}{\code {pthread_cond_broadcast}} +-\entry{pthread_cond_wait}{829}{\code {pthread_cond_wait}} +-\entry{pthread_cond_timedwait}{830}{\code {pthread_cond_timedwait}} +-\entry{pthread_cond_destroy}{830}{\code {pthread_cond_destroy}} +-\entry{pthread_condattr_init}{831}{\code {pthread_condattr_init}} +-\entry{pthread_condattr_destroy}{831}{\code {pthread_condattr_destroy}} +-\entry{sem_init}{832}{\code {sem_init}} +-\entry{sem_destroy}{832}{\code {sem_destroy}} +-\entry{sem_wait}{832}{\code {sem_wait}} +-\entry{sem_trywait}{832}{\code {sem_trywait}} +-\entry{sem_post}{832}{\code {sem_post}} +-\entry{sem_getvalue}{833}{\code {sem_getvalue}} +-\entry{pthread_key_create}{833}{\code {pthread_key_create}} +-\entry{pthread_key_delete}{833}{\code {pthread_key_delete}} +-\entry{pthread_setspecific}{834}{\code {pthread_setspecific}} +-\entry{pthread_getspecific}{834}{\code {pthread_getspecific}} +-\entry{pthread_sigmask}{834}{\code {pthread_sigmask}} +-\entry{pthread_kill}{835}{\code {pthread_kill}} +-\entry{sigwait}{835}{\code {sigwait}} +-\entry{pthread_atfork}{836}{\code {pthread_atfork}} +-\entry{pthread_self}{838}{\code {pthread_self}} +-\entry{pthread_equal}{838}{\code {pthread_equal}} +-\entry{pthread_detach}{838}{\code {pthread_detach}} +-\entry{pthread_kill_other_threads_np}{838}{\code {pthread_kill_other_threads_np}} +-\entry{pthread_once}{839}{\code {pthread_once}} +-\entry{pthread_setschedparam}{839}{\code {pthread_setschedparam}} +-\entry{pthread_getschedparam}{839}{\code {pthread_getschedparam}} +-\entry{pthread_setconcurrency}{840}{\code {pthread_setconcurrency}} +-\entry{pthread_getconcurrency}{840}{\code {pthread_getconcurrency}} +-\entry{assert}{841}{\code {assert}} +-\entry{assert_perror}{842}{\code {assert_perror}} +-\entry{va_start}{846}{\code {va_start}} +-\entry{va_arg}{846}{\code {va_arg}} +-\entry{va_end}{846}{\code {va_end}} +-\entry{__va_copy}{846}{\code {__va_copy}} +-\entry{va_alist}{848}{\code {va_alist}} +-\entry{va_dcl}{848}{\code {va_dcl}} +-\entry{va_start}{848}{\code {va_start}} +-\entry{offsetof}{857}{\code {offsetof}} +diff -u -udbrN glibc-2.3.2/manual/libc.fns glibc-2.3.2-200304020432/manual/libc.fns +--- glibc-2.3.2/manual/libc.fns Tue Feb 25 11:34:58 2003 ++++ glibc-2.3.2-200304020432/manual/libc.fns Thu Jan 1 01:00:00 1970 +@@ -1,1354 +0,0 @@ +-\initial {_} +-\entry {\code {__fbufsize}}{292} +-\entry {\code {__flbf}}{291} +-\entry {\code {__fpending}}{292} +-\entry {\code {__fpurge}}{290} +-\entry {\code {__freadable}}{235} +-\entry {\code {__freading}}{235} +-\entry {\code {__fsetlocking}}{238} +-\entry {\code {__fwritable}}{235} +-\entry {\code {__fwriting}}{235} +-\entry {\code {__va_copy}}{846} +-\entry {\code {_exit}}{699} +-\entry {\code {_Exit}}{699} +-\entry {\code {_flushlbf}}{289} +-\entry {\code {_tolower}}{69} +-\entry {\code {_toupper}}{69} +-\initial {A} +-\entry {\code {a64l}}{106} +-\entry {\code {abort}}{699} +-\entry {\code {abs}}{531} +-\entry {\code {accept}}{426} +-\entry {\code {access}}{383} +-\entry {\code {acos}}{482} +-\entry {\code {acosf}}{482} +-\entry {\code {acosh}}{487} +-\entry {\code {acoshf}}{487} +-\entry {\code {acoshl}}{487} +-\entry {\code {acosl}}{482} +-\entry {\code {addmntent}}{780} +-\entry {\code {addseverity}}{300} +-\entry {\code {adjtime}}{555} +-\entry {\code {adjtimex}}{556} +-\entry {\code {aio_cancel}}{334} +-\entry {\code {aio_cancel64}}{335} +-\entry {\code {aio_error}}{331} +-\entry {\code {aio_error64}}{331} +-\entry {\code {aio_fsync}}{332} +-\entry {\code {aio_fsync64}}{333} +-\entry {\code {aio_init}}{336} +-\entry {\code {aio_read}}{327} +-\entry {\code {aio_read64}}{328} +-\entry {\code {aio_return}}{332} +-\entry {\code {aio_return64}}{332} +-\entry {\code {aio_suspend}}{333} +-\entry {\code {aio_suspend64}}{334} +-\entry {\code {aio_write}}{328} +-\entry {\code {aio_write64}}{329} +-\entry {\code {alarm}}{579} +-\entry {\code {alloca}}{59} +-\entry {\code {alphasort}}{358} +-\entry {\code {alphasort64}}{359} +-\entry {\code {argp_error}}{674} +-\entry {\code {argp_failure}}{674} +-\entry {\code {argp_help}}{679} +-\entry {\code {argp_parse}}{666} +-\entry {\code {argp_state_help}}{674} +-\entry {\code {argp_usage}}{674} +-\entry {\code {argz_add}}{108} +-\entry {\code {argz_add_sep}}{108} +-\entry {\code {argz_append}}{108} +-\entry {\code {argz_count}}{108} +-\entry {\code {argz_create}}{108} +-\entry {\code {argz_create_sep}}{108} +-\entry {\code {argz_delete}}{109} +-\entry {\code {argz_extract}}{108} +-\entry {\code {argz_insert}}{109} +-\entry {\code {argz_next}}{109} +-\entry {\code {argz_replace}}{109} +-\entry {\code {argz_stringify}}{108} +-\entry {\code {asctime}}{562} +-\entry {\code {asctime_r}}{562} +-\entry {\code {asin}}{481} +-\entry {\code {asinf}}{481} +-\entry {\code {asinh}}{487} +-\entry {\code {asinhf}}{487} +-\entry {\code {asinhl}}{487} +-\entry {\code {asinl}}{481} +-\entry {\code {asprintf}}{261} +-\entry {\code {assert}}{841} +-\entry {\code {assert_perror}}{842} +-\entry {\code {atan}}{482} +-\entry {\code {atan2}}{482} +-\entry {\code {atan2f}}{482} +-\entry {\code {atan2l}}{482} +-\entry {\code {atanf}}{482} +-\entry {\code {atanh}}{487} +-\entry {\code {atanhf}}{487} +-\entry {\code {atanhl}}{487} +-\entry {\code {atanl}}{482} +-\entry {\code {atexit}}{698} +-\entry {\code {atof}}{545} +-\entry {\code {atoi}}{543} +-\entry {\code {atol}}{543} +-\entry {\code {atoll}}{543} +-\initial {B} +-\entry {\code {backtrace}}{817} +-\entry {\code {backtrace_symbols}}{817} +-\entry {\code {backtrace_symbols_fd}}{818} +-\entry {\code {basename}}{103, 104} +-\entry {\code {bcmp}}{92} +-\entry {\code {bcopy}}{88} +-\entry {\code {bind}}{403} +-\entry {\code {bind_textdomain_codeset}}{189} +-\entry {\code {bindtextdomain}}{184} +-\entry {\code {brk}}{62} +-\entry {\code {bsearch}}{196} +-\entry {\code {btowc}}{118} +-\entry {\code {bzero}}{89} +-\initial {C} +-\entry {\code {cabs}}{531} +-\entry {\code {cabsf}}{531} +-\entry {\code {cabsl}}{531} +-\entry {\code {cacos}}{482} +-\entry {\code {cacosf}}{482} +-\entry {\code {cacosh}}{488} +-\entry {\code {cacoshf}}{488} +-\entry {\code {cacoshl}}{488} +-\entry {\code {cacosl}}{482} +-\entry {\code {calloc}}{37} +-\entry {\code {canonicalize_file_name}}{366} +-\entry {\code {carg}}{539} +-\entry {\code {cargf}}{539} +-\entry {\code {cargl}}{539} +-\entry {\code {casin}}{482} +-\entry {\code {casinf}}{482} +-\entry {\code {casinh}}{487} +-\entry {\code {casinhf}}{487} +-\entry {\code {casinhl}}{487} +-\entry {\code {casinl}}{482} +-\entry {\code {catan}}{482} +-\entry {\code {catanf}}{482} +-\entry {\code {catanh}}{488} +-\entry {\code {catanhf}}{488} +-\entry {\code {catanhl}}{488} +-\entry {\code {catanl}}{482} +-\entry {\code {catclose}}{174} +-\entry {\code {catgets}}{174} +-\entry {\code {catopen}}{171} +-\entry {\code {cbc_crypt}}{814} +-\entry {\code {cbrt}}{485} +-\entry {\code {cbrtf}}{485} +-\entry {\code {cbrtl}}{485} +-\entry {\code {ccos}}{481} +-\entry {\code {ccosf}}{481} +-\entry {\code {ccosh}}{487} +-\entry {\code {ccoshf}}{487} +-\entry {\code {ccoshl}}{487} +-\entry {\code {ccosl}}{481} +-\entry {\code {ceil}}{533} +-\entry {\code {ceilf}}{533} +-\entry {\code {ceill}}{533} +-\entry {\code {cexp}}{485} +-\entry {\code {cexpf}}{485} +-\entry {\code {cexpl}}{485} +-\entry {\code {cfgetispeed}}{457} +-\entry {\code {cfgetospeed}}{457} +-\entry {\code {cfmakeraw}}{464} +-\entry {\code {cfree}}{36} +-\entry {\code {cfsetispeed}}{457} +-\entry {\code {cfsetospeed}}{457} +-\entry {\code {cfsetspeed}}{457} +-\entry {\code {chdir}}{352} +-\entry {\code {chmod}}{381} +-\entry {\code {chown}}{377} +-\entry {\code {cimag}}{539} +-\entry {\code {cimagf}}{539} +-\entry {\code {cimagl}}{539} +-\entry {\code {clearenv}}{692} +-\entry {\code {clearerr}}{282} +-\entry {\code {clearerr_unlocked}}{283} +-\entry {\code {clock}}{552} +-\entry {\code {clog}}{485} +-\entry {\code {clog10}}{486} +-\entry {\code {clog10f}}{486} +-\entry {\code {clog10l}}{486} +-\entry {\code {clogf}}{486} +-\entry {\code {clogl}}{486} +-\entry {\code {close}}{305} +-\entry {\code {closedir}}{356} +-\entry {\code {closelog}}{476} +-\entry {\code {confstr}}{805} +-\entry {\code {conj}}{539} +-\entry {\code {conjf}}{539} +-\entry {\code {conjl}}{539} +-\entry {\code {connect}}{424} +-\entry {\code {copysign}}{535} +-\entry {\code {copysignf}}{535} +-\entry {\code {copysignl}}{535} +-\entry {\code {cos}}{480} +-\entry {\code {cosf}}{480} +-\entry {\code {cosh}}{486} +-\entry {\code {coshf}}{486} +-\entry {\code {coshl}}{486} +-\entry {\code {cosl}}{480} +-\entry {\code {cpow}}{486} +-\entry {\code {cpowf}}{486} +-\entry {\code {cpowl}}{486} +-\entry {\code {cproj}}{539} +-\entry {\code {cprojf}}{539} +-\entry {\code {cprojl}}{539} +-\entry {\code {creal}}{539} +-\entry {\code {crealf}}{539} +-\entry {\code {creall}}{539} +-\entry {\code {creat}}{304} +-\entry {\code {creat64}}{305} +-\entry {\code {crypt}}{811} +-\entry {\code {crypt_r}}{812} +-\entry {\code {csin}}{481} +-\entry {\code {csinf}}{481} +-\entry {\code {csinh}}{487} +-\entry {\code {csinhf}}{487} +-\entry {\code {csinhl}}{487} +-\entry {\code {csinl}}{481} +-\entry {\code {csqrt}}{486} +-\entry {\code {csqrtf}}{486} +-\entry {\code {csqrtl}}{486} +-\entry {\code {ctan}}{481} +-\entry {\code {ctanf}}{481} +-\entry {\code {ctanh}}{487} +-\entry {\code {ctanhf}}{487} +-\entry {\code {ctanhl}}{487} +-\entry {\code {ctanl}}{481} +-\entry {\code {ctermid}}{728} +-\entry {\code {ctime}}{562} +-\entry {\code {ctime_r}}{562} +-\entry {\code {cuserid}}{753} +-\initial {D} +-\entry {\code {dcgettext}}{182} +-\entry {\code {dcngettext}}{186} +-\entry {\code {DES_FAILED}}{814} +-\entry {\code {des_setparity}}{815} +-\entry {\code {dgettext}}{182} +-\entry {\code {difftime}}{549} +-\entry {\code {dirfd}}{355} +-\entry {\code {dirname}}{104} +-\entry {\code {div}}{519} +-\entry {\code {dngettext}}{186} +-\entry {\code {drand48}}{511} +-\entry {\code {drand48_r}}{513} +-\entry {\code {drem}}{534} +-\entry {\code {dremf}}{535} +-\entry {\code {dreml}}{535} +-\entry {\code {DTTOIF}}{354} +-\entry {\code {dup}}{337} +-\entry {\code {dup2}}{337} +-\initial {E} +-\entry {\code {ecb_crypt}}{814} +-\entry {\code {ecvt}}{546} +-\entry {\code {ecvt_r}}{547} +-\entry {\code {encrypt}}{813} +-\entry {\code {encrypt_r}}{813} +-\entry {\code {endfsent}}{776} +-\entry {\code {endgrent}}{766} +-\entry {\code {endhostent}}{416} +-\entry {\code {endmntent}}{779} +-\entry {\code {endnetent}}{444} +-\entry {\code {endnetgrent}}{769} +-\entry {\code {endprotoent}}{420} +-\entry {\code {endpwent}}{763} +-\entry {\code {endservent}}{418} +-\entry {\code {endutent}}{756} +-\entry {\code {endutxent}}{759} +-\entry {\code {envz_add}}{110} +-\entry {\code {envz_entry}}{110} +-\entry {\code {envz_get}}{110} +-\entry {\code {envz_merge}}{110} +-\entry {\code {envz_strip}}{110} +-\entry {\code {erand48}}{511} +-\entry {\code {erand48_r}}{513} +-\entry {\code {erf}}{488} +-\entry {\code {erfc}}{488} +-\entry {\code {erfcf}}{488} +-\entry {\code {erfcl}}{488} +-\entry {\code {erff}}{488} +-\entry {\code {erfl}}{488} +-\entry {\code {err}}{30} +-\entry {\code {error}}{28} +-\entry {\code {error_at_line}}{28} +-\entry {\code {errx}}{30} +-\entry {\code {execl}}{704} +-\entry {\code {execle}}{704} +-\entry {\code {execlp}}{705} +-\entry {\code {execv}}{704} +-\entry {\code {execve}}{704} +-\entry {\code {execvp}}{705} +-\entry {\code {exit}}{696} +-\entry {\code {exp}}{483} +-\entry {\code {exp10}}{483} +-\entry {\code {exp10f}}{483} +-\entry {\code {exp10l}}{483} +-\entry {\code {exp2}}{483} +-\entry {\code {exp2f}}{483} +-\entry {\code {exp2l}}{483} +-\entry {\code {expf}}{483} +-\entry {\code {expl}}{483} +-\entry {\code {expm1}}{485} +-\entry {\code {expm1f}}{485} +-\entry {\code {expm1l}}{485} +-\initial {F} +-\entry {\code {fabs}}{531} +-\entry {\code {fabsf}}{531} +-\entry {\code {fabsl}}{531} +-\entry {\code {fchdir}}{352} +-\entry {\code {fchmod}}{382} +-\entry {\code {fchown}}{378} +-\entry {\code {fclean}}{315} +-\entry {\code {fclose}}{235} +-\entry {\code {fcloseall}}{236} +-\entry {\code {fcntl}}{336} +-\entry {\code {fcvt}}{546} +-\entry {\code {fcvt_r}}{547} +-\entry {\code {FD_CLR}}{321} +-\entry {\code {FD_ISSET}}{322} +-\entry {\code {FD_SET}}{321} +-\entry {\code {FD_ZERO}}{321} +-\entry {\code {fdatasync}}{324} +-\entry {\code {fdim}}{537} +-\entry {\code {fdimf}}{537} +-\entry {\code {fdiml}}{537} +-\entry {\code {fdopen}}{313} +-\entry {\code {feclearexcept}}{525} +-\entry {\code {fedisableexcept}}{530} +-\entry {\code {feenableexcept}}{530} +-\entry {\code {fegetenv}}{529} +-\entry {\code {fegetexcept}}{530} +-\entry {\code {fegetexceptflag}}{526} +-\entry {\code {fegetround}}{528} +-\entry {\code {feholdexcept}}{529} +-\entry {\code {feof}}{282} +-\entry {\code {feof_unlocked}}{282} +-\entry {\code {feraiseexcept}}{525} +-\entry {\code {ferror}}{282} +-\entry {\code {ferror_unlocked}}{282} +-\entry {\code {fesetenv}}{529} +-\entry {\code {fesetexceptflag}}{526} +-\entry {\code {fesetround}}{528} +-\entry {\code {fetestexcept}}{526} +-\entry {\code {feupdateenv}}{530} +-\entry {\code {fflush}}{289} +-\entry {\code {fflush_unlocked}}{289} +-\entry {\code {fgetc}}{243} +-\entry {\code {fgetc_unlocked}}{244} +-\entry {\code {fgetgrent}}{765} +-\entry {\code {fgetgrent_r}}{765} +-\entry {\code {fgetpos}}{287} +-\entry {\code {fgetpos64}}{287} +-\entry {\code {fgetpwent}}{762} +-\entry {\code {fgetpwent_r}}{763} +-\entry {\code {fgets}}{246} +-\entry {\code {fgets_unlocked}}{247} +-\entry {\code {fgetwc}}{243} +-\entry {\code {fgetwc_unlocked}}{244} +-\entry {\code {fgetws}}{246} +-\entry {\code {fgetws_unlocked}}{247} +-\entry {\code {fileno}}{313} +-\entry {\code {fileno_unlocked}}{313} +-\entry {\code {finite}}{522} +-\entry {\code {finitef}}{522} +-\entry {\code {finitel}}{522} +-\entry {\code {flockfile}}{236} +-\entry {\code {floor}}{533} +-\entry {\code {floorf}}{533} +-\entry {\code {floorl}}{533} +-\entry {\code {fma}}{538} +-\entry {\code {fmaf}}{538} +-\entry {\code {fmal}}{538} +-\entry {\code {fmax}}{537} +-\entry {\code {fmaxf}}{537} +-\entry {\code {fmaxl}}{537} +-\entry {\code {fmemopen}}{292} +-\entry {\code {fmin}}{537} +-\entry {\code {fminf}}{537} +-\entry {\code {fminl}}{537} +-\entry {\code {fmod}}{534} +-\entry {\code {fmodf}}{534} +-\entry {\code {fmodl}}{534} +-\entry {\code {fmtmsg}}{298} +-\entry {\code {fnmatch}}{205} +-\entry {\code {fopen}}{232} +-\entry {\code {fopen64}}{233} +-\entry {\code {fopencookie}}{296} +-\entry {\code {fork}}{703} +-\entry {\code {forkpty}}{470} +-\entry {\code {fpathconf}}{803} +-\entry {\code {fpclassify}}{520} +-\entry {\code {fprintf}}{259} +-\entry {\code {fputc}}{241} +-\entry {\code {fputc_unlocked}}{241} +-\entry {\code {fputs}}{242} +-\entry {\code {fputs_unlocked}}{243} +-\entry {\code {fputwc}}{241} +-\entry {\code {fputwc_unlocked}}{241} +-\entry {\code {fputws}}{242} +-\entry {\code {fputws_unlocked}}{243} +-\entry {\code {fread}}{249} +-\entry {\code {fread_unlocked}}{249} +-\entry {\code {free}}{35} +-\entry {\code {freopen}}{234} +-\entry {\code {freopen64}}{234} +-\entry {\code {frexp}}{531} +-\entry {\code {frexpf}}{531} +-\entry {\code {frexpl}}{531} +-\entry {\code {fscanf}}{280} +-\entry {\code {fseek}}{285} +-\entry {\code {fseeko}}{285} +-\entry {\code {fseeko64}}{285} +-\entry {\code {fsetpos}}{288} +-\entry {\code {fsetpos64}}{288} +-\entry {\code {fstat}}{375} +-\entry {\code {fstat64}}{375} +-\entry {\code {fsync}}{324} +-\entry {\code {ftell}}{284} +-\entry {\code {ftello}}{284} +-\entry {\code {ftello64}}{285} +-\entry {\code {ftruncate}}{386} +-\entry {\code {ftruncate64}}{387} +-\entry {\code {ftrylockfile}}{237} +-\entry {\code {ftw}}{361} +-\entry {\code {ftw64}}{362} +-\entry {\code {funlockfile}}{237} +-\entry {\code {futimes}}{385} +-\entry {\code {fwide}}{240} +-\entry {\code {fwprintf}}{259} +-\entry {\code {fwrite}}{250} +-\entry {\code {fwrite_unlocked}}{250} +-\entry {\code {fwscanf}}{280} +-\initial {G} +-\entry {\code {gamma}}{489} +-\entry {\code {gammaf}}{489} +-\entry {\code {gammal}}{489} +-\entry {\code {gcvt}}{546} +-\entry {\code {get_avphys_pages}}{600} +-\entry {\code {get_current_dir_name}}{352} +-\entry {\code {get_nprocs}}{600} +-\entry {\code {get_nprocs_conf}}{600} +-\entry {\code {get_phys_pages}}{599} +-\entry {\code {getc}}{244} +-\entry {\code {getc_unlocked}}{244} +-\entry {\code {getchar}}{244} +-\entry {\code {getchar_unlocked}}{244} +-\entry {\code {getcontext}}{604} +-\entry {\code {getcwd}}{351} +-\entry {\code {getdate}}{573} +-\entry {\code {getdate_r}}{574} +-\entry {\code {getdelim}}{246} +-\entry {\code {getdomainnname}}{772} +-\entry {\code {getegid}}{745} +-\entry {\code {getenv}}{691} +-\entry {\code {geteuid}}{745} +-\entry {\code {getfsent}}{777} +-\entry {\code {getfsfile}}{777} +-\entry {\code {getfsspec}}{777} +-\entry {\code {getgid}}{745} +-\entry {\code {getgrent}}{766} +-\entry {\code {getgrent_r}}{766} +-\entry {\code {getgrgid}}{764} +-\entry {\code {getgrgid_r}}{764} +-\entry {\code {getgrnam}}{765} +-\entry {\code {getgrnam_r}}{765} +-\entry {\code {getgrouplist}}{748} +-\entry {\code {getgroups}}{745} +-\entry {\code {gethostbyaddr}}{414} +-\entry {\code {gethostbyaddr_r}}{415} +-\entry {\code {gethostbyname}}{414} +-\entry {\code {gethostbyname_r}}{415} +-\entry {\code {gethostbyname2}}{414} +-\entry {\code {gethostbyname2_r}}{415} +-\entry {\code {gethostent}}{416} +-\entry {\code {gethostid}}{772} +-\entry {\code {gethostname}}{771} +-\entry {\code {getitimer}}{579} +-\entry {\code {getline}}{245} +-\entry {\code {getloadavg}}{600} +-\entry {\code {getlogin}}{753} +-\entry {\code {getmntent}}{779} +-\entry {\code {getmntent_r}}{780} +-\entry {\code {getnetbyaddr}}{444} +-\entry {\code {getnetbyname}}{443} +-\entry {\code {getnetent}}{444} +-\entry {\code {getnetgrent}}{768} +-\entry {\code {getnetgrent_r}}{769} +-\entry {\code {getopt}}{659} +-\entry {\code {getopt_long}}{663} +-\entry {\code {getopt_long_only}}{663} +-\entry {\code {getpagesize}}{599} +-\entry {\code {getpass}}{810} +-\entry {\code {getpeername}}{427} +-\entry {\code {getpgid}}{729} +-\entry {\code {getpgrp}}{729} +-\entry {\code {getpid}}{702} +-\entry {\code {getppid}}{702} +-\entry {\code {getpriority}}{597} +-\entry {\code {getprotobyname}}{420} +-\entry {\code {getprotobynumber}}{420} +-\entry {\code {getprotoent}}{420} +-\entry {\code {getpt}}{468} +-\entry {\code {getpwent}}{763} +-\entry {\code {getpwent_r}}{763} +-\entry {\code {getpwnam}}{762} +-\entry {\code {getpwnam_r}}{762} +-\entry {\code {getpwuid}}{762} +-\entry {\code {getpwuid_r}}{762} +-\entry {\code {getrlimit}}{586} +-\entry {\code {getrlimit64}}{586} +-\entry {\code {getrusage}}{583} +-\entry {\code {gets}}{247} +-\entry {\code {getservbyname}}{417} +-\entry {\code {getservbyport}}{418} +-\entry {\code {getservent}}{418} +-\entry {\code {getsid}}{729} +-\entry {\code {getsockname}}{403} +-\entry {\code {getsockopt}}{441} +-\entry {\code {getsubopt}}{689} +-\entry {\code {gettext}}{181} +-\entry {\code {gettimeofday}}{555} +-\entry {\code {getuid}}{745} +-\entry {\code {getumask}}{381} +-\entry {\code {getutent}}{755} +-\entry {\code {getutent_r}}{757} +-\entry {\code {getutid}}{756} +-\entry {\code {getutid_r}}{757} +-\entry {\code {getutline}}{756} +-\entry {\code {getutline_r}}{757} +-\entry {\code {getutmp}}{760} +-\entry {\code {getutmpx}}{760} +-\entry {\code {getutxent}}{759} +-\entry {\code {getutxid}}{759} +-\entry {\code {getutxline}}{760} +-\entry {\code {getw}}{245} +-\entry {\code {getwc}}{244} +-\entry {\code {getwc_unlocked}}{244} +-\entry {\code {getwchar}}{244} +-\entry {\code {getwchar_unlocked}}{244} +-\entry {\code {getwd}}{352} +-\entry {\code {glob}}{209} +-\entry {\code {glob64}}{209} +-\entry {\code {globfree}}{213} +-\entry {\code {globfree64}}{213} +-\entry {\code {gmtime}}{558} +-\entry {\code {gmtime_r}}{558} +-\entry {\code {grantpt}}{468} +-\entry {\code {gsignal}}{639} +-\entry {\code {gtty}}{464} +-\initial {H} +-\entry {\code {hasmntopt}}{780} +-\entry {\code {hcreate}}{199} +-\entry {\code {hcreate_r}}{201} +-\entry {\code {hdestroy}}{200} +-\entry {\code {hdestroy_r}}{201} +-\entry {\code {hsearch}}{200} +-\entry {\code {hsearch_r}}{201} +-\entry {\code {htonl}}{419} +-\entry {\code {htons}}{418} +-\entry {\code {hypot}}{485} +-\entry {\code {hypotf}}{485} +-\entry {\code {hypotl}}{485} +-\initial {I} +-\entry {\code {iconv}}{134} +-\entry {\code {iconv_close}}{133} +-\entry {\code {iconv_open}}{132} +-\entry {\code {if_freenameindex}}{405} +-\entry {\code {if_indextoname}}{404} +-\entry {\code {if_nameindex}}{405} +-\entry {\code {if_nametoindex}}{404} +-\entry {\code {IFTODT}}{354} +-\entry {\code {ilogb}}{484} +-\entry {\code {ilogbf}}{484} +-\entry {\code {ilogbl}}{484} +-\entry {\code {imaxabs}}{531} +-\entry {\code {imaxdiv}}{520} +-\entry {\code {index}}{100} +-\entry {\code {inet_addr}}{412} +-\entry {\code {inet_aton}}{412} +-\entry {\code {inet_lnaof}}{412} +-\entry {\code {inet_makeaddr}}{412} +-\entry {\code {inet_netof}}{412} +-\entry {\code {inet_network}}{412} +-\entry {\code {inet_ntoa}}{412} +-\entry {\code {inet_ntop}}{413} +-\entry {\code {inet_pton}}{412} +-\entry {\code {initgroups}}{748} +-\entry {\code {initstate}}{509} +-\entry {\code {initstate_r}}{510} +-\entry {\code {innetgr}}{769} +-\entry {\code {ioctl}}{349} +-\entry {\code {isalnum}}{68} +-\entry {\code {isalpha}}{67} +-\entry {\code {isascii}}{68} +-\entry {\code {isatty}}{445} +-\entry {\code {isblank}}{68} +-\entry {\code {iscntrl}}{68} +-\entry {\code {isdigit}}{68} +-\entry {\code {isfinite}}{521} +-\entry {\code {isgraph}}{68} +-\entry {\code {isgreater}}{536} +-\entry {\code {isgreaterequal}}{536} +-\entry {\code {isinf}}{521} +-\entry {\code {isinff}}{521} +-\entry {\code {isinfl}}{521} +-\entry {\code {isless}}{536} +-\entry {\code {islessequal}}{537} +-\entry {\code {islessgreater}}{537} +-\entry {\code {islower}}{67} +-\entry {\code {isnan}}{521, 522} +-\entry {\code {isnanf}}{522} +-\entry {\code {isnanl}}{522} +-\entry {\code {isnormal}}{521} +-\entry {\code {isprint}}{68} +-\entry {\code {ispunct}}{68} +-\entry {\code {isspace}}{68} +-\entry {\code {isunordered}}{537} +-\entry {\code {isupper}}{67} +-\entry {\code {iswalnum}}{70} +-\entry {\code {iswalpha}}{70} +-\entry {\code {iswblank}}{72} +-\entry {\code {iswcntrl}}{71} +-\entry {\code {iswctype}}{70} +-\entry {\code {iswdigit}}{71} +-\entry {\code {iswgraph}}{71} +-\entry {\code {iswlower}}{71} +-\entry {\code {iswprint}}{71} +-\entry {\code {iswpunct}}{72} +-\entry {\code {iswspace}}{72} +-\entry {\code {iswupper}}{72} +-\entry {\code {iswxdigit}}{72} +-\entry {\code {isxdigit}}{68} +-\initial {J} +-\entry {\code {j0}}{489} +-\entry {\code {j0f}}{489} +-\entry {\code {j0l}}{489} +-\entry {\code {j1}}{489} +-\entry {\code {j1f}}{489} +-\entry {\code {j1l}}{489} +-\entry {\code {jn}}{489} +-\entry {\code {jnf}}{489} +-\entry {\code {jnl}}{489} +-\entry {\code {jrand48}}{512} +-\entry {\code {jrand48_r}}{514} +-\initial {K} +-\entry {\code {kill}}{640} +-\entry {\code {killpg}}{641} +-\initial {L} +-\entry {\code {l64a}}{105} +-\entry {\code {labs}}{531} +-\entry {\code {lcong48}}{512} +-\entry {\code {lcong48_r}}{515} +-\entry {\code {ldexp}}{532} +-\entry {\code {ldexpf}}{532} +-\entry {\code {ldexpl}}{532} +-\entry {\code {ldiv}}{519} +-\entry {\code {lfind}}{195} +-\entry {\code {lgamma}}{488} +-\entry {\code {lgamma_r}}{489} +-\entry {\code {lgammaf}}{488} +-\entry {\code {lgammaf_r}}{489} +-\entry {\code {lgammal}}{488} +-\entry {\code {lgammal_r}}{489} +-\entry {\code {link}}{364} +-\entry {\code {lio_listio}}{330} +-\entry {\code {lio_listio64}}{331} +-\entry {\code {listen}}{425} +-\entry {\code {llabs}}{531} +-\entry {\code {lldiv}}{519} +-\entry {\code {llrint}}{533} +-\entry {\code {llrintf}}{534} +-\entry {\code {llrintl}}{534} +-\entry {\code {llround}}{534} +-\entry {\code {llroundf}}{534} +-\entry {\code {llroundl}}{534} +-\entry {\code {localeconv}}{158} +-\entry {\code {localtime}}{557} +-\entry {\code {localtime_r}}{558} +-\entry {\code {log}}{483} +-\entry {\code {log10}}{483} +-\entry {\code {log10f}}{483} +-\entry {\code {log10l}}{483} +-\entry {\code {log1p}}{485} +-\entry {\code {log1pf}}{485} +-\entry {\code {log1pl}}{485} +-\entry {\code {log2}}{483} +-\entry {\code {log2f}}{483} +-\entry {\code {log2l}}{483} +-\entry {\code {logb}}{483} +-\entry {\code {logbf}}{484} +-\entry {\code {logbl}}{484} +-\entry {\code {logf}}{483} +-\entry {\code {login}}{760} +-\entry {\code {login_tty}}{760} +-\entry {\code {logl}}{483} +-\entry {\code {logout}}{761} +-\entry {\code {logwtmp}}{761} +-\entry {\code {longjmp}}{602} +-\entry {\code {lrand48}}{511} +-\entry {\code {lrand48_r}}{513} +-\entry {\code {lrint}}{533} +-\entry {\code {lrintf}}{533} +-\entry {\code {lrintl}}{533} +-\entry {\code {lround}}{534} +-\entry {\code {lroundf}}{534} +-\entry {\code {lroundl}}{534} +-\entry {\code {lsearch}}{196} +-\entry {\code {lseek}}{310} +-\entry {\code {lseek64}}{311} +-\entry {\code {lstat}}{375} +-\entry {\code {lstat64}}{375} +-\entry {\code {lutimes}}{385} +-\initial {M} +-\entry {\code {madvise}}{320} +-\entry {\code {main}}{657} +-\entry {\code {makecontext}}{605} +-\entry {\code {mallinfo}}{44} +-\entry {\code {malloc}}{34} +-\entry {\code {mallopt}}{39} +-\entry {\code {matherr}}{522} +-\entry {\code {mblen}}{129} +-\entry {\code {mbrlen}}{120} +-\entry {\code {mbrtowc}}{119} +-\entry {\code {mbsinit}}{117} +-\entry {\code {mbsnrtowcs}}{125} +-\entry {\code {mbsrtowcs}}{123} +-\entry {\code {mbstowcs}}{129} +-\entry {\code {mbtowc}}{128} +-\entry {\code {mcheck}}{39} +-\entry {\code {memalign}}{38} +-\entry {\code {memccpy}}{81} +-\entry {\code {memchr}}{96} +-\entry {\code {memcmp}}{89} +-\entry {\code {memcpy}}{79} +-\entry {\code {memfrob}}{105} +-\entry {\code {memmem}}{99} +-\entry {\code {memmove}}{80} +-\entry {\code {mempcpy}}{80} +-\entry {\code {memrchr}}{97} +-\entry {\code {memset}}{81} +-\entry {\code {mkdir}}{369} +-\entry {\code {mkdtemp}}{391} +-\entry {\code {mkfifo}}{396} +-\entry {\code {mknod}}{388} +-\entry {\code {mkstemp}}{391} +-\entry {\code {mktemp}}{390} +-\entry {\code {mktime}}{558} +-\entry {\code {mlock}}{64} +-\entry {\code {mlockall}}{64} +-\entry {\code {mmap}}{317} +-\entry {\code {mmap64}}{318} +-\entry {\code {modf}}{534} +-\entry {\code {modff}}{534} +-\entry {\code {modfl}}{534} +-\entry {\code {mount}}{781} +-\entry {\code {mprobe}}{40} +-\entry {\code {mrand48}}{511} +-\entry {\code {mrand48_r}}{514} +-\entry {\code {mremap}}{319} +-\entry {\code {msync}}{319} +-\entry {\code {mtrace}}{45} +-\entry {\code {munlock}}{64} +-\entry {\code {munlockall}}{65} +-\entry {\code {munmap}}{318} +-\entry {\code {muntrace}}{46} +-\initial {N} +-\entry {\code {nan}}{536} +-\entry {\code {nanf}}{536} +-\entry {\code {nanl}}{536} +-\entry {\code {nanosleep}}{581} +-\entry {\code {nearbyint}}{533} +-\entry {\code {nearbyintf}}{533} +-\entry {\code {nearbyintl}}{533} +-\entry {\code {nextafter}}{535} +-\entry {\code {nextafterf}}{535} +-\entry {\code {nextafterl}}{535} +-\entry {\code {nexttoward}}{536} +-\entry {\code {nexttowardf}}{536} +-\entry {\code {nexttowardl}}{536} +-\entry {\code {nftw}}{362} +-\entry {\code {nftw64}}{363} +-\entry {\code {ngettext}}{186} +-\entry {\code {nice}}{597} +-\entry {\code {nl_langinfo}}{161} +-\entry {\code {notfound}}{735} +-\entry {\code {nrand48}}{511} +-\entry {\code {nrand48_r}}{513} +-\entry {\code {ntohl}}{419} +-\entry {\code {ntohs}}{419} +-\entry {\code {ntp_adjtime}}{561} +-\entry {\code {ntp_gettime}}{559} +-\initial {O} +-\entry {\code {obstack_1grow}}{54} +-\entry {\code {obstack_1grow_fast}}{55} +-\entry {\code {obstack_alignment_mask}}{57} +-\entry {\code {obstack_alloc}}{51} +-\entry {\code {obstack_base}}{56} +-\entry {\code {obstack_blank}}{53} +-\entry {\code {obstack_blank_fast}}{55} +-\entry {\code {obstack_chunk_alloc}}{50} +-\entry {\code {obstack_chunk_free}}{50} +-\entry {\code {obstack_chunk_size}}{57} +-\entry {\code {obstack_copy}}{51} +-\entry {\code {obstack_copy0}}{52} +-\entry {\code {obstack_finish}}{54} +-\entry {\code {obstack_free}}{52} +-\entry {\code {obstack_grow}}{53} +-\entry {\code {obstack_grow0}}{54} +-\entry {\code {obstack_init}}{50} +-\entry {\code {obstack_int_grow}}{54} +-\entry {\code {obstack_int_grow_fast}}{55} +-\entry {\code {obstack_next_free}}{56} +-\entry {\code {obstack_object_size}}{54, 56} +-\entry {\code {obstack_printf}}{261} +-\entry {\code {obstack_ptr_grow}}{54} +-\entry {\code {obstack_ptr_grow_fast}}{55} +-\entry {\code {obstack_room}}{55} +-\entry {\code {obstack_vprintf}}{263} +-\entry {\code {offsetof}}{857} +-\entry {\code {on_exit}}{698} +-\entry {\code {open}}{303} +-\entry {\code {open_memstream}}{293} +-\entry {\code {open_obstack_stream}}{294} +-\entry {\code {open64}}{304} +-\entry {\code {opendir}}{354} +-\entry {\code {openlog}}{472} +-\entry {\code {openpty}}{470} +-\initial {P} +-\entry {\code {parse_printf_format}}{264} +-\entry {\code {pathconf}}{802} +-\entry {\code {pause}}{650} +-\entry {\code {pclose}}{395} +-\entry {\code {perror}}{26} +-\entry {\code {pipe}}{393} +-\entry {\code {popen}}{395} +-\entry {\code {posix_memalign}}{38} +-\entry {\code {pow}}{484} +-\entry {\code {pow10}}{483} +-\entry {\code {pow10f}}{483} +-\entry {\code {pow10l}}{483} +-\entry {\code {powf}}{484} +-\entry {\code {powl}}{484} +-\entry {\code {pread}}{307} +-\entry {\code {pread64}}{307} +-\entry {\code {printf}}{259} +-\entry {\code {printf_size}}{271} +-\entry {\code {printf_size_info}}{271} +-\entry {\code {psignal}}{621} +-\entry {\code {pthread_atfork}}{836} +-\entry {\code {pthread_attr_destroy}}{821} +-\entry {\code {pthread_attr_getattr}}{821} +-\entry {\code {pthread_attr_getdetachstate}}{821} +-\entry {\code {pthread_attr_getguardsize}}{821} +-\entry {\code {pthread_attr_getinheritsched}}{821} +-\entry {\code {pthread_attr_getschedparam}}{821} +-\entry {\code {pthread_attr_getschedpolicy}}{821} +-\entry {\code {pthread_attr_getscope}}{821} +-\entry {\code {pthread_attr_getstack}}{821} +-\entry {\code {pthread_attr_getstackaddr}}{821} +-\entry {\code {pthread_attr_getstacksize}}{821} +-\entry {\code {pthread_attr_init}}{820} +-\entry {\code {pthread_attr_setattr}}{821} +-\entry {\code {pthread_attr_setdetachstate}}{821} +-\entry {\code {pthread_attr_setguardsize}}{821} +-\entry {\code {pthread_attr_setinheritsched}}{821} +-\entry {\code {pthread_attr_setschedparam}}{821} +-\entry {\code {pthread_attr_setschedpolicy}}{821} +-\entry {\code {pthread_attr_setscope}}{821} +-\entry {\code {pthread_attr_setstack}}{821} +-\entry {\code {pthread_attr_setstackaddr}}{821} +-\entry {\code {pthread_attr_setstacksize}}{821} +-\entry {\code {pthread_cancel}}{819} +-\entry {\code {pthread_cleanup_pop}}{825} +-\entry {\code {pthread_cleanup_pop_restore_np}}{825} +-\entry {\code {pthread_cleanup_push}}{825} +-\entry {\code {pthread_cleanup_push_defer_np}}{825} +-\entry {\code {pthread_cond_broadcast}}{829} +-\entry {\code {pthread_cond_destroy}}{830} +-\entry {\code {pthread_cond_init}}{829} +-\entry {\code {pthread_cond_signal}}{829} +-\entry {\code {pthread_cond_timedwait}}{830} +-\entry {\code {pthread_cond_wait}}{829} +-\entry {\code {pthread_condattr_destroy}}{831} +-\entry {\code {pthread_condattr_init}}{831} +-\entry {\code {pthread_create}}{819} +-\entry {\code {pthread_detach}}{838} +-\entry {\code {pthread_equal}}{838} +-\entry {\code {pthread_exit}}{819} +-\entry {\code {pthread_getconcurrency}}{840} +-\entry {\code {pthread_getschedparam}}{839} +-\entry {\code {pthread_getspecific}}{834} +-\entry {\code {pthread_join}}{820} +-\entry {\code {pthread_key_create}}{833} +-\entry {\code {pthread_key_delete}}{833} +-\entry {\code {pthread_kill}}{835} +-\entry {\code {pthread_kill_other_threads_np}}{838} +-\entry {\code {pthread_mutex_destroy}}{827} +-\entry {\code {pthread_mutex_init}}{826} +-\entry {\code {pthread_mutex_lock}}{826} +-\entry {\code {pthread_mutex_timedlock}}{827} +-\entry {\code {pthread_mutex_trylock}}{827} +-\entry {\code {pthread_mutex_unlock}}{827} +-\entry {\code {pthread_mutexattr_destroy}}{828} +-\entry {\code {pthread_mutexattr_gettype}}{829} +-\entry {\code {pthread_mutexattr_init}}{828} +-\entry {\code {pthread_mutexattr_settype}}{828} +-\entry {\code {pthread_once}}{839} +-\entry {\code {pthread_self}}{838} +-\entry {\code {pthread_setcancelstate}}{823} +-\entry {\code {pthread_setcanceltype}}{823} +-\entry {\code {pthread_setconcurrency}}{840} +-\entry {\code {pthread_setschedparam}}{839} +-\entry {\code {pthread_setspecific}}{834} +-\entry {\code {pthread_sigmask}}{834} +-\entry {\code {pthread_testcancel}}{824} +-\entry {\code {ptsname}}{469} +-\entry {\code {ptsname_r}}{469} +-\entry {\code {putc}}{241} +-\entry {\code {putc_unlocked}}{242} +-\entry {\code {putchar}}{242} +-\entry {\code {putchar_unlocked}}{242} +-\entry {\code {putenv}}{692} +-\entry {\code {putpwent}}{763} +-\entry {\code {puts}}{243} +-\entry {\code {pututline}}{756} +-\entry {\code {pututxline}}{760} +-\entry {\code {putw}}{243} +-\entry {\code {putwc}}{242} +-\entry {\code {putwc_unlocked}}{242} +-\entry {\code {putwchar}}{242} +-\entry {\code {putwchar_unlocked}}{242} +-\entry {\code {pwrite}}{309} +-\entry {\code {pwrite64}}{310} +-\initial {Q} +-\entry {\code {qecvt}}{546} +-\entry {\code {qecvt_r}}{547} +-\entry {\code {qfcvt}}{546} +-\entry {\code {qfcvt_r}}{547} +-\entry {\code {qgcvt}}{546} +-\entry {\code {qsort}}{196} +-\initial {R} +-\entry {\code {raise}}{639} +-\entry {\code {rand}}{508} +-\entry {\code {rand_r}}{509} +-\entry {\code {random}}{509} +-\entry {\code {random_r}}{510} +-\entry {\code {rawmemchr}}{96} +-\entry {\code {read}}{306} +-\entry {\code {readdir}}{355} +-\entry {\code {readdir_r}}{355} +-\entry {\code {readdir64}}{356} +-\entry {\code {readdir64_r}}{356} +-\entry {\code {readlink}}{365} +-\entry {\code {readv}}{316} +-\entry {\code {realloc}}{36} +-\entry {\code {realpath}}{367} +-\entry {\code {recv}}{429} +-\entry {\code {recvfrom}}{436} +-\entry {\code {regcomp}}{214} +-\entry {\code {regerror}}{218} +-\entry {\code {regexec}}{216} +-\entry {\code {regfree}}{218} +-\entry {\code {register_printf_function}}{267} +-\entry {\code {remainder}}{535} +-\entry {\code {remainderf}}{535} +-\entry {\code {remainderl}}{535} +-\entry {\code {remove}}{368} +-\entry {\code {rename}}{368} +-\entry {\code {rewind}}{286} +-\entry {\code {rewinddir}}{357} +-\entry {\code {rindex}}{100} +-\entry {\code {rint}}{533} +-\entry {\code {rintf}}{533} +-\entry {\code {rintl}}{533} +-\entry {\code {rmdir}}{368} +-\entry {\code {round}}{533} +-\entry {\code {roundf}}{533} +-\entry {\code {roundl}}{533} +-\entry {\code {rpmatch}}{170} +-\initial {S} +-\entry {\code {S_ISBLK}}{376} +-\entry {\code {S_ISCHR}}{376} +-\entry {\code {S_ISDIR}}{376} +-\entry {\code {S_ISFIFO}}{376} +-\entry {\code {S_ISLNK}}{376} +-\entry {\code {S_ISREG}}{376} +-\entry {\code {S_ISSOCK}}{376} +-\entry {\code {S_TYPEISMQ}}{377} +-\entry {\code {S_TYPEISSEM}}{377} +-\entry {\code {S_TYPEISSHM}}{377} +-\entry {\code {sbrk}}{62} +-\entry {\code {scalb}}{532} +-\entry {\code {scalbf}}{532} +-\entry {\code {scalbl}}{532} +-\entry {\code {scalbln}}{532} +-\entry {\code {scalblnf}}{532} +-\entry {\code {scalblnl}}{532} +-\entry {\code {scalbn}}{532} +-\entry {\code {scalbnf}}{532} +-\entry {\code {scalbnl}}{532} +-\entry {\code {scandir}}{358} +-\entry {\code {scandir64}}{358} +-\entry {\code {scanf}}{279} +-\entry {\code {sched_get_priority_max}}{594} +-\entry {\code {sched_get_priority_min}}{594} +-\entry {\code {sched_getparam}}{594} +-\entry {\code {sched_getscheduler}}{593} +-\entry {\code {sched_rr_get_interval}}{594} +-\entry {\code {sched_setparam}}{594} +-\entry {\code {sched_setscheduler}}{593} +-\entry {\code {sched_yield}}{594} +-\entry {\code {seed48}}{512} +-\entry {\code {seed48_r}}{514} +-\entry {\code {seekdir}}{357} +-\entry {\code {select}}{322} +-\entry {\code {sem_destroy}}{832} +-\entry {\code {sem_getvalue}}{833} +-\entry {\code {sem_init}}{832} +-\entry {\code {sem_post}}{832} +-\entry {\code {sem_trywait}}{832} +-\entry {\code {sem_wait}}{832} +-\entry {\code {send}}{428} +-\entry {\code {sendto}}{436} +-\entry {\code {setbuf}}{291} +-\entry {\code {setbuffer}}{291} +-\entry {\code {setcontext}}{605} +-\entry {\code {setdomainname}}{772} +-\entry {\code {setegid}}{747} +-\entry {\code {setenv}}{692} +-\entry {\code {seteuid}}{746} +-\entry {\code {setfsent}}{776} +-\entry {\code {setgid}}{747} +-\entry {\code {setgrent}}{766} +-\entry {\code {setgroups}}{748} +-\entry {\code {sethostent}}{416} +-\entry {\code {sethostid}}{773} +-\entry {\code {sethostname}}{772} +-\entry {\code {setitimer}}{579} +-\entry {\code {setjmp}}{602} +-\entry {\code {setkey}}{813} +-\entry {\code {setkey_r}}{813} +-\entry {\code {setlinebuf}}{291} +-\entry {\code {setlocale}}{155} +-\entry {\code {setlogmask}}{477} +-\entry {\code {setmntent}}{779} +-\entry {\code {setnetent}}{444} +-\entry {\code {setnetgrent}}{768} +-\entry {\code {setpgid}}{729} +-\entry {\code {setpgrp}}{730} +-\entry {\code {setpriority}}{597} +-\entry {\code {setprotoent}}{420} +-\entry {\code {setpwent}}{763} +-\entry {\code {setregid}}{747} +-\entry {\code {setreuid}}{746} +-\entry {\code {setrlimit}}{586} +-\entry {\code {setrlimit64}}{586} +-\entry {\code {setservent}}{418} +-\entry {\code {setsid}}{728} +-\entry {\code {setsockopt}}{441} +-\entry {\code {setstate}}{509} +-\entry {\code {setstate_r}}{510} +-\entry {\code {settimeofday}}{555} +-\entry {\code {setuid}}{746} +-\entry {\code {setutent}}{755} +-\entry {\code {setutxent}}{759} +-\entry {\code {setvbuf}}{290} +-\entry {\code {shutdown}}{422} +-\entry {\code {sigaction}}{625} +-\entry {\code {sigaddset}}{644} +-\entry {\code {sigaltstack}}{653} +-\entry {\code {sigblock}}{655} +-\entry {\code {sigdelset}}{644} +-\entry {\code {sigemptyset}}{644} +-\entry {\code {sigfillset}}{644} +-\entry {\code {siginterrupt}}{655} +-\entry {\code {sigismember}}{645} +-\entry {\code {siglongjmp}}{604} +-\entry {\code {sigmask}}{655} +-\entry {\code {signal}}{622} +-\entry {\code {signbit}}{535} +-\entry {\code {significand}}{532} +-\entry {\code {significandf}}{532} +-\entry {\code {significandl}}{532} +-\entry {\code {sigpause}}{656} +-\entry {\code {sigpending}}{647} +-\entry {\code {sigprocmask}}{645} +-\entry {\code {sigsetjmp}}{603} +-\entry {\code {sigsetmask}}{655} +-\entry {\code {sigstack}}{653} +-\entry {\code {sigsuspend}}{651} +-\entry {\code {sigvec}}{655} +-\entry {\code {sigwait}}{835} +-\entry {\code {sin}}{480} +-\entry {\code {sincos}}{480} +-\entry {\code {sincosf}}{480} +-\entry {\code {sincosl}}{480} +-\entry {\code {sinf}}{480} +-\entry {\code {sinh}}{486} +-\entry {\code {sinhf}}{486} +-\entry {\code {sinhl}}{486} +-\entry {\code {sinl}}{480} +-\entry {\code {sleep}}{580} +-\entry {\code {snprintf}}{260} +-\entry {\code {socket}}{422} +-\entry {\code {socketpair}}{423} +-\entry {\code {sprintf}}{259} +-\entry {\code {sqrt}}{485} +-\entry {\code {sqrtf}}{485} +-\entry {\code {sqrtl}}{485} +-\entry {\code {srand}}{508} +-\entry {\code {srand48}}{512} +-\entry {\code {srand48_r}}{514} +-\entry {\code {srandom}}{509} +-\entry {\code {srandom_r}}{510} +-\entry {\code {sscanf}}{280} +-\entry {\code {ssignal}}{624} +-\entry {\code {stat}}{374} +-\entry {\code {stat64}}{374} +-\entry {\code {stime}}{554} +-\entry {\code {stpcpy}}{83} +-\entry {\code {stpncpy}}{83} +-\entry {\code {strcasecmp}}{90} +-\entry {\code {strcasestr}}{98} +-\entry {\code {strcat}}{85} +-\entry {\code {strchr}}{97} +-\entry {\code {strchrnul}}{97} +-\entry {\code {strcmp}}{90} +-\entry {\code {strcoll}}{93} +-\entry {\code {strcpy}}{81} +-\entry {\code {strcspn}}{99} +-\entry {\code {strdup}}{82} +-\entry {\code {strdupa}}{84} +-\entry {\code {strerror}}{26} +-\entry {\code {strerror_r}}{26} +-\entry {\code {strfmon}}{167} +-\entry {\code {strfry}}{105} +-\entry {\code {strftime}}{563} +-\entry {\code {strlen}}{77} +-\entry {\code {strncasecmp}}{91} +-\entry {\code {strncat}}{87} +-\entry {\code {strncmp}}{91} +-\entry {\code {strncpy}}{81} +-\entry {\code {strndup}}{82} +-\entry {\code {strndupa}}{85} +-\entry {\code {strnlen}}{78} +-\entry {\code {strpbrk}}{99} +-\entry {\code {strptime}}{567} +-\entry {\code {strrchr}}{98} +-\entry {\code {strsep}}{102} +-\entry {\code {strsignal}}{621} +-\entry {\code {strspn}}{99} +-\entry {\code {strstr}}{98} +-\entry {\code {strtod}}{544} +-\entry {\code {strtof}}{545} +-\entry {\code {strtoimax}}{542} +-\entry {\code {strtok}}{100} +-\entry {\code {strtok_r}}{102} +-\entry {\code {strtol}}{540} +-\entry {\code {strtold}}{545} +-\entry {\code {strtoll}}{541} +-\entry {\code {strtoq}}{541} +-\entry {\code {strtoul}}{541} +-\entry {\code {strtoull}}{542} +-\entry {\code {strtoumax}}{542} +-\entry {\code {strtouq}}{542} +-\entry {\code {strverscmp}}{91} +-\entry {\code {strxfrm}}{93} +-\entry {\code {stty}}{464} +-\entry {\code {success}}{735} +-\entry {\code {SUN_LEN}}{406} +-\entry {\code {swapcontext}}{606} +-\entry {\code {swprintf}}{259} +-\entry {\code {swscanf}}{280} +-\entry {\code {symlink}}{365} +-\entry {\code {sync}}{323} +-\entry {\code {syscall}}{695} +-\entry {\code {sysconf}}{790} +-\entry {\code {sysctl}}{784} +-\entry {\code {syslog}}{474} +-\entry {\code {system}}{701} +-\entry {\code {sysv_signal}}{624} +-\initial {T} +-\entry {\code {tan}}{480} +-\entry {\code {tanf}}{480} +-\entry {\code {tanh}}{487} +-\entry {\code {tanhf}}{487} +-\entry {\code {tanhl}}{487} +-\entry {\code {tanl}}{480} +-\entry {\code {tcdrain}}{465} +-\entry {\code {tcflow}}{466} +-\entry {\code {tcflush}}{465} +-\entry {\code {tcgetattr}}{448} +-\entry {\code {tcgetpgrp}}{730} +-\entry {\code {tcgetsid}}{731} +-\entry {\code {tcsendbreak}}{465} +-\entry {\code {tcsetattr}}{448} +-\entry {\code {tcsetpgrp}}{730} +-\entry {\code {tdelete}}{202} +-\entry {\code {tdestroy}}{203} +-\entry {\code {telldir}}{357} +-\entry {\code {TEMP_FAILURE_RETRY}}{638} +-\entry {\code {tempnam}}{390} +-\entry {\code {textdomain}}{184} +-\entry {\code {tfind}}{202} +-\entry {\code {tgamma}}{489} +-\entry {\code {tgammaf}}{489} +-\entry {\code {tgammal}}{489} +-\entry {\code {time}}{554} +-\entry {\code {timegm}}{559} +-\entry {\code {timelocal}}{558} +-\entry {\code {times}}{553} +-\entry {\code {tmpfile}}{389} +-\entry {\code {tmpfile64}}{389} +-\entry {\code {tmpnam}}{389} +-\entry {\code {tmpnam_r}}{389} +-\entry {\code {toascii}}{69} +-\entry {\code {tolower}}{69} +-\entry {\code {toupper}}{69} +-\entry {\code {towctrans}}{74} +-\entry {\code {towlower}}{74} +-\entry {\code {towupper}}{74} +-\entry {\code {trunc}}{533} +-\entry {\code {truncate}}{386} +-\entry {\code {truncate64}}{386} +-\entry {\code {truncf}}{533} +-\entry {\code {truncl}}{533} +-\entry {\code {tryagain}}{735} +-\entry {\code {tsearch}}{202} +-\entry {\code {ttyname}}{445} +-\entry {\code {ttyname_r}}{445} +-\entry {\code {twalk}}{203} +-\entry {\code {tzset}}{577} +-\initial {U} +-\entry {\code {ulimit}}{588} +-\entry {\code {umask}}{381} +-\entry {\code {umount}}{784} +-\entry {\code {umount2}}{783} +-\entry {\code {uname}}{774} +-\entry {\code {unavail}}{735} +-\entry {\code {ungetc}}{248} +-\entry {\code {ungetwc}}{248} +-\entry {\code {unlink}}{367} +-\entry {\code {unlockpt}}{469} +-\entry {\code {unsetenv}}{692} +-\entry {\code {updwtmp}}{758} +-\entry {\code {utime}}{384} +-\entry {\code {utimes}}{385} +-\entry {\code {utmpname}}{757} +-\entry {\code {utmpxname}}{760} +-\initial {V} +-\entry {\code {va_alist}}{848} +-\entry {\code {va_arg}}{846} +-\entry {\code {va_dcl}}{848} +-\entry {\code {va_end}}{846} +-\entry {\code {va_start}}{846, 848} +-\entry {\code {valloc}}{38} +-\entry {\code {vasprintf}}{263} +-\entry {\code {verr}}{30} +-\entry {\code {verrx}}{30} +-\entry {\code {versionsort}}{358} +-\entry {\code {versionsort64}}{359} +-\entry {\code {vfork}}{703} +-\entry {\code {vfprintf}}{262} +-\entry {\code {vfscanf}}{281} +-\entry {\code {vfwprintf}}{262} +-\entry {\code {vfwscanf}}{281} +-\entry {\code {vlimit}}{588} +-\entry {\code {vprintf}}{262} +-\entry {\code {vscanf}}{281} +-\entry {\code {vsnprintf}}{263} +-\entry {\code {vsprintf}}{262} +-\entry {\code {vsscanf}}{281} +-\entry {\code {vswprintf}}{262} +-\entry {\code {vswscanf}}{281} +-\entry {\code {vsyslog}}{476} +-\entry {\code {vtimes}}{584} +-\entry {\code {vwarn}}{30} +-\entry {\code {vwarnx}}{30} +-\entry {\code {vwprintf}}{262} +-\entry {\code {vwscanf}}{281} +-\initial {W} +-\entry {\code {wait}}{708} +-\entry {\code {wait3}}{710} +-\entry {\code {wait4}}{708} +-\entry {\code {waitpid}}{706} +-\entry {\code {warn}}{30} +-\entry {\code {warnx}}{30} +-\entry {\code {WCOREDUMP}}{709} +-\entry {\code {wcpcpy}}{83} +-\entry {\code {wcpncpy}}{84} +-\entry {\code {wcrtomb}}{121} +-\entry {\code {wcscasecmp}}{90} +-\entry {\code {wcscat}}{85} +-\entry {\code {wcschr}}{97} +-\entry {\code {wcschrnul}}{97} +-\entry {\code {wcscmp}}{90} +-\entry {\code {wcscoll}}{93} +-\entry {\code {wcscpy}}{81} +-\entry {\code {wcscspn}}{99} +-\entry {\code {wcsdup}}{82} +-\entry {\code {wcsftime}}{567} +-\entry {\code {wcslen}}{78} +-\entry {\code {wcsncasecmp}}{91} +-\entry {\code {wcsncat}}{88} +-\entry {\code {wcsncmp}}{91} +-\entry {\code {wcsncpy}}{82} +-\entry {\code {wcsnlen}}{79} +-\entry {\code {wcsnrtombs}}{126} +-\entry {\code {wcspbrk}}{100} +-\entry {\code {wcsrchr}}{98} +-\entry {\code {wcsrtombs}}{124} +-\entry {\code {wcsspn}}{99} +-\entry {\code {wcsstr}}{98} +-\entry {\code {wcstod}}{545} +-\entry {\code {wcstof}}{545} +-\entry {\code {wcstoimax}}{542} +-\entry {\code {wcstok}}{101} +-\entry {\code {wcstol}}{540} +-\entry {\code {wcstold}}{545} +-\entry {\code {wcstoll}}{541} +-\entry {\code {wcstombs}}{130} +-\entry {\code {wcstoq}}{541} +-\entry {\code {wcstoul}}{541} +-\entry {\code {wcstoull}}{542} +-\entry {\code {wcstoumax}}{543} +-\entry {\code {wcstouq}}{542} +-\entry {\code {wcswcs}}{98} +-\entry {\code {wcsxfrm}}{94} +-\entry {\code {wctob}}{118} +-\entry {\code {wctomb}}{128} +-\entry {\code {wctrans}}{74} +-\entry {\code {wctype}}{70} +-\entry {\code {WEXITSTATUS}}{709} +-\entry {\code {WIFEXITED}}{709} +-\entry {\code {WIFSIGNALED}}{709} +-\entry {\code {WIFSTOPPED}}{709} +-\entry {\code {wmemchr}}{96} +-\entry {\code {wmemcmp}}{89} +-\entry {\code {wmemcpy}}{79} +-\entry {\code {wmemmove}}{81} +-\entry {\code {wmempcpy}}{80} +-\entry {\code {wmemset}}{81} +-\entry {\code {wordexp}}{220} +-\entry {\code {wordfree}}{220} +-\entry {\code {wprintf}}{259} +-\entry {\code {write}}{308} +-\entry {\code {writev}}{316} +-\entry {\code {wscanf}}{280} +-\entry {\code {WSTOPSIG}}{709} +-\entry {\code {WTERMSIG}}{709} +-\initial {Y} +-\entry {\code {y0}}{489} +-\entry {\code {y0f}}{489} +-\entry {\code {y0l}}{489} +-\entry {\code {y1}}{490} +-\entry {\code {y1f}}{490} +-\entry {\code {y1l}}{490} +-\entry {\code {yn}}{490} +-\entry {\code {ynf}}{490} +-\entry {\code {ynl}}{490} +diff -u -udbrN glibc-2.3.2/manual/libc.info glibc-2.3.2-200304020432/manual/libc.info +--- glibc-2.3.2/manual/libc.info Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info Thu Jan 1 01:00:00 1970 +@@ -1,818 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-Indirect: +-libc.info-1: 1208 +-libc.info-2: 61500 +-libc.info-3: 106626 +-libc.info-4: 156304 +-libc.info-5: 204142 +-libc.info-6: 247102 +-libc.info-7: 274125 +-libc.info-8: 319933 +-libc.info-9: 362805 +-libc.info-10: 410708 +-libc.info-11: 449597 +-libc.info-12: 496858 +-libc.info-13: 542519 +-libc.info-14: 584236 +-libc.info-15: 631323 +-libc.info-16: 681323 +-libc.info-17: 729210 +-libc.info-18: 778205 +-libc.info-19: 826920 +-libc.info-20: 875904 +-libc.info-21: 921832 +-libc.info-22: 963157 +-libc.info-23: 1009947 +-libc.info-24: 1059652 +-libc.info-25: 1107740 +-libc.info-26: 1153966 +-libc.info-27: 1203098 +-libc.info-28: 1252422 +-libc.info-29: 1302337 +-libc.info-30: 1350282 +-libc.info-31: 1398920 +-libc.info-32: 1429462 +-libc.info-33: 1486890 +-libc.info-34: 1536598 +-libc.info-35: 1584002 +-libc.info-36: 1631783 +-libc.info-37: 1679171 +-libc.info-38: 1728663 +-libc.info-39: 1774227 +-libc.info-40: 1823654 +-libc.info-41: 1870981 +-libc.info-42: 1920590 +-libc.info-43: 1965086 +-libc.info-44: 2014650 +-libc.info-45: 2060853 +-libc.info-46: 2110146 +-libc.info-47: 2158781 +-libc.info-48: 2201155 +-libc.info-49: 2251135 +-libc.info-50: 2297731 +-libc.info-51: 2347537 +-libc.info-52: 2394418 +-libc.info-53: 2407546 +-libc.info-54: 2617154 +-libc.info-55: 2662663 +-libc.info-56: 2703000 +-libc.info-57: 2722877 +-libc.info-58: 2786467 +-libc.info-59: 2794244 +-libc.info-60: 2876496 +-libc.info-61: 2941243 +- +-Tag Table: +-(Indirect) +-Node: Top1208 +-Node: Introduction61500 +-Node: Getting Started62849 +-Node: Standards and Portability64308 +-Node: ISO C65756 +-Node: POSIX67273 +-Node: Berkeley Unix69010 +-Node: SVID69774 +-Node: XPG70774 +-Node: Using the Library71715 +-Node: Header Files72438 +-Node: Macro Definitions76389 +-Node: Reserved Names78734 +-Node: Feature Test Macros83430 +-Node: Roadmap to the Manual94214 +-Node: Error Reporting101498 +-Node: Checking for Errors102415 +-Node: Error Codes106626 +-Node: Error Messages125922 +-Node: Memory140254 +-Node: Memory Concepts141111 +-Node: Memory Allocation146779 +-Node: Memory Allocation and C147668 +-Node: Unconstrained Allocation151217 +-Node: Basic Allocation152637 +-Node: Malloc Examples154337 +-Node: Freeing after Malloc156304 +-Node: Changing Block Size158119 +-Node: Allocating Cleared Space160722 +-Node: Efficiency and Malloc161730 +-Node: Aligned Memory Blocks162829 +-Node: Malloc Tunable Parameters165041 +-Node: Heap Consistency Checking166798 +-Node: Hooks for Malloc171898 +-Node: Statistics of Malloc178094 +-Node: Summary of Malloc180052 +-Node: Allocation Debugging182214 +-Node: Tracing malloc183317 +-Node: Using the Memory Debugger185167 +-Node: Tips for the Memory Debugger187052 +-Node: Interpreting the traces188380 +-Node: Obstacks191915 +-Node: Creating Obstacks193529 +-Node: Preparing for Obstacks195428 +-Node: Allocation in an Obstack198171 +-Node: Freeing Obstack Objects200578 +-Node: Obstack Functions201912 +-Node: Growing Objects204142 +-Node: Extra Fast Growing208387 +-Node: Status of an Obstack212006 +-Node: Obstacks Data Alignment213425 +-Node: Obstack Chunks215111 +-Node: Summary of Obstacks217466 +-Node: Variable Size Automatic220880 +-Node: Alloca Example222406 +-Node: Advantages of Alloca223527 +-Node: Disadvantages of Alloca225414 +-Node: GNU C Variable-Size Arrays226157 +-Node: Resizing the Data Segment227315 +-Node: Locking Pages229403 +-Node: Why Lock Pages230165 +-Node: Locked Memory Details231793 +-Node: Page Lock Functions234049 +-Node: Character Handling239913 +-Node: Classification of Characters241368 +-Node: Case Conversion245212 +-Node: Classification of Wide Characters247102 +-Node: Using Wide Char Classes254802 +-Node: Wide Character Case Conversion257113 +-Node: String and Array Utilities259806 +-Node: Representation of Strings261870 +-Node: String/Array Conventions267392 +-Node: String Length270326 +-Node: Copying and Concatenation274125 +-Node: String/Array Comparison299586 +-Node: Collation Functions309728 +-Node: Search Functions319933 +-Node: Finding Tokens in a String332053 +-Node: strfry344252 +-Node: Trivial Encryption345282 +-Node: Encode Binary Data346740 +-Node: Argz and Envz Vectors351442 +-Node: Argz Functions352042 +-Node: Envz Functions358603 +-Node: Character Set Handling361653 +-Node: Extended Char Intro362805 +-Node: Charset Function Overview375910 +-Node: Restartable multibyte conversion376873 +-Node: Selecting the Conversion378983 +-Node: Keeping the state381372 +-Node: Converting a Character384586 +-Node: Converting Strings400592 +-Node: Multibyte Conversion Example410708 +-Node: Non-reentrant Conversion413695 +-Node: Non-reentrant Character Conversion415379 +-Node: Non-reentrant String Conversion420079 +-Node: Shift State423077 +-Node: Generic Charset Conversion425740 +-Node: Generic Conversion Interface428922 +-Node: iconv Examples438863 +-Node: Other iconv Implementations444207 +-Node: glibc iconv Implementation449597 +-Node: Locales489334 +-Node: Effects of Locale491003 +-Node: Choosing Locale492967 +-Node: Locale Categories494341 +-Node: Setting the Locale496858 +-Node: Standard Locales501410 +-Node: Locale Information502699 +-Node: The Lame Way to Locale Data504415 +-Node: General Numeric506286 +-Node: Currency Symbol509265 +-Node: Sign of Money Amount513453 +-Node: The Elegant and Fast Way515583 +-Node: Formatting Numbers527719 +-Node: Yes-or-No Questions537139 +-Node: Message Translation539175 +-Node: Message catalogs a la X/Open541221 +-Node: The catgets Functions542519 +-Node: The message catalog files551540 +-Node: The gencat program558289 +-Node: Common Usage561423 +-Node: The Uniforum approach568549 +-Node: Message catalogs with gettext570043 +-Node: Translation with gettext571078 +-Node: Locating gettext catalog577373 +-Node: Advanced gettext functions584236 +-Ref: Advanced gettext functions-Footnote-1594353 +-Node: Charset conversion in gettext594445 +-Node: GUI program problems596934 +-Node: Using gettextized software602468 +-Node: Helper programs for gettext610780 +-Node: Searching and Sorting612544 +-Node: Comparison Functions613459 +-Node: Array Search Function614676 +-Node: Array Sort Function618020 +-Node: Search/Sort Example620151 +-Node: Hash Search Function623642 +-Node: Tree Search Function631323 +-Node: Pattern Matching638317 +-Node: Wildcard Matching639119 +-Node: Globbing643057 +-Node: Calling Glob643921 +-Node: Flags for Globbing653903 +-Node: More Flags for Globbing657433 +-Node: Regular Expressions663565 +-Node: POSIX Regexp Compilation664549 +-Node: Flags for POSIX Regexps668664 +-Node: Matching POSIX Regexps669571 +-Node: Regexp Subexpressions671732 +-Node: Subexpression Complications673786 +-Node: Regexp Cleanup676149 +-Node: Word Expansion678475 +-Node: Expansion Stages679830 +-Node: Calling Wordexp681323 +-Node: Flags for Wordexp685286 +-Node: Wordexp Example687239 +-Node: Tilde Expansion689050 +-Node: Variable Substitution690122 +-Node: I/O Overview694247 +-Node: I/O Concepts695761 +-Node: Streams and File Descriptors696906 +-Node: File Position699993 +-Node: File Names702125 +-Node: Directories703011 +-Node: File Name Resolution704748 +-Node: File Name Errors707676 +-Node: File Name Portability709216 +-Node: I/O on Streams711208 +-Node: Streams713430 +-Node: Standard Streams714771 +-Node: Opening Streams716555 +-Node: Closing Streams726658 +-Node: Streams and Threads729210 +-Node: Streams and I18N738236 +-Node: Simple Output744399 +-Node: Character Input749749 +-Node: Line Input754995 +-Node: Unreading761675 +-Node: Unreading Idea762484 +-Node: How Unread763310 +-Node: Block Input/Output766074 +-Node: Formatted Output768852 +-Node: Formatted Output Basics770619 +-Node: Output Conversion Syntax773112 +-Node: Table of Output Conversions778205 +-Node: Integer Conversions781211 +-Node: Floating-Point Conversions786752 +-Node: Other Output Conversions792586 +-Node: Formatted Output Functions796392 +-Node: Dynamic Output802374 +-Node: Variable Arguments Output804230 +-Node: Parsing a Template String810411 +-Node: Example of Parsing814242 +-Node: Customizing Printf816530 +-Node: Registering New Conversions818449 +-Node: Conversion Specifier Options820622 +-Node: Defining the Output Handler824459 +-Node: Printf Extension Example826920 +-Node: Predefined Printf Handlers829329 +-Node: Formatted Input832740 +-Node: Formatted Input Basics833819 +-Node: Input Conversion Syntax836511 +-Node: Table of Input Conversions839873 +-Node: Numeric Input Conversions844043 +-Node: String Input Conversions848498 +-Node: Dynamic String Input853618 +-Node: Other Input Conversions854808 +-Node: Formatted Input Functions856453 +-Node: Variable Arguments Input859294 +-Node: EOF and Errors861649 +-Node: Error Recovery864563 +-Node: Binary Streams866349 +-Node: File Positioning868873 +-Node: Portable Positioning875904 +-Node: Stream Buffering881593 +-Node: Buffering Concepts883192 +-Node: Flushing Buffers884555 +-Node: Controlling Buffering887662 +-Node: Other Kinds of Streams893267 +-Node: String Streams894556 +-Node: Obstack Streams898692 +-Node: Custom Streams900735 +-Node: Streams and Cookies901452 +-Node: Hook Functions904522 +-Node: Formatted Messages906908 +-Node: Printing Formatted Messages907573 +-Node: Adding Severity Classes914013 +-Node: Example915620 +-Node: Low-Level I/O918824 +-Node: Opening and Closing Files921832 +-Node: I/O Primitives929804 +-Node: File Position Primitive943900 +-Node: Descriptors and Streams951213 +-Node: Stream/Descriptor Precautions953897 +-Node: Linked Channels955103 +-Node: Independent Channels956364 +-Node: Cleaning Streams958267 +-Node: Scatter-Gather960567 +-Node: Memory-mapped I/O963157 +-Node: Waiting for I/O974620 +-Node: Synchronizing I/O982401 +-Node: Asynchronous I/O985849 +-Node: Asynchronous Reads/Writes993909 +-Node: Status of AIO Operations1006378 +-Node: Synchronizing AIO Operations1009947 +-Node: Cancel AIO Operations1016377 +-Node: Configuration of AIO1019868 +-Node: Control Operations1022062 +-Node: Duplicating Descriptors1024753 +-Node: Descriptor Flags1029009 +-Node: File Status Flags1032413 +-Node: Access Modes1033866 +-Node: Open-time Flags1036162 +-Node: Operating Modes1040878 +-Node: Getting File Status Flags1043643 +-Node: File Locks1046250 +-Node: Interrupt Input1055145 +-Node: IOCTLs1057575 +-Ref: IOCTLs-Footnote-11059555 +-Node: File System Interface1059652 +-Node: Working Directory1061181 +-Node: Accessing Directories1066192 +-Node: Directory Entries1067619 +-Node: Opening a Directory1070873 +-Node: Reading/Closing Directory1073316 +-Node: Simple Directory Lister1077818 +-Node: Random Access Directory1078813 +-Node: Scanning Directory Content1080315 +-Node: Simple Directory Lister Mark II1084770 +-Node: Working with Directory Trees1085879 +-Node: Hard Links1097422 +-Node: Symbolic Links1100220 +-Node: Deleting Files1107740 +-Node: Renaming Files1110658 +-Node: Creating Directories1114262 +-Node: File Attributes1116014 +-Node: Attribute Meanings1117538 +-Node: Reading Attributes1126760 +-Node: Testing File Type1130830 +-Node: File Owner1134986 +-Node: Permission Bits1138638 +-Node: Access Permission1143956 +-Node: Setting Permissions1145098 +-Node: Testing File Access1150304 +-Node: File Times1153966 +-Node: File Size1160352 +-Node: Making Special Files1166775 +-Node: Temporary Files1168451 +-Node: Pipes and FIFOs1177671 +-Node: Creating a Pipe1179254 +-Node: Pipe to a Subprocess1182547 +-Node: FIFO Special Files1185554 +-Node: Pipe Atomicity1187126 +-Node: Sockets1188009 +-Node: Socket Concepts1190049 +-Node: Communication Styles1194289 +-Node: Socket Addresses1196139 +-Node: Address Formats1198175 +-Node: Setting Address1201376 +-Node: Reading Address1203098 +-Node: Interface Naming1204859 +-Node: Local Namespace1207266 +-Node: Local Namespace Concepts1207926 +-Node: Local Namespace Details1209443 +-Node: Local Socket Example1211390 +-Node: Internet Namespace1212898 +-Node: Internet Address Formats1215121 +-Node: Host Addresses1217272 +-Node: Abstract Host Addresses1218440 +-Node: Host Address Data Type1222957 +-Node: Host Address Functions1226080 +-Node: Host Names1230432 +-Node: Ports1239701 +-Node: Services Database1241739 +-Node: Byte Order1244562 +-Node: Protocols Database1246870 +-Node: Inet Example1250412 +-Node: Misc Namespaces1252422 +-Node: Open/Close Sockets1253168 +-Node: Creating a Socket1253666 +-Node: Closing a Socket1255346 +-Node: Socket Pairs1256872 +-Node: Connections1258881 +-Node: Connecting1259975 +-Node: Listening1262802 +-Node: Accepting Connections1264875 +-Node: Who is Connected1268006 +-Node: Transferring Data1269105 +-Node: Sending Data1270210 +-Node: Receiving Data1272728 +-Node: Socket Data Options1274464 +-Node: Byte Stream Example1275327 +-Node: Server Example1277384 +-Node: Out-of-Band Data1281400 +-Node: Datagrams1287311 +-Node: Sending Datagrams1288340 +-Node: Receiving Datagrams1290265 +-Node: Datagram Example1292331 +-Node: Example Receiver1294345 +-Node: Inetd1296909 +-Node: Inetd Servers1297718 +-Node: Configuring Inetd1298960 +-Node: Socket Options1301629 +-Node: Socket Option Functions1302337 +-Node: Socket-Level Options1303894 +-Node: Networks Database1307523 +-Node: Low-Level Terminal Interface1310407 +-Node: Is It a Terminal1311877 +-Node: I/O Queues1313780 +-Node: Canonical or Not1315737 +-Node: Terminal Modes1317583 +-Node: Mode Data Types1319152 +-Node: Mode Functions1320980 +-Node: Setting Modes1324912 +-Node: Input Modes1326911 +-Node: Output Modes1332177 +-Node: Control Modes1333789 +-Node: Local Modes1337878 +-Node: Line Speed1344191 +-Node: Special Characters1348368 +-Node: Editing Characters1350282 +-Node: Signal Characters1354622 +-Node: Start/Stop Characters1357488 +-Node: Other Special1359358 +-Node: Noncanonical Input1361172 +-Node: BSD Terminal Modes1365986 +-Node: Line Control1367458 +-Node: Noncanon Example1372176 +-Node: Pseudo-Terminals1374403 +-Node: Allocation1375315 +-Node: Pseudo-Terminal Pairs1380102 +-Node: Syslog1382618 +-Node: Overview of Syslog1383567 +-Node: Submitting Syslog Messages1387751 +-Node: openlog1388569 +-Node: syslog; vsyslog1393583 +-Node: closelog1397780 +-Node: setlogmask1398920 +-Node: Syslog Example1400763 +-Node: Mathematics1401426 +-Node: Mathematical Constants1403148 +-Node: Trig Functions1405155 +-Node: Inverse Trig Functions1408890 +-Node: Exponents and Logarithms1412692 +-Node: Hyperbolic Functions1420884 +-Node: Special Functions1424924 +-Node: Errors in Math Functions1429462 +-Node: Pseudo-Random Numbers1486890 +-Node: ISO Random1489131 +-Node: BSD Random1491063 +-Node: SVID Random1495645 +-Node: FP Function Optimizations1508895 +-Node: Arithmetic1510982 +-Node: Integers1512261 +-Node: Integer Division1515277 +-Node: Floating Point Numbers1518962 +-Node: Floating Point Classes1520704 +-Node: Floating Point Errors1524525 +-Node: FP Exceptions1525022 +-Node: Infinity and NaN1529383 +-Node: Status bit operations1532456 +-Node: Math Error Reporting1536598 +-Node: Rounding1538924 +-Node: Control Functions1542512 +-Node: Arithmetic Functions1547334 +-Node: Absolute Value1548202 +-Node: Normalization Functions1550262 +-Node: Rounding Functions1553563 +-Node: Remainder Functions1557945 +-Node: FP Bit Twiddling1560089 +-Node: FP Comparison Functions1563201 +-Node: Misc FP Arithmetic1565914 +-Node: Complex Numbers1568656 +-Node: Operations on Complex1570361 +-Node: Parsing of Numbers1572705 +-Node: Parsing of Integers1573397 +-Node: Parsing of Floats1584002 +-Node: System V Number Conversion1589168 +-Node: Date and Time1594484 +-Node: Time Basics1595214 +-Node: Elapsed Time1597094 +-Node: Processor And CPU Time1600646 +-Node: CPU Time1602517 +-Node: Processor Time1604290 +-Node: Calendar Time1606690 +-Node: Simple Calendar Time1608623 +-Node: High-Resolution Calendar1611027 +-Node: Broken-down Time1616388 +-Node: High Accuracy Clock1624347 +-Node: Formatting Calendar Time1631783 +-Node: Parsing Date and Time1647616 +-Node: Low-Level Time String Parsing1648459 +-Node: General Time String Parsing1662052 +-Node: TZ Variable1669180 +-Node: Time Zone Functions1675223 +-Node: Time Functions Example1678063 +-Node: Setting an Alarm1679171 +-Node: Sleeping1684931 +-Node: Resource Usage And Limitation1689534 +-Node: Resource Usage1690211 +-Node: Limits on Resources1695793 +-Node: Priority1705010 +-Node: Absolute Priority1707372 +-Node: Realtime Scheduling1712466 +-Node: Basic Scheduling Functions1715914 +-Node: Traditional Scheduling1723848 +-Node: Traditional Scheduling Intro1724400 +-Node: Traditional Scheduling Functions1728663 +-Node: Memory Resources1732550 +-Node: Memory Subsystem1733400 +-Node: Query Memory Parameters1735780 +-Node: Processor Resources1739427 +-Node: Non-Local Exits1741544 +-Node: Non-Local Intro1742254 +-Node: Non-Local Details1745985 +-Node: Non-Local Exits and Signals1749061 +-Node: System V contexts1750558 +-Node: Signal Handling1763520 +-Node: Concepts of Signals1765554 +-Node: Kinds of Signals1766118 +-Node: Signal Generation1767513 +-Node: Delivery of Signal1769780 +-Node: Standard Signals1772634 +-Node: Program Error Signals1774227 +-Node: Termination Signals1781685 +-Node: Alarm Signals1785523 +-Node: Asynchronous I/O Signals1786755 +-Node: Job Control Signals1787945 +-Node: Operation Error Signals1792545 +-Node: Miscellaneous Signals1794484 +-Node: Signal Messages1796178 +-Node: Signal Actions1798063 +-Node: Basic Signal Handling1799008 +-Node: Advanced Signal Handling1805075 +-Node: Signal and Sigaction1808049 +-Node: Sigaction Function Example1809801 +-Node: Flags for Sigaction1812117 +-Node: Initial Signal Actions1814495 +-Node: Defining Handlers1815876 +-Node: Handler Returns1818061 +-Node: Termination in Handler1820111 +-Node: Longjmp in Handler1821550 +-Node: Signals in Handler1823654 +-Node: Merged Signals1825774 +-Node: Nonreentrancy1831487 +-Node: Atomic Data Access1836893 +-Node: Non-atomic Example1837939 +-Node: Atomic Types1839716 +-Node: Atomic Usage1840735 +-Node: Interrupted Primitives1842205 +-Node: Generating Signals1845504 +-Node: Signaling Yourself1846097 +-Node: Signaling Another Process1848080 +-Node: Permission for kill1851456 +-Node: Kill Example1853252 +-Node: Blocking Signals1855604 +-Node: Why Block1857376 +-Node: Signal Sets1858912 +-Node: Process Signal Mask1861938 +-Node: Testing for Delivery1865292 +-Node: Blocking for Handler1866550 +-Node: Checking for Pending Signals1868969 +-Node: Remembering a Signal1870981 +-Node: Waiting for a Signal1874535 +-Node: Using Pause1875080 +-Node: Pause Problems1876705 +-Node: Sigsuspend1878429 +-Node: Signal Stack1881140 +-Node: BSD Signal Handling1886462 +-Node: BSD Handler1887736 +-Node: Blocking in BSD1890168 +-Node: Program Basics1891619 +-Node: Program Arguments1893603 +-Node: Argument Syntax1895602 +-Node: Parsing Program Arguments1898276 +-Node: Getopt1899379 +-Node: Using Getopt1900017 +-Node: Example of Getopt1904135 +-Node: Getopt Long Options1906873 +-Node: Getopt Long Option Example1912121 +-Node: Argp1915242 +-Node: Argp Global Variables1918558 +-Node: Argp Parsers1920590 +-Node: Argp Option Vectors1923964 +-Node: Argp Option Flags1927179 +-Node: Argp Parser Functions1929225 +-Node: Argp Special Keys1931917 +-Node: Argp Helper Functions1937203 +-Node: Argp Parsing State1940235 +-Node: Argp Children1943798 +-Node: Argp Flags1945880 +-Node: Argp Help Filtering1948157 +-Node: Argp Help Filter Keys1949392 +-Node: Argp Help1950305 +-Node: Argp Help Flags1951485 +-Node: Argp Examples1953835 +-Node: Argp Example 11954305 +-Node: Argp Example 21955105 +-Node: Argp Example 31958046 +-Node: Argp Example 41965086 +-Node: Argp User Customization1972835 +-Node: Suboptions1974563 +-Node: Suboptions Example1976505 +-Node: Environment Variables1978674 +-Node: Environment Access1980539 +-Node: Standard Environment1985459 +-Node: System Calls1989631 +-Node: Program Termination1993187 +-Node: Normal Termination1994396 +-Node: Exit Status1995793 +-Node: Cleanups on Exit1999152 +-Node: Aborting a Program2000969 +-Node: Termination Internals2001868 +-Node: Processes2004048 +-Node: Running a Command2006070 +-Node: Process Creation Concepts2008097 +-Node: Process Identification2010106 +-Node: Creating a Process2011030 +-Node: Executing a File2014650 +-Node: Process Completion2021785 +-Node: Process Completion Status2028055 +-Node: BSD Wait Functions2029698 +-Node: Process Creation Example2031566 +-Node: Job Control2033822 +-Node: Concepts of Job Control2035100 +-Node: Job Control is Optional2038454 +-Node: Controlling Terminal2039503 +-Node: Access to the Terminal2040410 +-Node: Orphaned Process Groups2042013 +-Node: Implementing a Shell2043004 +-Node: Data Structures2043887 +-Node: Initializing the Shell2046545 +-Node: Launching Jobs2050281 +-Node: Foreground and Background2057734 +-Node: Stopped and Terminated Jobs2060853 +-Node: Continuing Stopped Jobs2066063 +-Node: Missing Pieces2067695 +-Node: Functions for Job Control2069319 +-Node: Identifying the Terminal2069799 +-Node: Process Group Functions2071372 +-Node: Terminal Access Functions2076382 +-Node: Name Service Switch2079859 +-Node: NSS Basics2081190 +-Node: NSS Configuration File2082779 +-Node: Services in the NSS configuration2084477 +-Node: Actions in the NSS configuration2085758 +-Node: Notes on NSS Configuration File2088919 +-Node: NSS Module Internals2090796 +-Node: NSS Module Names2091492 +-Ref: NSS Module Names-Footnote-12093533 +-Ref: NSS Module Names-Footnote-22093687 +-Node: NSS Modules Interface2093865 +-Node: Extending NSS2098562 +-Node: Adding another Service to NSS2099493 +-Node: NSS Module Function Internals2101724 +-Node: Users and Groups2106627 +-Node: User and Group IDs2109238 +-Node: Process Persona2110146 +-Node: Why Change Persona2111831 +-Node: How Change Persona2113712 +-Node: Reading Persona2115599 +-Node: Setting User ID2117869 +-Node: Setting Groups2120732 +-Node: Enable/Disable Setuid2126415 +-Node: Setuid Program Example2128450 +-Node: Tips for Setuid2131924 +-Node: Who Logged In2134439 +-Node: User Accounting Database2136819 +-Node: Manipulating the Database2138003 +-Node: XPG Functions2150331 +-Node: Logging In and Out2154746 +-Node: User Database2156862 +-Node: User Data Structure2157524 +-Node: Lookup User2158781 +-Node: Scanning All Users2161345 +-Node: Writing a User Entry2164299 +-Node: Group Database2165198 +-Node: Group Data Structure2165774 +-Node: Lookup Group2166537 +-Node: Scanning All Groups2169038 +-Node: Database Example2172068 +-Node: Netgroup Database2174265 +-Node: Netgroup Data2174676 +-Node: Lookup Netgroup2176204 +-Node: Netgroup Membership2179622 +-Node: System Management2180952 +-Node: Host Identification2181883 +-Node: Platform Type2188362 +-Node: Filesystem Handling2191667 +-Node: Mount Information2193167 +-Node: fstab2195339 +-Node: mtab2201155 +-Node: Other Mount Information2210447 +-Node: Mount-Unmount-Remount2210961 +-Node: System Parameters2220984 +-Node: System Configuration2226517 +-Node: General Limits2228088 +-Node: System Options2231723 +-Node: Version Supported2235055 +-Node: Sysconf2236892 +-Node: Sysconf Definition2237528 +-Node: Constants for Sysconf2238200 +-Node: Examples of Sysconf2251135 +-Node: Minimums2252128 +-Node: Limits for Files2254839 +-Node: Options for Files2257840 +-Node: File Minimums2260133 +-Node: Pathconf2262353 +-Node: Utility Limits2265728 +-Node: Utility Minimums2267658 +-Node: String Parameters2269410 +-Node: Cryptographic Functions2273310 +-Node: Legal Problems2275283 +-Node: getpass2277559 +-Node: crypt2279729 +-Node: DES Encryption2284497 +-Node: Debugging Support2290699 +-Node: Backtraces2291341 +-Node: POSIX Threads2296128 +-Node: Basic Thread Operations2297731 +-Node: Thread Attributes2302313 +-Node: Cancellation2309270 +-Node: Cleanup Handlers2313163 +-Node: Mutexes2318300 +-Node: Condition Variables2327958 +-Node: POSIX Semaphores2335333 +-Node: Thread-Specific Data2339214 +-Node: Threads and Signal Handling2343847 +-Node: Threads and Fork2347537 +-Node: Streams and Fork2352799 +-Node: Miscellaneous Thread Functions2354961 +-Node: Language Features2361446 +-Node: Consistency Checking2362372 +-Node: Variadic Functions2366918 +-Node: Why Variadic2367990 +-Node: How Variadic2369954 +-Node: Variadic Prototypes2371243 +-Node: Receiving Arguments2372384 +-Node: How Many Arguments2375055 +-Node: Calling Variadics2376717 +-Node: Argument Macros2378817 +-Node: Variadic Example2381653 +-Node: Old Varargs2382805 +-Node: Null Pointer Constant2384480 +-Node: Important Data Types2385565 +-Node: Data Type Measurements2388129 +-Node: Width of Type2388986 +-Node: Range of Type2389892 +-Node: Floating Type Macros2393160 +-Node: Floating Point Concepts2394418 +-Node: Floating Point Parameters2398146 +-Node: IEEE Floating Point2405098 +-Node: Structure Measurement2406851 +-Node: Library Summary2407546 +-Node: Installation2617154 +-Node: Configuring and compiling2618856 +-Node: Running make install2628187 +-Node: Tools for Compilation2632236 +-Node: Supported Configurations2635037 +-Node: Linux2637241 +-Node: Reporting Bugs2640145 +-Node: Maintenance2642977 +-Node: Source Layout2643360 +-Node: Porting2647292 +-Node: Hierarchy Conventions2655592 +-Node: Porting to Unix2660648 +-Node: Contributors2662663 +-Node: Free Manuals2669917 +-Node: Copying2674837 +-Node: Documentation License2703000 +-Node: Concept Index2722877 +-Node: Type Index2786467 +-Node: Function Index2794244 +-Node: Variable Index2876496 +-Node: File Index2941243 +- +-End Tag Table +diff -u -udbrN glibc-2.3.2/manual/libc.info-1 glibc-2.3.2-200304020432/manual/libc.info-1 +--- glibc-2.3.2/manual/libc.info-1 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-1 Thu Jan 1 01:00:00 1970 +@@ -1,1349 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir) +- +-Main Menu +-********* +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x of the GNU C Library. +- +-* Menu: +- +-* Introduction:: Purpose of the GNU C Library. +-* Error Reporting:: How library functions report errors. +-* Memory:: Allocating virtual memory and controlling +- paging. +-* Character Handling:: Character testing and conversion functions. +-* String and Array Utilities:: Utilities for copying and comparing strings +- and arrays. +-* Character Set Handling:: Support for extended character sets. +-* Locales:: The country and language can affect the +- behavior of library functions. +-* Message Translation:: How to make the program speak the user's +- language. +-* Searching and Sorting:: General searching and sorting functions. +-* Pattern Matching:: Matching shell ``globs'' and regular +- expressions. +-* I/O Overview:: Introduction to the I/O facilities. +-* I/O on Streams:: High-level, portable I/O facilities. +-* Low-Level I/O:: Low-level, less portable I/O. +-* File System Interface:: Functions for manipulating files. +-* Pipes and FIFOs:: A simple interprocess communication +- mechanism. +-* Sockets:: A more complicated IPC mechanism, with +- networking support. +-* Low-Level Terminal Interface:: How to change the characteristics of a +- terminal device. +-* Syslog:: System logging and messaging. +-* Mathematics:: Math functions, useful constants, random +- numbers. +-* Arithmetic:: Low level arithmetic functions. +-* Date and Time:: Functions for getting the date and time and +- formatting them nicely. +-* Resource Usage And Limitation:: Functions for examining resource usage and +- getting and setting limits. +-* Non-Local Exits:: Jumping out of nested function calls. +-* Signal Handling:: How to send, block, and handle signals. +-* Program Basics:: Writing the beginning and end of your +- program. +-* Processes:: How to create processes and run other +- programs. +-* Job Control:: All about process groups and sessions. +-* Name Service Switch:: Accessing system databases. +-* Users and Groups:: How users are identified and classified. +-* System Management:: Controlling the system and getting +- information about it. +-* System Configuration:: Parameters describing operating system +- limits. +-* Cryptographic Functions:: DES encryption and password handling. +-* Debugging Support:: Functions to help debugging applications. +- +-Add-ons +- +-* POSIX Threads:: The standard threads library. +- +-Appendices +- +-* Language Features:: C language features provided by the library. +-* Library Summary:: A summary showing the syntax, header file, +- and derivation of each library feature. +-* Installation:: How to install the GNU C library. +-* Maintenance:: How to enhance and port the GNU C Library. +-* Contributors:: Who wrote what parts of the GNU C library. +-* Free Manuals:: Free Software Needs Free Documentation. +-* Copying:: The GNU Lesser General Public License says +- how you can copy and share the GNU C Library. +-* Documentation License:: This manual is under the GNU Free +- Documentation License. +- +-Indices +- +-* Concept Index:: Index of concepts and names. +-* Type Index:: Index of types and type qualifiers. +-* Function Index:: Index of functions and function-like macros. +-* Variable Index:: Index of variables and variable-like macros. +-* File Index:: Index of programs and files. +- +- --- The Detailed Node Listing --- +- +-Introduction +- +-* Getting Started:: What this manual is for and how to use it. +-* Standards and Portability:: Standards and sources upon which the GNU +- C library is based. +-* Using the Library:: Some practical uses for the library. +-* Roadmap to the Manual:: Overview of the remaining chapters in +- this manual. +- +-Standards and Portability +- +-* ISO C:: The international standard for the C +- programming language. +-* POSIX:: The ISO/IEC 9945 (aka IEEE 1003) standards +- for operating systems. +-* Berkeley Unix:: BSD and SunOS. +-* SVID:: The System V Interface Description. +-* XPG:: The X/Open Portability Guide. +- +-Using the Library +- +-* Header Files:: How to include the header files in your +- programs. +-* Macro Definitions:: Some functions in the library may really +- be implemented as macros. +-* Reserved Names:: The C standard reserves some names for +- the library, and some for users. +-* Feature Test Macros:: How to control what names are defined. +- +-Error Reporting +- +-* Checking for Errors:: How errors are reported by library functions. +-* Error Codes:: Error code macros; all of these expand +- into integer constant values. +-* Error Messages:: Mapping error codes onto error messages. +- +-Memory +- +-* Memory Concepts:: An introduction to concepts and terminology. +-* Memory Allocation:: Allocating storage for your program data +-* Locking Pages:: Preventing page faults +-* Resizing the Data Segment:: `brk', `sbrk' +- +-Memory Allocation +- +-* Memory Allocation and C:: How to get different kinds of allocation in C. +-* Unconstrained Allocation:: The `malloc' facility allows fully general +- dynamic allocation. +-* Allocation Debugging:: Finding memory leaks and not freed memory. +-* Obstacks:: Obstacks are less general than malloc +- but more efficient and convenient. +-* Variable Size Automatic:: Allocation of variable-sized blocks +- of automatic storage that are freed when the +- calling function returns. +- +-Unconstrained Allocation +- +-* Basic Allocation:: Simple use of `malloc'. +-* Malloc Examples:: Examples of `malloc'. `xmalloc'. +-* Freeing after Malloc:: Use `free' to free a block you +- got with `malloc'. +-* Changing Block Size:: Use `realloc' to make a block +- bigger or smaller. +-* Allocating Cleared Space:: Use `calloc' to allocate a +- block and clear it. +-* Efficiency and Malloc:: Efficiency considerations in use of +- these functions. +-* Aligned Memory Blocks:: Allocating specially aligned memory. +-* Malloc Tunable Parameters:: Use `mallopt' to adjust allocation +- parameters. +-* Heap Consistency Checking:: Automatic checking for errors. +-* Hooks for Malloc:: You can use these hooks for debugging +- programs that use `malloc'. +-* Statistics of Malloc:: Getting information about how much +- memory your program is using. +-* Summary of Malloc:: Summary of `malloc' and related functions. +- +-Allocation Debugging +- +-* Tracing malloc:: How to install the tracing functionality. +-* Using the Memory Debugger:: Example programs excerpts. +-* Tips for the Memory Debugger:: Some more or less clever ideas. +-* Interpreting the traces:: What do all these lines mean? +- +-Obstacks +- +-* Creating Obstacks:: How to declare an obstack in your program. +-* Preparing for Obstacks:: Preparations needed before you can +- use obstacks. +-* Allocation in an Obstack:: Allocating objects in an obstack. +-* Freeing Obstack Objects:: Freeing objects in an obstack. +-* Obstack Functions:: The obstack functions are both +- functions and macros. +-* Growing Objects:: Making an object bigger by stages. +-* Extra Fast Growing:: Extra-high-efficiency (though more +- complicated) growing objects. +-* Status of an Obstack:: Inquiries about the status of an obstack. +-* Obstacks Data Alignment:: Controlling alignment of objects in obstacks. +-* Obstack Chunks:: How obstacks obtain and release chunks; +- efficiency considerations. +-* Summary of Obstacks:: +- +-Variable Size Automatic +- +-* Alloca Example:: Example of using `alloca'. +-* Advantages of Alloca:: Reasons to use `alloca'. +-* Disadvantages of Alloca:: Reasons to avoid `alloca'. +-* GNU C Variable-Size Arrays:: Only in GNU C, here is an alternative +- method of allocating dynamically and +- freeing automatically. +- +-Locking Pages +- +-* Why Lock Pages:: Reasons to read this section. +-* Locked Memory Details:: Everything you need to know locked +- memory +-* Page Lock Functions:: Here's how to do it. +- +-Character Handling +- +-* Classification of Characters:: Testing whether characters are +- letters, digits, punctuation, etc. +- +-* Case Conversion:: Case mapping, and the like. +-* Classification of Wide Characters:: Character class determination for +- wide characters. +-* Using Wide Char Classes:: Notes on using the wide character +- classes. +-* Wide Character Case Conversion:: Mapping of wide characters. +- +-String and Array Utilities +- +-* Representation of Strings:: Introduction to basic concepts. +-* String/Array Conventions:: Whether to use a string function or an +- arbitrary array function. +-* String Length:: Determining the length of a string. +-* Copying and Concatenation:: Functions to copy the contents of strings +- and arrays. +-* String/Array Comparison:: Functions for byte-wise and character-wise +- comparison. +-* Collation Functions:: Functions for collating strings. +-* Search Functions:: Searching for a specific element or substring. +-* Finding Tokens in a String:: Splitting a string into tokens by looking +- for delimiters. +-* strfry:: Function for flash-cooking a string. +-* Trivial Encryption:: Obscuring data. +-* Encode Binary Data:: Encoding and Decoding of Binary Data. +-* Argz and Envz Vectors:: Null-separated string vectors. +- +-Argz and Envz Vectors +- +-* Argz Functions:: Operations on argz vectors. +-* Envz Functions:: Additional operations on environment vectors. +- +-Character Set Handling +- +-* Extended Char Intro:: Introduction to Extended Characters. +-* Charset Function Overview:: Overview about Character Handling +- Functions. +-* Restartable multibyte conversion:: Restartable multibyte conversion +- Functions. +-* Non-reentrant Conversion:: Non-reentrant Conversion Function. +-* Generic Charset Conversion:: Generic Charset Conversion. +- +-Restartable multibyte conversion +- +-* Selecting the Conversion:: Selecting the conversion and its properties. +-* Keeping the state:: Representing the state of the conversion. +-* Converting a Character:: Converting Single Characters. +-* Converting Strings:: Converting Multibyte and Wide Character +- Strings. +-* Multibyte Conversion Example:: A Complete Multibyte Conversion Example. +- +-Non-reentrant Conversion +- +-* Non-reentrant Character Conversion:: Non-reentrant Conversion of Single +- Characters. +-* Non-reentrant String Conversion:: Non-reentrant Conversion of Strings. +-* Shift State:: States in Non-reentrant Functions. +- +-Generic Charset Conversion +- +-* Generic Conversion Interface:: Generic Character Set Conversion Interface. +-* iconv Examples:: A complete `iconv' example. +-* Other iconv Implementations:: Some Details about other `iconv' +- Implementations. +-* glibc iconv Implementation:: The `iconv' Implementation in the GNU C +- library. +- +-Locales +- +-* Effects of Locale:: Actions affected by the choice of +- locale. +-* Choosing Locale:: How the user specifies a locale. +-* Locale Categories:: Different purposes for which you can +- select a locale. +-* Setting the Locale:: How a program specifies the locale +- with library functions. +-* Standard Locales:: Locale names available on all systems. +-* Locale Information:: How to access the information for the locale. +-* Formatting Numbers:: A dedicated function to format numbers. +-* Yes-or-No Questions:: Check a Response against the locale. +- +-Locale Information +- +-* The Lame Way to Locale Data:: ISO C's `localeconv'. +-* The Elegant and Fast Way:: X/Open's `nl_langinfo'. +- +-The Lame Way to Locale Data +- +-* General Numeric:: Parameters for formatting numbers and +- currency amounts. +-* Currency Symbol:: How to print the symbol that identifies an +- amount of money (e.g. `$'). +-* Sign of Money Amount:: How to print the (positive or negative) sign +- for a monetary amount, if one exists. +- +-Message Translation +- +-* Message catalogs a la X/Open:: The `catgets' family of functions. +-* The Uniforum approach:: The `gettext' family of functions. +- +-Message catalogs a la X/Open +- +-* The catgets Functions:: The `catgets' function family. +-* The message catalog files:: Format of the message catalog files. +-* The gencat program:: How to generate message catalogs files which +- can be used by the functions. +-* Common Usage:: How to use the `catgets' interface. +- +-The Uniforum approach +- +-* Message catalogs with gettext:: The `gettext' family of functions. +-* Helper programs for gettext:: Programs to handle message catalogs +- for `gettext'. +- +-Message catalogs with gettext +- +-* Translation with gettext:: What has to be done to translate a message. +-* Locating gettext catalog:: How to determine which catalog to be used. +-* Advanced gettext functions:: Additional functions for more complicated +- situations. +-* Charset conversion in gettext:: How to specify the output character set +- `gettext' uses. +-* GUI program problems:: How to use `gettext' in GUI programs. +-* Using gettextized software:: The possibilities of the user to influence +- the way `gettext' works. +- +-Searching and Sorting +- +-* Comparison Functions:: Defining how to compare two objects. +- Since the sort and search facilities +- are general, you have to specify the +- ordering. +-* Array Search Function:: The `bsearch' function. +-* Array Sort Function:: The `qsort' function. +-* Search/Sort Example:: An example program. +-* Hash Search Function:: The `hsearch' function. +-* Tree Search Function:: The `tsearch' function. +- +-Pattern Matching +- +-* Wildcard Matching:: Matching a wildcard pattern against a single string. +-* Globbing:: Finding the files that match a wildcard pattern. +-* Regular Expressions:: Matching regular expressions against strings. +-* Word Expansion:: Expanding shell variables, nested commands, +- arithmetic, and wildcards. +- This is what the shell does with shell commands. +- +-Globbing +- +-* Calling Glob:: Basic use of `glob'. +-* Flags for Globbing:: Flags that enable various options in `glob'. +-* More Flags for Globbing:: GNU specific extensions to `glob'. +- +-Regular Expressions +- +-* POSIX Regexp Compilation:: Using `regcomp' to prepare to match. +-* Flags for POSIX Regexps:: Syntax variations for `regcomp'. +-* Matching POSIX Regexps:: Using `regexec' to match the compiled +- pattern that you get from `regcomp'. +-* Regexp Subexpressions:: Finding which parts of the string were matched. +-* Subexpression Complications:: Find points of which parts were matched. +-* Regexp Cleanup:: Freeing storage; reporting errors. +- +-Word Expansion +- +-* Expansion Stages:: What word expansion does to a string. +-* Calling Wordexp:: How to call `wordexp'. +-* Flags for Wordexp:: Options you can enable in `wordexp'. +-* Wordexp Example:: A sample program that does word expansion. +-* Tilde Expansion:: Details of how tilde expansion works. +-* Variable Substitution:: Different types of variable substitution. +- +-I/O Overview +- +-* I/O Concepts:: Some basic information and terminology. +-* File Names:: How to refer to a file. +- +-I/O Concepts +- +-* Streams and File Descriptors:: The GNU Library provides two ways +- to access the contents of files. +-* File Position:: The number of bytes from the +- beginning of the file. +- +-File Names +- +-* Directories:: Directories contain entries for files. +-* File Name Resolution:: A file name specifies how to look up a file. +-* File Name Errors:: Error conditions relating to file names. +-* File Name Portability:: File name portability and syntax issues. +- +-I/O on Streams +- +-* Streams:: About the data type representing a stream. +-* Standard Streams:: Streams to the standard input and output +- devices are created for you. +-* Opening Streams:: How to create a stream to talk to a file. +-* Closing Streams:: Close a stream when you are finished with it. +-* Streams and Threads:: Issues with streams in threaded programs. +-* Streams and I18N:: Streams in internationalized applications. +-* Simple Output:: Unformatted output by characters and lines. +-* Character Input:: Unformatted input by characters and words. +-* Line Input:: Reading a line or a record from a stream. +-* Unreading:: Peeking ahead/pushing back input just read. +-* Block Input/Output:: Input and output operations on blocks of data. +-* Formatted Output:: `printf' and related functions. +-* Customizing Printf:: You can define new conversion specifiers for +- `printf' and friends. +-* Formatted Input:: `scanf' and related functions. +-* EOF and Errors:: How you can tell if an I/O error happens. +-* Error Recovery:: What you can do about errors. +-* Binary Streams:: Some systems distinguish between text files +- and binary files. +-* File Positioning:: About random-access streams. +-* Portable Positioning:: Random access on peculiar ISO C systems. +-* Stream Buffering:: How to control buffering of streams. +-* Other Kinds of Streams:: Streams that do not necessarily correspond +- to an open file. +-* Formatted Messages:: Print strictly formatted messages. +- +-Unreading +- +-* Unreading Idea:: An explanation of unreading with pictures. +-* How Unread:: How to call `ungetc' to do unreading. +- +-Formatted Output +- +-* Formatted Output Basics:: Some examples to get you started. +-* Output Conversion Syntax:: General syntax of conversion +- specifications. +-* Table of Output Conversions:: Summary of output conversions and +- what they do. +-* Integer Conversions:: Details about formatting of integers. +-* Floating-Point Conversions:: Details about formatting of +- floating-point numbers. +-* Other Output Conversions:: Details about formatting of strings, +- characters, pointers, and the like. +-* Formatted Output Functions:: Descriptions of the actual functions. +-* Dynamic Output:: Functions that allocate memory for the output. +-* Variable Arguments Output:: `vprintf' and friends. +-* Parsing a Template String:: What kinds of args does a given template +- call for? +-* Example of Parsing:: Sample program using `parse_printf_format'. +- +-Customizing Printf +- +-* Registering New Conversions:: Using `register_printf_function' +- to register a new output conversion. +-* Conversion Specifier Options:: The handler must be able to get +- the options specified in the +- template when it is called. +-* Defining the Output Handler:: Defining the handler and arginfo +- functions that are passed as arguments +- to `register_printf_function'. +-* Printf Extension Example:: How to define a `printf' +- handler function. +-* Predefined Printf Handlers:: Predefined `printf' handlers. +- +-Formatted Input +- +-* Formatted Input Basics:: Some basics to get you started. +-* Input Conversion Syntax:: Syntax of conversion specifications. +-* Table of Input Conversions:: Summary of input conversions and what they do. +-* Numeric Input Conversions:: Details of conversions for reading numbers. +-* String Input Conversions:: Details of conversions for reading strings. +-* Dynamic String Input:: String conversions that `malloc' the buffer. +-* Other Input Conversions:: Details of miscellaneous other conversions. +-* Formatted Input Functions:: Descriptions of the actual functions. +-* Variable Arguments Input:: `vscanf' and friends. +- +-Stream Buffering +- +-* Buffering Concepts:: Terminology is defined here. +-* Flushing Buffers:: How to ensure that output buffers are flushed. +-* Controlling Buffering:: How to specify what kind of buffering to use. +- +-Other Kinds of Streams +- +-* String Streams:: Streams that get data from or put data in +- a string or memory buffer. +-* Obstack Streams:: Streams that store data in an obstack. +-* Custom Streams:: Defining your own streams with an arbitrary +- input data source and/or output data sink. +- +-Custom Streams +- +-* Streams and Cookies:: The "cookie" records where to fetch or +- store data that is read or written. +-* Hook Functions:: How you should define the four "hook +- functions" that a custom stream needs. +- +-Formatted Messages +- +-* Printing Formatted Messages:: The `fmtmsg' function. +-* Adding Severity Classes:: Add more severity classes. +-* Example:: How to use `fmtmsg' and `addseverity'. +- +-Low-Level I/O +- +-* Opening and Closing Files:: How to open and close file +- descriptors. +-* I/O Primitives:: Reading and writing data. +-* File Position Primitive:: Setting a descriptor's file +- position. +-* Descriptors and Streams:: Converting descriptor to stream +- or vice-versa. +-* Stream/Descriptor Precautions:: Precautions needed if you use both +- descriptors and streams. +-* Scatter-Gather:: Fast I/O to discontinuous buffers. +-* Memory-mapped I/O:: Using files like memory. +-* Waiting for I/O:: How to check for input or output +- on multiple file descriptors. +-* Synchronizing I/O:: Making sure all I/O actions completed. +-* Asynchronous I/O:: Perform I/O in parallel. +-* Control Operations:: Various other operations on file +- descriptors. +-* Duplicating Descriptors:: Fcntl commands for duplicating +- file descriptors. +-* Descriptor Flags:: Fcntl commands for manipulating +- flags associated with file +- descriptors. +-* File Status Flags:: Fcntl commands for manipulating +- flags associated with open files. +-* File Locks:: Fcntl commands for implementing +- file locking. +-* Interrupt Input:: Getting an asynchronous signal when +- input arrives. +-* IOCTLs:: Generic I/O Control operations. +- +-Stream/Descriptor Precautions +- +-* Linked Channels:: Dealing with channels sharing a file position. +-* Independent Channels:: Dealing with separately opened, unlinked channels. +-* Cleaning Streams:: Cleaning a stream makes it safe to use +- another channel. +- +-Asynchronous I/O +- +-* Asynchronous Reads/Writes:: Asynchronous Read and Write Operations. +-* Status of AIO Operations:: Getting the Status of AIO Operations. +-* Synchronizing AIO Operations:: Getting into a consistent state. +-* Cancel AIO Operations:: Cancellation of AIO Operations. +-* Configuration of AIO:: How to optimize the AIO implementation. +- +-File Status Flags +- +-* Access Modes:: Whether the descriptor can read or write. +-* Open-time Flags:: Details of `open'. +-* Operating Modes:: Special modes to control I/O operations. +-* Getting File Status Flags:: Fetching and changing these flags. +- +-File System Interface +- +-* Working Directory:: This is used to resolve relative +- file names. +-* Accessing Directories:: Finding out what files a directory +- contains. +-* Working with Directory Trees:: Apply actions to all files or a selectable +- subset of a directory hierarchy. +-* Hard Links:: Adding alternate names to a file. +-* Symbolic Links:: A file that ``points to'' a file name. +-* Deleting Files:: How to delete a file, and what that means. +-* Renaming Files:: Changing a file's name. +-* Creating Directories:: A system call just for creating a directory. +-* File Attributes:: Attributes of individual files. +-* Making Special Files:: How to create special files. +-* Temporary Files:: Naming and creating temporary files. +- +-Accessing Directories +- +-* Directory Entries:: Format of one directory entry. +-* Opening a Directory:: How to open a directory stream. +-* Reading/Closing Directory:: How to read directory entries from the stream. +-* Simple Directory Lister:: A very simple directory listing program. +-* Random Access Directory:: Rereading part of the directory +- already read with the same stream. +-* Scanning Directory Content:: Get entries for user selected subset of +- contents in given directory. +-* Simple Directory Lister Mark II:: Revised version of the program. +- +-File Attributes +- +-* Attribute Meanings:: The names of the file attributes, +- and what their values mean. +-* Reading Attributes:: How to read the attributes of a file. +-* Testing File Type:: Distinguishing ordinary files, +- directories, links... +-* File Owner:: How ownership for new files is determined, +- and how to change it. +-* Permission Bits:: How information about a file's access +- mode is stored. +-* Access Permission:: How the system decides who can access a file. +-* Setting Permissions:: How permissions for new files are assigned, +- and how to change them. +-* Testing File Access:: How to find out if your process can +- access a file. +-* File Times:: About the time attributes of a file. +-* File Size:: Manually changing the size of a file. +- +-Pipes and FIFOs +- +-* Creating a Pipe:: Making a pipe with the `pipe' function. +-* Pipe to a Subprocess:: Using a pipe to communicate with a +- child process. +-* FIFO Special Files:: Making a FIFO special file. +-* Pipe Atomicity:: When pipe (or FIFO) I/O is atomic. +- +-Sockets +- +-* Socket Concepts:: Basic concepts you need to know about. +-* Communication Styles::Stream communication, datagrams and other styles. +-* Socket Addresses:: How socket names (``addresses'') work. +-* Interface Naming:: Identifying specific network interfaces. +-* Local Namespace:: Details about the local namespace. +-* Internet Namespace:: Details about the Internet namespace. +-* Misc Namespaces:: Other namespaces not documented fully here. +-* Open/Close Sockets:: Creating sockets and destroying them. +-* Connections:: Operations on sockets with connection state. +-* Datagrams:: Operations on datagram sockets. +-* Inetd:: Inetd is a daemon that starts servers on request. +- The most convenient way to write a server +- is to make it work with Inetd. +-* Socket Options:: Miscellaneous low-level socket options. +-* Networks Database:: Accessing the database of network names. +- +-Socket Addresses +- +-* Address Formats:: About `struct sockaddr'. +-* Setting Address:: Binding an address to a socket. +-* Reading Address:: Reading the address of a socket. +- +-Local Namespace +- +-* Concepts: Local Namespace Concepts. What you need to understand. +-* Details: Local Namespace Details. Address format, symbolic names, etc. +-* Example: Local Socket Example. Example of creating a socket. +- +-Internet Namespace +- +-* Internet Address Formats:: How socket addresses are specified in the +- Internet namespace. +-* Host Addresses:: All about host addresses of Internet host. +-* Protocols Database:: Referring to protocols by name. +-* Ports:: Internet port numbers. +-* Services Database:: Ports may have symbolic names. +-* Byte Order:: Different hosts may use different byte +- ordering conventions; you need to +- canonicalize host address and port number. +-* Inet Example:: Putting it all together. +- +-Host Addresses +- +-* Abstract Host Addresses:: What a host number consists of. +-* Data type: Host Address Data Type. Data type for a host number. +-* Functions: Host Address Functions. Functions to operate on them. +-* Names: Host Names. Translating host names to host numbers. +- +-Open/Close Sockets +- +-* Creating a Socket:: How to open a socket. +-* Closing a Socket:: How to close a socket. +-* Socket Pairs:: These are created like pipes. +- +-Connections +- +-* Connecting:: What the client program must do. +-* Listening:: How a server program waits for requests. +-* Accepting Connections:: What the server does when it gets a request. +-* Who is Connected:: Getting the address of the +- other side of a connection. +-* Transferring Data:: How to send and receive data. +-* Byte Stream Example:: An example program: a client for communicating +- over a byte stream socket in the Internet namespace. +-* Server Example:: A corresponding server program. +-* Out-of-Band Data:: This is an advanced feature. +- +-Transferring Data +- +-* Sending Data:: Sending data with `send'. +-* Receiving Data:: Reading data with `recv'. +-* Socket Data Options:: Using `send' and `recv'. +- +-Datagrams +- +-* Sending Datagrams:: Sending packets on a datagram socket. +-* Receiving Datagrams:: Receiving packets on a datagram socket. +-* Datagram Example:: An example program: packets sent over a +- datagram socket in the local namespace. +-* Example Receiver:: Another program, that receives those packets. +- +-Inetd +- +-* Inetd Servers:: +-* Configuring Inetd:: +- +-Socket Options +- +-* Socket Option Functions:: The basic functions for setting and getting +- socket options. +-* Socket-Level Options:: Details of the options at the socket level. +- +-Low-Level Terminal Interface +- +-* Is It a Terminal:: How to determine if a file is a terminal +- device, and what its name is. +-* I/O Queues:: About flow control and typeahead. +-* Canonical or Not:: Two basic styles of input processing. +-* Terminal Modes:: How to examine and modify flags controlling +- details of terminal I/O: echoing, +- signals, editing. Posix. +-* BSD Terminal Modes:: BSD compatible terminal mode setting +-* Line Control:: Sending break sequences, clearing +- terminal buffers ... +-* Noncanon Example:: How to read single characters without echo. +-* Pseudo-Terminals:: How to open a pseudo-terminal. +- +-Terminal Modes +- +-* Mode Data Types:: The data type `struct termios' and +- related types. +-* Mode Functions:: Functions to read and set the terminal +- attributes. +-* Setting Modes:: The right way to set terminal attributes +- reliably. +-* Input Modes:: Flags controlling low-level input handling. +-* Output Modes:: Flags controlling low-level output handling. +-* Control Modes:: Flags controlling serial port behavior. +-* Local Modes:: Flags controlling high-level input handling. +-* Line Speed:: How to read and set the terminal line speed. +-* Special Characters:: Characters that have special effects, +- and how to change them. +-* Noncanonical Input:: Controlling how long to wait for input. +- +-Special Characters +- +-* Editing Characters:: Special characters that terminate lines and +- delete text, and other editing functions. +-* Signal Characters:: Special characters that send or raise signals +- to or for certain classes of processes. +-* Start/Stop Characters:: Special characters that suspend or resume +- suspended output. +-* Other Special:: Other special characters for BSD systems: +- they can discard output, and print status. +- +-Pseudo-Terminals +- +-* Allocation:: Allocating a pseudo terminal. +-* Pseudo-Terminal Pairs:: How to open both sides of a +- pseudo-terminal in a single operation. +- +-Syslog +- +-* Overview of Syslog:: Overview of a system's Syslog facility +-* Submitting Syslog Messages:: Functions to submit messages to Syslog +- +-Submitting Syslog Messages +- +-* openlog:: Open connection to Syslog +-* syslog; vsyslog:: Submit message to Syslog +-* closelog:: Close connection to Syslog +-* setlogmask:: Cause certain messages to be ignored +-* Syslog Example:: Example of all of the above +- +-Mathematics +- +-* Mathematical Constants:: Precise numeric values for often-used +- constants. +-* Trig Functions:: Sine, cosine, tangent, and friends. +-* Inverse Trig Functions:: Arcsine, arccosine, etc. +-* Exponents and Logarithms:: Also pow and sqrt. +-* Hyperbolic Functions:: sinh, cosh, tanh, etc. +-* Special Functions:: Bessel, gamma, erf. +-* Errors in Math Functions:: Known Maximum Errors in Math Functions. +-* Pseudo-Random Numbers:: Functions for generating pseudo-random +- numbers. +-* FP Function Optimizations:: Fast code or small code. +- +-Pseudo-Random Numbers +- +-* ISO Random:: `rand' and friends. +-* BSD Random:: `random' and friends. +-* SVID Random:: `drand48' and friends. +- +-Arithmetic +- +-* Integers:: Basic integer types and concepts +-* Integer Division:: Integer division with guaranteed rounding. +-* Floating Point Numbers:: Basic concepts. IEEE 754. +-* Floating Point Classes:: The five kinds of floating-point number. +-* Floating Point Errors:: When something goes wrong in a calculation. +-* Rounding:: Controlling how results are rounded. +-* Control Functions:: Saving and restoring the FPU's state. +-* Arithmetic Functions:: Fundamental operations provided by the library. +-* Complex Numbers:: The types. Writing complex constants. +-* Operations on Complex:: Projection, conjugation, decomposition. +-* Parsing of Numbers:: Converting strings to numbers. +-* System V Number Conversion:: An archaic way to convert numbers to strings. +- +-Floating Point Errors +- +-* FP Exceptions:: IEEE 754 math exceptions and how to detect them. +-* Infinity and NaN:: Special values returned by calculations. +-* Status bit operations:: Checking for exceptions after the fact. +-* Math Error Reporting:: How the math functions report errors. +- +-Arithmetic Functions +- +-* Absolute Value:: Absolute values of integers and floats. +-* Normalization Functions:: Extracting exponents and putting them back. +-* Rounding Functions:: Rounding floats to integers. +-* Remainder Functions:: Remainders on division, precisely defined. +-* FP Bit Twiddling:: Sign bit adjustment. Adding epsilon. +-* FP Comparison Functions:: Comparisons without risk of exceptions. +-* Misc FP Arithmetic:: Max, min, positive difference, multiply-add. +- +-Parsing of Numbers +- +-* Parsing of Integers:: Functions for conversion of integer values. +-* Parsing of Floats:: Functions for conversion of floating-point +- values. +- +-Date and Time +- +-* Time Basics:: Concepts and definitions. +-* Elapsed Time:: Data types to represent elapsed times +-* Processor And CPU Time:: Time a program has spent executing. +-* Calendar Time:: Manipulation of ``real'' dates and times. +-* Setting an Alarm:: Sending a signal after a specified time. +-* Sleeping:: Waiting for a period of time. +- +-Processor And CPU Time +- +-* CPU Time:: The `clock' function. +-* Processor Time:: The `times' function. +- +-Calendar Time +- +-* Simple Calendar Time:: Facilities for manipulating calendar time. +-* High-Resolution Calendar:: A time representation with greater precision. +-* Broken-down Time:: Facilities for manipulating local time. +-* High Accuracy Clock:: Maintaining a high accuracy system clock. +-* Formatting Calendar Time:: Converting times to strings. +-* Parsing Date and Time:: Convert textual time and date information back +- into broken-down time values. +-* TZ Variable:: How users specify the time zone. +-* Time Zone Functions:: Functions to examine or specify the time zone. +-* Time Functions Example:: An example program showing use of some of +- the time functions. +- +-Parsing Date and Time +- +-* Low-Level Time String Parsing:: Interpret string according to given format. +-* General Time String Parsing:: User-friendly function to parse data and +- time strings. +- +-Resource Usage And Limitation +- +-* Resource Usage:: Measuring various resources used. +-* Limits on Resources:: Specifying limits on resource usage. +-* Priority:: Reading or setting process run priority. +-* Memory Resources:: Querying memory available resources. +-* Processor Resources:: Learn about the processors available. +- +-Priority +- +-* Absolute Priority:: The first tier of priority. Posix +-* Realtime Scheduling:: Scheduling among the process nobility +-* Basic Scheduling Functions:: Get/set scheduling policy, priority +-* Traditional Scheduling:: Scheduling among the vulgar masses +- +-Traditional Scheduling +- +-* Traditional Scheduling Intro:: +-* Traditional Scheduling Functions:: +- +-Memory Resources +- +-* Memory Subsystem:: Overview about traditional Unix memory handling. +-* Query Memory Parameters:: How to get information about the memory +- subsystem? +- +-Non-Local Exits +- +-* Intro: Non-Local Intro. When and how to use these facilities. +-* Details: Non-Local Details. Functions for non-local exits. +-* Non-Local Exits and Signals:: Portability issues. +-* System V contexts:: Complete context control a la System V. +- +-Signal Handling +- +-* Concepts of Signals:: Introduction to the signal facilities. +-* Standard Signals:: Particular kinds of signals with +- standard names and meanings. +-* Signal Actions:: Specifying what happens when a +- particular signal is delivered. +-* Defining Handlers:: How to write a signal handler function. +-* Interrupted Primitives:: Signal handlers affect use of `open', +- `read', `write' and other functions. +-* Generating Signals:: How to send a signal to a process. +-* Blocking Signals:: Making the system hold signals temporarily. +-* Waiting for a Signal:: Suspending your program until a signal +- arrives. +-* Signal Stack:: Using a Separate Signal Stack. +-* BSD Signal Handling:: Additional functions for backward +- compatibility with BSD. +- +-Concepts of Signals +- +-* Kinds of Signals:: Some examples of what can cause a signal. +-* Signal Generation:: Concepts of why and how signals occur. +-* Delivery of Signal:: Concepts of what a signal does to the +- process. +- +-Standard Signals +- +-* Program Error Signals:: Used to report serious program errors. +-* Termination Signals:: Used to interrupt and/or terminate the +- program. +-* Alarm Signals:: Used to indicate expiration of timers. +-* Asynchronous I/O Signals:: Used to indicate input is available. +-* Job Control Signals:: Signals used to support job control. +-* Operation Error Signals:: Used to report operational system errors. +-* Miscellaneous Signals:: Miscellaneous Signals. +-* Signal Messages:: Printing a message describing a signal. +- +-Signal Actions +- +-* Basic Signal Handling:: The simple `signal' function. +-* Advanced Signal Handling:: The more powerful `sigaction' function. +-* Signal and Sigaction:: How those two functions interact. +-* Sigaction Function Example:: An example of using the sigaction function. +-* Flags for Sigaction:: Specifying options for signal handling. +-* Initial Signal Actions:: How programs inherit signal actions. +- +-Defining Handlers +- +-* Handler Returns:: Handlers that return normally, and what +- this means. +-* Termination in Handler:: How handler functions terminate a program. +-* Longjmp in Handler:: Nonlocal transfer of control out of a +- signal handler. +-* Signals in Handler:: What happens when signals arrive while +- the handler is already occupied. +-* Merged Signals:: When a second signal arrives before the +- first is handled. +-* Nonreentrancy:: Do not call any functions unless you know they +- are reentrant with respect to signals. +-* Atomic Data Access:: A single handler can run in the middle of +- reading or writing a single object. +- +-Atomic Data Access +- +-* Non-atomic Example:: A program illustrating interrupted access. +-* Types: Atomic Types. Data types that guarantee no interruption. +-* Usage: Atomic Usage. Proving that interruption is harmless. +- +-Generating Signals +- +-* Signaling Yourself:: A process can send a signal to itself. +-* Signaling Another Process:: Send a signal to another process. +-* Permission for kill:: Permission for using `kill'. +-* Kill Example:: Using `kill' for Communication. +- +-Blocking Signals +- +-* Why Block:: The purpose of blocking signals. +-* Signal Sets:: How to specify which signals to +- block. +-* Process Signal Mask:: Blocking delivery of signals to your +- process during normal execution. +-* Testing for Delivery:: Blocking to Test for Delivery of +- a Signal. +-* Blocking for Handler:: Blocking additional signals while a +- handler is being run. +-* Checking for Pending Signals:: Checking for Pending Signals +-* Remembering a Signal:: How you can get almost the same +- effect as blocking a signal, by +- handling it and setting a flag +- to be tested later. +- +-Waiting for a Signal +- +-* Using Pause:: The simple way, using `pause'. +-* Pause Problems:: Why the simple way is often not very good. +-* Sigsuspend:: Reliably waiting for a specific signal. +- +-BSD Signal Handling +- +-* BSD Handler:: BSD Function to Establish a Handler. +-* Blocking in BSD:: BSD Functions for Blocking Signals. +- +-Program Basics +- +-* Program Arguments:: Parsing your program's command-line arguments. +-* Environment Variables:: Less direct parameters affecting your program +-* System Calls:: Requesting service from the system +-* Program Termination:: Telling the system you're done; return status +- +-Program Arguments +- +-* Argument Syntax:: By convention, options start with a hyphen. +-* Parsing Program Arguments:: Ways to parse program options and arguments. +- +-Parsing Program Arguments +- +-* Getopt:: Parsing program options using `getopt'. +-* Argp:: Parsing program options using `argp_parse'. +-* Suboptions:: Some programs need more detailed options. +-* Suboptions Example:: This shows how it could be done for `mount'. +- +-Environment Variables +- +-* Environment Access:: How to get and set the values of +- environment variables. +-* Standard Environment:: These environment variables have +- standard interpretations. +- +-Program Termination +- +-* Normal Termination:: If a program calls `exit', a +- process terminates normally. +-* Exit Status:: The `exit status' provides information +- about why the process terminated. +-* Cleanups on Exit:: A process can run its own cleanup +- functions upon normal termination. +-* Aborting a Program:: The `abort' function causes +- abnormal program termination. +-* Termination Internals:: What happens when a process terminates. +- +-Processes +- +-* Running a Command:: The easy way to run another program. +-* Process Creation Concepts:: An overview of the hard way to do it. +-* Process Identification:: How to get the process ID of a process. +-* Creating a Process:: How to fork a child process. +-* Executing a File:: How to make a process execute another program. +-* Process Completion:: How to tell when a child process has completed. +-* Process Completion Status:: How to interpret the status value +- returned from a child process. +-* BSD Wait Functions:: More functions, for backward compatibility. +-* Process Creation Example:: A complete example program. +- +-Job Control +- +-* Concepts of Job Control:: Jobs can be controlled by a shell. +-* Job Control is Optional:: Not all POSIX systems support job control. +-* Controlling Terminal:: How a process gets its controlling terminal. +-* Access to the Terminal:: How processes share the controlling terminal. +-* Orphaned Process Groups:: Jobs left after the user logs out. +-* Implementing a Shell:: What a shell must do to implement job control. +-* Functions for Job Control:: Functions to control process groups. +- +-Implementing a Shell +- +-* Data Structures:: Introduction to the sample shell. +-* Initializing the Shell:: What the shell must do to take +- responsibility for job control. +-* Launching Jobs:: Creating jobs to execute commands. +-* Foreground and Background:: Putting a job in foreground of background. +-* Stopped and Terminated Jobs:: Reporting job status. +-* Continuing Stopped Jobs:: How to continue a stopped job in +- the foreground or background. +-* Missing Pieces:: Other parts of the shell. +- +-Functions for Job Control +- +-* Identifying the Terminal:: Determining the controlling terminal's name. +-* Process Group Functions:: Functions for manipulating process groups. +-* Terminal Access Functions:: Functions for controlling terminal access. +- +-Name Service Switch +- +-* NSS Basics:: What is this NSS good for. +-* NSS Configuration File:: Configuring NSS. +-* NSS Module Internals:: How does it work internally. +-* Extending NSS:: What to do to add services or databases. +- +-NSS Configuration File +- +-* Services in the NSS configuration:: Service names in the NSS configuration. +-* Actions in the NSS configuration:: React appropriately to the lookup result. +-* Notes on NSS Configuration File:: Things to take care about while +- configuring NSS. +- +-NSS Module Internals +- +-* NSS Module Names:: Construction of the interface function of +- the NSS modules. +-* NSS Modules Interface:: Programming interface in the NSS module +- functions. +- +-Extending NSS +- +-* Adding another Service to NSS:: What is to do to add a new service. +-* NSS Module Function Internals:: Guidelines for writing new NSS +- service functions. +- +-Users and Groups +- +-* User and Group IDs:: Each user has a unique numeric ID; +- likewise for groups. +-* Process Persona:: The user IDs and group IDs of a process. +-* Why Change Persona:: Why a program might need to change +- its user and/or group IDs. +-* How Change Persona:: Changing the user and group IDs. +-* Reading Persona:: How to examine the user and group IDs. +- +-* Setting User ID:: Functions for setting the user ID. +-* Setting Groups:: Functions for setting the group IDs. +- +-* Enable/Disable Setuid:: Turning setuid access on and off. +-* Setuid Program Example:: The pertinent parts of one sample program. +-* Tips for Setuid:: How to avoid granting unlimited access. +- +-* Who Logged In:: Getting the name of the user who logged in, +- or of the real user ID of the current process. +- +-* User Accounting Database:: Keeping information about users and various +- actions in databases. +- +-* User Database:: Functions and data structures for +- accessing the user database. +-* Group Database:: Functions and data structures for +- accessing the group database. +-* Database Example:: Example program showing the use of database +- inquiry functions. +-* Netgroup Database:: Functions for accessing the netgroup database. +- +-User Accounting Database +- +-* Manipulating the Database:: Scanning and modifying the user +- accounting database. +-* XPG Functions:: A standardized way for doing the same thing. +-* Logging In and Out:: Functions from BSD that modify the user +- accounting database. +- +-User Database +- +-* User Data Structure:: What each user record contains. +-* Lookup User:: How to look for a particular user. +-* Scanning All Users:: Scanning the list of all users, one by one. +-* Writing a User Entry:: How a program can rewrite a user's record. +- +-Group Database +- +-* Group Data Structure:: What each group record contains. +-* Lookup Group:: How to look for a particular group. +-* Scanning All Groups:: Scanning the list of all groups. +- +-Netgroup Database +- +-* Netgroup Data:: Data in the Netgroup database and where +- it comes from. +-* Lookup Netgroup:: How to look for a particular netgroup. +-* Netgroup Membership:: How to test for netgroup membership. +- +-System Management +- +-* Host Identification:: Determining the name of the machine. +-* Platform Type:: Determining operating system and basic +- machine type +-* Filesystem Handling:: Controlling/querying mounts +-* System Parameters:: Getting and setting various system parameters +- +-Filesystem Handling +- +-* Mount Information:: What is or could be mounted? +-* Mount-Unmount-Remount:: Controlling what is mounted and how +- +-Mount Information +- +-* fstab:: The `fstab' file +-* mtab:: The `mtab' file +-* Other Mount Information:: Other (non-libc) sources of mount information +- +-System Configuration +- +-* General Limits:: Constants and functions that describe +- various process-related limits that have +- one uniform value for any given machine. +-* System Options:: Optional POSIX features. +-* Version Supported:: Version numbers of POSIX.1 and POSIX.2. +-* Sysconf:: Getting specific configuration values +- of general limits and system options. +-* Minimums:: Minimum values for general limits. +- +-* Limits for Files:: Size limitations that pertain to individual files. +- These can vary between file systems +- or even from file to file. +-* Options for Files:: Optional features that some files may support. +-* File Minimums:: Minimum values for file limits. +-* Pathconf:: Getting the limit values for a particular file. +- +-* Utility Limits:: Capacity limits of some POSIX.2 utility programs. +-* Utility Minimums:: Minimum allowable values of those limits. +- +-* String Parameters:: Getting the default search path. +- +-Sysconf +- +-* Sysconf Definition:: Detailed specifications of `sysconf'. +-* Constants for Sysconf:: The list of parameters `sysconf' can read. +-* Examples of Sysconf:: How to use `sysconf' and the parameter +- macros properly together. +- +-Cryptographic Functions +- +-* Legal Problems:: This software can get you locked up, or worse. +-* getpass:: Prompting the user for a password. +-* crypt:: A one-way function for passwords. +-* DES Encryption:: Routines for DES encryption. +- +-Debugging Support +- +-* Backtraces:: Obtaining and printing a back trace of the +- current stack. +- +-POSIX Threads +- +-* Basic Thread Operations:: Creating, terminating, and waiting for threads. +-* Thread Attributes:: Tuning thread scheduling. +-* Cancellation:: Stopping a thread before it's done. +-* Cleanup Handlers:: Deallocating resources when a thread is +- canceled. +-* Mutexes:: One way to synchronize threads. +-* Condition Variables:: Another way. +-* POSIX Semaphores:: And a third way. +-* Thread-Specific Data:: Variables with different values in +- different threads. +-* Threads and Signal Handling:: Why you should avoid mixing the two, and +- how to do it if you must. +-* Threads and Fork:: Interactions between threads and the +- `fork' function. +-* Streams and Fork:: Interactions between stdio streams and +- `fork'. +-* Miscellaneous Thread Functions:: A grab bag of utility routines. +- +-Language Features +- +-* Consistency Checking:: Using `assert' to abort if +- something ``impossible'' happens. +-* Variadic Functions:: Defining functions with varying numbers +- of args. +-* Null Pointer Constant:: The macro `NULL'. +-* Important Data Types:: Data types for object sizes. +-* Data Type Measurements:: Parameters of data type representations. +- +-Variadic Functions +- +-* Why Variadic:: Reasons for making functions take +- variable arguments. +-* How Variadic:: How to define and call variadic functions. +-* Variadic Example:: A complete example. +- +-How Variadic +- +-* Variadic Prototypes:: How to make a prototype for a function +- with variable arguments. +-* Receiving Arguments:: Steps you must follow to access the +- optional argument values. +-* How Many Arguments:: How to decide whether there are more arguments. +-* Calling Variadics:: Things you need to know about calling +- variable arguments functions. +-* Argument Macros:: Detailed specification of the macros +- for accessing variable arguments. +-* Old Varargs:: The pre-ISO way of defining variadic functions. +- +-Data Type Measurements +- +-* Width of Type:: How many bits does an integer type hold? +-* Range of Type:: What are the largest and smallest values +- that an integer type can hold? +-* Floating Type Macros:: Parameters that measure the floating point types. +-* Structure Measurement:: Getting measurements on structure types. +- +-Floating Type Macros +- +-* Floating Point Concepts:: Definitions of terminology. +-* Floating Point Parameters:: Details of specific macros. +-* IEEE Floating Point:: The measurements for one common +- representation. +- +-Installation +- +-* Configuring and compiling:: How to compile and test GNU libc. +-* Running make install:: How to install it once you've got it +- compiled. +-* Tools for Compilation:: You'll need these first. +-* Supported Configurations:: What it runs on, what it doesn't. +-* Linux:: Specific advice for GNU/Linux systems. +-* Reporting Bugs:: So they'll get fixed. +- +-Maintenance +- +-* Source Layout:: How to add new functions or header files +- to the GNU C library. +-* Porting:: How to port the GNU C library to +- a new machine or operating system. +- +-Porting +- +-* Hierarchy Conventions:: The layout of the `sysdeps' hierarchy. +-* Porting to Unix:: Porting the library to an average +- Unix-like system. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-10 glibc-2.3.2-200304020432/manual/libc.info-10 +--- glibc-2.3.2/manual/libc.info-10 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-10 Thu Jan 1 01:00:00 1970 +@@ -1,899 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Multibyte Conversion Example, Prev: Converting Strings, Up: Restartable multibyte conversion +- +-A Complete Multibyte Conversion Example +---------------------------------------- +- +- The example programs given in the last sections are only brief and do +-not contain all the error checking, etc. Presented here is a complete +-and documented example. It features the `mbrtowc' function but it +-should be easy to derive versions using the other functions. +- +- int +- file_mbsrtowcs (int input, int output) +- { +- /* Note the use of `MB_LEN_MAX'. +- `MB_CUR_MAX' cannot portably be used here. */ +- char buffer[BUFSIZ + MB_LEN_MAX]; +- mbstate_t state; +- int filled = 0; +- int eof = 0; +- +- /* Initialize the state. */ +- memset (&state, '\0', sizeof (state)); +- +- while (!eof) +- { +- ssize_t nread; +- ssize_t nwrite; +- char *inp = buffer; +- wchar_t outbuf[BUFSIZ]; +- wchar_t *outp = outbuf; +- +- /* Fill up the buffer from the input file. */ +- nread = read (input, buffer + filled, BUFSIZ); +- if (nread < 0) +- { +- perror ("read"); +- return 0; +- } +- /* If we reach end of file, make a note to read no more. */ +- if (nread == 0) +- eof = 1; +- +- /* `filled' is now the number of bytes in `buffer'. */ +- filled += nread; +- +- /* Convert those bytes to wide characters-as many as we can. */ +- while (1) +- { +- size_t thislen = mbrtowc (outp, inp, filled, &state); +- /* Stop converting at invalid character; +- this can mean we have read just the first part +- of a valid character. */ +- if (thislen == (size_t) -1) +- break; +- /* We want to handle embedded NUL bytes +- but the return value is 0. Correct this. */ +- if (thislen == 0) +- thislen = 1; +- /* Advance past this character. */ +- inp += thislen; +- filled -= thislen; +- ++outp; +- } +- +- /* Write the wide characters we just made. */ +- nwrite = write (output, outbuf, +- (outp - outbuf) * sizeof (wchar_t)); +- if (nwrite < 0) +- { +- perror ("write"); +- return 0; +- } +- +- /* See if we have a _real_ invalid character. */ +- if ((eof && filled > 0) || filled >= MB_CUR_MAX) +- { +- error (0, 0, "invalid multibyte character"); +- return 0; +- } +- +- /* If any characters must be carried forward, +- put them at the beginning of `buffer'. */ +- if (filled > 0) +- memmove (inp, buffer, filled); +- } +- +- return 1; +- } +- +- +-File: libc.info, Node: Non-reentrant Conversion, Next: Generic Charset Conversion, Prev: Restartable multibyte conversion, Up: Character Set Handling +- +-Non-reentrant Conversion Function +-================================= +- +- The functions described in the previous chapter are defined in +-Amendment 1 to ISO C90, but the original ISO C90 standard also +-contained functions for character set conversion. The reason that +-these original functions are not described first is that they are almost +-entirely useless. +- +- The problem is that all the conversion functions described in the +-original ISO C90 use a local state. Using a local state implies that +-multiple conversions at the same time (not only when using threads) +-cannot be done, and that you cannot first convert single characters and +-then strings since you cannot tell the conversion functions which state +-to use. +- +- These original functions are therefore usable only in a very limited +-set of situations. One must complete converting the entire string +-before starting a new one, and each string/text must be converted with +-the same function (there is no problem with the library itself; it is +-guaranteed that no library function changes the state of any of these +-functions). *For the above reasons it is highly requested that the +-functions described in the previous section be used in place of +-non-reentrant conversion functions.* +- +-* Menu: +- +-* Non-reentrant Character Conversion:: Non-reentrant Conversion of Single +- Characters. +-* Non-reentrant String Conversion:: Non-reentrant Conversion of Strings. +-* Shift State:: States in Non-reentrant Functions. +- +- +-File: libc.info, Node: Non-reentrant Character Conversion, Next: Non-reentrant String Conversion, Up: Non-reentrant Conversion +- +-Non-reentrant Conversion of Single Characters +---------------------------------------------- +- +- - Function: int mbtowc (wchar_t *restrict RESULT, const char *restrict +- STRING, size_t SIZE) +- The `mbtowc' ("multibyte to wide character") function when called +- with non-null STRING converts the first multibyte character +- beginning at STRING to its corresponding wide character code. It +- stores the result in `*RESULT'. +- +- `mbtowc' never examines more than SIZE bytes. (The idea is to +- supply for SIZE the number of bytes of data you have in hand.) +- +- `mbtowc' with non-null STRING distinguishes three possibilities: +- the first SIZE bytes at STRING start with valid multibyte +- characters, they start with an invalid byte sequence or just part +- of a character, or STRING points to an empty string (a null +- character). +- +- For a valid multibyte character, `mbtowc' converts it to a wide +- character and stores that in `*RESULT', and returns the number of +- bytes in that character (always at least 1 and never more than +- SIZE). +- +- For an invalid byte sequence, `mbtowc' returns -1. For an empty +- string, it returns 0, also storing `'\0'' in `*RESULT'. +- +- If the multibyte character code uses shift characters, then +- `mbtowc' maintains and updates a shift state as it scans. If you +- call `mbtowc' with a null pointer for STRING, that initializes the +- shift state to its standard initial value. It also returns +- nonzero if the multibyte character code in use actually has a +- shift state. *Note Shift State::. +- +- - Function: int wctomb (char *STRING, wchar_t WCHAR) +- The `wctomb' ("wide character to multibyte") function converts the +- wide character code WCHAR to its corresponding multibyte character +- sequence, and stores the result in bytes starting at STRING. At +- most `MB_CUR_MAX' characters are stored. +- +- `wctomb' with non-null STRING distinguishes three possibilities +- for WCHAR: a valid wide character code (one that can be translated +- to a multibyte character), an invalid code, and `L'\0''. +- +- Given a valid code, `wctomb' converts it to a multibyte character, +- storing the bytes starting at STRING. Then it returns the number +- of bytes in that character (always at least 1 and never more than +- `MB_CUR_MAX'). +- +- If WCHAR is an invalid wide character code, `wctomb' returns -1. +- If WCHAR is `L'\0'', it returns `0', also storing `'\0'' in +- `*STRING'. +- +- If the multibyte character code uses shift characters, then +- `wctomb' maintains and updates a shift state as it scans. If you +- call `wctomb' with a null pointer for STRING, that initializes the +- shift state to its standard initial value. It also returns +- nonzero if the multibyte character code in use actually has a +- shift state. *Note Shift State::. +- +- Calling this function with a WCHAR argument of zero when STRING is +- not null has the side-effect of reinitializing the stored shift +- state _as well as_ storing the multibyte character `'\0'' and +- returning 0. +- +- Similar to `mbrlen' there is also a non-reentrant function that +-computes the length of a multibyte character. It can be defined in +-terms of `mbtowc'. +- +- - Function: int mblen (const char *STRING, size_t SIZE) +- The `mblen' function with a non-null STRING argument returns the +- number of bytes that make up the multibyte character beginning at +- STRING, never examining more than SIZE bytes. (The idea is to +- supply for SIZE the number of bytes of data you have in hand.) +- +- The return value of `mblen' distinguishes three possibilities: the +- first SIZE bytes at STRING start with valid multibyte characters, +- they start with an invalid byte sequence or just part of a +- character, or STRING points to an empty string (a null character). +- +- For a valid multibyte character, `mblen' returns the number of +- bytes in that character (always at least `1' and never more than +- SIZE). For an invalid byte sequence, `mblen' returns -1. For an +- empty string, it returns 0. +- +- If the multibyte character code uses shift characters, then `mblen' +- maintains and updates a shift state as it scans. If you call +- `mblen' with a null pointer for STRING, that initializes the shift +- state to its standard initial value. It also returns a nonzero +- value if the multibyte character code in use actually has a shift +- state. *Note Shift State::. +- +- The function `mblen' is declared in `stdlib.h'. +- +- +-File: libc.info, Node: Non-reentrant String Conversion, Next: Shift State, Prev: Non-reentrant Character Conversion, Up: Non-reentrant Conversion +- +-Non-reentrant Conversion of Strings +------------------------------------ +- +- For convenience the ISO C90 standard also defines functions to +-convert entire strings instead of single characters. These functions +-suffer from the same problems as their reentrant counterparts from +-Amendment 1 to ISO C90; see *Note Converting Strings::. +- +- - Function: size_t mbstowcs (wchar_t *WSTRING, const char *STRING, +- size_t SIZE) +- The `mbstowcs' ("multibyte string to wide character string") +- function converts the null-terminated string of multibyte +- characters STRING to an array of wide character codes, storing not +- more than SIZE wide characters into the array beginning at WSTRING. +- The terminating null character counts towards the size, so if SIZE +- is less than the actual number of wide characters resulting from +- STRING, no terminating null character is stored. +- +- The conversion of characters from STRING begins in the initial +- shift state. +- +- If an invalid multibyte character sequence is found, the `mbstowcs' +- function returns a value of -1. Otherwise, it returns the number +- of wide characters stored in the array WSTRING. This number does +- not include the terminating null character, which is present if the +- number is less than SIZE. +- +- Here is an example showing how to convert a string of multibyte +- characters, allocating enough space for the result. +- +- wchar_t * +- mbstowcs_alloc (const char *string) +- { +- size_t size = strlen (string) + 1; +- wchar_t *buf = xmalloc (size * sizeof (wchar_t)); +- +- size = mbstowcs (buf, string, size); +- if (size == (size_t) -1) +- return NULL; +- buf = xrealloc (buf, (size + 1) * sizeof (wchar_t)); +- return buf; +- } +- +- +- - Function: size_t wcstombs (char *STRING, const wchar_t *WSTRING, +- size_t SIZE) +- The `wcstombs' ("wide character string to multibyte string") +- function converts the null-terminated wide character array WSTRING +- into a string containing multibyte characters, storing not more +- than SIZE bytes starting at STRING, followed by a terminating null +- character if there is room. The conversion of characters begins in +- the initial shift state. +- +- The terminating null character counts towards the size, so if SIZE +- is less than or equal to the number of bytes needed in WSTRING, no +- terminating null character is stored. +- +- If a code that does not correspond to a valid multibyte character +- is found, the `wcstombs' function returns a value of -1. +- Otherwise, the return value is the number of bytes stored in the +- array STRING. This number does not include the terminating null +- character, which is present if the number is less than SIZE. +- +- +-File: libc.info, Node: Shift State, Prev: Non-reentrant String Conversion, Up: Non-reentrant Conversion +- +-States in Non-reentrant Functions +---------------------------------- +- +- In some multibyte character codes, the _meaning_ of any particular +-byte sequence is not fixed; it depends on what other sequences have come +-earlier in the same string. Typically there are just a few sequences +-that can change the meaning of other sequences; these few are called +-"shift sequences" and we say that they set the "shift state" for other +-sequences that follow. +- +- To illustrate shift state and shift sequences, suppose we decide that +-the sequence `0200' (just one byte) enters Japanese mode, in which +-pairs of bytes in the range from `0240' to `0377' are single +-characters, while `0201' enters Latin-1 mode, in which single bytes in +-the range from `0240' to `0377' are characters, and interpreted +-according to the ISO Latin-1 character set. This is a multibyte code +-that has two alternative shift states ("Japanese mode" and "Latin-1 +-mode"), and two shift sequences that specify particular shift states. +- +- When the multibyte character code in use has shift states, then +-`mblen', `mbtowc', and `wctomb' must maintain and update the current +-shift state as they scan the string. To make this work properly, you +-must follow these rules: +- +- * Before starting to scan a string, call the function with a null +- pointer for the multibyte character address--for example, `mblen +- (NULL, 0)'. This initializes the shift state to its standard +- initial value. +- +- * Scan the string one character at a time, in order. Do not "back +- up" and rescan characters already scanned, and do not intersperse +- the processing of different strings. +- +- Here is an example of using `mblen' following these rules: +- +- void +- scan_string (char *s) +- { +- int length = strlen (s); +- +- /* Initialize shift state. */ +- mblen (NULL, 0); +- +- while (1) +- { +- int thischar = mblen (s, length); +- /* Deal with end of string and invalid characters. */ +- if (thischar == 0) +- break; +- if (thischar == -1) +- { +- error ("invalid multibyte character"); +- break; +- } +- /* Advance past this character. */ +- s += thischar; +- length -= thischar; +- } +- } +- +- The functions `mblen', `mbtowc' and `wctomb' are not reentrant when +-using a multibyte code that uses a shift state. However, no other +-library functions call these functions, so you don't have to worry that +-the shift state will be changed mysteriously. +- +- +-File: libc.info, Node: Generic Charset Conversion, Prev: Non-reentrant Conversion, Up: Character Set Handling +- +-Generic Charset Conversion +-========================== +- +- The conversion functions mentioned so far in this chapter all had in +-common that they operate on character sets that are not directly +-specified by the functions. The multibyte encoding used is specified by +-the currently selected locale for the `LC_CTYPE' category. The wide +-character set is fixed by the implementation (in the case of GNU C +-library it is always UCS-4 encoded ISO 10646. +- +- This has of course several problems when it comes to general +-character conversion: +- +- * For every conversion where neither the source nor the destination +- character set is the character set of the locale for the `LC_CTYPE' +- category, one has to change the `LC_CTYPE' locale using +- `setlocale'. +- +- Changing the `LC_TYPE' locale introduces major problems for the +- rest of the programs since several more functions (e.g., the +- character classification functions, *note Classification of +- Characters::) use the `LC_CTYPE' category. +- +- * Parallel conversions to and from different character sets are not +- possible since the `LC_CTYPE' selection is global and shared by all +- threads. +- +- * If neither the source nor the destination character set is the +- character set used for `wchar_t' representation, there is at least +- a two-step process necessary to convert a text using the functions +- above. One would have to select the source character set as the +- multibyte encoding, convert the text into a `wchar_t' text, select +- the destination character set as the multibyte encoding, and +- convert the wide character text to the multibyte (= destination) +- character set. +- +- Even if this is possible (which is not guaranteed) it is a very +- tiring work. Plus it suffers from the other two raised points +- even more due to the steady changing of the locale. +- +- The XPG2 standard defines a completely new set of functions, which +-has none of these limitations. They are not at all coupled to the +-selected locales, and they have no constraints on the character sets +-selected for source and destination. Only the set of available +-conversions limits them. The standard does not specify that any +-conversion at all must be available. Such availability is a measure of +-the quality of the implementation. +- +- In the following text first the interface to `iconv' and then the +-conversion function, will be described. Comparisons with other +-implementations will show what obstacles stand in the way of portable +-applications. Finally, the implementation is described in so far as +-might interest the advanced user who wants to extend conversion +-capabilities. +- +-* Menu: +- +-* Generic Conversion Interface:: Generic Character Set Conversion Interface. +-* iconv Examples:: A complete `iconv' example. +-* Other iconv Implementations:: Some Details about other `iconv' +- Implementations. +-* glibc iconv Implementation:: The `iconv' Implementation in the GNU C +- library. +- +- +-File: libc.info, Node: Generic Conversion Interface, Next: iconv Examples, Up: Generic Charset Conversion +- +-Generic Character Set Conversion Interface +------------------------------------------- +- +- This set of functions follows the traditional cycle of using a +-resource: open-use-close. The interface consists of three functions, +-each of which implements one step. +- +- Before the interfaces are described it is necessary to introduce a +-data type. Just like other open-use-close interfaces the functions +-introduced here work using handles and the `iconv.h' header defines a +-special type for the handles used. +- +- - Data Type: iconv_t +- This data type is an abstract type defined in `iconv.h'. The user +- must not assume anything about the definition of this type; it +- must be completely opaque. +- +- Objects of this type can get assigned handles for the conversions +- using the `iconv' functions. The objects themselves need not be +- freed, but the conversions for which the handles stand for have to. +- +-The first step is the function to create a handle. +- +- - Function: iconv_t iconv_open (const char *TOCODE, const char +- *FROMCODE) +- The `iconv_open' function has to be used before starting a +- conversion. The two parameters this function takes determine the +- source and destination character set for the conversion, and if the +- implementation has the possibility to perform such a conversion, +- the function returns a handle. +- +- If the wanted conversion is not available, the `iconv_open' +- function returns `(iconv_t) -1'. In this case the global variable +- `errno' can have the following values: +- +- `EMFILE' +- The process already has `OPEN_MAX' file descriptors open. +- +- `ENFILE' +- The system limit of open file is reached. +- +- `ENOMEM' +- Not enough memory to carry out the operation. +- +- `EINVAL' +- The conversion from FROMCODE to TOCODE is not supported. +- +- It is not possible to use the same descriptor in different threads +- to perform independent conversions. The data structures associated +- with the descriptor include information about the conversion state. +- This must not be messed up by using it in different conversions. +- +- An `iconv' descriptor is like a file descriptor as for every use a +- new descriptor must be created. The descriptor does not stand for +- all of the conversions from FROMSET to TOSET. +- +- The GNU C library implementation of `iconv_open' has one +- significant extension to other implementations. To ease the +- extension of the set of available conversions, the implementation +- allows storing the necessary files with data and code in an +- arbitrary number of directories. How this extension must be +- written will be explained below (*note glibc iconv +- Implementation::). Here it is only important to say that all +- directories mentioned in the `GCONV_PATH' environment variable are +- considered only if they contain a file `gconv-modules'. These +- directories need not necessarily be created by the system +- administrator. In fact, this extension is introduced to help users +- writing and using their own, new conversions. Of course, this +- does not work for security reasons in SUID binaries; in this case +- only the system directory is considered and this normally is +- `PREFIX/lib/gconv'. The `GCONV_PATH' environment variable is +- examined exactly once at the first call of the `iconv_open' +- function. Later modifications of the variable have no effect. +- +- The `iconv_open' function was introduced early in the X/Open +- Portability Guide, version 2. It is supported by all commercial +- Unices as it is required for the Unix branding. However, the +- quality and completeness of the implementation varies widely. The +- `iconv_open' function is declared in `iconv.h'. +- +- The `iconv' implementation can associate large data structure with +-the handle returned by `iconv_open'. Therefore, it is crucial to free +-all the resources once all conversions are carried out and the +-conversion is not needed anymore. +- +- - Function: int iconv_close (iconv_t CD) +- The `iconv_close' function frees all resources associated with the +- handle CD, which must have been returned by a successful call to +- the `iconv_open' function. +- +- If the function call was successful the return value is 0. +- Otherwise it is -1 and `errno' is set appropriately. Defined +- error are: +- +- `EBADF' +- The conversion descriptor is invalid. +- +- The `iconv_close' function was introduced together with the rest +- of the `iconv' functions in XPG2 and is declared in `iconv.h'. +- +- The standard defines only one actual conversion function. This has, +-therefore, the most general interface: it allows conversion from one +-buffer to another. Conversion from a file to a buffer, vice versa, or +-even file to file can be implemented on top of it. +- +- - Function: size_t iconv (iconv_t CD, char **INBUF, size_t +- *INBYTESLEFT, char **OUTBUF, size_t *OUTBYTESLEFT) +- The `iconv' function converts the text in the input buffer +- according to the rules associated with the descriptor CD and +- stores the result in the output buffer. It is possible to call the +- function for the same text several times in a row since for +- stateful character sets the necessary state information is kept in +- the data structures associated with the descriptor. +- +- The input buffer is specified by `*INBUF' and it contains +- `*INBYTESLEFT' bytes. The extra indirection is necessary for +- communicating the used input back to the caller (see below). It is +- important to note that the buffer pointer is of type `char' and the +- length is measured in bytes even if the input text is encoded in +- wide characters. +- +- The output buffer is specified in a similar way. `*OUTBUF' points +- to the beginning of the buffer with at least `*OUTBYTESLEFT' bytes +- room for the result. The buffer pointer again is of type `char' +- and the length is measured in bytes. If OUTBUF or `*OUTBUF' is a +- null pointer, the conversion is performed but no output is +- available. +- +- If INBUF is a null pointer, the `iconv' function performs the +- necessary action to put the state of the conversion into the +- initial state. This is obviously a no-op for non-stateful +- encodings, but if the encoding has a state, such a function call +- might put some byte sequences in the output buffer, which perform +- the necessary state changes. The next call with INBUF not being a +- null pointer then simply goes on from the initial state. It is +- important that the programmer never makes any assumption as to +- whether the conversion has to deal with states. Even if the input +- and output character sets are not stateful, the implementation +- might still have to keep states. This is due to the +- implementation chosen for the GNU C library as it is described +- below. Therefore an `iconv' call to reset the state should always +- be performed if some protocol requires this for the output text. +- +- The conversion stops for one of three reasons. The first is that +- all characters from the input buffer are converted. This actually +- can mean two things: either all bytes from the input buffer are +- consumed or there are some bytes at the end of the buffer that +- possibly can form a complete character but the input is +- incomplete. The second reason for a stop is that the output +- buffer is full. And the third reason is that the input contains +- invalid characters. +- +- In all of these cases the buffer pointers after the last successful +- conversion, for input and output buffer, are stored in INBUF and +- OUTBUF, and the available room in each buffer is stored in +- INBYTESLEFT and OUTBYTESLEFT. +- +- Since the character sets selected in the `iconv_open' call can be +- almost arbitrary, there can be situations where the input buffer +- contains valid characters, which have no identical representation +- in the output character set. The behavior in this situation is +- undefined. The _current_ behavior of the GNU C library in this +- situation is to return with an error immediately. This certainly +- is not the most desirable solution; therefore, future versions +- will provide better ones, but they are not yet finished. +- +- If all input from the input buffer is successfully converted and +- stored in the output buffer, the function returns the number of +- non-reversible conversions performed. In all other cases the +- return value is `(size_t) -1' and `errno' is set appropriately. +- In such cases the value pointed to by INBYTESLEFT is nonzero. +- +- `EILSEQ' +- The conversion stopped because of an invalid byte sequence in +- the input. After the call, `*INBUF' points at the first byte +- of the invalid byte sequence. +- +- `E2BIG' +- The conversion stopped because it ran out of space in the +- output buffer. +- +- `EINVAL' +- The conversion stopped because of an incomplete byte sequence +- at the end of the input buffer. +- +- `EBADF' +- The CD argument is invalid. +- +- The `iconv' function was introduced in the XPG2 standard and is +- declared in the `iconv.h' header. +- +- The definition of the `iconv' function is quite good overall. It +-provides quite flexible functionality. The only problems lie in the +-boundary cases, which are incomplete byte sequences at the end of the +-input buffer and invalid input. A third problem, which is not really a +-design problem, is the way conversions are selected. The standard does +-not say anything about the legitimate names, a minimal set of available +-conversions. We will see how this negatively impacts other +-implementations, as demonstrated below. +- +- +-File: libc.info, Node: iconv Examples, Next: Other iconv Implementations, Prev: Generic Conversion Interface, Up: Generic Charset Conversion +- +-A complete `iconv' example +--------------------------- +- +- The example below features a solution for a common problem. Given +-that one knows the internal encoding used by the system for `wchar_t' +-strings, one often is in the position to read text from a file and store +-it in wide character buffers. One can do this using `mbsrtowcs', but +-then we run into the problems discussed above. +- +- int +- file2wcs (int fd, const char *charset, wchar_t *outbuf, size_t avail) +- { +- char inbuf[BUFSIZ]; +- size_t insize = 0; +- char *wrptr = (char *) outbuf; +- int result = 0; +- iconv_t cd; +- +- cd = iconv_open ("WCHAR_T", charset); +- if (cd == (iconv_t) -1) +- { +- /* Something went wrong. */ +- if (errno == EINVAL) +- error (0, 0, "conversion from '%s' to wchar_t not available", +- charset); +- else +- perror ("iconv_open"); +- +- /* Terminate the output string. */ +- *outbuf = L'\0'; +- +- return -1; +- } +- +- while (avail > 0) +- { +- size_t nread; +- size_t nconv; +- char *inptr = inbuf; +- +- /* Read more input. */ +- nread = read (fd, inbuf + insize, sizeof (inbuf) - insize); +- if (nread == 0) +- { +- /* When we come here the file is completely read. +- This still could mean there are some unused +- characters in the `inbuf'. Put them back. */ +- if (lseek (fd, -insize, SEEK_CUR) == -1) +- result = -1; +- +- /* Now write out the byte sequence to get into the +- initial state if this is necessary. */ +- iconv (cd, NULL, NULL, &wrptr, &avail); +- +- break; +- } +- insize += nread; +- +- /* Do the conversion. */ +- nconv = iconv (cd, &inptr, &insize, &wrptr, &avail); +- if (nconv == (size_t) -1) +- { +- /* Not everything went right. It might only be +- an unfinished byte sequence at the end of the +- buffer. Or it is a real problem. */ +- if (errno == EINVAL) +- /* This is harmless. Simply move the unused +- bytes to the beginning of the buffer so that +- they can be used in the next round. */ +- memmove (inbuf, inptr, insize); +- else +- { +- /* It is a real problem. Maybe we ran out of +- space in the output buffer or we have invalid +- input. In any case back the file pointer to +- the position of the last processed byte. */ +- lseek (fd, -insize, SEEK_CUR); +- result = -1; +- break; +- } +- } +- } +- +- /* Terminate the output string. */ +- if (avail >= sizeof (wchar_t)) +- *((wchar_t *) wrptr) = L'\0'; +- +- if (iconv_close (cd) != 0) +- perror ("iconv_close"); +- +- return (wchar_t *) wrptr - outbuf; +- } +- +- This example shows the most important aspects of using the `iconv' +-functions. It shows how successive calls to `iconv' can be used to +-convert large amounts of text. The user does not have to care about +-stateful encodings as the functions take care of everything. +- +- An interesting point is the case where `iconv' returns an error and +-`errno' is set to `EINVAL'. This is not really an error in the +-transformation. It can happen whenever the input character set contains +-byte sequences of more than one byte for some character and texts are +-not processed in one piece. In this case there is a chance that a +-multibyte sequence is cut. The caller can then simply read the +-remainder of the takes and feed the offending bytes together with new +-character from the input to `iconv' and continue the work. The +-internal state kept in the descriptor is _not_ unspecified after such +-an event as is the case with the conversion functions from the ISO C +-standard. +- +- The example also shows the problem of using wide character strings +-with `iconv'. As explained in the description of the `iconv' function +-above, the function always takes a pointer to a `char' array and the +-available space is measured in bytes. In the example, the output +-buffer is a wide character buffer; therefore, we use a local variable +-WRPTR of type `char *', which is used in the `iconv' calls. +- +- This looks rather innocent but can lead to problems on platforms that +-have tight restriction on alignment. Therefore the caller of `iconv' +-has to make sure that the pointers passed are suitable for access of +-characters from the appropriate character set. Since, in the above +-case, the input parameter to the function is a `wchar_t' pointer, this +-is the case (unless the user violates alignment when computing the +-parameter). But in other situations, especially when writing generic +-functions where one does not know what type of character set one uses +-and, therefore, treats text as a sequence of bytes, it might become +-tricky. +- +- +-File: libc.info, Node: Other iconv Implementations, Next: glibc iconv Implementation, Prev: iconv Examples, Up: Generic Charset Conversion +- +-Some Details about other `iconv' Implementations +------------------------------------------------- +- +- This is not really the place to discuss the `iconv' implementation +-of other systems but it is necessary to know a bit about them to write +-portable programs. The above mentioned problems with the specification +-of the `iconv' functions can lead to portability issues. +- +- The first thing to notice is that, due to the large number of +-character sets in use, it is certainly not practical to encode the +-conversions directly in the C library. Therefore, the conversion +-information must come from files outside the C library. This is +-usually done in one or both of the following ways: +- +- * The C library contains a set of generic conversion functions that +- can read the needed conversion tables and other information from +- data files. These files get loaded when necessary. +- +- This solution is problematic as it requires a great deal of effort +- to apply to all character sets (potentially an infinite set). The +- differences in the structure of the different character sets is so +- large that many different variants of the table-processing +- functions must be developed. In addition, the generic nature of +- these functions make them slower than specifically implemented +- functions. +- +- * The C library only contains a framework that can dynamically load +- object files and execute the conversion functions contained +- therein. +- +- This solution provides much more flexibility. The C library itself +- contains only very little code and therefore reduces the general +- memory footprint. Also, with a documented interface between the C +- library and the loadable modules it is possible for third parties +- to extend the set of available conversion modules. A drawback of +- this solution is that dynamic loading must be available. +- +- Some implementations in commercial Unices implement a mixture of +-these possibilities; the majority implement only the second solution. +-Using loadable modules moves the code out of the library itself and +-keeps the door open for extensions and improvements, but this design is +-also limiting on some platforms since not many platforms support dynamic +-loading in statically linked programs. On platforms without this +-capability it is therefore not possible to use this interface in +-statically linked programs. The GNU C library has, on ELF platforms, no +-problems with dynamic loading in these situations; therefore, this +-point is moot. The danger is that one gets acquainted with this +-situation and forgets about the restrictions on other systems. +- +- A second thing to know about other `iconv' implementations is that +-the number of available conversions is often very limited. Some +-implementations provide, in the standard release (not special +-international or developer releases), at most 100 to 200 conversion +-possibilities. This does not mean 200 different character sets are +-supported; for example, conversions from one character set to a set of +-10 others might count as 10 conversions. Together with the other +-direction this makes 20 conversion possibilities used up by one +-character set. One can imagine the thin coverage these platform +-provide. Some Unix vendors even provide only a handful of conversions, +-which renders them useless for almost all uses. +- +- This directly leads to a third and probably the most problematic +-point. The way the `iconv' conversion functions are implemented on all +-known Unix systems and the availability of the conversion functions from +-character set A to B and the conversion from B to C does _not_ imply +-that the conversion from A to C is available. +- +- This might not seem unreasonable and problematic at first, but it is +-a quite big problem as one will notice shortly after hitting it. To +-show the problem we assume to write a program that has to convert from +-A to C. A call like +- +- cd = iconv_open ("C", "A"); +- +-fails according to the assumption above. But what does the program do +-now? The conversion is necessary; therefore, simply giving up is not +-an option. +- +- This is a nuisance. The `iconv' function should take care of this. +-But how should the program proceed from here on? If it tries to convert +-to character set B, first the two `iconv_open' calls +- +- cd1 = iconv_open ("B", "A"); +- +-and +- +- cd2 = iconv_open ("C", "B"); +- +-will succeed, but how to find B? +- +- Unfortunately, the answer is: there is no general solution. On some +-systems guessing might help. On those systems most character sets can +-convert to and from UTF-8 encoded ISO 10646 or Unicode text. Beside +-this only some very system-specific methods can help. Since the +-conversion functions come from loadable modules and these modules must +-be stored somewhere in the filesystem, one _could_ try to find them and +-determine from the available file which conversions are available and +-whether there is an indirect route from A to C. +- +- This example shows one of the design errors of `iconv' mentioned +-above. It should at least be possible to determine the list of +-available conversion programmatically so that if `iconv_open' says +-there is no such conversion, one could make sure this also is true for +-indirect routes. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-11 glibc-2.3.2-200304020432/manual/libc.info-11 +--- glibc-2.3.2/manual/libc.info-11 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-11 Thu Jan 1 01:00:00 1970 +@@ -1,1041 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: glibc iconv Implementation, Prev: Other iconv Implementations, Up: Generic Charset Conversion +- +-The `iconv' Implementation in the GNU C library +------------------------------------------------ +- +- After reading about the problems of `iconv' implementations in the +-last section it is certainly good to note that the implementation in +-the GNU C library has none of the problems mentioned above. What +-follows is a step-by-step analysis of the points raised above. The +-evaluation is based on the current state of the development (as of +-January 1999). The development of the `iconv' functions is not +-complete, but basic functionality has solidified. +- +- The GNU C library's `iconv' implementation uses shared loadable +-modules to implement the conversions. A very small number of +-conversions are built into the library itself but these are only rather +-trivial conversions. +- +- All the benefits of loadable modules are available in the GNU C +-library implementation. This is especially appealing since the +-interface is well documented (see below), and it, therefore, is easy to +-write new conversion modules. The drawback of using loadable objects +-is not a problem in the GNU C library, at least on ELF systems. Since +-the library is able to load shared objects even in statically linked +-binaries, static linking need not be forbidden in case one wants to use +-`iconv'. +- +- The second mentioned problem is the number of supported conversions. +-Currently, the GNU C library supports more than 150 character sets. The +-way the implementation is designed the number of supported conversions +-is greater than 22350 (150 times 149). If any conversion from or to a +-character set is missing, it can be added easily. +- +- Particularly impressive as it may be, this high number is due to the +-fact that the GNU C library implementation of `iconv' does not have the +-third problem mentioned above (i.e., whenever there is a conversion +-from a character set A to B and from B to C it is always possible to +-convert from A to C directly). If the `iconv_open' returns an error +-and sets `errno' to `EINVAL', there is no known way, directly or +-indirectly, to perform the wanted conversion. +- +- Triangulation is achieved by providing for each character set a +-conversion from and to UCS-4 encoded ISO 10646. Using ISO 10646 as an +-intermediate representation it is possible to "triangulate" (i.e., +-convert with an intermediate representation). +- +- There is no inherent requirement to provide a conversion to +-ISO 10646 for a new character set, and it is also possible to provide +-other conversions where neither source nor destination character set is +-ISO 10646. The existing set of conversions is simply meant to cover all +-conversions that might be of interest. +- +- All currently available conversions use the triangulation method +-above, making conversion run unnecessarily slow. If, for example, +-somebody often needs the conversion from ISO-2022-JP to EUC-JP, a +-quicker solution would involve direct conversion between the two +-character sets, skipping the input to ISO 10646 first. The two +-character sets of interest are much more similar to each other than to +-ISO 10646. +- +- In such a situation one easily can write a new conversion and +-provide it as a better alternative. The GNU C library `iconv' +-implementation would automatically use the module implementing the +-conversion if it is specified to be more efficient. +- +-Format of `gconv-modules' files +-............................... +- +- All information about the available conversions comes from a file +-named `gconv-modules', which can be found in any of the directories +-along the `GCONV_PATH'. The `gconv-modules' files are line-oriented +-text files, where each of the lines has one of the following formats: +- +- * If the first non-whitespace character is a `#' the line contains +- only comments and is ignored. +- +- * Lines starting with `alias' define an alias name for a character +- set. Two more words are expected on the line. The first word +- defines the alias name, and the second defines the original name +- of the character set. The effect is that it is possible to use +- the alias name in the FROMSET or TOSET parameters of `iconv_open' +- and achieve the same result as when using the real character set +- name. +- +- This is quite important as a character set has often many different +- names. There is normally an official name but this need not +- correspond to the most popular name. Beside this many character +- sets have special names that are somehow constructed. For +- example, all character sets specified by the ISO have an alias of +- the form `ISO-IR-NNN' where NNN is the registration number. This +- allows programs that know about the registration number to +- construct character set names and use them in `iconv_open' calls. +- More on the available names and aliases follows below. +- +- * Lines starting with `module' introduce an available conversion +- module. These lines must contain three or four more words. +- +- The first word specifies the source character set, the second word +- the destination character set of conversion implemented in this +- module, and the third word is the name of the loadable module. +- The filename is constructed by appending the usual shared object +- suffix (normally `.so') and this file is then supposed to be found +- in the same directory the `gconv-modules' file is in. The last +- word on the line, which is optional, is a numeric value +- representing the cost of the conversion. If this word is missing, +- a cost of 1 is assumed. The numeric value itself does not matter +- that much; what counts are the relative values of the sums of +- costs for all possible conversion paths. Below is a more precise +- description of the use of the cost value. +- +- Returning to the example above where one has written a module to +-directly convert from ISO-2022-JP to EUC-JP and back. All that has to +-be done is to put the new module, let its name be ISO2022JP-EUCJP.so, +-in a directory and add a file `gconv-modules' with the following +-content in the same directory: +- +- module ISO-2022-JP// EUC-JP// ISO2022JP-EUCJP 1 +- module EUC-JP// ISO-2022-JP// ISO2022JP-EUCJP 1 +- +- To see why this is sufficient, it is necessary to understand how the +-conversion used by `iconv' (and described in the descriptor) is +-selected. The approach to this problem is quite simple. +- +- At the first call of the `iconv_open' function the program reads all +-available `gconv-modules' files and builds up two tables: one +-containing all the known aliases and another that contains the +-information about the conversions and which shared object implements +-them. +- +-Finding the conversion path in `iconv' +-...................................... +- +- The set of available conversions form a directed graph with weighted +-edges. The weights on the edges are the costs specified in the +-`gconv-modules' files. The `iconv_open' function uses an algorithm +-suitable for search for the best path in such a graph and so constructs +-a list of conversions that must be performed in succession to get the +-transformation from the source to the destination character set. +- +- Explaining why the above `gconv-modules' files allows the `iconv' +-implementation to resolve the specific ISO-2022-JP to EUC-JP conversion +-module instead of the conversion coming with the library itself is +-straightforward. Since the latter conversion takes two steps (from +-ISO-2022-JP to ISO 10646 and then from ISO 10646 to EUC-JP), the cost +-is 1+1 = 2. The above `gconv-modules' file, however, specifies that +-the new conversion modules can perform this conversion with only the +-cost of 1. +- +- A mysterious item about the `gconv-modules' file above (and also the +-file coming with the GNU C library) are the names of the character sets +-specified in the `module' lines. Why do almost all the names end in +-`//'? And this is not all: the names can actually be regular +-expressions. At this point in time this mystery should not be +-revealed, unless you have the relevant spell-casting materials: ashes +-from an original DOS 6.2 boot disk burnt in effigy, a crucifix blessed +-by St. Emacs, assorted herbal roots from Central America, sand from +-Cebu, etc. Sorry! *The part of the implementation where this is used +-is not yet finished. For now please simply follow the existing +-examples. It'll become clearer once it is. -drepper* +- +- A last remark about the `gconv-modules' is about the names not +-ending with `//'. A character set named `INTERNAL' is often mentioned. +-From the discussion above and the chosen name it should have become +-clear that this is the name for the representation used in the +-intermediate step of the triangulation. We have said that this is UCS-4 +-but actually that is not quite right. The UCS-4 specification also +-includes the specification of the byte ordering used. Since a UCS-4 +-value consists of four bytes, a stored value is effected by byte +-ordering. The internal representation is _not_ the same as UCS-4 in +-case the byte 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 endianess, the internal +-representation consistently is named `INTERNAL' even on big-endian +-systems where the representations are identical. +- +-`iconv' module data structures +-.............................. +- +- So far this section has described how modules are located and +-considered to be used. What remains to be described is the interface +-of the modules so that one can write new ones. This section describes +-the interface as it is in use in January 1999. The interface will +-change a bit in the future but, with luck, only in an upwardly +-compatible way. +- +- The definitions necessary to write new modules are publicly available +-in the non-standard header `gconv.h'. The following text, therefore, +-describes the definitions from this header file. First, however, it is +-necessary to get an overview. +- +- From the perspective of the user of `iconv' the interface is quite +-simple: the `iconv_open' function returns a handle that can be used in +-calls to `iconv', and finally the handle is freed with a call to +-`iconv_close'. The problem is that the handle has to be able to +-represent the possibly long sequences of conversion steps and also the +-state of each conversion since the handle is all that is passed to the +-`iconv' function. Therefore, the data structures are really the +-elements necessary to understanding the implementation. +- +- We need two different kinds of data structures. The first describes +-the conversion and the second describes the state etc. There are +-really two type definitions like this in `gconv.h'. +- +- - Data type: struct __gconv_step +- This data structure describes one conversion a module can perform. +- For each function in a loaded module with conversion functions +- there is exactly one object of this type. This object is shared +- by all users of the conversion (i.e., this object does not contain +- any information corresponding to an actual conversion; it only +- describes the conversion itself). +- +- `struct __gconv_loaded_object *__shlib_handle' +- `const char *__modname' +- `int __counter' +- All these elements of the structure are used internally in +- the C library to coordinate loading and unloading the shared. +- One must not expect any of the other elements to be +- available or initialized. +- +- `const char *__from_name' +- `const char *__to_name' +- `__from_name' and `__to_name' contain the names of the source +- and destination character sets. They can be used to identify +- the actual conversion to be carried out since one module +- might implement conversions for more than one character set +- and/or direction. +- +- `gconv_fct __fct' +- `gconv_init_fct __init_fct' +- `gconv_end_fct __end_fct' +- These elements contain pointers to the functions in the +- loadable module. The interface will be explained below. +- +- `int __min_needed_from' +- `int __max_needed_from' +- `int __min_needed_to' +- `int __max_needed_to;' +- These values have to be supplied in the init function of the +- module. The `__min_needed_from' value specifies how many +- bytes a character of the source character set at least needs. +- The `__max_needed_from' specifies the maximum value that +- also includes possible shift sequences. +- +- The `__min_needed_to' and `__max_needed_to' values serve the +- same purpose as `__min_needed_from' and `__max_needed_from' +- but this time for the destination character set. +- +- It is crucial that these values be accurate since otherwise +- the conversion functions will have problems or not work at +- all. +- +- `int __stateful' +- This element must also be initialized by the init function. +- `int __stateful' is nonzero if the source character set is +- stateful. Otherwise it is zero. +- +- `void *__data' +- This element can be used freely by the conversion functions +- in the module. `void *__data' can be used to communicate +- extra information from one call to another. `void *__data' +- need not be initialized if not needed at all. If `void +- *__data' element is assigned a pointer to dynamically +- allocated memory (presumably in the init function) it has to +- be made sure that the end function deallocates the memory. +- Otherwise the application will leak memory. +- +- It is important to be aware that this data structure is +- shared by all users of this specification conversion and +- therefore the `__data' element must not contain data specific +- to one specific use of the conversion function. +- +- - Data type: struct __gconv_step_data +- This is the data structure that contains the information specific +- to each use of the conversion functions. +- +- `char *__outbuf' +- `char *__outbufend' +- These elements specify the output buffer for the conversion +- step. The `__outbuf' element points to the beginning of the +- buffer, and `__outbufend' points to the byte following the +- last byte in the buffer. The conversion function must not +- assume anything about the size of the buffer but it can be +- safely assumed the there is room for at least one complete +- character in the output buffer. +- +- Once the conversion is finished, if the conversion is the +- last step, the `__outbuf' element must be modified to point +- after the last byte written into the buffer to signal how +- much output is available. If this conversion step is not the +- last one, the element must not be modified. The +- `__outbufend' element must not be modified. +- +- `int __is_last' +- This element is nonzero if this conversion step is the last +- one. This information is necessary for the recursion. See +- the description of the conversion function internals below. +- This element must never be modified. +- +- `int __invocation_counter' +- The conversion function can use this element to see how many +- calls of the conversion function already happened. Some +- character sets require a certain prolog when generating +- output, and by comparing this value with zero, one can find +- out whether it is the first call and whether, therefore, the +- prolog should be emitted. This element must never be +- modified. +- +- `int __internal_use' +- This element is another one rarely used but needed in certain +- situations. It is assigned a nonzero value in case the +- conversion functions are used to implement `mbsrtowcs' et.al. +- (i.e., the function is not used directly through the `iconv' +- interface). +- +- This sometimes makes a difference as it is expected that the +- `iconv' functions are used to translate entire texts while the +- `mbsrtowcs' functions are normally used only to convert single +- strings and might be used multiple times to convert entire +- texts. +- +- But in this situation we would have problem complying with +- some rules of the character set specification. Some +- character sets require a prolog, which must appear exactly +- once for an entire text. If a number of `mbsrtowcs' calls +- are used to convert the text, only the first call must add +- the prolog. However, because there is no communication +- between the different calls of `mbsrtowcs', the conversion +- functions have no possibility to find this out. The +- situation is different for sequences of `iconv' calls since +- the handle allows access to the needed information. +- +- The `int __internal_use' element is mostly used together with +- `__invocation_counter' as follows: +- +- if (!data->__internal_use +- && data->__invocation_counter == 0) +- /* Emit prolog. */ +- ... +- +- This element must never be modified. +- +- `mbstate_t *__statep' +- The `__statep' element points to an object of type `mbstate_t' +- (*note Keeping the state::). The conversion of a stateful +- character set must use the object pointed to by `__statep' to +- store information about the conversion state. The `__statep' +- element itself must never be modified. +- +- `mbstate_t __state' +- This element must _never_ be used directly. It is only part +- of this structure to have the needed space allocated. +- +-`iconv' module interfaces +-......................... +- +- With the knowledge about the data structures we now can describe the +-conversion function itself. To understand the interface a bit of +-knowledge is necessary about the functionality in the C library that +-loads the objects with the conversions. +- +- It is often the case that one conversion is used more than once +-(i.e., there are several `iconv_open' calls for the same set of +-character sets during one program run). The `mbsrtowcs' et.al. +-functions in the GNU C library also use the `iconv' functionality, which +-increases the number of uses of the same functions even more. +- +- Because of this multiple use of conversions, the modules do not get +-loaded exclusively for one conversion. Instead a module once loaded can +-be used by an arbitrary number of `iconv' or `mbsrtowcs' calls at the +-same time. The splitting of the information between conversion- +-function-specific information and conversion data makes this possible. +-The last section showed the two data structures used to do this. +- +- This is of course also reflected in the interface and semantics of +-the functions that the modules must provide. There are three functions +-that must have the following names: +- +-`gconv_init' +- The `gconv_init' function initializes the conversion function +- specific data structure. This very same object is shared by all +- conversions that use this conversion and, therefore, no state +- information about the conversion itself must be stored in here. +- If a module implements more than one conversion, the `gconv_init' +- function will be called multiple times. +- +-`gconv_end' +- The `gconv_end' function is responsible for freeing all resources +- allocated by the `gconv_init' function. If there is nothing to do, +- this function can be missing. Special care must be taken if the +- module implements more than one conversion and the `gconv_init' +- function does not allocate the same resources for all conversions. +- +-`gconv' +- This is the actual conversion function. It is called to convert +- one block of text. It gets passed the conversion step information +- initialized by `gconv_init' and the conversion data, specific to +- this use of the conversion functions. +- +- There are three data types defined for the three module interface +-functions and these define the interface. +- +- - Data type: int (*__gconv_init_fct) (struct __gconv_step *) +- This specifies the interface of the initialization function of the +- module. It is called exactly once for each conversion the module +- implements. +- +- As explained in the description of the `struct __gconv_step' data +- structure above the initialization function has to initialize +- parts of it. +- +- `__min_needed_from' +- `__max_needed_from' +- `__min_needed_to' +- `__max_needed_to' +- These elements must be initialized to the exact numbers of +- the minimum and maximum number of bytes used by one character +- in the source and destination character sets, respectively. +- If the characters all have the same size, the minimum and +- maximum values are the same. +- +- `__stateful' +- This element must be initialized to an nonzero value if the +- source character set is stateful. Otherwise it must be zero. +- +- If the initialization function needs to communicate some +- information to the conversion function, this communication can +- happen using the `__data' element of the `__gconv_step' structure. +- But since this data is shared by all the conversions, it must not +- be modified by the conversion function. The example below shows +- how this can be used. +- +- #define MIN_NEEDED_FROM 1 +- #define MAX_NEEDED_FROM 4 +- #define MIN_NEEDED_TO 4 +- #define MAX_NEEDED_TO 4 +- +- int +- gconv_init (struct __gconv_step *step) +- { +- /* Determine which direction. */ +- struct iso2022jp_data *new_data; +- enum direction dir = illegal_dir; +- enum variant var = illegal_var; +- int result; +- +- if (__strcasecmp (step->__from_name, "ISO-2022-JP//") == 0) +- { +- dir = from_iso2022jp; +- var = iso2022jp; +- } +- else if (__strcasecmp (step->__to_name, "ISO-2022-JP//") == 0) +- { +- dir = to_iso2022jp; +- var = iso2022jp; +- } +- else if (__strcasecmp (step->__from_name, "ISO-2022-JP-2//") == 0) +- { +- dir = from_iso2022jp; +- var = iso2022jp2; +- } +- else if (__strcasecmp (step->__to_name, "ISO-2022-JP-2//") == 0) +- { +- dir = to_iso2022jp; +- var = iso2022jp2; +- } +- +- result = __GCONV_NOCONV; +- if (dir != illegal_dir) +- { +- new_data = (struct iso2022jp_data *) +- malloc (sizeof (struct iso2022jp_data)); +- +- result = __GCONV_NOMEM; +- if (new_data != NULL) +- { +- new_data->dir = dir; +- new_data->var = var; +- step->__data = new_data; +- +- if (dir == from_iso2022jp) +- { +- step->__min_needed_from = MIN_NEEDED_FROM; +- step->__max_needed_from = MAX_NEEDED_FROM; +- step->__min_needed_to = MIN_NEEDED_TO; +- step->__max_needed_to = MAX_NEEDED_TO; +- } +- else +- { +- step->__min_needed_from = MIN_NEEDED_TO; +- step->__max_needed_from = MAX_NEEDED_TO; +- step->__min_needed_to = MIN_NEEDED_FROM; +- step->__max_needed_to = MAX_NEEDED_FROM + 2; +- } +- +- /* Yes, this is a stateful encoding. */ +- step->__stateful = 1; +- +- result = __GCONV_OK; +- } +- } +- +- return result; +- } +- +- The function first checks which conversion is wanted. The module +- from which this function is taken implements four different +- conversions; which one is selected can be determined by comparing +- the names. The comparison should always be done without paying +- attention to the case. +- +- Next, a data structure, which contains the necessary information +- about which conversion is selected, is allocated. The data +- structure `struct iso2022jp_data' is locally defined since, +- outside the module, this data is not used at all. Please note +- that if all four conversions this modules supports are requested +- there are four data blocks. +- +- One interesting thing is the initialization of the `__min_' and +- `__max_' elements of the step data object. A single ISO-2022-JP +- character can consist of one to four bytes. Therefore the +- `MIN_NEEDED_FROM' and `MAX_NEEDED_FROM' macros are defined this +- way. The output is always the `INTERNAL' character set (aka +- UCS-4) and therefore each character consists of exactly four +- bytes. For the conversion from `INTERNAL' to ISO-2022-JP we have +- to take into account that escape sequences might be necessary to +- switch the character sets. Therefore the `__max_needed_to' +- element for this direction gets assigned `MAX_NEEDED_FROM + 2'. +- This takes into account the two bytes needed for the escape +- sequences to single the switching. The asymmetry in the maximum +- values for the two directions can be explained easily: when +- reading ISO-2022-JP text, escape sequences can be handled alone +- (i.e., it is not necessary to process a real character since the +- effect of the escape sequence can be recorded in the state +- information). The situation is different for the other direction. +- Since it is in general not known which character comes next, one +- cannot emit escape sequences to change the state in advance. This +- means the escape sequences that have to be emitted together with +- the next character. Therefore one needs more room than only for +- the character itself. +- +- The possible return values of the initialization function are: +- +- `__GCONV_OK' +- The initialization succeeded +- +- `__GCONV_NOCONV' +- The requested conversion is not supported in the module. +- This can happen if the `gconv-modules' file has errors. +- +- `__GCONV_NOMEM' +- Memory required to store additional information could not be +- allocated. +- +- The function called before the module is unloaded is significantly +-easier. It often has nothing at all to do; in which case it can be left +-out completely. +- +- - Data type: void (*__gconv_end_fct) (struct gconv_step *) +- The task of this function is to free all resources allocated in the +- initialization function. Therefore only the `__data' element of +- the object pointed to by the argument is of interest. Continuing +- the example from the initialization function, the finalization +- function looks like this: +- +- void +- gconv_end (struct __gconv_step *data) +- { +- free (data->__data); +- } +- +- The most important function is the conversion function itself, which +-can get quite complicated for complex character sets. But since this +-is not of interest here, we will only describe a possible skeleton for +-the conversion function. +- +- - Data type: int (*__gconv_fct) (struct __gconv_step *, struct +- __gconv_step_data *, const char **, const char *, size_t *, +- int) +- The conversion function can be called for two basic reason: to +- convert text or to reset the state. From the description of the +- `iconv' function it can be seen why the flushing mode is +- necessary. What mode is selected is determined by the sixth +- argument, an integer. This argument being nonzero means that +- flushing is selected. +- +- Common to both modes is where the output buffer can be found. The +- information about this buffer is stored in the conversion step +- data. A pointer to this information is passed as the second +- argument to this function. The description of the `struct +- __gconv_step_data' structure has more information on the +- conversion step data. +- +- What has to be done for flushing depends on the source character +- set. If the source character set is not stateful, nothing has to +- be done. Otherwise the function has to emit a byte sequence to +- bring the state object into the initial state. Once this all +- happened the other conversion modules in the chain of conversions +- have to get the same chance. Whether another step follows can be +- determined from the `__is_last' element of the step data structure +- to which the first parameter points. +- +- The more interesting mode is when actual text has to be converted. +- The first step in this case is to convert as much text as +- possible from the input buffer and store the result in the output +- buffer. The start of the input buffer is determined by the third +- argument, which is a pointer to a pointer variable referencing the +- beginning of the buffer. The fourth argument is a pointer to the +- byte right after the last byte in the buffer. +- +- The conversion has to be performed according to the current state +- if the character set is stateful. The state is stored in an +- object pointed to by the `__statep' element of the step data +- (second argument). Once either the input buffer is empty or the +- output buffer is full the conversion stops. At this point, the +- pointer variable referenced by the third parameter must point to +- the byte following the last processed byte (i.e., if all of the +- input is consumed, this pointer and the fourth parameter have the +- same value). +- +- What now happens depends on whether this step is the last one. If +- it is the last step, the only thing that has to be done is to +- update the `__outbuf' element of the step data structure to point +- after the last written byte. This update gives the caller the +- information on how much text is available in the output buffer. +- In addition, the variable pointed to by the fifth parameter, which +- is of type `size_t', must be incremented by the number of +- characters (_not bytes_) that were converted in a non-reversible +- way. Then, the function can return. +- +- In case the step is not the last one, the later conversion +- functions have to get a chance to do their work. Therefore, the +- appropriate conversion function has to be called. The information +- about the functions is stored in the conversion data structures, +- passed as the first parameter. This information and the step data +- are stored in arrays, so the next element in both cases can be +- found by simple pointer arithmetic: +- +- int +- gconv (struct __gconv_step *step, struct __gconv_step_data *data, +- const char **inbuf, const char *inbufend, size_t *written, +- int do_flush) +- { +- struct __gconv_step *next_step = step + 1; +- struct __gconv_step_data *next_data = data + 1; +- ... +- +- The `next_step' pointer references the next step information and +- `next_data' the next data record. The call of the next function +- therefore will look similar to this: +- +- next_step->__fct (next_step, next_data, &outerr, outbuf, +- written, 0) +- +- But this is not yet all. Once the function call returns the +- conversion function might have some more to do. If the return +- value of the function is `__GCONV_EMPTY_INPUT', more room is +- available in the output buffer. Unless the input buffer is empty +- the conversion, functions start all over again and process the +- rest of the input buffer. If the return value is not +- `__GCONV_EMPTY_INPUT', something went wrong and we have to recover +- from this. +- +- A requirement for the conversion function is that the input buffer +- pointer (the third argument) always point to the last character +- that was put in converted form into the output buffer. This is +- trivially true after the conversion performed in the current step, +- but if the conversion functions deeper downstream stop +- prematurely, not all characters from the output buffer are +- consumed and, therefore, the input buffer pointers must be backed +- off to the right position. +- +- Correcting the input buffers is easy to do if the input and output +- character sets have a fixed width for all characters. In this +- situation we can compute how many characters are left in the +- output buffer and, therefore, can correct the input buffer pointer +- appropriately with a similar computation. Things are getting +- tricky if either character set has characters represented with +- variable length byte sequences, and it gets even more complicated +- if the conversion has to take care of the state. In these cases +- the conversion has to be performed once again, from the known +- state before the initial conversion (i.e., if necessary the state +- of the conversion has to be reset and the conversion loop has to be +- executed again). The difference now is that it is known how much +- input must be created, and the conversion can stop before +- converting the first unused character. Once this is done the +- input buffer pointers must be updated again and the function can +- return. +- +- One final thing should be mentioned. If it is necessary for the +- conversion to know whether it is the first invocation (in case a +- prolog has to be emitted), the conversion function should +- increment the `__invocation_counter' element of the step data +- structure just before returning to the caller. See the +- description of the `struct __gconv_step_data' structure above for +- more information on how this can be used. +- +- The return value must be one of the following values: +- +- `__GCONV_EMPTY_INPUT' +- All input was consumed and there is room left in the output +- buffer. +- +- `__GCONV_FULL_OUTPUT' +- No more room in the output buffer. In case this is not the +- last step this value is propagated down from the call of the +- next conversion function in the chain. +- +- `__GCONV_INCOMPLETE_INPUT' +- The input buffer is not entirely empty since it contains an +- incomplete character sequence. +- +- The following example provides a framework for a conversion +- function. In case a new conversion has to be written the holes in +- this implementation have to be filled and that is it. +- +- int +- gconv (struct __gconv_step *step, struct __gconv_step_data *data, +- const char **inbuf, const char *inbufend, size_t *written, +- int do_flush) +- { +- struct __gconv_step *next_step = step + 1; +- struct __gconv_step_data *next_data = data + 1; +- gconv_fct fct = next_step->__fct; +- int status; +- +- /* If the function is called with no input this means we have +- to reset to the initial state. The possibly partly +- converted input is dropped. */ +- if (do_flush) +- { +- status = __GCONV_OK; +- +- /* Possible emit a byte sequence which put the state object +- into the initial state. */ +- +- /* Call the steps down the chain if there are any but only +- if we successfully emitted the escape sequence. */ +- if (status == __GCONV_OK && ! data->__is_last) +- status = fct (next_step, next_data, NULL, NULL, +- written, 1); +- } +- else +- { +- /* We preserve the initial values of the pointer variables. */ +- const char *inptr = *inbuf; +- char *outbuf = data->__outbuf; +- char *outend = data->__outbufend; +- char *outptr; +- +- do +- { +- /* Remember the start value for this round. */ +- inptr = *inbuf; +- /* The outbuf buffer is empty. */ +- outptr = outbuf; +- +- /* For stateful encodings the state must be safe here. */ +- +- /* Run the conversion loop. `status' is set +- appropriately afterwards. */ +- +- /* If this is the last step, leave the loop. There is +- nothing we can do. */ +- if (data->__is_last) +- { +- /* Store information about how many bytes are +- available. */ +- data->__outbuf = outbuf; +- +- /* If any non-reversible conversions were performed, +- add the number to `*written'. */ +- +- break; +- } +- +- /* Write out all output that was produced. */ +- if (outbuf > outptr) +- { +- const char *outerr = data->__outbuf; +- int result; +- +- result = fct (next_step, next_data, &outerr, +- outbuf, written, 0); +- +- if (result != __GCONV_EMPTY_INPUT) +- { +- if (outerr != outbuf) +- { +- /* Reset the input buffer pointer. We +- document here the complex case. */ +- size_t nstatus; +- +- /* Reload the pointers. */ +- *inbuf = inptr; +- outbuf = outptr; +- +- /* Possibly reset the state. */ +- +- /* Redo the conversion, but this time +- the end of the output buffer is at +- `outerr'. */ +- } +- +- /* Change the status. */ +- status = result; +- } +- else +- /* All the output is consumed, we can make +- another run if everything was ok. */ +- if (status == __GCONV_FULL_OUTPUT) +- status = __GCONV_OK; +- } +- } +- while (status == __GCONV_OK); +- +- /* We finished one use of this step. */ +- ++data->__invocation_counter; +- } +- +- return status; +- } +- +- This information should be sufficient to write new modules. Anybody +-doing so should also take a look at the available source code in the GNU +-C library sources. It contains many examples of working and optimized +-modules. +- +- +-File: libc.info, Node: Locales, Next: Message Translation, Prev: Character Set Handling, Up: Top +- +-Locales and Internationalization +-******************************** +- +- Different countries and cultures have varying conventions for how to +-communicate. These conventions range from very simple ones, such as the +-format for representing dates and times, to very complex ones, such as +-the language spoken. +- +- "Internationalization" of software means programming it to be able +-to adapt to the user's favorite conventions. In ISO C, +-internationalization works by means of "locales". Each locale +-specifies a collection of conventions, one convention for each purpose. +-The user chooses a set of conventions by specifying a locale (via +-environment variables). +- +- All programs inherit the chosen locale as part of their environment. +-Provided the programs are written to obey the choice of locale, they +-will follow the conventions preferred by the user. +- +-* Menu: +- +-* Effects of Locale:: Actions affected by the choice of +- locale. +-* Choosing Locale:: How the user specifies a locale. +-* Locale Categories:: Different purposes for which you can +- select a locale. +-* Setting the Locale:: How a program specifies the locale +- with library functions. +-* Standard Locales:: Locale names available on all systems. +-* Locale Information:: How to access the information for the locale. +-* Formatting Numbers:: A dedicated function to format numbers. +-* Yes-or-No Questions:: Check a Response against the locale. +- +- +-File: libc.info, Node: Effects of Locale, Next: Choosing Locale, Up: Locales +- +-What Effects a Locale Has +-========================= +- +- Each locale specifies conventions for several purposes, including the +-following: +- +- * What multibyte character sequences are valid, and how they are +- interpreted (*note Character Set Handling::). +- +- * Classification of which characters in the local character set are +- considered alphabetic, and upper- and lower-case conversion +- conventions (*note Character Handling::). +- +- * The collating sequence for the local language and character set +- (*note Collation Functions::). +- +- * Formatting of numbers and currency amounts (*note General +- Numeric::). +- +- * Formatting of dates and times (*note Formatting Calendar Time::). +- +- * What language to use for output, including error messages (*note +- Message Translation::). +- +- * What language to use for user answers to yes-or-no questions +- (*note Yes-or-No Questions::). +- +- * What language to use for more complex user input. (The C library +- doesn't yet help you implement this.) +- +- Some aspects of adapting to the specified locale are handled +-automatically by the library subroutines. For example, all your program +-needs to do in order to use the collating sequence of the chosen locale +-is to use `strcoll' or `strxfrm' to compare strings. +- +- Other aspects of locales are beyond the comprehension of the library. +-For example, the library can't automatically translate your program's +-output messages into other languages. The only way you can support +-output in the user's favorite language is to program this more or less +-by hand. The C library provides functions to handle translations for +-multiple languages easily. +- +- This chapter discusses the mechanism by which you can modify the +-current locale. The effects of the current locale on specific library +-functions are discussed in more detail in the descriptions of those +-functions. +- +- +-File: libc.info, Node: Choosing Locale, Next: Locale Categories, Prev: Effects of Locale, Up: Locales +- +-Choosing a Locale +-================= +- +- The simplest way for the user to choose a locale is to set the +-environment variable `LANG'. This specifies a single locale to use for +-all purposes. For example, a user could specify a hypothetical locale +-named `espana-castellano' to use the standard conventions of most of +-Spain. +- +- The set of locales supported depends on the operating system you are +-using, and so do their names. We can't make any promises about what +-locales will exist, except for one standard locale called `C' or +-`POSIX'. Later we will describe how to construct locales. +- +- A user also has the option of specifying different locales for +-different purposes--in effect, choosing a mixture of multiple locales. +- +- For example, the user might specify the locale `espana-castellano' +-for most purposes, but specify the locale `usa-english' for currency +-formatting. This might make sense if the user is a Spanish-speaking +-American, working in Spanish, but representing monetary amounts in US +-dollars. +- +- Note that both locales `espana-castellano' and `usa-english', like +-all locales, would include conventions for all of the purposes to which +-locales apply. However, the user can choose to use each locale for a +-particular subset of those purposes. +- +- +-File: libc.info, Node: Locale Categories, Next: Setting the Locale, Prev: Choosing Locale, Up: Locales +- +-Categories of Activities that Locales Affect +-============================================ +- +- The purposes that locales serve are grouped into "categories", so +-that a user or a program can choose the locale for each category +-independently. Here is a table of categories; each name is both an +-environment variable that a user can set, and a macro name that you can +-use as an argument to `setlocale'. +- +-`LC_COLLATE' +- This category applies to collation of strings (functions `strcoll' +- and `strxfrm'); see *Note Collation Functions::. +- +-`LC_CTYPE' +- This category applies to classification and conversion of +- characters, and to multibyte and wide characters; see *Note +- Character Handling::, and *Note Character Set Handling::. +- +-`LC_MONETARY' +- This category applies to formatting monetary values; see *Note +- General Numeric::. +- +-`LC_NUMERIC' +- This category applies to formatting numeric values that are not +- monetary; see *Note General Numeric::. +- +-`LC_TIME' +- This category applies to formatting date and time values; see +- *Note Formatting Calendar Time::. +- +-`LC_MESSAGES' +- This category applies to selecting the language used in the user +- interface for message translation (*note The Uniforum approach::; +- *note Message catalogs a la X/Open::) and contains regular +- expressions for affirmative and negative responses. +- +-`LC_ALL' +- This is not an environment variable; it is only a macro that you +- can use with `setlocale' to set a single locale for all purposes. +- Setting this environment variable overwrites all selections by the +- other `LC_*' variables or `LANG'. +- +-`LANG' +- If this environment variable is defined, its value specifies the +- locale to use for all purposes except as overridden by the +- variables above. +- +- When developing the message translation functions it was felt that +-the functionality provided by the variables above is not sufficient. +-For example, it should be possible to specify more than one locale name. +-Take a Swedish user who better speaks German than English, and a program +-whose messages are output in English by default. It should be possible +-to specify that the first choice of language is Swedish, the second +-German, and if this also fails to use English. This is possible with +-the variable `LANGUAGE'. For further description of this GNU extension +-see *Note Using gettextized software::. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-12 glibc-2.3.2-200304020432/manual/libc.info-12 +--- glibc-2.3.2/manual/libc.info-12 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-12 Thu Jan 1 01:00:00 1970 +@@ -1,1156 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Setting the Locale, Next: Standard Locales, Prev: Locale Categories, Up: Locales +- +-How Programs Set the Locale +-=========================== +- +- A C program inherits its locale environment variables when it starts +-up. This happens automatically. However, these variables do not +-automatically control the locale used by the library functions, because +-ISO C says that all programs start by default in the standard `C' +-locale. To use the locales specified by the environment, you must call +-`setlocale'. Call it as follows: +- +- setlocale (LC_ALL, ""); +- +-to select a locale based on the user choice of the appropriate +-environment variables. +- +- You can also use `setlocale' to specify a particular locale, for +-general use or for a specific category. +- +- The symbols in this section are defined in the header file +-`locale.h'. +- +- - Function: char * setlocale (int CATEGORY, const char *LOCALE) +- The function `setlocale' sets the current locale for category +- CATEGORY to LOCALE. A list of all the locales the system provides +- can be created by running +- +- locale -a +- +- If CATEGORY is `LC_ALL', this specifies the locale for all +- purposes. The other possible values of CATEGORY specify an single +- purpose (*note Locale Categories::). +- +- You can also use this function to find out the current locale by +- passing a null pointer as the LOCALE argument. In this case, +- `setlocale' returns a string that is the name of the locale +- currently selected for category CATEGORY. +- +- The string returned by `setlocale' can be overwritten by subsequent +- calls, so you should make a copy of the string (*note Copying and +- Concatenation::) if you want to save it past any further calls to +- `setlocale'. (The standard library is guaranteed never to call +- `setlocale' itself.) +- +- You should not modify the string returned by `setlocale'. It might +- be the same string that was passed as an argument in a previous +- call to `setlocale'. One requirement is that the CATEGORY must be +- the same in the call the string was returned and the one when the +- string is passed in as LOCALE parameter. +- +- When you read the current locale for category `LC_ALL', the value +- encodes the entire combination of selected locales for all +- categories. In this case, the value is not just a single locale +- name. In fact, we don't make any promises about what it looks +- like. But if you specify the same "locale name" with `LC_ALL' in +- a subsequent call to `setlocale', it restores the same combination +- of locale selections. +- +- To be sure you can use the returned string encoding the currently +- selected locale at a later time, you must make a copy of the +- string. It is not guaranteed that the returned pointer remains +- valid over time. +- +- When the LOCALE argument is not a null pointer, the string returned +- by `setlocale' reflects the newly-modified locale. +- +- If you specify an empty string for LOCALE, this means to read the +- appropriate environment variable and use its value to select the +- locale for CATEGORY. +- +- If a nonempty string is given for LOCALE, then the locale of that +- name is used if possible. +- +- If you specify an invalid locale name, `setlocale' returns a null +- pointer and leaves the current locale unchanged. +- +- Here is an example showing how you might use `setlocale' to +-temporarily switch to a new locale. +- +- #include +- #include +- #include +- #include +- +- void +- with_other_locale (char *new_locale, +- void (*subroutine) (int), +- int argument) +- { +- char *old_locale, *saved_locale; +- +- /* Get the name of the current locale. */ +- old_locale = setlocale (LC_ALL, NULL); +- +- /* Copy the name so it won't be clobbered by `setlocale'. */ +- saved_locale = strdup (old_locale); +- if (saved_locale == NULL) +- fatal ("Out of memory"); +- +- /* Now change the locale and do some stuff with it. */ +- setlocale (LC_ALL, new_locale); +- (*subroutine) (argument); +- +- /* Restore the original locale. */ +- setlocale (LC_ALL, saved_locale); +- free (saved_locale); +- } +- +- *Portability Note:* Some ISO C systems may define additional locale +-categories, and future versions of the library will do so. For +-portability, assume that any symbol beginning with `LC_' might be +-defined in `locale.h'. +- +- +-File: libc.info, Node: Standard Locales, Next: Locale Information, Prev: Setting the Locale, Up: Locales +- +-Standard Locales +-================ +- +- The only locale names you can count on finding on all operating +-systems are these three standard ones: +- +-`"C"' +- This is the standard C locale. The attributes and behavior it +- provides are specified in the ISO C standard. When your program +- starts up, it initially uses this locale by default. +- +-`"POSIX"' +- This is the standard POSIX locale. Currently, it is an alias for +- the standard C locale. +- +-`""' +- The empty name says to select a locale based on environment +- variables. *Note Locale Categories::. +- +- Defining and installing named locales is normally a responsibility of +-the system administrator at your site (or the person who installed the +-GNU C library). It is also possible for the user to create private +-locales. All this will be discussed later when describing the tool to +-do so. +- +- If your program needs to use something other than the `C' locale, it +-will be more portable if you use whatever locale the user specifies +-with the environment, rather than trying to specify some non-standard +-locale explicitly by name. Remember, different machines might have +-different sets of locales installed. +- +- +-File: libc.info, Node: Locale Information, Next: Formatting Numbers, Prev: Standard Locales, Up: Locales +- +-Accessing Locale Information +-============================ +- +- There are several ways to access locale information. The simplest +-way is to let the C library itself do the work. Several of the +-functions in this library implicitly access the locale data, and use +-what information is provided by the currently selected locale. This is +-how the locale model is meant to work normally. +- +- As an example take the `strftime' function, which is meant to nicely +-format date and time information (*note Formatting Calendar Time::). +-Part of the standard information contained in the `LC_TIME' category is +-the names of the months. Instead of requiring the programmer to take +-care of providing the translations the `strftime' function does this +-all by itself. `%A' in the format string is replaced by the +-appropriate weekday name of the locale currently selected by `LC_TIME'. +-This is an easy example, and wherever possible functions do things +-automatically in this way. +- +- But there are quite often situations when there is simply no function +-to perform the task, or it is simply not possible to do the work +-automatically. For these cases it is necessary to access the +-information in the locale directly. To do this the C library provides +-two functions: `localeconv' and `nl_langinfo'. The former is part of +-ISO C and therefore portable, but has a brain-damaged interface. The +-second is part of the Unix interface and is portable in as far as the +-system follows the Unix standards. +- +-* Menu: +- +-* The Lame Way to Locale Data:: ISO C's `localeconv'. +-* The Elegant and Fast Way:: X/Open's `nl_langinfo'. +- +- +-File: libc.info, Node: The Lame Way to Locale Data, Next: The Elegant and Fast Way, Up: Locale Information +- +-`localeconv': It is portable but ... +------------------------------------- +- +- Together with the `setlocale' function the ISO C people invented the +-`localeconv' function. It is a masterpiece of poor design. It is +-expensive to use, not extendable, and not generally usable as it +-provides access to only `LC_MONETARY' and `LC_NUMERIC' related +-information. Nevertheless, if it is applicable to a given situation it +-should be used since it is very portable. The function `strfmon' +-formats monetary amounts according to the selected locale using this +-information. +- +- - Function: struct lconv * localeconv (void) +- The `localeconv' function returns a pointer to a structure whose +- components contain information about how numeric and monetary +- values should be formatted in the current locale. +- +- You should not modify the structure or its contents. The +- structure might be overwritten by subsequent calls to +- `localeconv', or by calls to `setlocale', but no other function in +- the library overwrites this value. +- +- - Data Type: struct lconv +- `localeconv''s return value is of this data type. Its elements are +- described in the following subsections. +- +- If a member of the structure `struct lconv' has type `char', and the +-value is `CHAR_MAX', it means that the current locale has no value for +-that parameter. +- +-* Menu: +- +-* General Numeric:: Parameters for formatting numbers and +- currency amounts. +-* Currency Symbol:: How to print the symbol that identifies an +- amount of money (e.g. `$'). +-* Sign of Money Amount:: How to print the (positive or negative) sign +- for a monetary amount, if one exists. +- +- +-File: libc.info, Node: General Numeric, Next: Currency Symbol, Up: The Lame Way to Locale Data +- +-Generic Numeric Formatting Parameters +-..................................... +- +- These are the standard members of `struct lconv'; there may be +-others. +- +-`char *decimal_point' +-`char *mon_decimal_point' +- These are the decimal-point separators used in formatting +- non-monetary and monetary quantities, respectively. In the `C' +- locale, the value of `decimal_point' is `"."', and the value of +- `mon_decimal_point' is `""'. +- +-`char *thousands_sep' +-`char *mon_thousands_sep' +- These are the separators used to delimit groups of digits to the +- left of the decimal point in formatting non-monetary and monetary +- quantities, respectively. In the `C' locale, both members have a +- value of `""' (the empty string). +- +-`char *grouping' +-`char *mon_grouping' +- These are strings that specify how to group the digits to the left +- of the decimal point. `grouping' applies to non-monetary +- quantities and `mon_grouping' applies to monetary quantities. Use +- either `thousands_sep' or `mon_thousands_sep' to separate the digit +- groups. +- +- Each member of these strings is to be interpreted as an integer +- value of type `char'. Successive numbers (from left to right) +- give the sizes of successive groups (from right to left, starting +- at the decimal point.) The last member is either `0', in which +- case the previous member is used over and over again for all the +- remaining groups, or `CHAR_MAX', in which case there is no more +- grouping--or, put another way, any remaining digits form one large +- group without separators. +- +- For example, if `grouping' is `"\04\03\02"', the correct grouping +- for the number `123456787654321' is `12', `34', `56', `78', `765', +- `4321'. This uses a group of 4 digits at the end, preceded by a +- group of 3 digits, preceded by groups of 2 digits (as many as +- needed). With a separator of `,', the number would be printed as +- `12,34,56,78,765,4321'. +- +- A value of `"\03"' indicates repeated groups of three digits, as +- normally used in the U.S. +- +- In the standard `C' locale, both `grouping' and `mon_grouping' +- have a value of `""'. This value specifies no grouping at all. +- +-`char int_frac_digits' +-`char frac_digits' +- These are small integers indicating how many fractional digits (to +- the right of the decimal point) should be displayed in a monetary +- value in international and local formats, respectively. (Most +- often, both members have the same value.) +- +- In the standard `C' locale, both of these members have the value +- `CHAR_MAX', meaning "unspecified". The ISO standard doesn't say +- what to do when you find this value; we recommend printing no +- fractional digits. (This locale also specifies the empty string +- for `mon_decimal_point', so printing any fractional digits would be +- confusing!) +- +- +-File: libc.info, Node: Currency Symbol, Next: Sign of Money Amount, Prev: General Numeric, Up: The Lame Way to Locale Data +- +-Printing the Currency Symbol +-............................ +- +- These members of the `struct lconv' structure specify how to print +-the symbol to identify a monetary value--the international analog of +-`$' for US dollars. +- +- Each country has two standard currency symbols. The "local currency +-symbol" is used commonly within the country, while the "international +-currency symbol" is used internationally to refer to that country's +-currency when it is necessary to indicate the country unambiguously. +- +- For example, many countries use the dollar as their monetary unit, +-and when dealing with international currencies it's important to specify +-that one is dealing with (say) Canadian dollars instead of U.S. dollars +-or Australian dollars. But when the context is known to be Canada, +-there is no need to make this explicit--dollar amounts are implicitly +-assumed to be in Canadian dollars. +- +-`char *currency_symbol' +- The local currency symbol for the selected locale. +- +- In the standard `C' locale, this member has a value of `""' (the +- empty string), meaning "unspecified". The ISO standard doesn't +- say what to do when you find this value; we recommend you simply +- print the empty string as you would print any other string pointed +- to by this variable. +- +-`char *int_curr_symbol' +- The international currency symbol for the selected locale. +- +- The value of `int_curr_symbol' should normally consist of a +- three-letter abbreviation determined by the international standard +- `ISO 4217 Codes for the Representation of Currency and Funds', +- followed by a one-character separator (often a space). +- +- In the standard `C' locale, this member has a value of `""' (the +- empty string), meaning "unspecified". We recommend you simply +- print the empty string as you would print any other string pointed +- to by this variable. +- +-`char p_cs_precedes' +-`char n_cs_precedes' +-`char int_p_cs_precedes' +-`char int_n_cs_precedes' +- These members are `1' if the `currency_symbol' or +- `int_curr_symbol' strings should precede the value of a monetary +- amount, or `0' if the strings should follow the value. The +- `p_cs_precedes' and `int_p_cs_precedes' members apply to positive +- amounts (or zero), and the `n_cs_precedes' and `int_n_cs_precedes' +- members apply to negative amounts. +- +- In the standard `C' locale, all of these members have a value of +- `CHAR_MAX', meaning "unspecified". The ISO standard doesn't say +- what to do when you find this value. We recommend printing the +- currency symbol before the amount, which is right for most +- countries. In other words, treat all nonzero values alike in +- these members. +- +- The members with the `int_' prefix apply to the `int_curr_symbol' +- while the other two apply to `currency_symbol'. +- +-`char p_sep_by_space' +-`char n_sep_by_space' +-`char int_p_sep_by_space' +-`char int_n_sep_by_space' +- These members are `1' if a space should appear between the +- `currency_symbol' or `int_curr_symbol' strings and the amount, or +- `0' if no space should appear. The `p_sep_by_space' and +- `int_p_sep_by_space' members apply to positive amounts (or zero), +- and the `n_sep_by_space' and `int_n_sep_by_space' members apply to +- negative amounts. +- +- In the standard `C' locale, all of these members have a value of +- `CHAR_MAX', meaning "unspecified". The ISO standard doesn't say +- what you should do when you find this value; we suggest you treat +- it as 1 (print a space). In other words, treat all nonzero values +- alike in these members. +- +- The members with the `int_' prefix apply to the `int_curr_symbol' +- while the other two apply to `currency_symbol'. There is one +- specialty with the `int_curr_symbol', though. Since all legal +- values contain a space at the end the string one either printf +- this space (if the currency symbol must appear in front and must +- be separated) or one has to avoid printing this character at all +- (especially when at the end of the string). +- +- +-File: libc.info, Node: Sign of Money Amount, Prev: Currency Symbol, Up: The Lame Way to Locale Data +- +-Printing the Sign of a Monetary Amount +-...................................... +- +- These members of the `struct lconv' structure specify how to print +-the sign (if any) of a monetary value. +- +-`char *positive_sign' +-`char *negative_sign' +- These are strings used to indicate positive (or zero) and negative +- monetary quantities, respectively. +- +- In the standard `C' locale, both of these members have a value of +- `""' (the empty string), meaning "unspecified". +- +- The ISO standard doesn't say what to do when you find this value; +- we recommend printing `positive_sign' as you find it, even if it is +- empty. For a negative value, print `negative_sign' as you find it +- unless both it and `positive_sign' are empty, in which case print +- `-' instead. (Failing to indicate the sign at all seems rather +- unreasonable.) +- +-`char p_sign_posn' +-`char n_sign_posn' +-`char int_p_sign_posn' +-`char int_n_sign_posn' +- These members are small integers that indicate how to position the +- sign for nonnegative and negative monetary quantities, +- respectively. (The string used by the sign is what was specified +- with `positive_sign' or `negative_sign'.) The possible values are +- as follows: +- +- `0' +- The currency symbol and quantity should be surrounded by +- parentheses. +- +- `1' +- Print the sign string before the quantity and currency symbol. +- +- `2' +- Print the sign string after the quantity and currency symbol. +- +- `3' +- Print the sign string right before the currency symbol. +- +- `4' +- Print the sign string right after the currency symbol. +- +- `CHAR_MAX' +- "Unspecified". Both members have this value in the standard +- `C' locale. +- +- The ISO standard doesn't say what you should do when the value is +- `CHAR_MAX'. We recommend you print the sign after the currency +- symbol. +- +- The members with the `int_' prefix apply to the `int_curr_symbol' +- while the other two apply to `currency_symbol'. +- +- +-File: libc.info, Node: The Elegant and Fast Way, Prev: The Lame Way to Locale Data, Up: Locale Information +- +-Pinpoint Access to Locale Data +------------------------------- +- +- When writing the X/Open Portability Guide the authors realized that +-the `localeconv' function is not enough to provide reasonable access to +-locale information. The information which was meant to be available in +-the locale (as later specified in the POSIX.1 standard) requires more +-ways to access it. Therefore the `nl_langinfo' function was introduced. +- +- - Function: char * nl_langinfo (nl_item ITEM) +- The `nl_langinfo' function can be used to access individual +- elements of the locale categories. Unlike the `localeconv' +- function, which returns all the information, `nl_langinfo' lets +- the caller select what information it requires. This is very fast +- and it is not a problem to call this function multiple times. +- +- A second advantage is that in addition to the numeric and monetary +- formatting information, information from the `LC_TIME' and +- `LC_MESSAGES' categories is available. +- +- The type `nl_type' is defined in `nl_types.h'. The argument ITEM +- is a numeric value defined in the header `langinfo.h'. The X/Open +- standard defines the following values: +- +- `CODESET' +- `nl_langinfo' returns a string with the name of the coded +- character set used in the selected locale. +- +- `ABDAY_1' +- `ABDAY_2' +- `ABDAY_3' +- `ABDAY_4' +- `ABDAY_5' +- `ABDAY_6' +- `ABDAY_7' +- `nl_langinfo' returns the abbreviated weekday name. `ABDAY_1' +- corresponds to Sunday. +- +- `DAY_1' +- `DAY_2' +- `DAY_3' +- `DAY_4' +- `DAY_5' +- `DAY_6' +- `DAY_7' +- Similar to `ABDAY_1' etc., but here the return value is the +- unabbreviated weekday name. +- +- `ABMON_1' +- `ABMON_2' +- `ABMON_3' +- `ABMON_4' +- `ABMON_5' +- `ABMON_6' +- `ABMON_7' +- `ABMON_8' +- `ABMON_9' +- `ABMON_10' +- `ABMON_11' +- `ABMON_12' +- The return value is abbreviated name of the month. `ABMON_1' +- corresponds to January. +- +- `MON_1' +- `MON_2' +- `MON_3' +- `MON_4' +- `MON_5' +- `MON_6' +- `MON_7' +- `MON_8' +- `MON_9' +- `MON_10' +- `MON_11' +- `MON_12' +- Similar to `ABMON_1' etc., but here the month names are not +- abbreviated. Here the first value `MON_1' also corresponds +- to January. +- +- `AM_STR' +- `PM_STR' +- The return values are strings which can be used in the +- representation of time as an hour from 1 to 12 plus an am/pm +- specifier. +- +- Note that in locales which do not use this time representation +- these strings might be empty, in which case the am/pm format +- cannot be used at all. +- +- `D_T_FMT' +- The return value can be used as a format string for +- `strftime' to represent time and date in a locale-specific +- way. +- +- `D_FMT' +- The return value can be used as a format string for +- `strftime' to represent a date in a locale-specific way. +- +- `T_FMT' +- The return value can be used as a format string for +- `strftime' to represent time in a locale-specific way. +- +- `T_FMT_AMPM' +- The return value can be used as a format string for +- `strftime' to represent time in the am/pm format. +- +- Note that if the am/pm format does not make any sense for the +- selected locale, the return value might be the same as the +- one for `T_FMT'. +- +- `ERA' +- The return value represents the era used in the current +- locale. +- +- Most locales do not define this value. An example of a +- locale which does define this value is the Japanese one. In +- Japan, the traditional representation of dates includes the +- name of the era corresponding to the then-emperor's reign. +- +- Normally it should not be necessary to use this value +- directly. Specifying the `E' modifier in their format +- strings causes the `strftime' functions to use this +- information. The format of the returned string is not +- specified, and therefore you should not assume knowledge of +- it on different systems. +- +- `ERA_YEAR' +- The return value gives the year in the relevant era of the +- locale. As for `ERA' it should not be necessary to use this +- value directly. +- +- `ERA_D_T_FMT' +- This return value can be used as a format string for +- `strftime' to represent dates and times in a locale-specific +- era-based way. +- +- `ERA_D_FMT' +- This return value can be used as a format string for +- `strftime' to represent a date in a locale-specific era-based +- way. +- +- `ERA_T_FMT' +- This return value can be used as a format string for +- `strftime' to represent time in a locale-specific era-based +- way. +- +- `ALT_DIGITS' +- The return value is a representation of up to 100 values used +- to represent the values 0 to 99. As for `ERA' this value is +- not intended to be used directly, but instead indirectly +- through the `strftime' function. When the modifier `O' is +- used in a format which would otherwise use numerals to +- represent hours, minutes, seconds, weekdays, months, or +- weeks, the appropriate value for the locale is used instead. +- +- `INT_CURR_SYMBOL' +- The same as the value returned by `localeconv' in the +- `int_curr_symbol' element of the `struct lconv'. +- +- `CURRENCY_SYMBOL' +- `CRNCYSTR' +- The same as the value returned by `localeconv' in the +- `currency_symbol' element of the `struct lconv'. +- +- `CRNCYSTR' is a deprecated alias still required by Unix98. +- +- `MON_DECIMAL_POINT' +- The same as the value returned by `localeconv' in the +- `mon_decimal_point' element of the `struct lconv'. +- +- `MON_THOUSANDS_SEP' +- The same as the value returned by `localeconv' in the +- `mon_thousands_sep' element of the `struct lconv'. +- +- `MON_GROUPING' +- The same as the value returned by `localeconv' in the +- `mon_grouping' element of the `struct lconv'. +- +- `POSITIVE_SIGN' +- The same as the value returned by `localeconv' in the +- `positive_sign' element of the `struct lconv'. +- +- `NEGATIVE_SIGN' +- The same as the value returned by `localeconv' in the +- `negative_sign' element of the `struct lconv'. +- +- `INT_FRAC_DIGITS' +- The same as the value returned by `localeconv' in the +- `int_frac_digits' element of the `struct lconv'. +- +- `FRAC_DIGITS' +- The same as the value returned by `localeconv' in the +- `frac_digits' element of the `struct lconv'. +- +- `P_CS_PRECEDES' +- The same as the value returned by `localeconv' in the +- `p_cs_precedes' element of the `struct lconv'. +- +- `P_SEP_BY_SPACE' +- The same as the value returned by `localeconv' in the +- `p_sep_by_space' element of the `struct lconv'. +- +- `N_CS_PRECEDES' +- The same as the value returned by `localeconv' in the +- `n_cs_precedes' element of the `struct lconv'. +- +- `N_SEP_BY_SPACE' +- The same as the value returned by `localeconv' in the +- `n_sep_by_space' element of the `struct lconv'. +- +- `P_SIGN_POSN' +- The same as the value returned by `localeconv' in the +- `p_sign_posn' element of the `struct lconv'. +- +- `N_SIGN_POSN' +- The same as the value returned by `localeconv' in the +- `n_sign_posn' element of the `struct lconv'. +- +- `INT_P_CS_PRECEDES' +- The same as the value returned by `localeconv' in the +- `int_p_cs_precedes' element of the `struct lconv'. +- +- `INT_P_SEP_BY_SPACE' +- The same as the value returned by `localeconv' in the +- `int_p_sep_by_space' element of the `struct lconv'. +- +- `INT_N_CS_PRECEDES' +- The same as the value returned by `localeconv' in the +- `int_n_cs_precedes' element of the `struct lconv'. +- +- `INT_N_SEP_BY_SPACE' +- The same as the value returned by `localeconv' in the +- `int_n_sep_by_space' element of the `struct lconv'. +- +- `INT_P_SIGN_POSN' +- The same as the value returned by `localeconv' in the +- `int_p_sign_posn' element of the `struct lconv'. +- +- `INT_N_SIGN_POSN' +- The same as the value returned by `localeconv' in the +- `int_n_sign_posn' element of the `struct lconv'. +- +- `DECIMAL_POINT' +- `RADIXCHAR' +- The same as the value returned by `localeconv' in the +- `decimal_point' element of the `struct lconv'. +- +- The name `RADIXCHAR' is a deprecated alias still used in +- Unix98. +- +- `THOUSANDS_SEP' +- `THOUSEP' +- The same as the value returned by `localeconv' in the +- `thousands_sep' element of the `struct lconv'. +- +- The name `THOUSEP' is a deprecated alias still used in Unix98. +- +- `GROUPING' +- The same as the value returned by `localeconv' in the +- `grouping' element of the `struct lconv'. +- +- `YESEXPR' +- The return value is a regular expression which can be used +- with the `regex' function to recognize a positive response to +- a yes/no question. The GNU C library provides the `rpmatch' +- function for easier handling in applications. +- +- `NOEXPR' +- The return value is a regular expression which can be used +- with the `regex' function to recognize a negative response to +- a yes/no question. +- +- `YESSTR' +- The return value is a locale-specific translation of the +- positive response to a yes/no question. +- +- Using this value is deprecated since it is a very special +- case of message translation, and is better handled by the +- message translation functions (*note Message Translation::). +- +- The use of this symbol is deprecated. Instead message +- translation should be used. +- +- `NOSTR' +- The return value is a locale-specific translation of the +- negative response to a yes/no question. What is said for +- `YESSTR' is also true here. +- +- The use of this symbol is deprecated. Instead message +- translation should be used. +- +- The file `langinfo.h' defines a lot more symbols but none of them +- is official. Using them is not portable, and the format of the +- return values might change. Therefore we recommended you not use +- them. +- +- Note that the return value for any valid argument can be used for +- in all situations (with the possible exception of the am/pm time +- formatting codes). If the user has not selected any locale for the +- appropriate category, `nl_langinfo' returns the information from +- the `"C"' locale. It is therefore possible to use this function as +- shown in the example below. +- +- If the argument ITEM is not valid, a pointer to an empty string is +- returned. +- +- An example of `nl_langinfo' usage is a function which has to print a +-given date and time in a locale-specific way. At first one might think +-that, since `strftime' internally uses the locale information, writing +-something like the following is enough: +- +- size_t +- i18n_time_n_data (char *s, size_t len, const struct tm *tp) +- { +- return strftime (s, len, "%X %D", tp); +- } +- +- The format contains no weekday or month names and therefore is +-internationally usable. Wrong! The output produced is something like +-`"hh:mm:ss MM/DD/YY"'. This format is only recognizable in the USA. +-Other countries use different formats. Therefore the function should +-be rewritten like this: +- +- size_t +- i18n_time_n_data (char *s, size_t len, const struct tm *tp) +- { +- return strftime (s, len, nl_langinfo (D_T_FMT), tp); +- } +- +- Now it uses the date and time format of the locale selected when the +-program runs. If the user selects the locale correctly there should +-never be a misunderstanding over the time and date format. +- +- +-File: libc.info, Node: Formatting Numbers, Next: Yes-or-No Questions, Prev: Locale Information, Up: Locales +- +-A dedicated function to format numbers +-====================================== +- +- We have seen that the structure returned by `localeconv' as well as +-the values given to `nl_langinfo' allow you to retrieve the various +-pieces of locale-specific information to format numbers and monetary +-amounts. We have also seen that the underlying rules are quite complex. +- +- Therefore the X/Open standards introduce a function which uses such +-locale information, making it easier for the user to format numbers +-according to these rules. +- +- - Function: ssize_t strfmon (char *S, size_t MAXSIZE, const char +- *FORMAT, ...) +- The `strfmon' function is similar to the `strftime' function in +- that it takes a buffer, its size, a format string, and values to +- write into the buffer as text in a form specified by the format +- string. Like `strftime', the function also returns the number of +- bytes written into the buffer. +- +- There are two differences: `strfmon' can take more than one +- argument, and, of course, the format specification is different. +- Like `strftime', the format string consists of normal text, which +- is output as is, and format specifiers, which are indicated by a +- `%'. Immediately after the `%', you can optionally specify +- various flags and formatting information before the main +- formatting character, in a similar way to `printf': +- +- * Immediately following the `%' there can be one or more of the +- following flags: +- `=F' +- The single byte character F is used for this field as +- the numeric fill character. By default this character +- is a space character. Filling with this character is +- only performed if a left precision is specified. It is +- not just to fill to the given field width. +- +- `^' +- The number is printed without grouping the digits +- according to the rules of the current locale. By +- default grouping is enabled. +- +- `+', `(' +- At most one of these flags can be used. They select +- which format to represent the sign of a currency amount. +- By default, and if `+' is given, the locale equivalent +- of +/- is used. If `(' is given, negative amounts are +- enclosed in parentheses. The exact format is determined +- by the values of the `LC_MONETARY' category of the +- locale selected at program runtime. +- +- `!' +- The output will not contain the currency symbol. +- +- `-' +- The output will be formatted left-justified instead of +- right-justified if it does not fill the entire field +- width. +- +- The next part of a specification is an optional field width. If no +- width is specified 0 is taken. During output, the function first +- determines how much space is required. If it requires at least as +- many characters as given by the field width, it is output using as +- much space as necessary. Otherwise, it is extended to use the +- full width by filling with the space character. The presence or +- absence of the `-' flag determines the side at which such padding +- occurs. If present, the spaces are added at the right making the +- output left-justified, and vice versa. +- +- So far the format looks familiar, being similar to the `printf' and +- `strftime' formats. However, the next two optional fields +- introduce something new. The first one is a `#' character followed +- by a decimal digit string. The value of the digit string +- specifies the number of _digit_ positions to the left of the +- decimal point (or equivalent). This does _not_ include the +- grouping character when the `^' flag is not given. If the space +- needed to print the number does not fill the whole width, the +- field is padded at the left side with the fill character, which +- can be selected using the `=' flag and by default is a space. For +- example, if the field width is selected as 6 and the number is +- 123, the fill character is `*' the result will be `***123'. +- +- The second optional field starts with a `.' (period) and consists +- of another decimal digit string. Its value describes the number of +- characters printed after the decimal point. The default is +- selected from the current locale (`frac_digits', +- `int_frac_digits', see *note General Numeric::). If the exact +- representation needs more digits than given by the field width, +- the displayed value is rounded. If the number of fractional +- digits is selected to be zero, no decimal point is printed. +- +- As a GNU extension, the `strfmon' implementation in the GNU libc +- allows an optional `L' next as a format modifier. If this modifier +- is given, the argument is expected to be a `long double' instead of +- a `double' value. +- +- Finally, the last component is a format specifier. There are three +- specifiers defined: +- +- `i' +- Use the locale's rules for formatting an international +- currency value. +- +- `n' +- Use the locale's rules for formatting a national currency +- value. +- +- `%' +- Place a `%' in the output. There must be no flag, width +- specifier or modifier given, only `%%' is allowed. +- +- As for `printf', the function reads the format string from left to +- right and uses the values passed to the function following the +- format string. The values are expected to be either of type +- `double' or `long double', depending on the presence of the +- modifier `L'. The result is stored in the buffer pointed to by S. +- At most MAXSIZE characters are stored. +- +- The return value of the function is the number of characters +- stored in S, including the terminating `NULL' byte. If the number +- of characters stored would exceed MAXSIZE, the function returns -1 +- and the content of the buffer S is unspecified. In this case +- `errno' is set to `E2BIG'. +- +- A few examples should make clear how the function works. It is +-assumed that all the following pieces of code are executed in a program +-which uses the USA locale (`en_US'). The simplest form of the format +-is this: +- +- strfmon (buf, 100, "@%n@%n@%n@", 123.45, -567.89, 12345.678); +- +-The output produced is +- "@$123.45@-$567.89@$12,345.68@" +- +- We can notice several things here. First, the widths of the output +-numbers are different. We have not specified a width in the format +-string, and so this is no wonder. Second, the third number is printed +-using thousands separators. The thousands separator for the `en_US' +-locale is a comma. The number is also rounded. .678 is rounded to .68 +-since the format does not specify a precision and the default value in +-the locale is 2. Finally, note that the national currency symbol is +-printed since `%n' was used, not `i'. The next example shows how we +-can align the output. +- +- strfmon (buf, 100, "@%=*11n@%=*11n@%=*11n@", 123.45, -567.89, 12345.678); +- +-The output this time is: +- +- "@ $123.45@ -$567.89@ $12,345.68@" +- +- Two things stand out. Firstly, all fields have the same width +-(eleven characters) since this is the width given in the format and +-since no number required more characters to be printed. The second +-important point is that the fill character is not used. This is +-correct since the white space was not used to achieve a precision given +-by a `#' modifier, but instead to fill to the given width. The +-difference becomes obvious if we now add a width specification. +- +- strfmon (buf, 100, "@%=*11#5n@%=*11#5n@%=*11#5n@", +- 123.45, -567.89, 12345.678); +- +-The output is +- +- "@ $***123.45@-$***567.89@ $12,456.68@" +- +- Here we can see that all the currency symbols are now aligned, and +-that the space between the currency sign and the number is filled with +-the selected fill character. Note that although the width is selected +-to be 5 and 123.45 has three digits left of the decimal point, the +-space is filled with three asterisks. This is correct since, as +-explained above, the width does not include the positions used to store +-thousands separators. One last example should explain the remaining +-functionality. +- +- strfmon (buf, 100, "@%=0(16#5.3i@%=0(16#5.3i@%=0(16#5.3i@", +- 123.45, -567.89, 12345.678); +- +-This rather complex format string produces the following output: +- +- "@ USD 000123,450 @(USD 000567.890)@ USD 12,345.678 @" +- +- The most noticeable change is the alternative way of representing +-negative numbers. In financial circles this is often done using +-parentheses, and this is what the `(' flag selected. The fill +-character is now `0'. Note that this `0' character is not regarded as +-a numeric zero, and therefore the first and second numbers are not +-printed using a thousands separator. Since we used the format +-specifier `i' instead of `n', the international form of the currency +-symbol is used. This is a four letter string, in this case `"USD "'. +-The last point is that since the precision right of the decimal point +-is selected to be three, the first and second numbers are printed with +-an extra zero at the end and the third number is printed without +-rounding. +- +- +-File: libc.info, Node: Yes-or-No Questions, Prev: Formatting Numbers, Up: Locales +- +-Yes-or-No Questions +-=================== +- +- Some non GUI programs ask a yes-or-no question. If the messages +-(especially the questions) are translated into foreign languages, be +-sure that you localize the answers too. It would be very bad habit to +-ask a question in one language and request the answer in another, often +-English. +- +- The GNU C library contains `rpmatch' to give applications easy +-access to the corresponding locale definitions. +- +- - Function: int rpmatch (const char *RESPONSE) +- The function `rpmatch' checks the string in RESPONSE whether or +- not it is a correct yes-or-no answer and if yes, which one. The +- check uses the `YESEXPR' and `NOEXPR' data in the `LC_MESSAGES' +- category of the currently selected locale. The return value is as +- follows: +- +- `1' +- The user entered an affirmative answer. +- +- `0' +- The user entered a negative answer. +- +- `-1' +- The answer matched neither the `YESEXPR' nor the `NOEXPR' +- regular expression. +- +- This function is not standardized but available beside in GNU libc +- at least also in the IBM AIX library. +- +-This function would normally be used like this: +- +- ... +- /* Use a safe default. */ +- _Bool doit = false; +- +- fputs (gettext ("Do you really want to do this? "), stdout); +- fflush (stdout); +- /* Prepare the `getline' call. */ +- line = NULL; +- len = 0; +- while (getline (&line, &len, stdout) >= 0) +- { +- /* Check the response. */ +- int res = rpmatch (line); +- if (res >= 0) +- { +- /* We got a definitive answer. */ +- if (res > 0) +- doit = true; +- break; +- } +- } +- /* Free what `getline' allocated. */ +- free (line); +- +- Note that the loop continues until an read error is detected or +-until a definitive (positive or negative) answer is read. +- +- +-File: libc.info, Node: Message Translation, Next: Searching and Sorting, Prev: Locales, Up: Top +- +-Message Translation +-******************* +- +- The program's interface with the human should be designed in a way to +-ease the human the task. One of the possibilities is to use messages in +-whatever language the user prefers. +- +- Printing messages in different languages can be implemented in +-different ways. One could add all the different languages in the +-source code and add among the variants every time a message has to be +-printed. This is certainly no good solution since extending the set of +-languages is difficult (the code must be changed) and the code itself +-can become really big with dozens of message sets. +- +- A better solution is to keep the message sets for each language are +-kept in separate files which are loaded at runtime depending on the +-language selection of the user. +- +- The GNU C Library provides two different sets of functions to support +-message translation. The problem is that neither of the interfaces is +-officially defined by the POSIX standard. The `catgets' family of +-functions is defined in the X/Open standard but this is derived from +-industry decisions and therefore not necessarily based on reasonable +-decisions. +- +- As mentioned above the message catalog handling provides easy +-extendibility by using external data files which contain the message +-translations. I.e., these files contain for each of the messages used +-in the program a translation for the appropriate language. So the tasks +-of the message handling functions are +- +- * locate the external data file with the appropriate translations. +- +- * load the data and make it possible to address the messages +- +- * map a given key to the translated message +- +- The two approaches mainly differ in the implementation of this last +-step. The design decisions made for this influences the whole rest. +- +-* Menu: +- +-* Message catalogs a la X/Open:: The `catgets' family of functions. +-* The Uniforum approach:: The `gettext' family of functions. +- +- +-File: libc.info, Node: Message catalogs a la X/Open, Next: The Uniforum approach, Up: Message Translation +- +-X/Open Message Catalog Handling +-=============================== +- +- The `catgets' functions are based on the simple scheme: +- +- Associate every message to translate in the source code with a +- unique identifier. To retrieve a message from a catalog file +- solely the identifier is used. +- +- This means for the author of the program that s/he will have to make +-sure the meaning of the identifier in the program code and in the +-message catalogs are always the same. +- +- Before a message can be translated the catalog file must be located. +-The user of the program must be able to guide the responsible function +-to find whatever catalog the user wants. This is separated from what +-the programmer had in mind. +- +- All the types, constants and functions for the `catgets' functions +-are defined/declared in the `nl_types.h' header file. +- +-* Menu: +- +-* The catgets Functions:: The `catgets' function family. +-* The message catalog files:: Format of the message catalog files. +-* The gencat program:: How to generate message catalogs files which +- can be used by the functions. +-* Common Usage:: How to use the `catgets' interface. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-13 glibc-2.3.2-200304020432/manual/libc.info-13 +--- glibc-2.3.2/manual/libc.info-13 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-13 Thu Jan 1 01:00:00 1970 +@@ -1,938 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: The catgets Functions, Next: The message catalog files, Up: Message catalogs a la X/Open +- +-The `catgets' function family +------------------------------ +- +- - Function: nl_catd catopen (const char *CAT_NAME, int FLAG) +- The `catgets' function tries to locate the message data file names +- CAT_NAME and loads it when found. The return value is of an +- opaque type and can be used in calls to the other functions to +- refer to this loaded catalog. +- +- The return value is `(nl_catd) -1' in case the function failed and +- no catalog was loaded. The global variable ERRNO contains a code +- for the error causing the failure. But even if the function call +- succeeded this does not mean that all messages can be translated. +- +- Locating the catalog file must happen in a way which lets the user +- of the program influence the decision. It is up to the user to +- decide about the language to use and sometimes it is useful to use +- alternate catalog files. All this can be specified by the user by +- setting some environment variables. +- +- The first problem is to find out where all the message catalogs are +- stored. Every program could have its own place to keep all the +- different files but usually the catalog files are grouped by +- languages and the catalogs for all programs are kept in the same +- place. +- +- To tell the `catopen' function where the catalog for the program +- can be found the user can set the environment variable `NLSPATH' to +- a value which describes her/his choice. Since this value must be +- usable for different languages and locales it cannot be a simple +- string. Instead it is a format string (similar to `printf''s). +- An example is +- +- /usr/share/locale/%L/%N:/usr/share/locale/%L/LC_MESSAGES/%N +- +- First one can see that more than one directory can be specified +- (with the usual syntax of separating them by colons). The next +- things to observe are the format string, `%L' and `%N' in this +- case. The `catopen' function knows about several of them and the +- replacement for all of them is of course different. +- +- `%N' +- This format element is substituted with the name of the +- catalog file. This is the value of the CAT_NAME argument +- given to `catgets'. +- +- `%L' +- This format element is substituted with the name of the +- currently selected locale for translating messages. How this +- is determined is explained below. +- +- `%l' +- (This is the lowercase ell.) This format element is +- substituted with the language element of the locale name. +- The string describing the selected locale is expected to have +- the form `LANG[_TERR[.CODESET]]' and this format uses the +- first part LANG. +- +- `%t' +- This format element is substituted by the territory part TERR +- of the name of the currently selected locale. See the +- explanation of the format above. +- +- `%c' +- This format element is substituted by the codeset part +- CODESET of the name of the currently selected locale. See +- the explanation of the format above. +- +- `%%' +- Since `%' is used in a meta character there must be a way to +- express the `%' character in the result itself. Using `%%' +- does this just like it works for `printf'. +- +- Using `NLSPATH' allows arbitrary directories to be searched for +- message catalogs while still allowing different languages to be +- used. If the `NLSPATH' environment variable is not set, the +- default value is +- +- PREFIX/share/locale/%L/%N:PREFIX/share/locale/%L/LC_MESSAGES/%N +- +- where PREFIX is given to `configure' while installing the GNU C +- Library (this value is in many cases `/usr' or the empty string). +- +- The remaining problem is to decide which must be used. The value +- decides about the substitution of the format elements mentioned +- above. First of all the user can specify a path in the message +- catalog name (i.e., the name contains a slash character). In this +- situation the `NLSPATH' environment variable is not used. The +- catalog must exist as specified in the program, perhaps relative +- to the current working directory. This situation in not desirable +- and catalogs names never should be written this way. Beside this, +- this behavior is not portable to all other platforms providing the +- `catgets' interface. +- +- Otherwise the values of environment variables from the standard +- environment are examined (*note Standard Environment::). Which +- variables are examined is decided by the FLAG parameter of +- `catopen'. If the value is `NL_CAT_LOCALE' (which is defined in +- `nl_types.h') then the `catopen' function use the name of the +- locale currently selected for the `LC_MESSAGES' category. +- +- If FLAG is zero the `LANG' environment variable is examined. This +- is a left-over from the early days where the concept of the locales +- had not even reached the level of POSIX locales. +- +- The environment variable and the locale name should have a value +- of the form `LANG[_TERR[.CODESET]]' as explained above. If no +- environment variable is set the `"C"' locale is used which +- prevents any translation. +- +- The return value of the function is in any case a valid string. +- Either it is a translation from a message catalog or it is the +- same as the STRING parameter. So a piece of code to decide +- whether a translation actually happened must look like this: +- +- { +- char *trans = catgets (desc, set, msg, input_string); +- if (trans == input_string) +- { +- /* Something went wrong. */ +- } +- } +- +- When an error occurred the global variable ERRNO is set to +- +- EBADF +- The catalog does not exist. +- +- ENOMSG +- The set/message tuple does not name an existing element in the +- message catalog. +- +- While it sometimes can be useful to test for errors programs +- normally will avoid any test. If the translation is not available +- it is no big problem if the original, untranslated message is +- printed. Either the user understands this as well or s/he will +- look for the reason why the messages are not translated. +- +- Please note that the currently selected locale does not depend on a +-call to the `setlocale' function. It is not necessary that the locale +-data files for this locale exist and calling `setlocale' succeeds. The +-`catopen' function directly reads the values of the environment +-variables. +- +- - Function: char * catgets (nl_catd CATALOG_DESC, int SET, int +- MESSAGE, const char *STRING) +- The function `catgets' has to be used to access the massage catalog +- previously opened using the `catopen' function. The CATALOG_DESC +- parameter must be a value previously returned by `catopen'. +- +- The next two parameters, SET and MESSAGE, reflect the internal +- organization of the message catalog files. This will be explained +- in detail below. For now it is interesting to know that a catalog +- can consists of several set and the messages in each thread are +- individually numbered using numbers. Neither the set number nor +- the message number must be consecutive. They can be arbitrarily +- chosen. But each message (unless equal to another one) must have +- its own unique pair of set and message number. +- +- Since it is not guaranteed that the message catalog for the +- language selected by the user exists the last parameter STRING +- helps to handle this case gracefully. If no matching string can +- be found STRING is returned. This means for the programmer that +- +- * the STRING parameters should contain reasonable text (this +- also helps to understand the program seems otherwise there +- would be no hint on the string which is expected to be +- returned. +- +- * all STRING arguments should be written in the same language. +- +- It is somewhat uncomfortable to write a program using the `catgets' +-functions if no supporting functionality is available. Since each +-set/message number tuple must be unique the programmer must keep lists +-of the messages at the same time the code is written. And the work +-between several people working on the same project must be coordinated. +-We will see some how these problems can be relaxed a bit (*note Common +-Usage::). +- +- - Function: int catclose (nl_catd CATALOG_DESC) +- The `catclose' function can be used to free the resources +- associated with a message catalog which previously was opened by a +- call to `catopen'. If the resources can be successfully freed the +- function returns `0'. Otherwise it return `-1' and the global +- variable ERRNO is set. Errors can occur if the catalog descriptor +- CATALOG_DESC is not valid in which case ERRNO is set to `EBADF'. +- +- +-File: libc.info, Node: The message catalog files, Next: The gencat program, Prev: The catgets Functions, Up: Message catalogs a la X/Open +- +-Format of the message catalog files +------------------------------------ +- +- The only reasonable way the translate all the messages of a function +-and store the result in a message catalog file which can be read by the +-`catopen' function is to write all the message text to the translator +-and let her/him translate them all. I.e., we must have a file with +-entries which associate the set/message tuple with a specific +-translation. This file format is specified in the X/Open standard and +-is as follows: +- +- * Lines containing only whitespace characters or empty lines are +- ignored. +- +- * Lines which contain as the first non-whitespace character a `$' +- followed by a whitespace character are comment and are also +- ignored. +- +- * If a line contains as the first non-whitespace characters the +- sequence `$set' followed by a whitespace character an additional +- argument is required to follow. This argument can either be: +- +- - a number. In this case the value of this number determines +- the set to which the following messages are added. +- +- - an identifier consisting of alphanumeric characters plus the +- underscore character. In this case the set get automatically +- a number assigned. This value is one added to the largest +- set number which so far appeared. +- +- How to use the symbolic names is explained in section *Note +- Common Usage::. +- +- It is an error if a symbol name appears more than once. All +- following messages are placed in a set with this number. +- +- * If a line contains as the first non-whitespace characters the +- sequence `$delset' followed by a whitespace character an +- additional argument is required to follow. This argument can +- either be: +- +- - a number. In this case the value of this number determines +- the set which will be deleted. +- +- - an identifier consisting of alphanumeric characters plus the +- underscore character. This symbolic identifier must match a +- name for a set which previously was defined. It is an error +- if the name is unknown. +- +- In both cases all messages in the specified set will be removed. +- They will not appear in the output. But if this set is later +- again selected with a `$set' command again messages could be added +- and these messages will appear in the output. +- +- * If a line contains after leading whitespaces the sequence +- `$quote', the quoting character used for this input file is +- changed to the first non-whitespace character following the +- `$quote'. If no non-whitespace character is present before the +- line ends quoting is disable. +- +- By default no quoting character is used. In this mode strings are +- terminated with the first unescaped line break. If there is a +- `$quote' sequence present newline need not be escaped. Instead a +- string is terminated with the first unescaped appearance of the +- quote character. +- +- A common usage of this feature would be to set the quote character +- to `"'. Then any appearance of the `"' in the strings must be +- escaped using the backslash (i.e., `\"' must be written). +- +- * Any other line must start with a number or an alphanumeric +- identifier (with the underscore character included). The +- following characters (starting after the first whitespace +- character) will form the string which gets associated with the +- currently selected set and the message number represented by the +- number and identifier respectively. +- +- If the start of the line is a number the message number is +- obvious. It is an error if the same message number already +- appeared for this set. +- +- If the leading token was an identifier the message number gets +- automatically assigned. The value is the current maximum messages +- number for this set plus one. It is an error if the identifier was +- already used for a message in this set. It is OK to reuse the +- identifier for a message in another thread. How to use the +- symbolic identifiers will be explained below (*note Common +- Usage::). There is one limitation with the identifier: it must +- not be `Set'. The reason will be explained below. +- +- The text of the messages can contain escape characters. The usual +- bunch of characters known from the ISO C language are recognized +- (`\n', `\t', `\v', `\b', `\r', `\f', `\\', and `\NNN', where NNN +- is the octal coding of a character code). +- +- *Important:* The handling of identifiers instead of numbers for the +-set and messages is a GNU extension. Systems strictly following the +-X/Open specification do not have this feature. An example for a message +-catalog file is this: +- +- $ This is a leading comment. +- $quote " +- +- $set SetOne +- 1 Message with ID 1. +- two " Message with ID \"two\", which gets the value 2 assigned" +- +- $set SetTwo +- $ Since the last set got the number 1 assigned this set has number 2. +- 4000 "The numbers can be arbitrary, they need not start at one." +- +- This small example shows various aspects: +- * Lines 1 and 9 are comments since they start with `$' followed by a +- whitespace. +- +- * The quoting character is set to `"'. Otherwise the quotes in the +- message definition would have to be left away and in this case the +- message with the identifier `two' would loose its leading +- whitespace. +- +- * Mixing numbered messages with message having symbolic names is no +- problem and the numbering happens automatically. +- +- While this file format is pretty easy it is not the best possible for +-use in a running program. The `catopen' function would have to parser +-the file and handle syntactic errors gracefully. This is not so easy +-and the whole process is pretty slow. Therefore the `catgets' +-functions expect the data in another more compact and ready-to-use file +-format. There is a special program `gencat' which is explained in +-detail in the next section. +- +- Files in this other format are not human readable. To be easy to +-use by programs it is a binary file. But the format is byte order +-independent so translation files can be shared by systems of arbitrary +-architecture (as long as they use the GNU C Library). +- +- Details about the binary file format are not important to know since +-these files are always created by the `gencat' program. The sources of +-the GNU C Library also provide the sources for the `gencat' program and +-so the interested reader can look through these source files to learn +-about the file format. +- +- +-File: libc.info, Node: The gencat program, Next: Common Usage, Prev: The message catalog files, Up: Message catalogs a la X/Open +- +-Generate Message Catalogs files +-------------------------------- +- +- The `gencat' program is specified in the X/Open standard and the GNU +-implementation follows this specification and so processes all +-correctly formed input files. Additionally some extension are +-implemented which help to work in a more reasonable way with the +-`catgets' functions. +- +- The `gencat' program can be invoked in two ways: +- +- `gencat [OPTION]... [OUTPUT-FILE [INPUT-FILE]...]` +- +- This is the interface defined in the X/Open standard. If no +-INPUT-FILE parameter is given input will be read from standard input. +-Multiple input files will be read as if they are concatenated. If +-OUTPUT-FILE is also missing, the output will be written to standard +-output. To provide the interface one is used to from other programs a +-second interface is provided. +- +- `gencat [OPTION]... -o OUTPUT-FILE [INPUT-FILE]...` +- +- The option `-o' is used to specify the output file and all file +-arguments are used as input files. +- +- Beside this one can use `-' or `/dev/stdin' for INPUT-FILE to denote +-the standard input. Corresponding one can use `-' and `/dev/stdout' +-for OUTPUT-FILE to denote standard output. Using `-' as a file name is +-allowed in X/Open while using the device names is a GNU extension. +- +- The `gencat' program works by concatenating all input files and then +-*merge* the resulting collection of message sets with a possibly +-existing output file. This is done by removing all messages with +-set/message number tuples matching any of the generated messages from +-the output file and then adding all the new messages. To regenerate a +-catalog file while ignoring the old contents therefore requires to +-remove the output file if it exists. If the output is written to +-standard output no merging takes place. +- +-The following table shows the options understood by the `gencat' +-program. The X/Open standard does not specify any option for the +-program so all of these are GNU extensions. +- +-`-V' +-`--version' +- Print the version information and exit. +- +-`-h' +-`--help' +- Print a usage message listing all available options, then exit +- successfully. +- +-`--new' +- Do never merge the new messages from the input files with the old +- content of the output files. The old content of the output file +- is discarded. +- +-`-H' +-`--header=name' +- This option is used to emit the symbolic names given to sets and +- messages in the input files for use in the program. Details about +- how to use this are given in the next section. The NAME parameter +- to this option specifies the name of the output file. It will +- contain a number of C preprocessor `#define's to associate a name +- with a number. +- +- Please note that the generated file only contains the symbols from +- the input files. If the output is merged with the previous +- content of the output file the possibly existing symbols from the +- file(s) which generated the old output files are not in the +- generated header file. +- +- +-File: libc.info, Node: Common Usage, Prev: The gencat program, Up: Message catalogs a la X/Open +- +-How to use the `catgets' interface +----------------------------------- +- +- The `catgets' functions can be used in two different ways. By +-following slavishly the X/Open specs and not relying on the extension +-and by using the GNU extensions. We will take a look at the former +-method first to understand the benefits of extensions. +- +-Not using symbolic names +-........................ +- +- Since the X/Open format of the message catalog files does not allow +-symbol names we have to work with numbers all the time. When we start +-writing a program we have to replace all appearances of translatable +-strings with something like +- +- catgets (catdesc, set, msg, "string") +- +-CATGETS is retrieved from a call to `catopen' which is normally done +-once at the program start. The `"string"' is the string we want to +-translate. The problems start with the set and message numbers. +- +- In a bigger program several programmers usually work at the same +-time on the program and so coordinating the number allocation is +-crucial. Though no two different strings must be indexed by the same +-tuple of numbers it is highly desirable to reuse the numbers for equal +-strings with equal translations (please note that there might be +-strings which are equal in one language but have different translations +-due to difference contexts). +- +- The allocation process can be relaxed a bit by different set numbers +-for different parts of the program. So the number of developers who +-have to coordinate the allocation can be reduced. But still lists must +-be keep track of the allocation and errors can easily happen. These +-errors cannot be discovered by the compiler or the `catgets' functions. +-Only the user of the program might see wrong messages printed. In the +-worst cases the messages are so irritating that they cannot be +-recognized as wrong. Think about the translations for `"true"' and +-`"false"' being exchanged. This could result in a disaster. +- +-Using symbolic names +-.................... +- +- The problems mentioned in the last section derive from the fact that: +- +- 1. the numbers are allocated once and due to the possibly frequent +- use of them it is difficult to change a number later. +- +- 2. the numbers do not allow to guess anything about the string and +- therefore collisions can easily happen. +- +- By constantly using symbolic names and by providing a method which +-maps the string content to a symbolic name (however this will happen) +-one can prevent both problems above. The cost of this is that the +-programmer has to write a complete message catalog file while s/he is +-writing the program itself. +- +- This is necessary since the symbolic names must be mapped to numbers +-before the program sources can be compiled. In the last section it was +-described how to generate a header containing the mapping of the names. +-E.g., for the example message file given in the last section we could +-call the `gencat' program as follow (assume `ex.msg' contains the +-sources). +- +- gencat -H ex.h -o ex.cat ex.msg +- +-This generates a header file with the following content: +- +- #define SetTwoSet 0x2 /* ex.msg:8 */ +- +- #define SetOneSet 0x1 /* ex.msg:4 */ +- #define SetOnetwo 0x2 /* ex.msg:6 */ +- +- As can be seen the various symbols given in the source file are +-mangled to generate unique identifiers and these identifiers get numbers +-assigned. Reading the source file and knowing about the rules will +-allow to predict the content of the header file (it is deterministic) +-but this is not necessary. The `gencat' program can take care for +-everything. All the programmer has to do is to put the generated header +-file in the dependency list of the source files of her/his project and +-to add a rules to regenerate the header of any of the input files +-change. +- +- One word about the symbol mangling. Every symbol consists of two +-parts: the name of the message set plus the name of the message or the +-special string `Set'. So `SetOnetwo' means this macro can be used to +-access the translation with identifier `two' in the message set +-`SetOne'. +- +- The other names denote the names of the message sets. The special +-string `Set' is used in the place of the message identifier. +- +- If in the code the second string of the set `SetOne' is used the C +-code should look like this: +- +- catgets (catdesc, SetOneSet, SetOnetwo, +- " Message with ID \"two\", which gets the value 2 assigned") +- +- Writing the function this way will allow to change the message number +-and even the set number without requiring any change in the C source +-code. (The text of the string is normally not the same; this is only +-for this example.) +- +-How does to this allow to develop +-................................. +- +- To illustrate the usual way to work with the symbolic version numbers +-here is a little example. Assume we want to write the very complex and +-famous greeting program. We start by writing the code as usual: +- +- #include +- int +- main (void) +- { +- printf ("Hello, world!\n"); +- return 0; +- } +- +- Now we want to internationalize the message and therefore replace the +-message with whatever the user wants. +- +- #include +- #include +- #include "msgnrs.h" +- int +- main (void) +- { +- nl_catd catdesc = catopen ("hello.cat", NL_CAT_LOCALE); +- printf (catgets (catdesc, SetMainSet, SetMainHello, +- "Hello, world!\n")); +- catclose (catdesc); +- return 0; +- } +- +- We see how the catalog object is opened and the returned descriptor +-used in the other function calls. It is not really necessary to check +-for failure of any of the functions since even in these situations the +-functions will behave reasonable. They simply will be return a +-translation. +- +- What remains unspecified here are the constants `SetMainSet' and +-`SetMainHello'. These are the symbolic names describing the message. +-To get the actual definitions which match the information in the +-catalog file we have to create the message catalog source file and +-process it using the `gencat' program. +- +- $ Messages for the famous greeting program. +- $quote " +- +- $set Main +- Hello "Hallo, Welt!\n" +- +- Now we can start building the program (assume the message catalog +-source file is named `hello.msg' and the program source file `hello.c'): +- +- % gencat -H msgnrs.h -o hello.cat hello.msg +- % cat msgnrs.h +- #define MainSet 0x1 /* hello.msg:4 */ +- #define MainHello 0x1 /* hello.msg:5 */ +- % gcc -o hello hello.c -I. +- % cp hello.cat /usr/share/locale/de/LC_MESSAGES +- % echo $LC_ALL +- de +- % ./hello +- Hallo, Welt! +- % +- +- The call of the `gencat' program creates the missing header file +-`msgnrs.h' as well as the message catalog binary. The former is used +-in the compilation of `hello.c' while the later is placed in a +-directory in which the `catopen' function will try to locate it. +-Please check the `LC_ALL' environment variable and the default path for +-`catopen' presented in the description above. +- +- +-File: libc.info, Node: The Uniforum approach, Prev: Message catalogs a la X/Open, Up: Message Translation +- +-The Uniforum approach to Message Translation +-============================================ +- +- Sun Microsystems tried to standardize a different approach to message +-translation in the Uniforum group. There never was a real standard +-defined but still the interface was used in Sun's operation systems. +-Since this approach fits better in the development process of free +-software it is also used throughout the GNU project and the GNU +-`gettext' package provides support for this outside the GNU C Library. +- +- The code of the `libintl' from GNU `gettext' is the same as the code +-in the GNU C Library. So the documentation in the GNU `gettext' manual +-is also valid for the functionality here. The following text will +-describe the library functions in detail. But the numerous helper +-programs are not described in this manual. Instead people should read +-the GNU `gettext' manual (*note GNU gettext utilities: (gettext)Top.). +-We will only give a short overview. +- +- Though the `catgets' functions are available by default on more +-systems the `gettext' interface is at least as portable as the former. +-The GNU `gettext' package can be used wherever the functions are not +-available. +- +-* Menu: +- +-* Message catalogs with gettext:: The `gettext' family of functions. +-* Helper programs for gettext:: Programs to handle message catalogs +- for `gettext'. +- +- +-File: libc.info, Node: Message catalogs with gettext, Next: Helper programs for gettext, Up: The Uniforum approach +- +-The `gettext' family of functions +---------------------------------- +- +- The paradigms underlying the `gettext' approach to message +-translations is different from that of the `catgets' functions the +-basic functionally is equivalent. There are functions of the following +-categories: +- +-* Menu: +- +-* Translation with gettext:: What has to be done to translate a message. +-* Locating gettext catalog:: How to determine which catalog to be used. +-* Advanced gettext functions:: Additional functions for more complicated +- situations. +-* Charset conversion in gettext:: How to specify the output character set +- `gettext' uses. +-* GUI program problems:: How to use `gettext' in GUI programs. +-* Using gettextized software:: The possibilities of the user to influence +- the way `gettext' works. +- +- +-File: libc.info, Node: Translation with gettext, Next: Locating gettext catalog, Up: Message catalogs with gettext +- +-What has to be done to translate a message? +-........................................... +- +- The `gettext' functions have a very simple interface. The most +-basic function just takes the string which shall be translated as the +-argument and it returns the translation. This is fundamentally +-different from the `catgets' approach where an extra key is necessary +-and the original string is only used for the error case. +- +- If the string which has to be translated is the only argument this of +-course means the string itself is the key. I.e., the translation will +-be selected based on the original string. The message catalogs must +-therefore contain the original strings plus one translation for any such +-string. The task of the `gettext' function is it to compare the +-argument string with the available strings in the catalog and return the +-appropriate translation. Of course this process is optimized so that +-this process is not more expensive than an access using an atomic key +-like in `catgets'. +- +- The `gettext' approach has some advantages but also some +-disadvantages. Please see the GNU `gettext' manual for a detailed +-discussion of the pros and cons. +- +- All the definitions and declarations for `gettext' can be found in +-the `libintl.h' header file. On systems where these functions are not +-part of the C library they can be found in a separate library named +-`libintl.a' (or accordingly different for shared libraries). +- +- - Function: char * gettext (const char *MSGID) +- The `gettext' function searches the currently selected message +- catalogs for a string which is equal to MSGID. If there is such a +- string available it is returned. Otherwise the argument string +- MSGID is returned. +- +- Please note that all though the return value is `char *' the +- returned string must not be changed. This broken type results +- from the history of the function and does not reflect the way the +- function should be used. +- +- Please note that above we wrote "message catalogs" (plural). This +- is a specialty of the GNU implementation of these functions and we +- will say more about this when we talk about the ways message +- catalogs are selected (*note Locating gettext catalog::). +- +- The `gettext' function does not modify the value of the global +- ERRNO variable. This is necessary to make it possible to write +- something like +- +- printf (gettext ("Operation failed: %m\n")); +- +- Here the ERRNO value is used in the `printf' function while +- processing the `%m' format element and if the `gettext' function +- would change this value (it is called before `printf' is called) +- we would get a wrong message. +- +- So there is no easy way to detect a missing message catalog beside +- comparing the argument string with the result. But it is normally +- the task of the user to react on missing catalogs. The program +- cannot guess when a message catalog is really necessary since for +- a user who speaks the language the program was developed in does +- not need any translation. +- +- The remaining two functions to access the message catalog add some +-functionality to select a message catalog which is not the default one. +-This is important if parts of the program are developed independently. +-Every part can have its own message catalog and all of them can be used +-at the same time. The C library itself is an example: internally it +-uses the `gettext' functions but since it must not depend on a +-currently selected default message catalog it must specify all ambiguous +-information. +- +- - Function: char * dgettext (const char *DOMAINNAME, const char *MSGID) +- The `dgettext' functions acts just like the `gettext' function. +- It only takes an additional first argument DOMAINNAME which guides +- the selection of the message catalogs which are searched for the +- translation. If the DOMAINNAME parameter is the null pointer the +- `dgettext' function is exactly equivalent to `gettext' since the +- default value for the domain name is used. +- +- As for `gettext' the return value type is `char *' which is an +- anachronism. The returned string must never be modified. +- +- - Function: char * dcgettext (const char *DOMAINNAME, const char +- *MSGID, int CATEGORY) +- The `dcgettext' adds another argument to those which `dgettext' +- takes. This argument CATEGORY specifies the last piece of +- information needed to localize the message catalog. I.e., the +- domain name and the locale category exactly specify which message +- catalog has to be used (relative to a given directory, see below). +- +- The `dgettext' function can be expressed in terms of `dcgettext' +- by using +- +- dcgettext (domain, string, LC_MESSAGES) +- +- instead of +- +- dgettext (domain, string) +- +- This also shows which values are expected for the third parameter. +- One has to use the available selectors for the categories +- available in `locale.h'. Normally the available values are +- `LC_CTYPE', `LC_COLLATE', `LC_MESSAGES', `LC_MONETARY', +- `LC_NUMERIC', and `LC_TIME'. Please note that `LC_ALL' must not +- be used and even though the names might suggest this, there is no +- relation to the environments variables of this name. +- +- The `dcgettext' function is only implemented for compatibility with +- other systems which have `gettext' functions. There is not really +- any situation where it is necessary (or useful) to use a different +- value but `LC_MESSAGES' in for the CATEGORY parameter. We are +- dealing with messages here and any other choice can only be +- irritating. +- +- As for `gettext' the return value type is `char *' which is an +- anachronism. The returned string must never be modified. +- +- When using the three functions above in a program it is a frequent +-case that the MSGID argument is a constant string. So it is worth to +-optimize this case. Thinking shortly about this one will realize that +-as long as no new message catalog is loaded the translation of a message +-will not change. This optimization is actually implemented by the +-`gettext', `dgettext' and `dcgettext' functions. +- +- +-File: libc.info, Node: Locating gettext catalog, Next: Advanced gettext functions, Prev: Translation with gettext, Up: Message catalogs with gettext +- +-How to determine which catalog to be used +-......................................... +- +- The functions to retrieve the translations for a given message have a +-remarkable simple interface. But to provide the user of the program +-still the opportunity to select exactly the translation s/he wants and +-also to provide the programmer the possibility to influence the way to +-locate the search for catalogs files there is a quite complicated +-underlying mechanism which controls all this. The code is complicated +-the use is easy. +- +- Basically we have two different tasks to perform which can also be +-performed by the `catgets' functions: +- +- 1. Locate the set of message catalogs. There are a number of files +- for different languages and which all belong to the package. +- Usually they are all stored in the filesystem below a certain +- directory. +- +- There can be arbitrary many packages installed and they can follow +- different guidelines for the placement of their files. +- +- 2. Relative to the location specified by the package the actual +- translation files must be searched, based on the wishes of the +- user. I.e., for each language the user selects the program should +- be able to locate the appropriate file. +- +- This is the functionality required by the specifications for +-`gettext' and this is also what the `catgets' functions are able to do. +-But there are some problems unresolved: +- +- * The language to be used can be specified in several different ways. +- There is no generally accepted standard for this and the user +- always expects the program understand what s/he means. E.g., to +- select the German translation one could write `de', `german', or +- `deutsch' and the program should always react the same. +- +- * Sometimes the specification of the user is too detailed. If s/he, +- e.g., specifies `de_DE.ISO-8859-1' which means German, spoken in +- Germany, coded using the ISO 8859-1 character set there is the +- possibility that a message catalog matching this exactly is not +- available. But there could be a catalog matching `de' and if the +- character set used on the machine is always ISO 8859-1 there is no +- reason why this later message catalog should not be used. (We +- call this "message inheritance".) +- +- * If a catalog for a wanted language is not available it is not +- always the second best choice to fall back on the language of the +- developer and simply not translate any message. Instead a user +- might be better able to read the messages in another language and +- so the user of the program should be able to define an precedence +- order of languages. +- +- We can divide the configuration actions in two parts: the one is +-performed by the programmer, the other by the user. We will start with +-the functions the programmer can use since the user configuration will +-be based on this. +- +- As the functions described in the last sections already mention +-separate sets of messages can be selected by a "domain name". This is a +-simple string which should be unique for each program part with uses a +-separate domain. It is possible to use in one program arbitrary many +-domains at the same time. E.g., the GNU C Library itself uses a domain +-named `libc' while the program using the C Library could use a domain +-named `foo'. The important point is that at any time exactly one +-domain is active. This is controlled with the following function. +- +- - Function: char * textdomain (const char *DOMAINNAME) +- The `textdomain' function sets the default domain, which is used in +- all future `gettext' calls, to DOMAINNAME. Please note that +- `dgettext' and `dcgettext' calls are not influenced if the +- DOMAINNAME parameter of these functions is not the null pointer. +- +- Before the first call to `textdomain' the default domain is +- `messages'. This is the name specified in the specification of +- the `gettext' API. This name is as good as any other name. No +- program should ever really use a domain with this name since this +- can only lead to problems. +- +- The function returns the value which is from now on taken as the +- default domain. If the system went out of memory the returned +- value is `NULL' and the global variable ERRNO is set to `ENOMEM'. +- Despite the return value type being `char *' the return string must +- not be changed. It is allocated internally by the `textdomain' +- function. +- +- If the DOMAINNAME parameter is the null pointer no new default +- domain is set. Instead the currently selected default domain is +- returned. +- +- If the DOMAINNAME parameter is the empty string the default domain +- is reset to its initial value, the domain with the name `messages'. +- This possibility is questionable to use since the domain `messages' +- really never should be used. +- +- - Function: char * bindtextdomain (const char *DOMAINNAME, const char +- *DIRNAME) +- The `bindtextdomain' function can be used to specify the directory +- which contains the message catalogs for domain DOMAINNAME for the +- different languages. To be correct, this is the directory where +- the hierarchy of directories is expected. Details are explained +- below. +- +- For the programmer it is important to note that the translations +- which come with the program have be placed in a directory +- hierarchy starting at, say, `/foo/bar'. Then the program should +- make a `bindtextdomain' call to bind the domain for the current +- program to this directory. So it is made sure the catalogs are +- found. A correctly running program does not depend on the user +- setting an environment variable. +- +- The `bindtextdomain' function can be used several times and if the +- DOMAINNAME argument is different the previously bound domains will +- not be overwritten. +- +- If the program which wish to use `bindtextdomain' at some point of +- time use the `chdir' function to change the current working +- directory it is important that the DIRNAME strings ought to be an +- absolute pathname. Otherwise the addressed directory might vary +- with the time. +- +- If the DIRNAME parameter is the null pointer `bindtextdomain' +- returns the currently selected directory for the domain with the +- name DOMAINNAME. +- +- The `bindtextdomain' function returns a pointer to a string +- containing the name of the selected directory name. The string is +- allocated internally in the function and must not be changed by the +- user. If the system went out of core during the execution of +- `bindtextdomain' the return value is `NULL' and the global +- variable ERRNO is set accordingly. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-14 glibc-2.3.2-200304020432/manual/libc.info-14 +--- glibc-2.3.2/manual/libc.info-14 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-14 Thu Jan 1 01:00:00 1970 +@@ -1,1159 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Advanced gettext functions, Next: Charset conversion in gettext, Prev: Locating gettext catalog, Up: Message catalogs with gettext +- +-Additional functions for more complicated situations +-.................................................... +- +- The functions of the `gettext' family described so far (and all the +-`catgets' functions as well) have one problem in the real world which +-have been neglected completely in all existing approaches. What is +-meant here is the handling of plural forms. +- +- Looking through Unix source code before the time anybody thought +-about internationalization (and, sadly, even afterwards) one can often +-find code similar to the following: +- +- printf ("%d file%s deleted", n, n == 1 ? "" : "s"); +- +-After the first complaints from people internationalizing the code +-people either completely avoided formulations like this or used strings +-like `"file(s)"'. Both look unnatural and should be avoided. First +-tries to solve the problem correctly looked like this: +- +- if (n == 1) +- printf ("%d file deleted", n); +- else +- printf ("%d files deleted", n); +- +- But this does not solve the problem. It helps languages where the +-plural form of a noun is not simply constructed by adding an `s' but +-that is all. Once again people fell into the trap of believing the +-rules their language is using are universal. But the handling of plural +-forms differs widely between the language families. There are two +-things we can differ between (and even inside language families); +- +- * The form how plural forms are build differs. This is a problem +- with language which have many irregularities. German, for +- instance, is a drastic case. Though English and German are part +- of the same language family (Germanic), the almost regular forming +- of plural noun forms (appending an `s') is hardly found in German. +- +- * The number of plural forms differ. This is somewhat surprising for +- those who only have experiences with Romanic and Germanic languages +- since here the number is the same (there are two). +- +- But other language families have only one form or many forms. More +- information on this in an extra section. +- +- The consequence of this is that application writers should not try to +-solve the problem in their code. This would be localization since it is +-only usable for certain, hardcoded language environments. Instead the +-extended `gettext' interface should be used. +- +- These extra functions are taking instead of the one key string two +-strings and an numerical argument. The idea behind this is that using +-the numerical argument and the first string as a key, the implementation +-can select using rules specified by the translator the right plural +-form. The two string arguments then will be used to provide a return +-value in case no message catalog is found (similar to the normal +-`gettext' behavior). In this case the rules for Germanic language is +-used and it is assumed that the first string argument is the singular +-form, the second the plural form. +- +- This has the consequence that programs without language catalogs can +-display the correct strings only if the program itself is written using +-a Germanic language. This is a limitation but since the GNU C library +-(as well as the GNU `gettext' package) are written as part of the GNU +-package and the coding standards for the GNU project require program +-being written in English, this solution nevertheless fulfills its +-purpose. +- +- - Function: char * ngettext (const char *MSGID1, const char *MSGID2, +- unsigned long int N) +- The `ngettext' function is similar to the `gettext' function as it +- finds the message catalogs in the same way. But it takes two +- extra arguments. The MSGID1 parameter must contain the singular +- form of the string to be converted. It is also used as the key +- for the search in the catalog. The MSGID2 parameter is the plural +- form. The parameter N is used to determine the plural form. If no +- message catalog is found MSGID1 is returned if `n == 1', otherwise +- `msgid2'. +- +- An example for the us of this function is: +- +- printf (ngettext ("%d file removed", "%d files removed", n), n); +- +- Please note that the numeric value N has to be passed to the +- `printf' function as well. It is not sufficient to pass it only to +- `ngettext'. +- +- - Function: char * dngettext (const char *DOMAIN, const char *MSGID1, +- const char *MSGID2, unsigned long int N) +- The `dngettext' is similar to the `dgettext' function in the way +- the message catalog is selected. The difference is that it takes +- two extra parameter to provide the correct plural form. These two +- parameters are handled in the same way `ngettext' handles them. +- +- - Function: char * dcngettext (const char *DOMAIN, const char *MSGID1, +- const char *MSGID2, unsigned long int N, int CATEGORY) +- The `dcngettext' is similar to the `dcgettext' function in the way +- the message catalog is selected. The difference is that it takes +- two extra parameter to provide the correct plural form. These two +- parameters are handled in the same way `ngettext' handles them. +- +-The problem of plural forms +-........................... +- +- A description of the problem can be found at the beginning of the +-last section. Now there is the question how to solve it. Without the +-input of linguists (which was not available) it was not possible to +-determine whether there are only a few different forms in which plural +-forms are formed or whether the number can increase with every new +-supported language. +- +- Therefore the solution implemented is to allow the translator to +-specify the rules of how to select the plural form. Since the formula +-varies with every language this is the only viable solution except for +-hardcoding the information in the code (which still would require the +-possibility of extensions to not prevent the use of new languages). The +-details are explained in the GNU `gettext' manual. Here only a a bit +-of information is provided. +- +- The information about the plural form selection has to be stored in +-the header entry (the one with the empty (`msgid' string). It looks +-like this: +- +- Plural-Forms: nplurals=2; plural=n == 1 ? 0 : 1; +- +- The `nplurals' value must be a decimal number which specifies how +-many different plural forms exist for this language. The string +-following `plural' is an expression which is using the C language +-syntax. Exceptions are that no negative number are allowed, numbers +-must be decimal, and the only variable allowed is `n'. This expression +-will be evaluated whenever one of the functions `ngettext', +-`dngettext', or `dcngettext' is called. The numeric value passed to +-these functions is then substituted for all uses of the variable `n' in +-the expression. The resulting value then must be greater or equal to +-zero and smaller than the value given as the value of `nplurals'. +- +-The following rules are known at this point. The language with families +-are listed. But this does not necessarily mean the information can be +-generalized for the whole family (as can be easily seen in the table +-below).(1) +- +-Only one form: +- Some languages only require one single form. There is no +- distinction between the singular and plural form. An appropriate +- header entry would look like this: +- +- Plural-Forms: nplurals=1; plural=0; +- +- Languages with this property include: +- +- Finno-Ugric family +- Hungarian +- +- Asian family +- Japanese +- +- Turkic/Altaic family +- Turkish +- +-Two forms, singular used for one only +- This is the form used in most existing programs since it is what +- English is using. A header entry would look like this: +- +- Plural-Forms: nplurals=2; plural=n != 1; +- +- (Note: this uses the feature of C expressions that boolean +- expressions have to value zero or one.) +- +- Languages with this property include: +- +- Germanic family +- Danish, Dutch, English, German, Norwegian, Swedish +- +- Finno-Ugric family +- Estonian, Finnish +- +- Latin/Greek family +- Greek +- +- Semitic family +- Hebrew +- +- Romance family +- Italian, Spanish +- +- Artificial +- Esperanto +- +-Two forms, singular used for zero and one +- Exceptional case in the language family. The header entry would +- be: +- +- Plural-Forms: nplurals=2; plural=n>1; +- +- Languages with this property include: +- +- Romanic family +- French +- +-Three forms, special cases for one and two +- The header entry would be: +- +- Plural-Forms: nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2; +- +- Languages with this property include: +- +- Celtic +- Gaeilge +- +-Three forms, special cases for numbers ending in 1 and 2, 3, 4, except those ending in 1[1-4] +- The header entry would look like this: +- +- Plural-Forms: nplurals=3; \ +- plural=n%100/10==1 ? 2 : n%10==1 ? 0 : (n+9)%10>3 ? 2 : 1; +- +- Languages with this property include: +- +- Slavic family +- Czech, Russian +- +-Three forms, special cases for 1 and 2, 3, 4 +- The header entry would look like this: +- +- Plural-Forms: nplurals=3; \ +- plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0; +- +- Languages with this property include: +- +- Slavic family +- Slovak +- +-Three forms, special case for one and some numbers ending in 2, 3, or 4 +- The header entry would look like this: +- +- Plural-Forms: nplurals=3; \ +- plural=n==1 ? 0 : \ +- n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; +- +- (Continuation in the next line is possible.) +- +- Languages with this property include: +- +- Slavic family +- Polish +- +-Four forms, special case for one and all numbers ending in 2, 3, or 4 +- The header entry would look like this: +- +- Plural-Forms: nplurals=4; \ +- plural=n==1 ? 0 : n%10==2 ? 1 : n%10==3 || n%10==4 ? 2 : 3; +- +- Languages with this property include: +- +- Slavic family +- Slovenian +- +- ---------- Footnotes ---------- +- +- (1) Additions are welcome. Send appropriate information to +-. +- +- +-File: libc.info, Node: Charset conversion in gettext, Next: GUI program problems, Prev: Advanced gettext functions, Up: Message catalogs with gettext +- +-How to specify the output character set `gettext' uses +-...................................................... +- +- `gettext' not only looks up a translation in a message catalog. It +-also converts the translation on the fly to the desired output character +-set. This is useful if the user is working in a different character set +-than the translator who created the message catalog, because it avoids +-distributing variants of message catalogs which differ only in the +-character set. +- +- The output character set is, by default, the value of `nl_langinfo +-(CODESET)', which depends on the `LC_CTYPE' part of the current locale. +-But programs which store strings in a locale independent way (e.g. +-UTF-8) can request that `gettext' and related functions return the +-translations in that encoding, by use of the `bind_textdomain_codeset' +-function. +- +- Note that the MSGID argument to `gettext' is not subject to +-character set conversion. Also, when `gettext' does not find a +-translation for MSGID, it returns MSGID unchanged - independently of +-the current output character set. It is therefore recommended that all +-MSGIDs be US-ASCII strings. +- +- - Function: char * bind_textdomain_codeset (const char *DOMAINNAME, +- const char *CODESET) +- The `bind_textdomain_codeset' function can be used to specify the +- output character set for message catalogs for domain DOMAINNAME. +- The CODESET argument must be a valid codeset name which can be used +- for the `iconv_open' function, or a null pointer. +- +- If the CODESET parameter is the null pointer, +- `bind_textdomain_codeset' returns the currently selected codeset +- for the domain with the name DOMAINNAME. It returns `NULL' if no +- codeset has yet been selected. +- +- The `bind_textdomain_codeset' function can be used several times. +- If used multiple times with the same DOMAINNAME argument, the +- later call overrides the settings made by the earlier one. +- +- The `bind_textdomain_codeset' function returns a pointer to a +- string containing the name of the selected codeset. The string is +- allocated internally in the function and must not be changed by the +- user. If the system went out of core during the execution of +- `bind_textdomain_codeset', the return value is `NULL' and the +- global variable ERRNO is set accordingly. +- +- +-File: libc.info, Node: GUI program problems, Next: Using gettextized software, Prev: Charset conversion in gettext, Up: Message catalogs with gettext +- +-How to use `gettext' in GUI programs +-.................................... +- +- One place where the `gettext' functions, if used normally, have big +-problems is within programs with graphical user interfaces (GUIs). The +-problem is that many of the strings which have to be translated are very +-short. They have to appear in pull-down menus which restricts the +-length. But strings which are not containing entire sentences or at +-least large fragments of a sentence may appear in more than one +-situation in the program but might have different translations. This is +-especially true for the one-word strings which are frequently used in +-GUI programs. +- +- As a consequence many people say that the `gettext' approach is +-wrong and instead `catgets' should be used which indeed does not have +-this problem. But there is a very simple and powerful method to handle +-these kind of problems with the `gettext' functions. +- +-As as example consider the following fictional situation. A GUI program +-has a menu bar with the following entries: +- +- +------------+------------+--------------------------------------+ +- | File | Printer | | +- +------------+------------+--------------------------------------+ +- | Open | | Select | +- | New | | Open | +- +----------+ | Connect | +- +----------+ +- +- To have the strings `File', `Printer', `Open', `New', `Select', and +-`Connect' translated there has to be at some point in the code a call +-to a function of the `gettext' family. But in two places the string +-passed into the function would be `Open'. The translations might not +-be the same and therefore we are in the dilemma described above. +- +- One solution to this problem is to artificially enlengthen the +-strings to make them unambiguous. But what would the program do if no +-translation is available? The enlengthened string is not what should be +-printed. So we should use a little bit modified version of the +-functions. +- +- To enlengthen the strings a uniform method should be used. E.g., in +-the example above the strings could be chosen as +- +- Menu|File +- Menu|Printer +- Menu|File|Open +- Menu|File|New +- Menu|Printer|Select +- Menu|Printer|Open +- Menu|Printer|Connect +- +- Now all the strings are different and if now instead of `gettext' +-the following little wrapper function is used, everything works just +-fine: +- +- char * +- sgettext (const char *msgid) +- { +- char *msgval = gettext (msgid); +- if (msgval == msgid) +- msgval = strrchr (msgid, '|') + 1; +- return msgval; +- } +- +- What this little function does is to recognize the case when no +-translation is available. This can be done very efficiently by a +-pointer comparison since the return value is the input value. If there +-is no translation we know that the input string is in the format we used +-for the Menu entries and therefore contains a `|' character. We simply +-search for the last occurrence of this character and return a pointer +-to the character following it. That's it! +- +- If one now consistently uses the enlengthened string form and +-replaces the `gettext' calls with calls to `sgettext' (this is normally +-limited to very few places in the GUI implementation) then it is +-possible to produce a program which can be internationalized. +- +- With advanced compilers (such as GNU C) one can write the `sgettext' +-functions as an inline function or as a macro like this: +- +- #define sgettext(msgid) \ +- ({ const char *__msgid = (msgid); \ +- char *__msgstr = gettext (__msgid); \ +- if (__msgval == __msgid) \ +- __msgval = strrchr (__msgid, '|') + 1; \ +- __msgval; }) +- +- The other `gettext' functions (`dgettext', `dcgettext' and the +-`ngettext' equivalents) can and should have corresponding functions as +-well which look almost identical, except for the parameters and the +-call to the underlying function. +- +- Now there is of course the question why such functions do not exist +-in the GNU C library? There are two parts of the answer to this +-question. +- +- * They are easy to write and therefore can be provided by the +- project they are used in. This is not an answer by itself and +- must be seen together with the second part which is: +- +- * There is no way the C library can contain a version which can work +- everywhere. The problem is the selection of the character to +- separate the prefix from the actual string in the enlenghtened +- string. The examples above used `|' which is a quite good choice +- because it resembles a notation frequently used in this context +- and it also is a character not often used in message strings. +- +- But what if the character is used in message strings. Or if the +- chose character is not available in the character set on the +- machine one compiles (e.g., `|' is not required to exist for +- ISO C; this is why the `iso646.h' file exists in ISO C programming +- environments). +- +- There is only one more comment to make left. The wrapper function +-above require that the translations strings are not enlengthened +-themselves. This is only logical. There is no need to disambiguate +-the strings (since they are never used as keys for a search) and one +-also saves quite some memory and disk space by doing this. +- +- +-File: libc.info, Node: Using gettextized software, Prev: GUI program problems, Up: Message catalogs with gettext +- +-User influence on `gettext' +-........................... +- +- The last sections described what the programmer can do to +-internationalize the messages of the program. But it is finally up to +-the user to select the message s/he wants to see. S/He must understand +-them. +- +- The POSIX locale model uses the environment variables `LC_COLLATE', +-`LC_CTYPE', `LC_MESSAGES', `LC_MONETARY', `NUMERIC', and `LC_TIME' to +-select the locale which is to be used. This way the user can influence +-lots of functions. As we mentioned above the `gettext' functions also +-take advantage of this. +- +- To understand how this happens it is necessary to take a look at the +-various components of the filename which gets computed to locate a +-message catalog. It is composed as follows: +- +- DIR_NAME/LOCALE/LC_CATEGORY/DOMAIN_NAME.mo +- +- The default value for DIR_NAME is system specific. It is computed +-from the value given as the prefix while configuring the C library. +-This value normally is `/usr' or `/'. For the former the complete +-DIR_NAME is: +- +- /usr/share/locale +- +- We can use `/usr/share' since the `.mo' files containing the message +-catalogs are system independent, so all systems can use the same files. +-If the program executed the `bindtextdomain' function for the message +-domain that is currently handled, the `dir_name' component is exactly +-the value which was given to the function as the second parameter. +-I.e., `bindtextdomain' allows overwriting the only system dependent and +-fixed value to make it possible to address files anywhere in the +-filesystem. +- +- The CATEGORY is the name of the locale category which was selected +-in the program code. For `gettext' and `dgettext' this is always +-`LC_MESSAGES', for `dcgettext' this is selected by the value of the +-third parameter. As said above it should be avoided to ever use a +-category other than `LC_MESSAGES'. +- +- The LOCALE component is computed based on the category used. Just +-like for the `setlocale' function here comes the user selection into +-the play. Some environment variables are examined in a fixed order and +-the first environment variable set determines the return value of the +-lookup process. In detail, for the category `LC_xxx' the following +-variables in this order are examined: +- +-`LANGUAGE' +- +-`LC_ALL' +- +-`LC_xxx' +- +-`LANG' +- This looks very familiar. With the exception of the `LANGUAGE' +-environment variable this is exactly the lookup order the `setlocale' +-function uses. But why introducing the `LANGUAGE' variable? +- +- The reason is that the syntax of the values these variables can have +-is different to what is expected by the `setlocale' function. If we +-would set `LC_ALL' to a value following the extended syntax that would +-mean the `setlocale' function will never be able to use the value of +-this variable as well. An additional variable removes this problem +-plus we can select the language independently of the locale setting +-which sometimes is useful. +- +- While for the `LC_xxx' variables the value should consist of exactly +-one specification of a locale the `LANGUAGE' variable's value can +-consist of a colon separated list of locale names. The attentive +-reader will realize that this is the way we manage to implement one of +-our additional demands above: we want to be able to specify an ordered +-list of language. +- +- Back to the constructed filename we have only one component missing. +-The DOMAIN_NAME part is the name which was either registered using the +-`textdomain' function or which was given to `dgettext' or `dcgettext' +-as the first parameter. Now it becomes obvious that a good choice for +-the domain name in the program code is a string which is closely +-related to the program/package name. E.g., for the GNU C Library the +-domain name is `libc'. +- +-A limit piece of example code should show how the programmer is supposed +-to work: +- +- { +- setlocale (LC_ALL, ""); +- textdomain ("test-package"); +- bindtextdomain ("test-package", "/usr/local/share/locale"); +- puts (gettext ("Hello, world!")); +- } +- +- At the program start the default domain is `messages', and the +-default locale is "C". The `setlocale' call sets the locale according +-to the user's environment variables; remember that correct functioning +-of `gettext' relies on the correct setting of the `LC_MESSAGES' locale +-(for looking up the message catalog) and of the `LC_CTYPE' locale (for +-the character set conversion). The `textdomain' call changes the +-default domain to `test-package'. The `bindtextdomain' call specifies +-that the message catalogs for the domain `test-package' can be found +-below the directory `/usr/local/share/locale'. +- +- If now the user set in her/his environment the variable `LANGUAGE' +-to `de' the `gettext' function will try to use the translations from +-the file +- +- /usr/local/share/locale/de/LC_MESSAGES/test-package.mo +- +- From the above descriptions it should be clear which component of +-this filename is determined by which source. +- +- In the above example we assumed that the `LANGUAGE' environment +-variable to `de'. This might be an appropriate selection but what +-happens if the user wants to use `LC_ALL' because of the wider +-usability and here the required value is `de_DE.ISO-8859-1'? We +-already mentioned above that a situation like this is not infrequent. +-E.g., a person might prefer reading a dialect and if this is not +-available fall back on the standard language. +- +- The `gettext' functions know about situations like this and can +-handle them gracefully. The functions recognize the format of the value +-of the environment variable. It can split the value is different pieces +-and by leaving out the only or the other part it can construct new +-values. This happens of course in a predictable way. To understand +-this one must know the format of the environment variable value. There +-is one more or less standardized form, originally from the X/Open +-specification: +- +- `language[_territory[.codeset]][@modifier]' +- +- Less specific locale names will be stripped of in the order of the +-following list: +- +- 1. `codeset' +- +- 2. `normalized codeset' +- +- 3. `territory' +- +- 4. `modifier' +- +- The `language' field will never be dropped for obvious reasons. +- +- The only new thing is the `normalized codeset' entry. This is +-another goodie which is introduced to help reducing the chaos which +-derives from the inability of the people to standardize the names of +-character sets. Instead of ISO-8859-1 one can often see 8859-1, 88591, +-iso8859-1, or iso_8859-1. The `normalized codeset' value is generated +-from the user-provided character set name by applying the following +-rules: +- +- 1. Remove all characters beside numbers and letters. +- +- 2. Fold letters to lowercase. +- +- 3. If the same only contains digits prepend the string `"iso"'. +- +-So all of the above name will be normalized to `iso88591'. This allows +-the program user much more freely choosing the locale name. +- +- Even this extended functionality still does not help to solve the +-problem that completely different names can be used to denote the same +-locale (e.g., `de' and `german'). To be of help in this situation the +-locale implementation and also the `gettext' functions know about +-aliases. +- +- The file `/usr/share/locale/locale.alias' (replace `/usr' with +-whatever prefix you used for configuring the C library) contains a +-mapping of alternative names to more regular names. The system manager +-is free to add new entries to fill her/his own needs. The selected +-locale from the environment is compared with the entries in the first +-column of this file ignoring the case. If they match the value of the +-second column is used instead for the further handling. +- +- In the description of the format of the environment variables we +-already mentioned the character set as a factor in the selection of the +-message catalog. In fact, only catalogs which contain text written +-using the character set of the system/program can be used (directly; +-there will come a solution for this some day). This means for the user +-that s/he will always have to take care for this. If in the collection +-of the message catalogs there are files for the same language but coded +-using different character sets the user has to be careful. +- +- +-File: libc.info, Node: Helper programs for gettext, Prev: Message catalogs with gettext, Up: The Uniforum approach +- +-Programs to handle message catalogs for `gettext' +-------------------------------------------------- +- +- The GNU C Library does not contain the source code for the programs +-to handle message catalogs for the `gettext' functions. As part of the +-GNU project the GNU gettext package contains everything the developer +-needs. The functionality provided by the tools in this package by far +-exceeds the abilities of the `gencat' program described above for the +-`catgets' functions. +- +- There is a program `msgfmt' which is the equivalent program to the +-`gencat' program. It generates from the human-readable and -editable +-form of the message catalog a binary file which can be used by the +-`gettext' functions. But there are several more programs available. +- +- The `xgettext' program can be used to automatically extract the +-translatable messages from a source file. I.e., the programmer need not +-take care for the translations and the list of messages which have to be +-translated. S/He will simply wrap the translatable string in calls to +-`gettext' et.al and the rest will be done by `xgettext'. This program +-has a lot of option which help to customize the output or do 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 _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. +- +- +-File: libc.info, Node: Searching and Sorting, Next: Pattern Matching, Prev: Message Translation, Up: Top +- +-Searching and Sorting +-********************* +- +- This chapter describes functions for searching and sorting arrays of +-arbitrary objects. You pass the appropriate comparison function to be +-applied as an argument, along with the size of the objects in the array +-and the total number of elements. +- +-* Menu: +- +-* Comparison Functions:: Defining how to compare two objects. +- Since the sort and search facilities +- are general, you have to specify the +- ordering. +-* Array Search Function:: The `bsearch' function. +-* Array Sort Function:: The `qsort' function. +-* Search/Sort Example:: An example program. +-* Hash Search Function:: The `hsearch' function. +-* Tree Search Function:: The `tsearch' function. +- +- +-File: libc.info, Node: Comparison Functions, Next: Array Search Function, Up: Searching and Sorting +- +-Defining the Comparison Function +-================================ +- +- In order to use the sorted array library functions, you have to +-describe how to compare the elements of the array. +- +- To do this, you supply a comparison function to compare two elements +-of the array. The library will call this function, passing as arguments +-pointers to two array elements to be compared. Your comparison function +-should return a value the way `strcmp' (*note String/Array +-Comparison::) does: negative if the first argument is "less" than the +-second, zero if they are "equal", and positive if the first argument is +-"greater". +- +- Here is an example of a comparison function which works with an +-array of numbers of type `double': +- +- int +- compare_doubles (const void *a, const void *b) +- { +- const double *da = (const double *) a; +- const double *db = (const double *) b; +- +- return (*da > *db) - (*da < *db); +- } +- +- The header file `stdlib.h' defines a name for the data type of +-comparison functions. This type is a GNU extension. +- +- int comparison_fn_t (const void *, const void *); +- +- +-File: libc.info, Node: Array Search Function, Next: Array Sort Function, Prev: Comparison Functions, Up: Searching and Sorting +- +-Array Search Function +-===================== +- +- Generally searching for a specific element in an array means that +-potentially all elements must be checked. The GNU C library contains +-functions to perform linear search. The prototypes for the following +-two functions can be found in `search.h'. +- +- - Function: void * lfind (const void *KEY, void *BASE, size_t *NMEMB, +- size_t SIZE, comparison_fn_t COMPAR) +- The `lfind' function searches in the array with `*NMEMB' elements +- of SIZE bytes pointed to by BASE for an element which matches the +- one pointed to by KEY. The function pointed to by COMPAR is used +- decide whether two elements match. +- +- The return value is a pointer to the matching element in the array +- starting at BASE if it is found. If no matching element is +- available `NULL' is returned. +- +- The mean runtime of this function is `*NMEMB'/2. This 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. +- +- - Function: void * lsearch (const void *KEY, void *BASE, size_t +- *NMEMB, size_t SIZE, comparison_fn_t COMPAR) +- The `lsearch' function is similar to the `lfind' function. It +- searches the given array for an element and returns it if found. +- The difference is that if no matching element is found the +- `lsearch' function adds the object pointed to by KEY (with a size +- of SIZE bytes) at the end of the array and it increments the value +- of `*NMEMB' to reflect this addition. +- +- This means for the caller that if it is not sure that the array +- contains the element one is searching for the memory allocated for +- the array starting at BASE must have room for at least SIZE more +- bytes. If one is sure the element is in the array it is better to +- use `lfind' so having more room in the array is always necessary +- when calling `lsearch'. +- +- To search a sorted array for an element matching the key, use the +-`bsearch' function. The prototype for this function is in the header +-file `stdlib.h'. +- +- - Function: void * bsearch (const void *KEY, const void *ARRAY, size_t +- COUNT, size_t SIZE, comparison_fn_t COMPARE) +- The `bsearch' function searches the sorted array ARRAY for an +- object that is equivalent to KEY. The array contains COUNT +- elements, each of which is of size SIZE bytes. +- +- The COMPARE function is used to perform the comparison. This +- function is called with two pointer arguments and should return an +- integer less than, equal to, or greater than zero corresponding to +- whether its first argument is considered less than, equal to, or +- greater than its second argument. The elements of the ARRAY must +- already be sorted in ascending order according to this comparison +- function. +- +- The return value is a pointer to the matching array element, or a +- null pointer if no match is found. If the array contains more +- than one element that matches, the one that is returned is +- unspecified. +- +- This function derives its name from the fact that it is implemented +- using the binary search algorithm. +- +- +-File: libc.info, Node: Array Sort Function, Next: Search/Sort Example, Prev: Array Search Function, Up: Searching and Sorting +- +-Array Sort Function +-=================== +- +- To sort an array using an arbitrary comparison function, use the +-`qsort' function. The prototype for this function is in `stdlib.h'. +- +- - Function: void qsort (void *ARRAY, size_t COUNT, size_t SIZE, +- comparison_fn_t COMPARE) +- The QSORT function sorts the array ARRAY. The array contains +- COUNT elements, each of which is of size SIZE. +- +- The COMPARE function is used to perform the comparison on the +- array elements. This function is called with two pointer +- arguments and should return an integer less than, equal to, or +- greater than zero corresponding to whether its first argument is +- considered less than, equal to, or greater than its second +- argument. +- +- *Warning:* If two objects compare as equal, their order after +- sorting is unpredictable. That is to say, the sorting is not +- stable. This can make a difference when the comparison considers +- only part of the elements. Two elements with the same sort key +- may differ in other respects. +- +- If you want the effect of a stable sort, you can get this result by +- writing the comparison function so that, lacking other reason +- distinguish between two elements, it compares them by their +- addresses. Note that doing this may make the sorting algorithm +- less efficient, so do it only if necessary. +- +- Here is a simple example of sorting an array of doubles in +- numerical order, using the comparison function defined above +- (*note Comparison Functions::): +- +- { +- double *array; +- int size; +- ... +- qsort (array, size, sizeof (double), compare_doubles); +- } +- +- The `qsort' function derives its name from the fact that it was +- originally implemented using the "quick sort" algorithm. +- +- The implementation of `qsort' in this library might not be an +- in-place sort and might thereby use an extra amount of memory to +- store the array. +- +- +-File: libc.info, Node: Search/Sort Example, Next: Hash Search Function, Prev: Array Sort Function, Up: Searching and Sorting +- +-Searching and Sorting Example +-============================= +- +- Here is an example showing the use of `qsort' and `bsearch' with an +-array of structures. The objects in the array are sorted by comparing +-their `name' fields with the `strcmp' function. Then, we can look up +-individual objects based on their names. +- +- #include +- #include +- #include +- +- /* Define an array of critters to sort. */ +- +- struct critter +- { +- const char *name; +- const char *species; +- }; +- +- struct critter muppets[] = +- { +- {"Kermit", "frog"}, +- {"Piggy", "pig"}, +- {"Gonzo", "whatever"}, +- {"Fozzie", "bear"}, +- {"Sam", "eagle"}, +- {"Robin", "frog"}, +- {"Animal", "animal"}, +- {"Camilla", "chicken"}, +- {"Sweetums", "monster"}, +- {"Dr. Strangepork", "pig"}, +- {"Link Hogthrob", "pig"}, +- {"Zoot", "human"}, +- {"Dr. Bunsen Honeydew", "human"}, +- {"Beaker", "human"}, +- {"Swedish Chef", "human"} +- }; +- +- int count = sizeof (muppets) / sizeof (struct critter); +- +- +- +- /* This is the comparison function used for sorting and searching. */ +- +- int +- critter_cmp (const struct critter *c1, const struct critter *c2) +- { +- return strcmp (c1->name, c2->name); +- } +- +- +- /* Print information about a critter. */ +- +- void +- print_critter (const struct critter *c) +- { +- printf ("%s, the %s\n", c->name, c->species); +- } +- +- +- /* Do the lookup into the sorted array. */ +- +- void +- find_critter (const char *name) +- { +- struct critter target, *result; +- target.name = name; +- result = bsearch (&target, muppets, count, sizeof (struct critter), +- critter_cmp); +- if (result) +- print_critter (result); +- else +- printf ("Couldn't find %s.\n", name); +- } +- +- /* Main program. */ +- +- int +- main (void) +- { +- int i; +- +- for (i = 0; i < count; i++) +- print_critter (&muppets[i]); +- printf ("\n"); +- +- qsort (muppets, count, sizeof (struct critter), critter_cmp); +- +- for (i = 0; i < count; i++) +- print_critter (&muppets[i]); +- printf ("\n"); +- +- find_critter ("Kermit"); +- find_critter ("Gonzo"); +- find_critter ("Janice"); +- +- return 0; +- } +- +- The output from this program looks like: +- +- Kermit, the frog +- Piggy, the pig +- Gonzo, the whatever +- Fozzie, the bear +- Sam, the eagle +- Robin, the frog +- Animal, the animal +- Camilla, the chicken +- Sweetums, the monster +- Dr. Strangepork, the pig +- Link Hogthrob, the pig +- Zoot, the human +- Dr. Bunsen Honeydew, the human +- Beaker, the human +- Swedish Chef, the human +- +- Animal, the animal +- Beaker, the human +- Camilla, the chicken +- Dr. Bunsen Honeydew, the human +- Dr. Strangepork, the pig +- Fozzie, the bear +- Gonzo, the whatever +- Kermit, the frog +- Link Hogthrob, the pig +- Piggy, the pig +- Robin, the frog +- Sam, the eagle +- Swedish Chef, the human +- Sweetums, the monster +- Zoot, the human +- +- Kermit, the frog +- Gonzo, the whatever +- Couldn't find Janice. +- +- +-File: libc.info, Node: Hash Search Function, Next: Tree Search Function, Prev: Search/Sort Example, Up: Searching and Sorting +- +-The `hsearch' function. +-======================= +- +- 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 the header file +-`search.h'. +- +- - Function: int hcreate (size_t NEL) +- The `hcreate' function creates a hashing table which can contain at +- least NEL elements. There is no possibility to grow this table so +- it is necessary to choose the value for 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 +- 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 information. +- +- The weakest aspect of this function is that there can be at most +- one hashing table used through the whole program. The table is +- allocated in local memory out of control of the programmer. As an +- extension the GNU C library provides an additional set of +- functions with an reentrant interface which provide a similar +- interface but which allow to keep arbitrarily many hashing tables. +- +- It is possible to use more than one hashing table in the program +- run if the former table is first destroyed by a call to `hdestroy'. +- +- The function returns a non-zero value if successful. If it return +- zero something went wrong. This could either mean there is +- already a hashing table in use or the program runs out of memory. +- +- - Function: void hdestroy (void) +- The `hdestroy' function can be used to free all the resources +- allocated in a previous call of `hcreate'. After a call to this +- function it is again possible to call `hcreate' and allocate a new +- table with possibly different size. +- +- It is important to remember that the elements contained in the +- hashing table at the time `hdestroy' is called are _not_ freed by +- this function. It is the responsibility of the program code to +- free those strings (if necessary at all). Freeing all the element +- memory is not possible without extra, separately kept information +- since there is no function to iterate through all available +- elements in the hashing table. If it is really necessary to free +- a table and all elements the programmer has to keep a list of all +- table elements and before calling `hdestroy' s/he has to free all +- element's data using this list. This is a very unpleasant +- mechanism and it also shows that this kind of hashing tables is +- mainly meant for tables which are created once and used until the +- end of the program run. +- +- Entries of the hashing table and keys for the search are defined +-using this type: +- +- - Data type: struct ENTRY +- Both elements of this structure are pointers to zero-terminated +- strings. This is a limiting restriction of the functionality of +- the `hsearch' functions. They can only be used for data sets +- which use the NUL character always and solely to terminate the +- records. It is not possible to handle general binary data. +- +- `char *key' +- Pointer to a zero-terminated string of characters describing +- the key for the search or the element in the hashing table. +- +- `char *data' +- Pointer to a zero-terminated string of characters describing +- the data. If the functions will be called only for searching +- an existing entry this element might stay undefined since it +- is not used. +- +- - Function: ENTRY * hsearch (ENTRY ITEM, ACTION ACTION) +- To search in a hashing table created using `hcreate' the `hsearch' +- function must be used. This function can perform simple search +- for an element (if ACTION has the `FIND') or it can alternatively +- insert the key element into the hashing table. Entries are never +- replaced. +- +- The key is denoted by a pointer to an object of type `ENTRY'. For +- locating the corresponding position in the hashing table only the +- `key' element of the structure is used. +- +- If an entry with matching key is found the ACTION parameter is +- irrelevant. The found entry is returned. If no matching entry is +- found and the ACTION parameter has the value `FIND' the function +- returns a `NULL' pointer. If no entry is found and the ACTION +- parameter has the value `ENTER' a new entry is added to the +- hashing table which is initialized with the parameter ITEM. A +- pointer to the newly added entry is returned. +- +- As mentioned before the hashing table used by the functions +-described so far is global and there can be at any time at most one +-hashing table in the program. A solution is to use the following +-functions which are a GNU extension. All have in common that they +-operate on a hashing table which is described by the content of an +-object of the type `struct hsearch_data'. This type should be treated +-as opaque, none of its members should be changed directly. +- +- - Function: int hcreate_r (size_t NEL, struct hsearch_data *HTAB) +- The `hcreate_r' function initializes the object pointed to by HTAB +- to contain a hashing table with at least NEL elements. So this +- function is equivalent to the `hcreate' function except that the +- initialized data structure is controlled by the user. +- +- This allows having more than one hashing table at one time. The +- memory necessary for the `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 were successful. if +- the return value is zero something went wrong which probably means +- the programs runs out of memory. +- +- - Function: void hdestroy_r (struct hsearch_data *HTAB) +- The `hdestroy_r' function frees all resources allocated by the +- `hcreate_r' function for this very same object HTAB. As for +- `hdestroy' it is the programs responsibility to free the strings +- for the elements of the table. +- +- - Function: int hsearch_r (ENTRY ITEM, ACTION ACTION, ENTRY **RETVAL, +- struct hsearch_data *HTAB) +- The `hsearch_r' function is equivalent to `hsearch'. The meaning +- of the first two arguments is identical. But instead of operating +- on a single global hashing table the function works on the table +- described by the object pointed to by HTAB (which is initialized +- by a call to `hcreate_r'). +- +- Another difference to `hcreate' is that the pointer to the found +- entry in the table is not the return value of the functions. It is +- returned by storing it in a pointer variables pointed to by the +- RETVAL parameter. The return value of the function is an integer +- value indicating success if it is non-zero and failure if it is +- zero. In the latter case the global variable ERRNO signals the +- reason for the failure. +- +- `ENOMEM' +- The table is filled and `hsearch_r' was called with an so far +- unknown key and ACTION set to `ENTER'. +- +- `ESRCH' +- The ACTION parameter is `FIND' and no corresponding element +- is found in the table. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-15 glibc-2.3.2-200304020432/manual/libc.info-15 +--- glibc-2.3.2/manual/libc.info-15 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-15 Thu Jan 1 01:00:00 1970 +@@ -1,1197 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Tree Search Function, Prev: Hash Search Function, Up: Searching and Sorting +- +-The `tsearch' function. +-======================= +- +- Another common form to organize data for efficient search is to use +-trees. The `tsearch' function family provides a nice interface to +-functions to organize possibly large amounts of data by providing a mean +-access time proportional to the logarithm of the number of elements. +-The GNU C library implementation even guarantees that this bound is +-never exceeded even for input data which cause problems for simple +-binary tree implementations. +- +- The functions described in the chapter are all described in the +-System V and X/Open specifications and are therefore quite portable. +- +- In contrast to the `hsearch' functions the `tsearch' functions can +-be used with arbitrary data and not only zero-terminated strings. +- +- The `tsearch' functions have the advantage that no function to +-initialize data structures is necessary. A simple pointer of type +-`void *' initialized to `NULL' is a valid tree and can be extended or +-searched. The prototypes for these functions can be found in the +-header file `search.h'. +- +- - Function: void * tsearch (const void *KEY, void **ROOTP, +- comparison_fn_t COMPAR) +- The `tsearch' function searches in the tree pointed to by `*ROOTP' +- for an element matching KEY. The function pointed to by COMPAR is +- used to determine whether two elements match. *Note Comparison +- Functions::, for a specification of the functions which can be +- used for the COMPAR parameter. +- +- If the tree does not contain a matching entry the KEY value will +- be added to the tree. `tsearch' does not make a copy of the object +- pointed to by KEY (how could it since the size is unknown). +- Instead it adds a reference to this object which means the object +- must be available as long as the tree data structure is used. +- +- The tree is represented by a pointer to a pointer since it is +- sometimes necessary to change the root node of the tree. So it +- must not be assumed that the variable pointed to by ROOTP has the +- same value after the call. This also shows that it is not safe to +- call the `tsearch' function more than once at the same time using +- the same tree. It is no problem to run it more than once at a +- time on different trees. +- +- The return value is a pointer to the matching element in the tree. +- If a new element was created the pointer points to the new data +- (which is in fact KEY). If an entry had to be created and the +- program ran out of space `NULL' is returned. +- +- - Function: void * tfind (const void *KEY, void *const *ROOTP, +- comparison_fn_t COMPAR) +- The `tfind' function is similar to the `tsearch' function. It +- locates an element matching the one pointed to by KEY and returns +- a pointer to this element. But if no matching element is +- available no new element is entered (note that the ROOTP parameter +- points to a constant pointer). Instead the function returns +- `NULL'. +- +- Another advantage of the `tsearch' function in contrast to the +-`hsearch' functions is that there is an easy way to remove elements. +- +- - Function: void * tdelete (const void *KEY, void **ROOTP, +- comparison_fn_t COMPAR) +- To remove a specific element matching KEY from the tree `tdelete' +- can be used. It locates the matching element using the same +- method as `tfind'. The corresponding element is then removed and +- a pointer to the parent of the deleted node is returned by the +- function. If there is no matching entry in the tree nothing can be +- deleted and the function returns `NULL'. If the root of the tree +- is deleted `tdelete' returns some unspecified value not equal to +- `NULL'. +- +- - Function: void tdestroy (void *VROOT, __free_fn_t FREEFCT) +- If the complete search tree has to be removed one can use +- `tdestroy'. It frees all resources allocated by the `tsearch' +- function to generate the tree pointed to by VROOT. +- +- For the data in each tree node the function FREEFCT is called. +- The pointer to the data is passed as the argument to the function. +- If no such work is necessary FREEFCT must point to a function +- doing nothing. It is called in any case. +- +- This function is a GNU extension and not covered by the System V or +- X/Open specifications. +- +- In addition to the function to create and destroy the tree data +-structure, there is another function which allows you to apply a +-function to all elements of the tree. The function must have this type: +- +- void __action_fn_t (const void *nodep, VISIT value, int level); +- +- The NODEP is the data value of the current node (once given as the +-KEY argument to `tsearch'). LEVEL is a numeric value which corresponds +-to the depth of the current node in the tree. The root node has the +-depth 0 and its children have a depth of 1 and so on. The `VISIT' type +-is an enumeration type. +- +- - Data Type: VISIT +- The `VISIT' value indicates the status of the current node in the +- tree and how the function is called. The status of a node is +- either `leaf' or `internal node'. For each leaf node the function +- is called exactly once, for each internal node it is called three +- times: before the first child is processed, after the first child +- is processed and after both children are processed. This makes it +- possible to handle all three methods of tree traversal (or even a +- combination of them). +- +- `preorder' +- The current node is an internal node and the function is +- called before the first child was processed. +- +- `postorder' +- The current node is an internal node and the function is +- called after the first child was processed. +- +- `endorder' +- The current node is an internal node and the function is +- called after the second child was processed. +- +- `leaf' +- The current node is a leaf. +- +- - Function: void twalk (const void *ROOT, __action_fn_t ACTION) +- For each node in the tree with a node pointed to by ROOT, the +- `twalk' function calls the function provided by the parameter +- ACTION. For leaf nodes the function is called exactly once with +- VALUE set to `leaf'. For internal nodes the function is called +- three times, setting the VALUE parameter or ACTION to the +- appropriate value. The LEVEL argument for the ACTION function is +- computed while descending the tree with increasing the value by +- one for the descend to a child, starting with the value 0 for the +- root node. +- +- Since the functions used for the ACTION parameter to `twalk' must +- not modify the tree data, it is safe to run `twalk' in more than +- one thread at the same time, working on the same tree. It is also +- safe to call `tfind' in parallel. Functions which modify the tree +- must not be used, otherwise the behavior is undefined. +- +- +-File: libc.info, Node: Pattern Matching, Next: I/O Overview, Prev: Searching and Sorting, Up: Top +- +-Pattern Matching +-**************** +- +- The GNU C Library provides pattern matching facilities for two kinds +-of patterns: regular expressions and file-name wildcards. The library +-also provides a facility for expanding variable and command references +-and parsing text into words in the way the shell does. +- +-* Menu: +- +-* Wildcard Matching:: Matching a wildcard pattern against a single string. +-* Globbing:: Finding the files that match a wildcard pattern. +-* Regular Expressions:: Matching regular expressions against strings. +-* Word Expansion:: Expanding shell variables, nested commands, +- arithmetic, and wildcards. +- This is what the shell does with shell commands. +- +- +-File: libc.info, Node: Wildcard Matching, Next: Globbing, Up: Pattern Matching +- +-Wildcard Matching +-================= +- +- This section describes how to match a wildcard pattern against a +-particular string. The result is a yes or no answer: does the string +-fit the pattern or not. The symbols described here are all declared in +-`fnmatch.h'. +- +- - Function: int fnmatch (const char *PATTERN, const char *STRING, int +- FLAGS) +- This function tests whether the string STRING matches the pattern +- PATTERN. It returns `0' if they do match; otherwise, it returns +- the nonzero value `FNM_NOMATCH'. The arguments PATTERN and STRING +- are both strings. +- +- The argument FLAGS is a combination of flag bits that alter the +- details of matching. See below for a list of the defined flags. +- +- In the GNU C Library, `fnmatch' cannot experience an "error"--it +- always returns an answer for whether the match succeeds. However, +- other implementations of `fnmatch' might sometimes report "errors". +- They would do so by returning nonzero values that are not equal to +- `FNM_NOMATCH'. +- +- These are the available flags for the FLAGS argument: +- +-`FNM_FILE_NAME' +- Treat the `/' character specially, for matching file names. If +- this flag is set, wildcard constructs in PATTERN cannot match `/' +- in STRING. Thus, the only way to match `/' is with an explicit +- `/' in PATTERN. +- +-`FNM_PATHNAME' +- This is an alias for `FNM_FILE_NAME'; it comes from POSIX.2. We +- don't recommend this name because we don't use the term "pathname" +- for file names. +- +-`FNM_PERIOD' +- Treat the `.' character specially if it appears at the beginning of +- STRING. If this flag is set, wildcard constructs in PATTERN +- cannot match `.' as the first character of STRING. +- +- If you set both `FNM_PERIOD' and `FNM_FILE_NAME', then the special +- treatment applies to `.' following `/' as well as to `.' at the +- beginning of STRING. (The shell uses the `FNM_PERIOD' and +- `FNM_FILE_NAME' flags together for matching file names.) +- +-`FNM_NOESCAPE' +- Don't treat the `\' character specially in patterns. Normally, +- `\' quotes the following character, turning off its special meaning +- (if any) so that it matches only itself. When quoting is enabled, +- the pattern `\?' matches only the string `?', because the question +- mark in the pattern acts like an ordinary character. +- +- If you use `FNM_NOESCAPE', then `\' is an ordinary character. +- +-`FNM_LEADING_DIR' +- Ignore a trailing sequence of characters starting with a `/' in +- STRING; that is to say, test whether STRING starts with a +- directory name that PATTERN matches. +- +- If this flag is set, either `foo*' or `foobar' as a pattern would +- match the string `foobar/frobozz'. +- +-`FNM_CASEFOLD' +- Ignore case in comparing STRING to PATTERN. +- +-`FNM_EXTMATCH' +- Recognize beside the normal patterns also the extended patterns +- introduced in `ksh'. The patterns are written in the form +- explained in the following table where PATTERN-LIST is a `|' +- separated list of patterns. +- +- `?(PATTERN-LIST)' +- The pattern matches if zero or one occurrences of any of the +- patterns in the PATTERN-LIST allow matching the input string. +- +- `*(PATTERN-LIST)' +- The pattern matches if zero or more occurrences of any of the +- patterns in the PATTERN-LIST allow matching the input string. +- +- `+(PATTERN-LIST)' +- The pattern matches if one or more occurrences of any of the +- patterns in the PATTERN-LIST allow matching the input string. +- +- `@(PATTERN-LIST)' +- The pattern matches if exactly one occurrence of any of the +- patterns in the PATTERN-LIST allows matching the input string. +- +- `!(PATTERN-LIST)' +- The pattern matches if the input string cannot be matched +- with any of the patterns in the PATTERN-LIST. +- +- +-File: libc.info, Node: Globbing, Next: Regular Expressions, Prev: Wildcard Matching, Up: Pattern Matching +- +-Globbing +-======== +- +- The archetypal use of wildcards is for matching against the files in +-a directory, and making a list of all the matches. This is called +-"globbing". +- +- You could do this using `fnmatch', by reading the directory entries +-one by one and testing each one with `fnmatch'. But that would be slow +-(and complex, since you would have to handle subdirectories by hand). +- +- The library provides a function `glob' to make this particular use +-of wildcards convenient. `glob' and the other symbols in this section +-are declared in `glob.h'. +- +-* Menu: +- +-* Calling Glob:: Basic use of `glob'. +-* Flags for Globbing:: Flags that enable various options in `glob'. +-* More Flags for Globbing:: GNU specific extensions to `glob'. +- +- +-File: libc.info, Node: Calling Glob, Next: Flags for Globbing, Up: Globbing +- +-Calling `glob' +--------------- +- +- The result of globbing is a vector of file names (strings). To +-return this vector, `glob' uses a special data type, `glob_t', which is +-a structure. You pass `glob' the address of the structure, and it +-fills in the structure's fields to tell you about the results. +- +- - Data Type: glob_t +- This data type holds a pointer to a word vector. More precisely, +- it records both the address of the word vector and its size. The +- GNU implementation contains some more fields which are non-standard +- extensions. +- +- `gl_pathc' +- The number of elements in the vector, excluding the initial +- null entries if the GLOB_DOOFFS flag is used (see gl_offs +- below). +- +- `gl_pathv' +- The address of the vector. This field has type `char **'. +- +- `gl_offs' +- The offset of the first real element of the vector, from its +- nominal address in the `gl_pathv' field. Unlike the other +- fields, this is always an input to `glob', rather than an +- output from it. +- +- If you use a nonzero offset, then that many elements at the +- beginning of the vector are left empty. (The `glob' function +- fills them with null pointers.) +- +- The `gl_offs' field is meaningful only if you use the +- `GLOB_DOOFFS' flag. Otherwise, the offset is always zero +- regardless of what is in this field, and the first real +- element comes at the beginning of the vector. +- +- `gl_closedir' +- The address of an alternative implementation of the `closedir' +- function. It is used if the `GLOB_ALTDIRFUNC' bit is set in +- the flag parameter. The type of this field is +- `void (*) (void *)'. +- +- This is a GNU extension. +- +- `gl_readdir' +- The address of an alternative implementation of the `readdir' +- function used to read the contents of a directory. It is +- used if the `GLOB_ALTDIRFUNC' bit is set in the flag +- parameter. The type of this field is +- `struct dirent *(*) (void *)'. +- +- This is a GNU extension. +- +- `gl_opendir' +- The address of an alternative implementation of the `opendir' +- function. It is used if the `GLOB_ALTDIRFUNC' bit is set in +- the flag parameter. The type of this field is +- `void *(*) (const char *)'. +- +- This is a GNU extension. +- +- `gl_stat' +- The address of an alternative implementation of the `stat' +- function to get information about an object in the +- filesystem. It is used if the `GLOB_ALTDIRFUNC' bit is set +- in the flag parameter. The type of this field is +- `int (*) (const char *, struct stat *)'. +- +- This is a GNU extension. +- +- `gl_lstat' +- The address of an alternative implementation of the `lstat' +- function to get information about an object in the +- filesystems, not following symbolic links. It is used if the +- `GLOB_ALTDIRFUNC' bit is set in the flag parameter. The type +- of this field is `int (*) (const char *, struct stat *)'. +- +- This is a GNU extension. +- +- For use in the `glob64' function `glob.h' contains another +-definition for a very similar type. `glob64_t' differs from `glob_t' +-only in the types of the members `gl_readdir', `gl_stat', and +-`gl_lstat'. +- +- - Data Type: glob64_t +- This data type holds a pointer to a word vector. More precisely, +- it records both the address of the word vector and its size. The +- GNU implementation contains some more fields which are non-standard +- extensions. +- +- `gl_pathc' +- The number of elements in the vector, excluding the initial +- null entries if the GLOB_DOOFFS flag is used (see gl_offs +- below). +- +- `gl_pathv' +- The address of the vector. This field has type `char **'. +- +- `gl_offs' +- The offset of the first real element of the vector, from its +- nominal address in the `gl_pathv' field. Unlike the other +- fields, this is always an input to `glob', rather than an +- output from it. +- +- If you use a nonzero offset, then that many elements at the +- beginning of the vector are left empty. (The `glob' function +- fills them with null pointers.) +- +- The `gl_offs' field is meaningful only if you use the +- `GLOB_DOOFFS' flag. Otherwise, the offset is always zero +- regardless of what is in this field, and the first real +- element comes at the beginning of the vector. +- +- `gl_closedir' +- The address of an alternative implementation of the `closedir' +- function. It is used if the `GLOB_ALTDIRFUNC' bit is set in +- the flag parameter. The type of this field is +- `void (*) (void *)'. +- +- This is a GNU extension. +- +- `gl_readdir' +- The address of an alternative implementation of the +- `readdir64' function used to read the contents of a +- directory. It is used if the `GLOB_ALTDIRFUNC' bit is set in +- the flag parameter. The type of this field is +- `struct dirent64 *(*) (void *)'. +- +- This is a GNU extension. +- +- `gl_opendir' +- The address of an alternative implementation of the `opendir' +- function. It is used if the `GLOB_ALTDIRFUNC' bit is set in +- the flag parameter. The type of this field is +- `void *(*) (const char *)'. +- +- This is a GNU extension. +- +- `gl_stat' +- The address of an alternative implementation of the `stat64' +- function to get information about an object in the +- filesystem. It is used if the `GLOB_ALTDIRFUNC' bit is set +- in the flag parameter. The type of this field is +- `int (*) (const char *, struct stat64 *)'. +- +- This is a GNU extension. +- +- `gl_lstat' +- The address of an alternative implementation of the `lstat64' +- function to get information about an object in the +- filesystems, not following symbolic links. It is used if the +- `GLOB_ALTDIRFUNC' bit is set in the flag parameter. The type +- of this field is `int (*) (const char *, struct stat64 *)'. +- +- This is a GNU extension. +- +- - Function: int glob (const char *PATTERN, int FLAGS, int (*ERRFUNC) +- (const char *FILENAME, int ERROR-CODE), glob_t *VECTOR-PTR) +- The function `glob' does globbing using the pattern PATTERN in the +- current directory. It puts the result in a newly allocated +- vector, and stores the size and address of this vector into +- `*VECTOR-PTR'. The argument FLAGS is a combination of bit flags; +- see *Note Flags for Globbing::, for details of the flags. +- +- The result of globbing is a sequence of file names. The function +- `glob' allocates a string for each resulting word, then allocates +- a vector of type `char **' to store the addresses of these +- strings. The last element of the vector is a null pointer. This +- vector is called the "word vector". +- +- To return this vector, `glob' stores both its address and its +- length (number of elements, not counting the terminating null +- pointer) into `*VECTOR-PTR'. +- +- Normally, `glob' sorts the file names alphabetically before +- returning them. You can turn this off with the flag `GLOB_NOSORT' +- if you want to get the information as fast as possible. Usually +- it's a good idea to let `glob' sort them--if you process the files +- in alphabetical order, the users will have a feel for the rate of +- progress that your application is making. +- +- If `glob' succeeds, it returns 0. Otherwise, it returns one of +- these error codes: +- +- `GLOB_ABORTED' +- There was an error opening a directory, and you used the flag +- `GLOB_ERR' or your specified ERRFUNC returned a nonzero value. +- *Note Flags for Globbing::, for an explanation of the +- `GLOB_ERR' flag and ERRFUNC. +- +- `GLOB_NOMATCH' +- The pattern didn't match any existing files. If you use the +- `GLOB_NOCHECK' flag, then you never get this error code, +- because that flag tells `glob' to _pretend_ that the pattern +- matched at least one file. +- +- `GLOB_NOSPACE' +- It was impossible to allocate memory to hold the result. +- +- In the event of an error, `glob' stores information in +- `*VECTOR-PTR' about all the matches it has found so far. +- +- It is important to notice that the `glob' function will not fail if +- it encounters directories or files which cannot be handled without +- the LFS interfaces. The implementation of `glob' is supposed to +- use these functions internally. This at least is the assumptions +- made by the Unix standard. The GNU extension of allowing the user +- to provide own directory handling and `stat' functions complicates +- things a bit. If these callback functions are used and a large +- file or directory is encountered `glob' _can_ fail. +- +- - Function: int glob64 (const char *PATTERN, int FLAGS, int (*ERRFUNC) +- (const char *FILENAME, int ERROR-CODE), glob64_t *VECTOR-PTR) +- The `glob64' function was added as part of the Large File Summit +- extensions but is not part of the original LFS proposal. The +- reason for this is simple: it is not necessary. The necessity for +- a `glob64' function is added by the extensions of the GNU `glob' +- implementation which allows the user to provide own directory +- handling and `stat' functions. The `readdir' and `stat' functions +- do depend on the choice of `_FILE_OFFSET_BITS' since the definition +- of the types `struct dirent' and `struct stat' will change +- depending on the choice. +- +- Beside this difference the `glob64' works just like `glob' in all +- aspects. +- +- This function is a GNU extension. +- +- +-File: libc.info, Node: Flags for Globbing, Next: More Flags for Globbing, Prev: Calling Glob, Up: Globbing +- +-Flags for Globbing +------------------- +- +- This section describes the flags that you can specify in the FLAGS +-argument to `glob'. Choose the flags you want, and combine them with +-the C bitwise OR operator `|'. +- +-`GLOB_APPEND' +- Append the words from this expansion to the vector of words +- produced by previous calls to `glob'. This way you can +- effectively expand several words as if they were concatenated with +- spaces between them. +- +- In order for appending to work, you must not modify the contents +- of the word vector structure between calls to `glob'. And, if you +- set `GLOB_DOOFFS' in the first call to `glob', you must also set +- it when you append to the results. +- +- Note that the pointer stored in `gl_pathv' may no longer be valid +- after you call `glob' the second time, because `glob' might have +- relocated the vector. So always fetch `gl_pathv' from the +- `glob_t' structure after each `glob' call; *never* save the +- pointer across calls. +- +-`GLOB_DOOFFS' +- Leave blank slots at the beginning of the vector of words. The +- `gl_offs' field says how many slots to leave. The blank slots +- contain null pointers. +- +-`GLOB_ERR' +- Give up right away and report an error if there is any difficulty +- reading the directories that must be read in order to expand +- PATTERN fully. Such difficulties might include a directory in +- which you don't have the requisite access. Normally, `glob' tries +- its best to keep on going despite any errors, reading whatever +- directories it can. +- +- You can exercise even more control than this by specifying an +- error-handler function ERRFUNC when you call `glob'. If ERRFUNC +- is not a null pointer, then `glob' doesn't give up right away when +- it can't read a directory; instead, it calls ERRFUNC with two +- arguments, like this: +- +- (*ERRFUNC) (FILENAME, ERROR-CODE) +- +- The argument FILENAME is the name of the directory that `glob' +- couldn't open or couldn't read, and ERROR-CODE is the `errno' +- value that was reported to `glob'. +- +- If the error handler function returns nonzero, then `glob' gives up +- right away. Otherwise, it continues. +- +-`GLOB_MARK' +- If the pattern matches the name of a directory, append `/' to the +- directory's name when returning it. +- +-`GLOB_NOCHECK' +- If the pattern doesn't match any file names, return the pattern +- itself as if it were a file name that had been matched. +- (Normally, when the pattern doesn't match anything, `glob' returns +- that there were no matches.) +- +-`GLOB_NOSORT' +- Don't sort the file names; return them in no particular order. +- (In practice, the order will depend on the order of the entries in +- the directory.) The only reason _not_ to sort is to save time. +- +-`GLOB_NOESCAPE' +- Don't treat the `\' character specially in patterns. Normally, +- `\' quotes the following character, turning off its special meaning +- (if any) so that it matches only itself. When quoting is enabled, +- the pattern `\?' matches only the string `?', because the question +- mark in the pattern acts like an ordinary character. +- +- If you use `GLOB_NOESCAPE', then `\' is an ordinary character. +- +- `glob' does its work by calling the function `fnmatch' repeatedly. +- It handles the flag `GLOB_NOESCAPE' by turning on the +- `FNM_NOESCAPE' flag in calls to `fnmatch'. +- +- +-File: libc.info, Node: More Flags for Globbing, Prev: Flags for Globbing, Up: Globbing +- +-More Flags for Globbing +------------------------ +- +- Beside the flags described in the last section, the GNU +-implementation of `glob' allows a few more flags which are also defined +-in the `glob.h' file. Some of the extensions implement functionality +-which is available in modern shell implementations. +- +-`GLOB_PERIOD' +- The `.' character (period) is treated special. It cannot be +- matched by wildcards. *Note Wildcard Matching::, `FNM_PERIOD'. +- +-`GLOB_MAGCHAR' +- The `GLOB_MAGCHAR' value is not to be given to `glob' in the FLAGS +- parameter. Instead, `glob' sets this bit in the GL_FLAGS element +- of the GLOB_T structure provided as the result if the pattern used +- for matching contains any wildcard character. +- +-`GLOB_ALTDIRFUNC' +- Instead of the using the using the normal functions for accessing +- the filesystem the `glob' implementation uses the user-supplied +- functions specified in the structure pointed to by PGLOB +- parameter. For more information about the functions refer to the +- sections about directory handling see *Note Accessing +- Directories::, and *Note Reading Attributes::. +- +-`GLOB_BRACE' +- If this flag is given the handling of braces in the pattern is +- changed. It is now required that braces appear correctly grouped. +- I.e., for each opening brace there must be a closing one. Braces +- can be used recursively. So it is possible to define one brace +- expression in another one. It is important to note that the range +- of each brace expression is completely contained in the outer +- brace expression (if there is one). +- +- The string between the matching braces is separated into single +- expressions by splitting at `,' (comma) characters. The commas +- themselves are discarded. Please note what we said above about +- recursive brace expressions. The commas used to separate the +- subexpressions must be at the same level. Commas in brace +- subexpressions are not matched. They are used during expansion of +- the brace expression of the deeper level. The example below shows +- this +- +- glob ("{foo/{,bar,biz},baz}", GLOB_BRACE, NULL, &result) +- +- is equivalent to the sequence +- +- glob ("foo/", GLOB_BRACE, NULL, &result) +- glob ("foo/bar", GLOB_BRACE|GLOB_APPEND, NULL, &result) +- glob ("foo/biz", GLOB_BRACE|GLOB_APPEND, NULL, &result) +- glob ("baz", GLOB_BRACE|GLOB_APPEND, NULL, &result) +- +- if we leave aside error handling. +- +-`GLOB_NOMAGIC' +- If the pattern contains no wildcard constructs (it is a literal +- file name), return it as the sole "matching" word, even if no file +- exists by that name. +- +-`GLOB_TILDE' +- If this flag is used the character `~' (tilde) is handled special +- if it appears at the beginning of the pattern. Instead of being +- taken verbatim it is used to represent the home directory of a +- known user. +- +- If `~' is the only character in pattern or it is followed by a `/' +- (slash), the home directory of the process owner is substituted. +- Using `getlogin' and `getpwnam' the information is read from the +- system databases. As an example take user `bart' with his home +- directory at `/home/bart'. For him a call like +- +- glob ("~/bin/*", GLOB_TILDE, NULL, &result) +- +- would return the contents of the directory `/home/bart/bin'. +- Instead of referring to the own home directory it is also possible +- to name the home directory of other users. To do so one has to +- append the user name after the tilde character. So the contents +- of user `homer''s `bin' directory can be retrieved by +- +- glob ("~homer/bin/*", GLOB_TILDE, NULL, &result) +- +- If the user name is not valid or the home directory cannot be +- determined for some reason the pattern is left untouched and +- itself used as the result. I.e., if in the last example `home' is +- not available the tilde expansion yields to `"~homer/bin/*"' and +- `glob' is not looking for a directory named `~homer'. +- +- This functionality is equivalent to what is available in C-shells +- if the `nonomatch' flag is set. +- +-`GLOB_TILDE_CHECK' +- If this flag is used `glob' behaves like as if `GLOB_TILDE' is +- given. The only difference is that if the user name is not +- available or the home directory cannot be determined for other +- reasons this leads to an error. `glob' will return `GLOB_NOMATCH' +- instead of using the pattern itself as the name. +- +- This functionality is equivalent to what is available in C-shells +- if `nonomatch' flag is not set. +- +-`GLOB_ONLYDIR' +- If this flag is used the globbing function takes this as a *hint* +- that the caller is only interested in directories matching the +- pattern. If the information about the type of the file is easily +- available non-directories will be rejected but no extra work will +- be done to determine the information for each file. I.e., the +- caller must still be able to filter directories out. +- +- This functionality is only available with the GNU `glob' +- implementation. It is mainly used internally to increase the +- performance but might be useful for a user as well and therefore is +- documented here. +- +- Calling `glob' will in most cases allocate resources which are used +-to represent the result of the function call. If the same object of +-type `glob_t' is used in multiple call to `glob' the resources are +-freed or reused so that no leaks appear. But this does not include the +-time when all `glob' calls are done. +- +- - Function: void globfree (glob_t *PGLOB) +- The `globfree' function frees all resources allocated by previous +- calls to `glob' associated with the object pointed to by PGLOB. +- This function should be called whenever the currently used +- `glob_t' typed object isn't used anymore. +- +- - Function: void globfree64 (glob64_t *PGLOB) +- This function is equivalent to `globfree' but it frees records of +- type `glob64_t' which were allocated by `glob64'. +- +- +-File: libc.info, Node: Regular Expressions, Next: Word Expansion, Prev: Globbing, Up: Pattern Matching +- +-Regular Expression Matching +-=========================== +- +- The GNU C library supports two interfaces for matching regular +-expressions. One is the standard POSIX.2 interface, and the other is +-what the GNU system has had for many years. +- +- Both interfaces are declared in the header file `regex.h'. If you +-define `_POSIX_C_SOURCE', then only the POSIX.2 functions, structures, +-and constants are declared. +- +-* Menu: +- +-* POSIX Regexp Compilation:: Using `regcomp' to prepare to match. +-* Flags for POSIX Regexps:: Syntax variations for `regcomp'. +-* Matching POSIX Regexps:: Using `regexec' to match the compiled +- pattern that you get from `regcomp'. +-* Regexp Subexpressions:: Finding which parts of the string were matched. +-* Subexpression Complications:: Find points of which parts were matched. +-* Regexp Cleanup:: Freeing storage; reporting errors. +- +- +-File: libc.info, Node: POSIX Regexp Compilation, Next: Flags for POSIX Regexps, Up: Regular Expressions +- +-POSIX Regular Expression Compilation +------------------------------------- +- +- Before you can actually match a regular expression, you must +-"compile" it. This is not true compilation--it produces a special data +-structure, not machine instructions. But it is like ordinary +-compilation in that its purpose is to enable you to "execute" the +-pattern fast. (*Note Matching POSIX Regexps::, for how to use the +-compiled regular expression for matching.) +- +- There is a special data type for compiled regular expressions: +- +- - Data Type: regex_t +- This type of object holds a compiled regular expression. It is +- actually a structure. It has just one field that your programs +- should look at: +- +- `re_nsub' +- This field holds the number of parenthetical subexpressions +- in the regular expression that was compiled. +- +- There are several other fields, but we don't describe them here, +- because only the functions in the library should use them. +- +- After you create a `regex_t' object, you can compile a regular +-expression into it by calling `regcomp'. +- +- - Function: int regcomp (regex_t *COMPILED, const char *PATTERN, int +- CFLAGS) +- The function `regcomp' "compiles" a regular expression into a data +- structure that you can use with `regexec' to match against a +- string. The compiled regular expression format is designed for +- efficient matching. `regcomp' stores it into `*COMPILED'. +- +- It's up to you to allocate an object of type `regex_t' and pass its +- address to `regcomp'. +- +- The argument CFLAGS lets you specify various options that control +- the syntax and semantics of regular expressions. *Note Flags for +- POSIX Regexps::. +- +- If you use the flag `REG_NOSUB', then `regcomp' omits from the +- compiled regular expression the information necessary to record +- how subexpressions actually match. In this case, you might as well +- pass `0' for the MATCHPTR and NMATCH arguments when you call +- `regexec'. +- +- If you don't use `REG_NOSUB', then the compiled regular expression +- does have the capacity to record how subexpressions match. Also, +- `regcomp' tells you how many subexpressions PATTERN has, by +- storing the number in `COMPILED->re_nsub'. You can use that value +- to decide how long an array to allocate to hold information about +- subexpression matches. +- +- `regcomp' returns `0' if it succeeds in compiling the regular +- expression; otherwise, it returns a nonzero error code (see the +- table below). You can use `regerror' to produce an error message +- string describing the reason for a nonzero value; see *Note Regexp +- Cleanup::. +- +- +- Here are the possible nonzero values that `regcomp' can return: +- +-`REG_BADBR' +- There was an invalid `\{...\}' construct in the regular +- expression. A valid `\{...\}' construct must contain either a +- single number, or two numbers in increasing order separated by a +- comma. +- +-`REG_BADPAT' +- There was a syntax error in the regular expression. +- +-`REG_BADRPT' +- A repetition operator such as `?' or `*' appeared in a bad +- position (with no preceding subexpression to act on). +- +-`REG_ECOLLATE' +- The regular expression referred to an invalid collating element +- (one not defined in the current locale for string collation). +- *Note Locale Categories::. +- +-`REG_ECTYPE' +- The regular expression referred to an invalid character class name. +- +-`REG_EESCAPE' +- The regular expression ended with `\'. +- +-`REG_ESUBREG' +- There was an invalid number in the `\DIGIT' construct. +- +-`REG_EBRACK' +- There were unbalanced square brackets in the regular expression. +- +-`REG_EPAREN' +- An extended regular expression had unbalanced parentheses, or a +- basic regular expression had unbalanced `\(' and `\)'. +- +-`REG_EBRACE' +- The regular expression had unbalanced `\{' and `\}'. +- +-`REG_ERANGE' +- One of the endpoints in a range expression was invalid. +- +-`REG_ESPACE' +- `regcomp' ran out of memory. +- +- +-File: libc.info, Node: Flags for POSIX Regexps, Next: Matching POSIX Regexps, Prev: POSIX Regexp Compilation, Up: Regular Expressions +- +-Flags for POSIX Regular Expressions +------------------------------------ +- +- These are the bit flags that you can use in the CFLAGS operand when +-compiling a regular expression with `regcomp'. +- +-`REG_EXTENDED' +- Treat the pattern as an extended regular expression, rather than +- as a basic regular expression. +- +-`REG_ICASE' +- Ignore case when matching letters. +- +-`REG_NOSUB' +- Don't bother storing the contents of the MATCHES-PTR array. +- +-`REG_NEWLINE' +- Treat a newline in STRING as dividing STRING into multiple lines, +- so that `$' can match before the newline and `^' can match after. +- Also, don't permit `.' to match a newline, and don't permit +- `[^...]' to match a newline. +- +- Otherwise, newline acts like any other ordinary character. +- +- +-File: libc.info, Node: Matching POSIX Regexps, Next: Regexp Subexpressions, Prev: Flags for POSIX Regexps, Up: Regular Expressions +- +-Matching a Compiled POSIX Regular Expression +--------------------------------------------- +- +- Once you have compiled a regular expression, as described in *Note +-POSIX Regexp Compilation::, you can match it against strings using +-`regexec'. A match anywhere inside the string counts as success, +-unless the regular expression contains anchor characters (`^' or `$'). +- +- - Function: int regexec (regex_t *COMPILED, char *STRING, size_t +- NMATCH, regmatch_t MATCHPTR [], int EFLAGS) +- This function tries to match the compiled regular expression +- `*COMPILED' against STRING. +- +- `regexec' returns `0' if the regular expression matches; +- otherwise, it returns a nonzero value. See the table below for +- what nonzero values mean. You can use `regerror' to produce an +- error message string describing the reason for a nonzero value; +- see *Note Regexp Cleanup::. +- +- The argument EFLAGS is a word of bit flags that enable various +- options. +- +- If you want to get information about what part of STRING actually +- matched the regular expression or its subexpressions, use the +- arguments MATCHPTR and NMATCH. Otherwise, pass `0' for NMATCH, +- and `NULL' for MATCHPTR. *Note Regexp Subexpressions::. +- +- You must match the regular expression with the same set of current +-locales that were in effect when you compiled the regular expression. +- +- The function `regexec' accepts the following flags in the EFLAGS +-argument: +- +-`REG_NOTBOL' +- Do not regard the beginning of the specified string as the +- beginning of a line; more generally, don't make any assumptions +- about what text might precede it. +- +-`REG_NOTEOL' +- Do not regard the end of the specified string as the end of a +- line; more generally, don't make any assumptions about what text +- might follow it. +- +- Here are the possible nonzero values that `regexec' can return: +- +-`REG_NOMATCH' +- The pattern didn't match the string. This isn't really an error. +- +-`REG_ESPACE' +- `regexec' ran out of memory. +- +- +-File: libc.info, Node: Regexp Subexpressions, Next: Subexpression Complications, Prev: Matching POSIX Regexps, Up: Regular Expressions +- +-Match Results with Subexpressions +---------------------------------- +- +- When `regexec' matches parenthetical subexpressions of PATTERN, it +-records which parts of STRING they match. It returns that information +-by storing the offsets into an array whose elements are structures of +-type `regmatch_t'. The first element of the array (index `0') records +-the part of the string that matched the entire regular expression. +-Each other element of the array records the beginning and end of the +-part that matched a single parenthetical subexpression. +- +- - Data Type: regmatch_t +- This is the data type of the MATCHARRAY array that you pass to +- `regexec'. It contains two structure fields, as follows: +- +- `rm_so' +- The offset in STRING of the beginning of a substring. Add +- this value to STRING to get the address of that part. +- +- `rm_eo' +- The offset in STRING of the end of the substring. +- +- - Data Type: regoff_t +- `regoff_t' is an alias for another signed integer type. The +- fields of `regmatch_t' have type `regoff_t'. +- +- The `regmatch_t' elements correspond to subexpressions positionally; +-the first element (index `1') records where the first subexpression +-matched, the second element records the second subexpression, and so +-on. The order of the subexpressions is the order in which they begin. +- +- When you call `regexec', you specify how long the MATCHPTR array is, +-with the NMATCH argument. This tells `regexec' how many elements to +-store. If the actual regular expression has more than NMATCH +-subexpressions, then you won't get offset information about the rest of +-them. But this doesn't alter whether the pattern matches a particular +-string or not. +- +- If you don't want `regexec' to return any information about where +-the subexpressions matched, you can either supply `0' for NMATCH, or +-use the flag `REG_NOSUB' when you compile the pattern with `regcomp'. +- +- +-File: libc.info, Node: Subexpression Complications, Next: Regexp Cleanup, Prev: Regexp Subexpressions, Up: Regular Expressions +- +-Complications in Subexpression Matching +---------------------------------------- +- +- Sometimes a subexpression matches a substring of no characters. This +-happens when `f\(o*\)' matches the string `fum'. (It really matches +-just the `f'.) In this case, both of the offsets identify the point in +-the string where the null substring was found. In this example, the +-offsets are both `1'. +- +- Sometimes the entire regular expression can match without using some +-of its subexpressions at all--for example, when `ba\(na\)*' matches the +-string `ba', the parenthetical subexpression is not used. When this +-happens, `regexec' stores `-1' in both fields of the element for that +-subexpression. +- +- Sometimes matching the entire regular expression can match a +-particular subexpression more than once--for example, when `ba\(na\)*' +-matches the string `bananana', the parenthetical subexpression matches +-three times. When this happens, `regexec' usually stores the offsets +-of the last part of the string that matched the subexpression. In the +-case of `bananana', these offsets are `6' and `8'. +- +- But the last match is not always the one that is chosen. It's more +-accurate to say that the last _opportunity_ to match is the one that +-takes precedence. What this means is that when one subexpression +-appears within another, then the results reported for the inner +-subexpression reflect whatever happened on the last match of the outer +-subexpression. For an example, consider `\(ba\(na\)*s \)*' matching +-the string `bananas bas '. The last time the inner expression actually +-matches is near the end of the first word. But it is _considered_ +-again in the second word, and fails to match there. `regexec' reports +-nonuse of the "na" subexpression. +- +- Another place where this rule applies is when the regular expression +- \(ba\(na\)*s \|nefer\(ti\)* \)* +- +-matches `bananas nefertiti'. The "na" subexpression does match in the +-first word, but it doesn't match in the second word because the other +-alternative is used there. Once again, the second repetition of the +-outer subexpression overrides the first, and within that second +-repetition, the "na" subexpression is not used. So `regexec' reports +-nonuse of the "na" subexpression. +- +- +-File: libc.info, Node: Regexp Cleanup, Prev: Subexpression Complications, Up: Regular Expressions +- +-POSIX Regexp Matching Cleanup +------------------------------ +- +- When you are finished using a compiled regular expression, you can +-free the storage it uses by calling `regfree'. +- +- - Function: void regfree (regex_t *COMPILED) +- Calling `regfree' frees all the storage that `*COMPILED' points +- to. This includes various internal fields of the `regex_t' +- structure that aren't documented in this manual. +- +- `regfree' does not free the object `*COMPILED' itself. +- +- You should always free the space in a `regex_t' structure with +-`regfree' before using the structure to compile another regular +-expression. +- +- When `regcomp' or `regexec' reports an error, you can use the +-function `regerror' to turn it into an error message string. +- +- - Function: size_t regerror (int ERRCODE, regex_t *COMPILED, char +- *BUFFER, size_t LENGTH) +- This function produces an error message string for the error code +- ERRCODE, and stores the string in LENGTH bytes of memory starting +- at BUFFER. For the COMPILED argument, supply the same compiled +- regular expression structure that `regcomp' or `regexec' was +- working with when it got the error. Alternatively, you can supply +- `NULL' for COMPILED; you will still get a meaningful error +- message, but it might not be as detailed. +- +- If the error message can't fit in LENGTH bytes (including a +- terminating null character), then `regerror' truncates it. The +- string that `regerror' stores is always null-terminated even if it +- has been truncated. +- +- The return value of `regerror' is the minimum length needed to +- store the entire error message. If this is less than LENGTH, then +- the error message was not truncated, and you can use it. +- Otherwise, you should call `regerror' again with a larger buffer. +- +- Here is a function which uses `regerror', but always dynamically +- allocates a buffer for the error message: +- +- char *get_regerror (int errcode, regex_t *compiled) +- { +- size_t length = regerror (errcode, compiled, NULL, 0); +- char *buffer = xmalloc (length); +- (void) regerror (errcode, compiled, buffer, length); +- return buffer; +- } +- +- +-File: libc.info, Node: Word Expansion, Prev: Regular Expressions, Up: Pattern Matching +- +-Shell-Style Word Expansion +-========================== +- +- "Word expansion" means the process of splitting a string into +-"words" and substituting for variables, commands, and wildcards just as +-the shell does. +- +- For example, when you write `ls -l foo.c', this string is split into +-three separate words--`ls', `-l' and `foo.c'. This is the most basic +-function of word expansion. +- +- When you write `ls *.c', this can become many words, because the +-word `*.c' can be replaced with any number of file names. This is +-called "wildcard expansion", and it is also a part of word expansion. +- +- When you use `echo $PATH' to print your path, you are taking +-advantage of "variable substitution", which is also part of word +-expansion. +- +- Ordinary programs can perform word expansion just like the shell by +-calling the library function `wordexp'. +- +-* Menu: +- +-* Expansion Stages:: What word expansion does to a string. +-* Calling Wordexp:: How to call `wordexp'. +-* Flags for Wordexp:: Options you can enable in `wordexp'. +-* Wordexp Example:: A sample program that does word expansion. +-* Tilde Expansion:: Details of how tilde expansion works. +-* Variable Substitution:: Different types of variable substitution. +- +- +-File: libc.info, Node: Expansion Stages, Next: Calling Wordexp, Up: Word Expansion +- +-The Stages of Word Expansion +----------------------------- +- +- When word expansion is applied to a sequence of words, it performs +-the following transformations in the order shown here: +- +- 1. "Tilde expansion": Replacement of `~foo' with the name of the home +- directory of `foo'. +- +- 2. Next, three different transformations are applied in the same step, +- from left to right: +- +- * "Variable substitution": Environment variables are +- substituted for references such as `$foo'. +- +- * "Command substitution": Constructs such as ``cat foo`' and +- the equivalent `$(cat foo)' are replaced with the output from +- the inner command. +- +- * "Arithmetic expansion": Constructs such as `$(($x-1))' are +- replaced with the result of the arithmetic computation. +- +- 3. "Field splitting": subdivision of the text into "words". +- +- 4. "Wildcard expansion": The replacement of a construct such as `*.c' +- with a list of `.c' file names. Wildcard expansion applies to an +- entire word at a time, and replaces that word with 0 or more file +- names that are themselves words. +- +- 5. "Quote removal": The deletion of string-quotes, now that they have +- done their job by inhibiting the above transformations when +- appropriate. +- +- For the details of these transformations, and how to write the +-constructs that use them, see `The BASH Manual' (to appear). +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-16 glibc-2.3.2-200304020432/manual/libc.info-16 +--- glibc-2.3.2/manual/libc.info-16 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-16 Thu Jan 1 01:00:00 1970 +@@ -1,1127 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Calling Wordexp, Next: Flags for Wordexp, Prev: Expansion Stages, Up: Word Expansion +- +-Calling `wordexp' +------------------ +- +- All the functions, constants and data types for word expansion are +-declared in the header file `wordexp.h'. +- +- Word expansion produces a vector of words (strings). To return this +-vector, `wordexp' uses a special data type, `wordexp_t', which is a +-structure. You pass `wordexp' the address of the structure, and it +-fills in the structure's fields to tell you about the results. +- +- - Data Type: wordexp_t +- This data type holds a pointer to a word vector. More precisely, +- it records both the address of the word vector and its size. +- +- `we_wordc' +- The number of elements in the vector. +- +- `we_wordv' +- The address of the vector. This field has type `char **'. +- +- `we_offs' +- The offset of the first real element of the vector, from its +- nominal address in the `we_wordv' field. Unlike the other +- fields, this is always an input to `wordexp', rather than an +- output from it. +- +- If you use a nonzero offset, then that many elements at the +- beginning of the vector are left empty. (The `wordexp' +- function fills them with null pointers.) +- +- The `we_offs' field is meaningful only if you use the +- `WRDE_DOOFFS' flag. Otherwise, the offset is always zero +- regardless of what is in this field, and the first real +- element comes at the beginning of the vector. +- +- - Function: int wordexp (const char *WORDS, wordexp_t +- *WORD-VECTOR-PTR, int FLAGS) +- Perform word expansion on the string WORDS, putting the result in +- a newly allocated vector, and store the size and address of this +- vector into `*WORD-VECTOR-PTR'. The argument FLAGS is a +- combination of bit flags; see *Note Flags for Wordexp::, for +- details of the flags. +- +- You shouldn't use any of the characters `|&;<>' in the string +- WORDS unless they are quoted; likewise for newline. If you use +- these characters unquoted, you will get the `WRDE_BADCHAR' error +- code. Don't use parentheses or braces unless they are quoted or +- part of a word expansion construct. If you use quotation +- characters `'"`', they should come in pairs that balance. +- +- The results of word expansion are a sequence of words. The +- function `wordexp' allocates a string for each resulting word, then +- allocates a vector of type `char **' to store the addresses of +- these strings. The last element of the vector is a null pointer. +- This vector is called the "word vector". +- +- To return this vector, `wordexp' stores both its address and its +- length (number of elements, not counting the terminating null +- pointer) into `*WORD-VECTOR-PTR'. +- +- If `wordexp' succeeds, it returns 0. Otherwise, it returns one of +- these error codes: +- +- `WRDE_BADCHAR' +- The input string WORDS contains an unquoted invalid character +- such as `|'. +- +- `WRDE_BADVAL' +- The input string refers to an undefined shell variable, and +- you used the flag `WRDE_UNDEF' to forbid such references. +- +- `WRDE_CMDSUB' +- The input string uses command substitution, and you used the +- flag `WRDE_NOCMD' to forbid command substitution. +- +- `WRDE_NOSPACE' +- It was impossible to allocate memory to hold the result. In +- this case, `wordexp' can store part of the results--as much +- as it could allocate room for. +- +- `WRDE_SYNTAX' +- There was a syntax error in the input string. For example, +- an unmatched quoting character is a syntax error. +- +- - Function: void wordfree (wordexp_t *WORD-VECTOR-PTR) +- Free the storage used for the word-strings and vector that +- `*WORD-VECTOR-PTR' points to. This does not free the structure +- `*WORD-VECTOR-PTR' itself--only the other data it points to. +- +- +-File: libc.info, Node: Flags for Wordexp, Next: Wordexp Example, Prev: Calling Wordexp, Up: Word Expansion +- +-Flags for Word Expansion +------------------------- +- +- This section describes the flags that you can specify in the FLAGS +-argument to `wordexp'. Choose the flags you want, and combine them +-with the C operator `|'. +- +-`WRDE_APPEND' +- Append the words from this expansion to the vector of words +- produced by previous calls to `wordexp'. This way you can +- effectively expand several words as if they were concatenated with +- spaces between them. +- +- In order for appending to work, you must not modify the contents +- of the word vector structure between calls to `wordexp'. And, if +- you set `WRDE_DOOFFS' in the first call to `wordexp', you must also +- set it when you append to the results. +- +-`WRDE_DOOFFS' +- Leave blank slots at the beginning of the vector of words. The +- `we_offs' field says how many slots to leave. The blank slots +- contain null pointers. +- +-`WRDE_NOCMD' +- Don't do command substitution; if the input requests command +- substitution, report an error. +- +-`WRDE_REUSE' +- Reuse a word vector made by a previous call to `wordexp'. Instead +- of allocating a new vector of words, this call to `wordexp' will +- use the vector that already exists (making it larger if necessary). +- +- Note that the vector may move, so it is not safe to save an old +- pointer and use it again after calling `wordexp'. You must fetch +- `we_pathv' anew after each call. +- +-`WRDE_SHOWERR' +- Do show any error messages printed by commands run by command +- substitution. More precisely, allow these commands to inherit the +- standard error output stream of the current process. By default, +- `wordexp' gives these commands a standard error stream that +- discards all output. +- +-`WRDE_UNDEF' +- If the input refers to a shell variable that is not defined, +- report an error. +- +- +-File: libc.info, Node: Wordexp Example, Next: Tilde Expansion, Prev: Flags for Wordexp, Up: Word Expansion +- +-`wordexp' Example +------------------ +- +- Here is an example of using `wordexp' to expand several strings and +-use the results to run a shell command. It also shows the use of +-`WRDE_APPEND' to concatenate the expansions and of `wordfree' to free +-the space allocated by `wordexp'. +- +- int +- expand_and_execute (const char *program, const char **options) +- { +- wordexp_t result; +- pid_t pid +- int status, i; +- +- /* Expand the string for the program to run. */ +- switch (wordexp (program, &result, 0)) +- { +- case 0: /* Successful. */ +- break; +- case WRDE_NOSPACE: +- /* If the error was `WRDE_NOSPACE', +- then perhaps part of the result was allocated. */ +- wordfree (&result); +- default: /* Some other error. */ +- return -1; +- } +- +- /* Expand the strings specified for the arguments. */ +- for (i = 0; options[i] != NULL; i++) +- { +- if (wordexp (options[i], &result, WRDE_APPEND)) +- { +- wordfree (&result); +- return -1; +- } +- } +- +- pid = fork (); +- if (pid == 0) +- { +- /* This is the child process. Execute the command. */ +- execv (result.we_wordv[0], result.we_wordv); +- exit (EXIT_FAILURE); +- } +- else if (pid < 0) +- /* The fork failed. Report failure. */ +- status = -1; +- else +- /* This is the parent process. Wait for the child to complete. */ +- if (waitpid (pid, &status, 0) != pid) +- status = -1; +- +- wordfree (&result); +- return status; +- } +- +- +-File: libc.info, Node: Tilde Expansion, Next: Variable Substitution, Prev: Wordexp Example, Up: Word Expansion +- +-Details of Tilde Expansion +--------------------------- +- +- It's a standard part of shell syntax that you can use `~' at the +-beginning of a file name to stand for your own home directory. You can +-use `~USER' to stand for USER's home directory. +- +- "Tilde expansion" is the process of converting these abbreviations +-to the directory names that they stand for. +- +- Tilde expansion applies to the `~' plus all following characters up +-to whitespace or a slash. It takes place only at the beginning of a +-word, and only if none of the characters to be transformed is quoted in +-any way. +- +- Plain `~' uses the value of the environment variable `HOME' as the +-proper home directory name. `~' followed by a user name uses +-`getpwname' to look up that user in the user database, and uses +-whatever directory is recorded there. Thus, `~' followed by your own +-name can give different results from plain `~', if the value of `HOME' +-is not really your home directory. +- +- +-File: libc.info, Node: Variable Substitution, Prev: Tilde Expansion, Up: Word Expansion +- +-Details of Variable Substitution +--------------------------------- +- +- Part of ordinary shell syntax is the use of `$VARIABLE' to +-substitute the value of a shell variable into a command. This is called +-"variable substitution", and it is one part of doing word expansion. +- +- There are two basic ways you can write a variable reference for +-substitution: +- +-`${VARIABLE}' +- If you write braces around the variable name, then it is completely +- unambiguous where the variable name ends. You can concatenate +- additional letters onto the end of the variable value by writing +- them immediately after the close brace. For example, `${foo}s' +- expands into `tractors'. +- +-`$VARIABLE' +- If you do not put braces around the variable name, then the +- variable name consists of all the alphanumeric characters and +- underscores that follow the `$'. The next punctuation character +- ends the variable name. Thus, `$foo-bar' refers to the variable +- `foo' and expands into `tractor-bar'. +- +- When you use braces, you can also use various constructs to modify +-the value that is substituted, or test it in various ways. +- +-`${VARIABLE:-DEFAULT}' +- Substitute the value of VARIABLE, but if that is empty or +- undefined, use DEFAULT instead. +- +-`${VARIABLE:=DEFAULT}' +- Substitute the value of VARIABLE, but if that is empty or +- undefined, use DEFAULT instead and set the variable to DEFAULT. +- +-`${VARIABLE:?MESSAGE}' +- If VARIABLE is defined and not empty, substitute its value. +- +- Otherwise, print MESSAGE as an error message on the standard error +- stream, and consider word expansion a failure. +- +-`${VARIABLE:+REPLACEMENT}' +- Substitute REPLACEMENT, but only if VARIABLE is defined and +- nonempty. Otherwise, substitute nothing for this construct. +- +-`${#VARIABLE}' +- Substitute a numeral which expresses in base ten the number of +- characters in the value of VARIABLE. `${#foo}' stands for `7', +- because `tractor' is seven characters. +- +- These variants of variable substitution let you remove part of the +-variable's value before substituting it. The PREFIX and SUFFIX are not +-mere strings; they are wildcard patterns, just like the patterns that +-you use to match multiple file names. But in this context, they match +-against parts of the variable value rather than against file names. +- +-`${VARIABLE%%SUFFIX}' +- Substitute the value of VARIABLE, but first discard from that +- variable any portion at the end that matches the pattern SUFFIX. +- +- If there is more than one alternative for how to match against +- SUFFIX, this construct uses the longest possible match. +- +- Thus, `${foo%%r*}' substitutes `t', because the largest match for +- `r*' at the end of `tractor' is `ractor'. +- +-`${VARIABLE%SUFFIX}' +- Substitute the value of VARIABLE, but first discard from that +- variable any portion at the end that matches the pattern SUFFIX. +- +- If there is more than one alternative for how to match against +- SUFFIX, this construct uses the shortest possible alternative. +- +- Thus, `${foo%r*}' substitutes `tracto', because the shortest match +- for `r*' at the end of `tractor' is just `r'. +- +-`${VARIABLE##PREFIX}' +- Substitute the value of VARIABLE, but first discard from that +- variable any portion at the beginning that matches the pattern +- PREFIX. +- +- If there is more than one alternative for how to match against +- PREFIX, this construct uses the longest possible match. +- +- Thus, `${foo##*t}' substitutes `or', because the largest match for +- `*t' at the beginning of `tractor' is `tract'. +- +-`${VARIABLE#PREFIX}' +- Substitute the value of VARIABLE, but first discard from that +- variable any portion at the beginning that matches the pattern +- PREFIX. +- +- If there is more than one alternative for how to match against +- PREFIX, this construct uses the shortest possible alternative. +- +- Thus, `${foo#*t}' substitutes `ractor', because the shortest match +- for `*t' at the beginning of `tractor' is just `t'. +- +- +-File: libc.info, Node: I/O Overview, Next: I/O on Streams, Prev: Pattern Matching, Up: Top +- +-Input/Output Overview +-********************* +- +- Most programs need to do either input (reading data) or output +-(writing data), or most frequently both, in order to do anything +-useful. The GNU C library provides such a large selection of input and +-output functions that the hardest part is often deciding which function +-is most appropriate! +- +- This chapter introduces concepts and terminology relating to input +-and output. Other chapters relating to the GNU I/O facilities are: +- +- * *Note I/O on Streams::, which covers the high-level functions that +- operate on streams, including formatted input and output. +- +- * *Note Low-Level I/O::, which covers the basic I/O and control +- functions on file descriptors. +- +- * *Note File System Interface::, which covers functions for +- operating on directories and for manipulating file attributes such +- as access modes and ownership. +- +- * *Note Pipes and FIFOs::, which includes information on the basic +- interprocess communication facilities. +- +- * *Note Sockets::, which covers a more complicated interprocess +- communication facility with support for networking. +- +- * *Note Low-Level Terminal Interface::, which covers functions for +- changing how input and output to terminals or other serial devices +- are processed. +- +-* Menu: +- +-* I/O Concepts:: Some basic information and terminology. +-* File Names:: How to refer to a file. +- +- +-File: libc.info, Node: I/O Concepts, Next: File Names, Up: I/O Overview +- +-Input/Output Concepts +-===================== +- +- Before you can read or write the contents of a file, you must +-establish a connection or communications channel to the file. This +-process is called "opening" the file. You can open a file for reading, +-writing, or both. +- +- The connection to an open file is represented either as a stream or +-as a file descriptor. You pass this as an argument to the functions +-that do the actual read or write operations, to tell them which file to +-operate on. Certain functions expect streams, and others are designed +-to operate on file descriptors. +- +- When you have finished reading to or writing from the file, you can +-terminate the connection by "closing" the file. Once you have closed a +-stream or file descriptor, you cannot do any more input or output +-operations on it. +- +-* Menu: +- +-* Streams and File Descriptors:: The GNU Library provides two ways +- to access the contents of files. +-* File Position:: The number of bytes from the +- beginning of the file. +- +- +-File: libc.info, Node: Streams and File Descriptors, Next: File Position, Up: I/O Concepts +- +-Streams and File Descriptors +----------------------------- +- +- When you want to do input or output to a file, you have a choice of +-two basic mechanisms for representing the connection between your +-program and the file: file descriptors and streams. File descriptors +-are represented as objects of type `int', while streams are represented +-as `FILE *' objects. +- +- File descriptors provide a primitive, low-level interface to input +-and output operations. Both file descriptors and streams can represent +-a connection to a device (such as a terminal), or a pipe or socket for +-communicating with another process, as well as a normal file. But, if +-you want to do control operations that are specific to a particular kind +-of device, you must use a file descriptor; there are no facilities to +-use streams in this way. You must also use file descriptors if your +-program needs to do input or output in special modes, such as +-nonblocking (or polled) input (*note File Status Flags::). +- +- Streams provide a higher-level interface, layered on top of the +-primitive file descriptor facilities. The stream interface treats all +-kinds of files pretty much alike--the sole exception being the three +-styles of buffering that you can choose (*note Stream Buffering::). +- +- The main advantage of using the stream interface is that the set of +-functions for performing actual input and output operations (as opposed +-to control operations) on streams is much richer and more powerful than +-the corresponding facilities for file descriptors. The file descriptor +-interface provides only simple functions for transferring blocks of +-characters, but the stream interface also provides powerful formatted +-input and output functions (`printf' and `scanf') as well as functions +-for character- and line-oriented input and output. +- +- Since streams are implemented in terms of file descriptors, you can +-extract the file descriptor from a stream and perform low-level +-operations directly on the file descriptor. You can also initially open +-a connection as a file descriptor and then make a stream associated with +-that file descriptor. +- +- In general, you should stick with using streams rather than file +-descriptors, unless there is some specific operation you want to do that +-can only be done on a file descriptor. If you are a beginning +-programmer and aren't sure what functions to use, we suggest that you +-concentrate on the formatted input functions (*note Formatted Input::) +-and formatted output functions (*note Formatted Output::). +- +- If you are concerned about portability of your programs to systems +-other than GNU, you should also be aware that file descriptors are not +-as portable as streams. You can expect any system running ISO C to +-support streams, but non-GNU systems may not support file descriptors at +-all, or may only implement a subset of the GNU functions that operate on +-file descriptors. Most of the file descriptor functions in the GNU +-library are included in the POSIX.1 standard, however. +- +- +-File: libc.info, Node: File Position, Prev: Streams and File Descriptors, Up: I/O Concepts +- +-File Position +-------------- +- +- One of the attributes of an open file is its "file position" that +-keeps track of where in the file the next character is to be read or +-written. In the GNU system, and all POSIX.1 systems, the file position +-is simply an integer representing the number of bytes from the beginning +-of the file. +- +- The file position is normally set to the beginning of the file when +-it is opened, and each time a character is read or written, the file +-position is incremented. In other words, access to the file is normally +-"sequential". +- +- Ordinary files permit read or write operations at any position within +-the file. Some other kinds of files may also permit this. Files which +-do permit this are sometimes referred to as "random-access" files. You +-can change the file position using the `fseek' function on a stream +-(*note File Positioning::) or the `lseek' function on a file descriptor +-(*note I/O Primitives::). If you try to change the file position on a +-file that doesn't support random access, you get the `ESPIPE' error. +- +- Streams and descriptors that are opened for "append access" are +-treated specially for output: output to such files is _always_ appended +-sequentially to the _end_ of the file, regardless of the file position. +-However, the file position is still used to control where in the file +-reading is done. +- +- If you think about it, you'll realize that several programs can read +-a given file at the same time. In order for each program to be able to +-read the file at its own pace, each program must have its own file +-pointer, which is not affected by anything the other programs do. +- +- In fact, each opening of a file creates a separate file position. +-Thus, if you open a file twice even in the same program, you get two +-streams or descriptors with independent file positions. +- +- By contrast, if you open a descriptor and then duplicate it to get +-another descriptor, these two descriptors share the same file position: +-changing the file position of one descriptor will affect the other. +- +- +-File: libc.info, Node: File Names, Prev: I/O Concepts, Up: I/O Overview +- +-File Names +-========== +- +- In order to open a connection to a file, or to perform other +-operations such as deleting a file, you need some way to refer to the +-file. Nearly all files have names that are strings--even files which +-are actually devices such as tape drives or terminals. These strings +-are called "file names". You specify the file name to say which file +-you want to open or operate on. +- +- This section describes the conventions for file names and how the +-operating system works with them. +- +-* Menu: +- +-* Directories:: Directories contain entries for files. +-* File Name Resolution:: A file name specifies how to look up a file. +-* File Name Errors:: Error conditions relating to file names. +-* File Name Portability:: File name portability and syntax issues. +- +- +-File: libc.info, Node: Directories, Next: File Name Resolution, Up: File Names +- +-Directories +------------ +- +- In order to understand the syntax of file names, you need to +-understand how the file system is organized into a hierarchy of +-directories. +- +- A "directory" is a file that contains information to associate other +-files with names; these associations are called "links" or "directory +-entries". Sometimes, people speak of "files in a directory", but in +-reality, a directory only contains pointers to files, not the files +-themselves. +- +- The name of a file contained in a directory entry is called a "file +-name component". In general, a file name consists of a sequence of one +-or more such components, separated by the slash character (`/'). A +-file name which is just one component names a file with respect to its +-directory. A file name with multiple components names a directory, and +-then a file in that directory, and so on. +- +- Some other documents, such as the POSIX standard, use the term +-"pathname" for what we call a file name, and either "filename" or +-"pathname component" for what this manual calls a file name component. +-We don't use this terminology because a "path" is something completely +-different (a list of directories to search), and we think that +-"pathname" used for something else will confuse users. We always use +-"file name" and "file name component" (or sometimes just "component", +-where the context is obvious) in GNU documentation. Some macros use +-the POSIX terminology in their names, such as `PATH_MAX'. These macros +-are defined by the POSIX standard, so we cannot change their names. +- +- You can find more detailed information about operations on +-directories in *Note File System Interface::. +- +- +-File: libc.info, Node: File Name Resolution, Next: File Name Errors, Prev: Directories, Up: File Names +- +-File Name Resolution +--------------------- +- +- A file name consists of file name components separated by slash +-(`/') characters. On the systems that the GNU C library supports, +-multiple successive `/' characters are equivalent to a single `/' +-character. +- +- The process of determining what file a file name refers to is called +-"file name resolution". This is performed by examining the components +-that make up a file name in left-to-right order, and locating each +-successive component in the directory named by the previous component. +-Of course, each of the files that are referenced as directories must +-actually exist, be directories instead of regular files, and have the +-appropriate permissions to be accessible by the process; otherwise the +-file name resolution fails. +- +- If a file name begins with a `/', the first component in the file +-name is located in the "root directory" of the process (usually all +-processes on the system have the same root directory). Such a file name +-is called an "absolute file name". +- +- Otherwise, the first component in the file name is located in the +-current working directory (*note Working Directory::). This kind of +-file name is called a "relative file name". +- +- The file name components `.' ("dot") and `..' ("dot-dot") have +-special meanings. Every directory has entries for these file name +-components. The file name component `.' refers to the directory +-itself, while the file name component `..' refers to its "parent +-directory" (the directory that contains the link for the directory in +-question). As a special case, `..' in the root directory refers to the +-root directory itself, since it has no parent; thus `/..' is the same +-as `/'. +- +- Here are some examples of file names: +- +-`/a' +- The file named `a', in the root directory. +- +-`/a/b' +- The file named `b', in the directory named `a' in the root +- directory. +- +-`a' +- The file named `a', in the current working directory. +- +-`/a/./b' +- This is the same as `/a/b'. +- +-`./a' +- The file named `a', in the current working directory. +- +-`../a' +- The file named `a', in the parent directory of the current working +- directory. +- +- A file name that names a directory may optionally end in a `/'. You +-can specify a file name of `/' to refer to the root directory, but the +-empty string is not a meaningful file name. If you want to refer to +-the current working directory, use a file name of `.' or `./'. +- +- Unlike some other operating systems, the GNU system doesn't have any +-built-in support for file types (or extensions) or file versions as part +-of its file name syntax. Many programs and utilities use conventions +-for file names--for example, files containing C source code usually +-have names suffixed with `.c'--but there is nothing in the file system +-itself that enforces this kind of convention. +- +- +-File: libc.info, Node: File Name Errors, Next: File Name Portability, Prev: File Name Resolution, Up: File Names +- +-File Name Errors +----------------- +- +- Functions that accept file name arguments usually detect these +-`errno' error conditions relating to the file name syntax or trouble +-finding the named file. These errors are referred to throughout this +-manual as the "usual file name errors". +- +-`EACCES' +- The process does not have search permission for a directory +- component of the file name. +- +-`ENAMETOOLONG' +- This error is used when either the total length of a file name is +- greater than `PATH_MAX', or when an individual file name component +- has a length greater than `NAME_MAX'. *Note Limits for Files::. +- +- In the GNU system, there is no imposed limit on overall file name +- length, but some file systems may place limits on the length of a +- component. +- +-`ENOENT' +- This error is reported when a file referenced as a directory +- component in the file name doesn't exist, or when a component is a +- symbolic link whose target file does not exist. *Note Symbolic +- Links::. +- +-`ENOTDIR' +- A file that is referenced as a directory component in the file name +- exists, but it isn't a directory. +- +-`ELOOP' +- Too many symbolic links were resolved while trying to look up the +- file name. The system has an arbitrary limit on the number of +- symbolic links that may be resolved in looking up a single file +- name, as a primitive way to detect loops. *Note Symbolic Links::. +- +- +-File: libc.info, Node: File Name Portability, Prev: File Name Errors, Up: File Names +- +-Portability of File Names +-------------------------- +- +- The rules for the syntax of file names discussed in *Note File +-Names::, are the rules normally used by the GNU system and by other +-POSIX systems. However, other operating systems may use other +-conventions. +- +- There are two reasons why it can be important for you to be aware of +-file name portability issues: +- +- * If your program makes assumptions about file name syntax, or +- contains embedded literal file name strings, it is more difficult +- to get it to run under other operating systems that use different +- syntax conventions. +- +- * Even if you are not concerned about running your program on +- machines that run other operating systems, it may still be +- possible to access files that use different naming conventions. +- For example, you may be able to access file systems on another +- computer running a different operating system over a network, or +- read and write disks in formats used by other operating systems. +- +- The ISO C standard says very little about file name syntax, only that +-file names are strings. In addition to varying restrictions on the +-length of file names and what characters can validly appear in a file +-name, different operating systems use different conventions and syntax +-for concepts such as structured directories and file types or +-extensions. Some concepts such as file versions might be supported in +-some operating systems and not by others. +- +- The POSIX.1 standard allows implementations to put additional +-restrictions on file name syntax, concerning what characters are +-permitted in file names and on the length of file name and file name +-component strings. However, in the GNU system, you do not need to worry +-about these restrictions; any character except the null character is +-permitted in a file name string, and there are no limits on the length +-of file name strings. +- +- +-File: libc.info, Node: I/O on Streams, Next: Low-Level I/O, Prev: I/O Overview, Up: Top +- +-Input/Output on Streams +-*********************** +- +- This chapter describes the functions for creating streams and +-performing input and output operations on them. As discussed in *Note +-I/O Overview::, a stream is a fairly abstract, high-level concept +-representing a communications channel to a file, device, or process. +- +-* Menu: +- +-* Streams:: About the data type representing a stream. +-* Standard Streams:: Streams to the standard input and output +- devices are created for you. +-* Opening Streams:: How to create a stream to talk to a file. +-* Closing Streams:: Close a stream when you are finished with it. +-* Streams and Threads:: Issues with streams in threaded programs. +-* Streams and I18N:: Streams in internationalized applications. +-* Simple Output:: Unformatted output by characters and lines. +-* Character Input:: Unformatted input by characters and words. +-* Line Input:: Reading a line or a record from a stream. +-* Unreading:: Peeking ahead/pushing back input just read. +-* Block Input/Output:: Input and output operations on blocks of data. +-* Formatted Output:: `printf' and related functions. +-* Customizing Printf:: You can define new conversion specifiers for +- `printf' and friends. +-* Formatted Input:: `scanf' and related functions. +-* EOF and Errors:: How you can tell if an I/O error happens. +-* Error Recovery:: What you can do about errors. +-* Binary Streams:: Some systems distinguish between text files +- and binary files. +-* File Positioning:: About random-access streams. +-* Portable Positioning:: Random access on peculiar ISO C systems. +-* Stream Buffering:: How to control buffering of streams. +-* Other Kinds of Streams:: Streams that do not necessarily correspond +- to an open file. +-* Formatted Messages:: Print strictly formatted messages. +- +- +-File: libc.info, Node: Streams, Next: Standard Streams, Up: I/O on Streams +- +-Streams +-======= +- +- For historical reasons, the type of the C data structure that +-represents a stream is called `FILE' rather than "stream". Since most +-of the library functions deal with objects of type `FILE *', sometimes +-the term "file pointer" is also used to mean "stream". This leads to +-unfortunate confusion over terminology in many books on C. This +-manual, however, is careful to use the terms "file" and "stream" only +-in the technical sense. +- +- The `FILE' type is declared in the header file `stdio.h'. +- +- - Data Type: FILE +- This is the data type used to represent stream objects. A `FILE' +- object holds all of the internal state information about the +- connection to the associated file, including such things as the +- file position indicator and buffering information. Each stream +- also has error and end-of-file status indicators that can be +- tested with the `ferror' and `feof' functions; see *Note EOF and +- Errors::. +- +- `FILE' objects are allocated and managed internally by the +-input/output library functions. Don't try to create your own objects of +-type `FILE'; let the library do it. Your programs should deal only +-with pointers to these objects (that is, `FILE *' values) rather than +-the objects themselves. +- +- +-File: libc.info, Node: Standard Streams, Next: Opening Streams, Prev: Streams, Up: I/O on Streams +- +-Standard Streams +-================ +- +- When the `main' function of your program is invoked, it already has +-three predefined streams open and available for use. These represent +-the "standard" input and output channels that have been established for +-the process. +- +- These streams are declared in the header file `stdio.h'. +- +- - Variable: FILE * stdin +- The "standard input" stream, which is the normal source of input +- for the program. +- +- - Variable: FILE * stdout +- The "standard output" stream, which is used for normal output from +- the program. +- +- - Variable: FILE * stderr +- The "standard error" stream, which is used for error messages and +- diagnostics issued by the program. +- +- In the GNU system, you can specify what files or processes +-correspond to these streams using the pipe and redirection facilities +-provided by the shell. (The primitives shells use to implement these +-facilities are described in *Note File System Interface::.) Most other +-operating systems provide similar mechanisms, but the details of how to +-use them can vary. +- +- In the GNU C library, `stdin', `stdout', and `stderr' are normal +-variables which you can set just like any others. For example, to +-redirect the standard output to a file, you could do: +- +- fclose (stdout); +- stdout = fopen ("standard-output-file", "w"); +- +- Note however, that in other systems `stdin', `stdout', and `stderr' +-are macros that you cannot assign to in the normal way. But you can +-use `freopen' to get the effect of closing one and reopening it. *Note +-Opening Streams::. +- +- The three streams `stdin', `stdout', and `stderr' are not unoriented +-at program start (*note Streams and I18N::). +- +- +-File: libc.info, Node: Opening Streams, Next: Closing Streams, Prev: Standard Streams, Up: I/O on Streams +- +-Opening Streams +-=============== +- +- Opening a file with the `fopen' function creates a new stream and +-establishes a connection between the stream and a file. This may +-involve creating a new file. +- +- Everything described in this section is declared in the header file +-`stdio.h'. +- +- - Function: FILE * fopen (const char *FILENAME, const char *OPENTYPE) +- The `fopen' function opens a stream for I/O to the file FILENAME, +- and returns a pointer to the stream. +- +- The OPENTYPE argument is a string that controls how the file is +- opened and specifies attributes of the resulting stream. It must +- begin with one of the following sequences of characters: +- +- `r' +- Open an existing file for reading only. +- +- `w' +- Open the file for writing only. If the file already exists, +- it is truncated to zero length. Otherwise a new file is +- created. +- +- `a' +- Open a file for append access; that is, writing at the end of +- file only. If the file already exists, its initial contents +- are unchanged and output to the stream is appended to the end +- of the file. Otherwise, a new, empty file is created. +- +- `r+' +- Open an existing file for both reading and writing. The +- initial contents of the file are unchanged and the initial +- file position is at the beginning of the file. +- +- `w+' +- Open a file for both reading and writing. If the file +- already exists, it is truncated to zero length. Otherwise, a +- new file is created. +- +- `a+' +- Open or create file for both reading and appending. If the +- file exists, its initial contents are unchanged. Otherwise, +- a new file is created. The initial file position for reading +- is at the beginning of the file, but output is always +- appended to the end of the file. +- +- As you can see, `+' requests a stream that can do both input and +- output. The ISO standard says that when using such a stream, you +- must call `fflush' (*note Stream Buffering::) or a file positioning +- function such as `fseek' (*note File Positioning::) when switching +- from reading to writing or vice versa. Otherwise, internal buffers +- might not be emptied properly. The GNU C library does not have +- this limitation; you can do arbitrary reading and writing +- operations on a stream in whatever order. +- +- Additional characters may appear after these to specify flags for +- the call. Always put the mode (`r', `w+', etc.) first; that is +- the only part you are guaranteed will be understood by all systems. +- +- The GNU C library defines one additional character for use in +- OPENTYPE: the character `x' insists on creating a new file--if a +- file FILENAME already exists, `fopen' fails rather than opening +- it. If you use `x' you are guaranteed that you will not clobber +- an existing file. This is equivalent to the `O_EXCL' option to +- the `open' function (*note Opening and Closing Files::). +- +- The character `b' in OPENTYPE has a standard meaning; it requests +- a binary stream rather than a text stream. But this makes no +- difference in POSIX systems (including the GNU system). If both +- `+' and `b' are specified, they can appear in either order. *Note +- Binary Streams::. +- +- If the OPENTYPE string contains the sequence `,ccs=STRING' then +- STRING is taken as the name of a coded character set and `fopen' +- will mark the stream as wide-oriented which appropriate conversion +- functions in place to convert from and to the character set STRING +- is place. Any other stream is opened initially unoriented and the +- orientation is decided with the first file operation. If the +- first operation is a wide character operation, the stream is not +- only marked as wide-oriented, also the conversion functions to +- convert to the coded character set used for the current locale are +- loaded. This will not change anymore from this point on even if +- the locale selected for the `LC_CTYPE' category is changed. +- +- Any other characters in OPENTYPE are simply ignored. They may be +- meaningful in other systems. +- +- If the open fails, `fopen' returns a null pointer. +- +- When the sources are compiling with `_FILE_OFFSET_BITS == 64' on a +- 32 bit machine this function is in fact `fopen64' since the LFS +- interface replaces transparently the old interface. +- +- You can have multiple streams (or file descriptors) pointing to the +-same file open at the same time. If you do only input, this works +-straightforwardly, but you must be careful if any output streams are +-included. *Note Stream/Descriptor Precautions::. This is equally true +-whether the streams are in one program (not usual) or in several +-programs (which can easily happen). It may be advantageous to use the +-file locking facilities to avoid simultaneous access. *Note File +-Locks::. +- +- - Function: FILE * fopen64 (const char *FILENAME, const char *OPENTYPE) +- This function is similar to `fopen' but the stream it returns a +- pointer for is opened using `open64'. Therefore this stream can be +- used even on files larger then 2^31 bytes on 32 bit machines. +- +- Please note that the return type is still `FILE *'. There is no +- special `FILE' type for the LFS interface. +- +- If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32 +- bits machine this function is available under the name `fopen' and +- so transparently replaces the old interface. +- +- - Macro: int FOPEN_MAX +- The value of this macro is an integer constant expression that +- represents the minimum number of streams that the implementation +- guarantees can be open simultaneously. You might be able to open +- more than this many streams, but that is not guaranteed. The +- value of this constant is at least eight, which includes the three +- standard streams `stdin', `stdout', and `stderr'. In POSIX.1 +- systems this value is determined by the `OPEN_MAX' parameter; +- *note General Limits::. In BSD and GNU, it is controlled by the +- `RLIMIT_NOFILE' resource limit; *note Limits on Resources::. +- +- - Function: FILE * freopen (const char *FILENAME, const char +- *OPENTYPE, FILE *STREAM) +- This function is like a combination of `fclose' and `fopen'. It +- first closes the stream referred to by STREAM, ignoring any errors +- that are detected in the process. (Because errors are ignored, +- you should not use `freopen' on an output stream if you have +- actually done any output using the stream.) Then the file named by +- FILENAME is opened with mode OPENTYPE as for `fopen', and +- associated with the same stream object STREAM. +- +- If the operation fails, a null pointer is returned; otherwise, +- `freopen' returns STREAM. +- +- `freopen' has traditionally been used to connect a standard stream +- such as `stdin' with a file of your own choice. This is useful in +- programs in which use of a standard stream for certain purposes is +- hard-coded. In the GNU C library, you can simply close the +- standard streams and open new ones with `fopen'. But other +- systems lack this ability, so using `freopen' is more portable. +- +- When the sources are compiling with `_FILE_OFFSET_BITS == 64' on a +- 32 bit machine this function is in fact `freopen64' since the LFS +- interface replaces transparently the old interface. +- +- - Function: FILE * freopen64 (const char *FILENAME, const char +- *OPENTYPE, FILE *STREAM) +- This function is similar to `freopen'. The only difference is that +- on 32 bit machine the stream returned is able to read beyond the +- 2^31 bytes limits imposed by the normal interface. It should be +- noted that the stream pointed to by STREAM need not be opened +- using `fopen64' or `freopen64' since its mode is not important for +- this function. +- +- If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32 +- bits machine this function is available under the name `freopen' +- and so transparently replaces the old interface. +- +- In some situations it is useful to know whether a given stream is +-available for reading or writing. This information is normally not +-available and would have to be remembered separately. Solaris +-introduced a few functions to get this information from the stream +-descriptor and these functions are also available in the GNU C library. +- +- - Function: int __freadable (FILE *STREAM) +- The `__freadable' function determines whether the stream STREAM +- was opened to allow reading. In this case the return value is +- nonzero. For write-only streams the function returns zero. +- +- This function is declared in `stdio_ext.h'. +- +- - Function: int __fwritable (FILE *STREAM) +- The `__fwritable' function determines whether the stream STREAM +- was opened to allow writing. In this case the return value is +- nonzero. For read-only streams the function returns zero. +- +- This function is declared in `stdio_ext.h'. +- +- For slightly different kind of problems there are two more functions. +-They provide even finer-grained information. +- +- - Function: int __freading (FILE *STREAM) +- The `__freading' function determines whether the stream STREAM was +- last read from or whether it is opened read-only. In this case +- the return value is nonzero, otherwise it is zero. Determining +- whether a stream opened for reading and writing was last used for +- writing allows to draw conclusions about the content about the +- buffer, among other things. +- +- This function is declared in `stdio_ext.h'. +- +- - Function: int __fwriting (FILE *STREAM) +- The `__fwriting' function determines whether the stream STREAM was +- last written to or whether it is opened write-only. In this case +- the return value is nonzero, otherwise it is zero. +- +- This function is declared in `stdio_ext.h'. +- +- +-File: libc.info, Node: Closing Streams, Next: Streams and Threads, Prev: Opening Streams, Up: I/O on Streams +- +-Closing Streams +-=============== +- +- When a stream is closed with `fclose', the connection between the +-stream and the file is canceled. After you have closed a stream, you +-cannot perform any additional operations on it. +- +- - Function: int fclose (FILE *STREAM) +- This function causes STREAM to be closed and the connection to the +- corresponding file to be broken. Any buffered output is written +- and any buffered input is discarded. The `fclose' function returns +- a value of `0' if the file was closed successfully, and `EOF' if +- an error was detected. +- +- It is important to check for errors when you call `fclose' to close +- an output stream, because real, everyday errors can be detected at +- this time. For example, when `fclose' writes the remaining +- buffered output, it might get an error because the disk is full. +- Even if you know the buffer is empty, errors can still occur when +- closing a file if you are using NFS. +- +- The function `fclose' is declared in `stdio.h'. +- +- To close all streams currently available the GNU C Library provides +-another function. +- +- - Function: int fcloseall (void) +- This function causes all open streams of the process to be closed +- and the connection to corresponding files to be broken. All +- buffered data is written and any buffered input is discarded. The +- `fcloseall' function returns a value of `0' if all the files were +- closed successfully, and `EOF' if an error was detected. +- +- This function should be used only in special situations, e.g., +- when an error occurred and the program must be aborted. Normally +- each single stream should be closed separately so that problems +- with individual streams can be identified. It is also problematic +- since the standard streams (*note Standard Streams::) will also be +- closed. +- +- The function `fcloseall' is declared in `stdio.h'. +- +- If the `main' function to your program returns, or if you call the +-`exit' function (*note Normal Termination::), all open streams are +-automatically closed properly. If your program terminates in any other +-manner, such as by calling the `abort' function (*note Aborting a +-Program::) or from a fatal signal (*note Signal Handling::), open +-streams might not be closed properly. Buffered output might not be +-flushed and files may be incomplete. For more information on buffering +-of streams, see *Note Stream Buffering::. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-17 glibc-2.3.2-200304020432/manual/libc.info-17 +--- glibc-2.3.2/manual/libc.info-17 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-17 Thu Jan 1 01:00:00 1970 +@@ -1,1136 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Streams and Threads, Next: Streams and I18N, Prev: Closing Streams, Up: I/O on Streams +- +-Streams and Threads +-=================== +- +- 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 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. +- +- The POSIX standard requires that by default the stream operations are +-atomic. I.e., issuing two stream operations for the same stream in two +-threads at the same time will cause the operations to be executed as if +-they were issued sequentially. The buffer operations performed while +-reading or writing are protected from other uses of the same stream. To +-do this each stream has an internal lock object which has to be +-(implicitly) acquired before any work can be done. +- +- But there are situations where this is not enough and there are also +-situations where this is not wanted. The implicit locking is not enough +-if the program requires more than one stream function call to happen +-atomically. One example would be if an output line a program wants to +-generate is created by several function calls. The functions by +-themselves would ensure only atomicity of their own operation, but not +-atomicity over all the function calls. For this it is necessary to +-perform the stream locking in the application code. +- +- - Function: void flockfile (FILE *STREAM) +- The `flockfile' function acquires the internal locking object +- associated with the stream STREAM. This ensures that no other +- thread can explicitly through `flockfile'/`ftrylockfile' or +- implicit through a call of a stream function lock the stream. The +- thread will block until the lock is acquired. An explicit call to +- `funlockfile' has to be used to release the lock. +- +- - Function: int ftrylockfile (FILE *STREAM) +- The `ftrylockfile' function tries to acquire the internal locking +- object associated with the stream STREAM just like `flockfile'. +- But unlike `flockfile' this function does not block if the lock is +- not available. `ftrylockfile' returns zero if the lock was +- successfully acquired. Otherwise the stream is locked by another +- thread. +- +- - Function: void funlockfile (FILE *STREAM) +- The `funlockfile' function releases the internal locking object of +- the stream STREAM. The stream must have been locked before by a +- call to `flockfile' or a successful call of `ftrylockfile'. The +- implicit locking performed by the stream operations do not count. +- The `funlockfile' function does not return an error status and the +- behavior of a call for a stream which is not locked by the current +- thread is undefined. +- +- The following example shows how the functions above can be used to +-generate an output line atomically even in multi-threaded applications +-(yes, the same job could be done with one `fprintf' call but it is +-sometimes not possible): +- +- FILE *fp; +- { +- ... +- flockfile (fp); +- fputs ("This is test number ", fp); +- fprintf (fp, "%d\n", test); +- funlockfile (fp) +- } +- +- Without the explicit locking it would be possible for another thread +-to use the stream FP after the `fputs' call return and before `fprintf' +-was called with the result that the number does not follow the word +-`number'. +- +- From this description it might already be clear that the locking +-objects in streams are no simple mutexes. Since locking the same +-stream twice in the same thread is allowed the locking objects must be +-equivalent to recursive mutexes. These mutexes keep track of the owner +-and the number of times the lock is acquired. The same number of +-`funlockfile' calls by the same threads is necessary to unlock the +-stream completely. For instance: +- +- void +- foo (FILE *fp) +- { +- ftrylockfile (fp); +- fputs ("in foo\n", fp); +- /* This is very wrong!!! */ +- funlockfile (fp); +- } +- +- It is important here that the `funlockfile' function is only called +-if the `ftrylockfile' function succeeded in locking the stream. It is +-therefore always wrong to ignore the result of `ftrylockfile'. And it +-makes no sense since otherwise one would use `flockfile'. The result +-of code like that above is that either `funlockfile' tries to free a +-stream that hasn't been locked by the current thread or it frees the +-stream prematurely. The code should look like this: +- +- void +- foo (FILE *fp) +- { +- if (ftrylockfile (fp) == 0) +- { +- fputs ("in foo\n", fp); +- funlockfile (fp); +- } +- } +- +- Now that we covered why it is necessary to have these locking it is +-necessary to talk about situations when locking is unwanted and what can +-be done. The locking operations (explicit or implicit) don't come for +-free. Even if a lock is not taken the cost is not zero. The operations +-which have to be performed require memory operations that are safe in +-multi-processor environments. With the many local caches involved in +-such systems this is quite costly. So it is best to avoid the locking +-completely if it is not needed - because the code in question is never +-used in a context where two or more threads may use a stream at a time. +-This can be determined most of the time for application code; for +-library code which can be used in many contexts one should default to be +-conservative and use locking. +- +- There are two basic mechanisms to avoid locking. The first is to use +-the `_unlocked' variants of the stream operations. The POSIX standard +-defines quite a few of those and the GNU library adds a few more. +-These variants of the functions behave just like the functions with the +-name without the suffix except that they do not lock the stream. Using +-these functions is very desirable since they are potentially much +-faster. This is not only because the locking operation itself is +-avoided. More importantly, functions like `putc' and `getc' are very +-simple and traditionally (before the introduction of threads) were +-implemented as macros which are very fast if the buffer is not empty. +-With the addition of locking requirements these functions are no longer +-implemented as macros since they would would expand to too much code. +-But these macros are still available with the same functionality under +-the new names `putc_unlocked' and `getc_unlocked'. This possibly huge +-difference of speed also suggests the use of the `_unlocked' functions +-even if locking is required. The difference is that the locking then +-has to be performed in the program: +- +- void +- foo (FILE *fp, char *buf) +- { +- flockfile (fp); +- while (*buf != '/') +- putc_unlocked (*buf++, fp); +- funlockfile (fp); +- } +- +- If in this example the `putc' function would be used and the +-explicit locking would be missing the `putc' function would have to +-acquire the lock in every call, potentially many times depending on when +-the loop terminates. Writing it the way illustrated above allows the +-`putc_unlocked' macro to be used which means no locking and direct +-manipulation of the buffer of the stream. +- +- A second way to avoid locking is by using a non-standard function +-which was introduced in Solaris and is available in the GNU C library +-as well. +- +- - Function: int __fsetlocking (FILE *STREAM, int TYPE) +- The `__fsetlocking' function can be used to select whether the +- stream operations will implicitly acquire the locking object of the +- stream STREAM. By default this is done but it can be disabled and +- reinstated using this function. There are three values defined +- for the TYPE parameter. +- +- `FSETLOCKING_INTERNAL' +- The stream `stream' will from now on use the default internal +- locking. Every stream operation with exception of the +- `_unlocked' variants will implicitly lock the stream. +- +- `FSETLOCKING_BYCALLER' +- After the `__fsetlocking' function returns the user is +- responsible for locking the stream. None of the stream +- operations will implicitly do this anymore until the state is +- set back to `FSETLOCKING_INTERNAL'. +- +- `FSETLOCKING_QUERY' +- `__fsetlocking' only queries the current locking state of the +- stream. The return value will be `FSETLOCKING_INTERNAL' or +- `FSETLOCKING_BYCALLER' depending on the state. +- +- The return value of `__fsetlocking' is either +- `FSETLOCKING_INTERNAL' or `FSETLOCKING_BYCALLER' depending on the +- state of the stream before the call. +- +- This function and the values for the TYPE parameter are declared +- in `stdio_ext.h'. +- +- This function is especially useful when program code has to be used +-which is written without knowledge about the `_unlocked' functions (or +-if the programmer was too lazy to use them). +- +- +-File: libc.info, Node: Streams and I18N, Next: Simple Output, Prev: Streams and Threads, Up: I/O on Streams +- +-Streams in Internationalized Applications +-========================================= +- +- ISO C90 introduced the new type `wchar_t' to allow handling larger +-character sets. What was missing was a possibility to output strings +-of `wchar_t' directly. One had to convert them into multibyte strings +-using `mbstowcs' (there was no `mbsrtowcs' yet) and then use the normal +-stream functions. While this is doable it is very cumbersome since +-performing the conversions is not trivial and greatly increases program +-complexity and size. +- +- The Unix standard early on (I think in XPG4.2) introduced two +-additional format specifiers for the `printf' and `scanf' families of +-functions. Printing and reading of single wide characters was made +-possible using the `%C' specifier and wide character strings can be +-handled with `%S'. These modifiers behave just like `%c' and `%s' only +-that they expect the corresponding argument to have the wide character +-type and that the wide character and string are transformed into/from +-multibyte strings before being used. +- +- This was a beginning but it is still not good enough. Not always is +-it desirable to use `printf' and `scanf'. The other, smaller and +-faster functions cannot handle wide characters. Second, it is not +-possible to have a format string for `printf' and `scanf' consisting of +-wide characters. The result is that format strings would have to be +-generated if they have to contain non-basic characters. +- +- In the Amendment 1 to ISO C90 a whole new set of functions was added +-to solve the problem. Most of the stream functions got a counterpart +-which take a wide character or wide character string instead of a +-character or string respectively. The new functions operate on the +-same streams (like `stdout'). This is different from the model of the +-C++ runtime library where separate streams for wide and normal I/O are +-used. +- +- Being able to use the same stream for wide and normal operations +-comes with a restriction: a stream can be used either for wide +-operations or for normal operations. Once it is decided there is no +-way back. Only a call to `freopen' or `freopen64' can reset the +-"orientation". The orientation can be decided in three ways: +- +- * If any of the normal character functions is used (this includes the +- `fread' and `fwrite' functions) the stream is marked as not wide +- oriented. +- +- * If any of the wide character functions is used the stream is +- marked as wide oriented. +- +- * The `fwide' function can be used to set the orientation either way. +- +- It is important to never mix the use of wide and not wide operations +-on a stream. There are no diagnostics issued. The application behavior +-will simply be strange or the application will simply crash. The +-`fwide' function can help avoiding this. +- +- - Function: int fwide (FILE *STREAM, int MODE) +- The `fwide' function can be used to set and query the state of the +- orientation of the stream STREAM. If the MODE parameter has a +- positive value the streams get wide oriented, for negative values +- narrow oriented. It is not possible to overwrite previous +- orientations with `fwide'. I.e., if the stream STREAM was already +- oriented before the call nothing is done. +- +- If MODE is zero the current orientation state is queried and +- nothing is changed. +- +- The `fwide' function returns a negative value, zero, or a positive +- value if the stream is narrow, not at all, or wide oriented +- respectively. +- +- This function was introduced in Amendment 1 to ISO C90 and is +- declared in `wchar.h'. +- +- It is generally a good idea to orient a stream as early as possible. +-This can prevent surprise especially for the standard streams `stdin', +-`stdout', and `stderr'. If some library function in some situations +-uses one of these streams and this use orients the stream in a +-different way the rest of the application expects it one might end up +-with hard to reproduce errors. Remember that no errors are signal if +-the streams are used incorrectly. Leaving a stream unoriented after +-creation is normally only necessary for library functions which create +-streams which can be used in different contexts. +- +- When writing code which uses streams and which can be used in +-different contexts it is important to query the orientation of the +-stream before using it (unless the rules of the library interface +-demand a specific orientation). The following little, silly function +-illustrates this. +- +- void +- print_f (FILE *fp) +- { +- if (fwide (fp, 0) > 0) +- /* Positive return value means wide orientation. */ +- fputwc (L'f', fp); +- else +- fputc ('f', fp); +- } +- +- Note that in this case the function `print_f' decides about the +-orientation of the stream if it was unoriented before (will not happen +-if the advise above is followed). +- +- The encoding used for the `wchar_t' values is unspecified and the +-user must not make any assumptions about it. For I/O of `wchar_t' +-values this means that it is impossible to write these values directly +-to the stream. This is not what follows from the ISO C locale model +-either. What happens instead is that the bytes read from or written to +-the underlying media are first converted into the internal encoding +-chosen by the implementation for `wchar_t'. The external encoding is +-determined by the `LC_CTYPE' category of the current locale or by the +-`ccs' part of the mode specification given to `fopen', `fopen64', +-`freopen', or `freopen64'. How and when the conversion happens is +-unspecified and it happens invisible to the user. +- +- Since a stream is created in the unoriented state it has at that +-point no conversion associated with it. The conversion which will be +-used is determined by the `LC_CTYPE' category selected at the time the +-stream is oriented. If the locales are changed at the runtime this +-might produce surprising results unless one pays attention. This is +-just another good reason to orient the stream explicitly as soon as +-possible, perhaps with a call to `fwide'. +- +- +-File: libc.info, Node: Simple Output, Next: Character Input, Prev: Streams and I18N, Up: I/O on Streams +- +-Simple Output by Characters or Lines +-==================================== +- +- This section describes functions for performing character- and +-line-oriented output. +- +- These narrow streams functions are declared in the header file +-`stdio.h' and the wide stream functions in `wchar.h'. +- +- - Function: int fputc (int C, FILE *STREAM) +- The `fputc' function converts the character C to type `unsigned +- char', and writes it to the stream STREAM. `EOF' is returned if a +- write error occurs; otherwise the character C is returned. +- +- - Function: wint_t fputwc (wchar_t WC, FILE *STREAM) +- The `fputwc' function writes the wide character WC to the stream +- STREAM. `WEOF' is returned if a write error occurs; otherwise the +- character WC is returned. +- +- - Function: int fputc_unlocked (int C, FILE *STREAM) +- The `fputc_unlocked' function is equivalent to the `fputc' +- function except that it does not implicitly lock the stream. +- +- - Function: wint_t fputwc_unlocked (wint_t WC, FILE *STREAM) +- The `fputwc_unlocked' function is equivalent to the `fputwc' +- function except that it does not implicitly lock the stream. +- +- This function is a GNU extension. +- +- - Function: int putc (int C, FILE *STREAM) +- This is just like `fputc', except that most systems implement it as +- a macro, making it faster. One consequence is that it may +- evaluate the STREAM argument more than once, which is an exception +- to the general rule for macros. `putc' is usually the best +- function to use for writing a single character. +- +- - Function: wint_t putwc (wchar_t WC, FILE *STREAM) +- This is just like `fputwc', except that it can be implement as a +- macro, making it faster. One consequence is that it may evaluate +- the STREAM argument more than once, which is an exception to the +- general rule for macros. `putwc' is usually the best function to +- use for writing a single wide character. +- +- - Function: int putc_unlocked (int C, FILE *STREAM) +- The `putc_unlocked' function is equivalent to the `putc' function +- except that it does not implicitly lock the stream. +- +- - Function: wint_t putwc_unlocked (wchar_t WC, FILE *STREAM) +- The `putwc_unlocked' function is equivalent to the `putwc' +- function except that it does not implicitly lock the stream. +- +- This function is a GNU extension. +- +- - Function: int putchar (int C) +- The `putchar' function is equivalent to `putc' with `stdout' as +- the value of the STREAM argument. +- +- - Function: wint_t putwchar (wchar_t WC) +- The `putwchar' function is equivalent to `putwc' with `stdout' as +- the value of the STREAM argument. +- +- - Function: int putchar_unlocked (int C) +- The `putchar_unlocked' function is equivalent to the `putchar' +- function except that it does not implicitly lock the stream. +- +- - Function: wint_t putwchar_unlocked (wchar_t WC) +- The `putwchar_unlocked' function is equivalent to the `putwchar' +- function except that it does not implicitly lock the stream. +- +- This function is a GNU extension. +- +- - Function: int fputs (const char *S, FILE *STREAM) +- The function `fputs' writes the string S to the stream STREAM. +- The terminating null character is not written. This function does +- _not_ add a newline character, either. It outputs only the +- characters in the string. +- +- This function returns `EOF' if a write error occurs, and otherwise +- a non-negative value. +- +- For example: +- +- fputs ("Are ", stdout); +- fputs ("you ", stdout); +- fputs ("hungry?\n", stdout); +- +- outputs the text `Are you hungry?' followed by a newline. +- +- - Function: int fputws (const wchar_t *WS, FILE *STREAM) +- The function `fputws' writes the wide character string WS to the +- stream STREAM. The terminating null character is not written. +- This function does _not_ add a newline character, either. It +- outputs only the characters in the string. +- +- This function returns `WEOF' if a write error occurs, and otherwise +- a non-negative value. +- +- - Function: int fputs_unlocked (const char *S, FILE *STREAM) +- The `fputs_unlocked' function is equivalent to the `fputs' +- function except that it does not implicitly lock the stream. +- +- This function is a GNU extension. +- +- - Function: int fputws_unlocked (const wchar_t *WS, FILE *STREAM) +- The `fputws_unlocked' function is equivalent to the `fputws' +- function except that it does not implicitly lock the stream. +- +- This function is a GNU extension. +- +- - Function: int puts (const char *S) +- The `puts' function writes the string S to the stream `stdout' +- followed by a newline. The terminating null character of the +- string is not written. (Note that `fputs' does _not_ write a +- newline as this function does.) +- +- `puts' is the most convenient function for printing simple +- messages. For example: +- +- puts ("This is a message."); +- +- outputs the text `This is a message.' followed by a newline. +- +- - Function: int putw (int W, FILE *STREAM) +- This function writes the word W (that is, an `int') to STREAM. It +- is provided for compatibility with SVID, but we recommend you use +- `fwrite' instead (*note Block Input/Output::). +- +- +-File: libc.info, Node: Character Input, Next: Line Input, Prev: Simple Output, Up: I/O on Streams +- +-Character Input +-=============== +- +- This section describes functions for performing character-oriented +-input. These narrow streams functions are declared in the header file +-`stdio.h' and the wide character functions are declared in `wchar.h'. +- +- These functions return an `int' or `wint_t' value (for narrow and +-wide stream functions respectively) that is either a character of +-input, or the special value `EOF'/`WEOF' (usually -1). For the narrow +-stream functions it is important to store the result of these functions +-in a variable of type `int' instead of `char', even when you plan to +-use it only as a character. Storing `EOF' in a `char' variable +-truncates its value to the size of a character, so that it is no longer +-distinguishable from the valid character `(char) -1'. So always use an +-`int' for the result of `getc' and friends, and check for `EOF' after +-the call; once you've verified that the result is not `EOF', you can be +-sure that it will fit in a `char' variable without loss of information. +- +- - Function: int fgetc (FILE *STREAM) +- This function reads the next character as an `unsigned char' from +- the stream STREAM and returns its value, converted to an `int'. +- If an end-of-file condition or read error occurs, `EOF' is +- returned instead. +- +- - Function: wint_t fgetwc (FILE *STREAM) +- This function reads the next wide character from the stream STREAM +- and returns its value. If an end-of-file condition or read error +- occurs, `WEOF' is returned instead. +- +- - Function: int fgetc_unlocked (FILE *STREAM) +- The `fgetc_unlocked' function is equivalent to the `fgetc' +- function except that it does not implicitly lock the stream. +- +- - Function: wint_t fgetwc_unlocked (FILE *STREAM) +- The `fgetwc_unlocked' function is equivalent to the `fgetwc' +- function except that it does not implicitly lock the stream. +- +- This function is a GNU extension. +- +- - Function: int getc (FILE *STREAM) +- This is just like `fgetc', except that it is permissible (and +- typical) for it to be implemented as a macro that evaluates the +- STREAM argument more than once. `getc' is often highly optimized, +- so it is usually the best function to use to read a single +- character. +- +- - Function: wint_t getwc (FILE *STREAM) +- This is just like `fgetwc', except that it is permissible for it to +- be implemented as a macro that evaluates the STREAM argument more +- than once. `getwc' can be highly optimized, so it is usually the +- best function to use to read a single wide character. +- +- - Function: int getc_unlocked (FILE *STREAM) +- The `getc_unlocked' function is equivalent to the `getc' function +- except that it does not implicitly lock the stream. +- +- - Function: wint_t getwc_unlocked (FILE *STREAM) +- The `getwc_unlocked' function is equivalent to the `getwc' +- function except that it does not implicitly lock the stream. +- +- This function is a GNU extension. +- +- - Function: int getchar (void) +- The `getchar' function is equivalent to `getc' with `stdin' as the +- value of the STREAM argument. +- +- - Function: wint_t getwchar (void) +- The `getwchar' function is equivalent to `getwc' with `stdin' as +- the value of the STREAM argument. +- +- - Function: int getchar_unlocked (void) +- The `getchar_unlocked' function is equivalent to the `getchar' +- function except that it does not implicitly lock the stream. +- +- - Function: wint_t getwchar_unlocked (void) +- The `getwchar_unlocked' function is equivalent to the `getwchar' +- function except that it does not implicitly lock the stream. +- +- This function is a GNU extension. +- +- Here is an example of a function that does input using `fgetc'. It +-would work just as well using `getc' instead, or using `getchar ()' +-instead of `fgetc (stdin)'. The code would also work the same for the +-wide character stream functions. +- +- int +- y_or_n_p (const char *question) +- { +- fputs (question, stdout); +- while (1) +- { +- int c, answer; +- /* Write a space to separate answer from question. */ +- fputc (' ', stdout); +- /* Read the first character of the line. +- This should be the answer character, but might not be. */ +- c = tolower (fgetc (stdin)); +- answer = c; +- /* Discard rest of input line. */ +- while (c != '\n' && c != EOF) +- c = fgetc (stdin); +- /* Obey the answer if it was valid. */ +- if (answer == 'y') +- return 1; +- if (answer == 'n') +- return 0; +- /* Answer was invalid: ask for valid answer. */ +- fputs ("Please answer y or n:", stdout); +- } +- } +- +- - Function: int getw (FILE *STREAM) +- This function reads a word (that is, an `int') from STREAM. It's +- provided for compatibility with SVID. We recommend you use +- `fread' instead (*note Block Input/Output::). Unlike `getc', any +- `int' value could be a valid result. `getw' returns `EOF' when it +- encounters end-of-file or an error, but there is no way to +- distinguish this from an input word with value -1. +- +- +-File: libc.info, Node: Line Input, Next: Unreading, Prev: Character Input, Up: I/O on Streams +- +-Line-Oriented Input +-=================== +- +- Since many programs interpret input on the basis of lines, it is +-convenient to have functions to read a line of text from a stream. +- +- Standard C has functions to do this, but they aren't very safe: null +-characters and even (for `gets') long lines can confuse them. So the +-GNU library provides the nonstandard `getline' function that makes it +-easy to read lines reliably. +- +- Another GNU extension, `getdelim', generalizes `getline'. It reads +-a delimited record, defined as everything through the next occurrence +-of a specified delimiter character. +- +- All these functions are declared in `stdio.h'. +- +- - Function: ssize_t getline (char **LINEPTR, size_t *N, FILE *STREAM) +- This function reads an entire line from STREAM, storing the text +- (including the newline and a terminating null character) in a +- buffer and storing the buffer address in `*LINEPTR'. +- +- Before calling `getline', you should place in `*LINEPTR' the +- address of a buffer `*N' bytes long, allocated with `malloc'. If +- this buffer is long enough to hold the line, `getline' stores the +- line in this buffer. Otherwise, `getline' makes the buffer bigger +- using `realloc', storing the new buffer address back in `*LINEPTR' +- and the increased size back in `*N'. *Note Unconstrained +- Allocation::. +- +- If you set `*LINEPTR' to a null pointer, and `*N' to zero, before +- the call, then `getline' allocates the initial buffer for you by +- calling `malloc'. +- +- In either case, when `getline' returns, `*LINEPTR' is a `char *' +- which points to the text of the line. +- +- When `getline' is successful, it returns the number of characters +- read (including the newline, but not including the terminating +- null). This value enables you to distinguish null characters that +- are part of the line from the null character inserted as a +- terminator. +- +- This function is a GNU extension, but it is the recommended way to +- read lines from a stream. The alternative standard functions are +- unreliable. +- +- If an error occurs or end of file is reached without any bytes +- read, `getline' returns `-1'. +- +- - Function: ssize_t getdelim (char **LINEPTR, size_t *N, int +- DELIMITER, FILE *STREAM) +- This function is like `getline' except that the character which +- tells it to stop reading is not necessarily newline. The argument +- DELIMITER specifies the delimiter character; `getdelim' keeps +- reading until it sees that character (or end of file). +- +- The text is stored in LINEPTR, including the delimiter character +- and a terminating null. Like `getline', `getdelim' makes LINEPTR +- bigger if it isn't big enough. +- +- `getline' is in fact implemented in terms of `getdelim', just like +- this: +- +- ssize_t +- getline (char **lineptr, size_t *n, FILE *stream) +- { +- return getdelim (lineptr, n, '\n', stream); +- } +- +- - Function: char * fgets (char *S, int COUNT, FILE *STREAM) +- The `fgets' function reads characters from the stream STREAM up to +- and including a newline character and stores them in the string S, +- adding a null character to mark the end of the string. You must +- supply COUNT characters worth of space in S, but the number of +- characters read is at most COUNT - 1. The extra character space +- is used to hold the null character at the end of the string. +- +- If the system is already at end of file when you call `fgets', then +- the contents of the array S are unchanged and a null pointer is +- returned. A null pointer is also returned if a read error occurs. +- Otherwise, the return value is the pointer S. +- +- *Warning:* If the input data has a null character, you can't tell. +- So don't use `fgets' unless you know the data cannot contain a +- null. Don't use it to read files edited by the user because, if +- the user inserts a null character, you should either handle it +- properly or print a clear error message. We recommend using +- `getline' instead of `fgets'. +- +- - Function: wchar_t * fgetws (wchar_t *WS, int COUNT, FILE *STREAM) +- The `fgetws' function reads wide characters from the stream STREAM +- up to and including a newline character and stores them in the +- string WS, adding a null wide character to mark the end of the +- string. You must supply COUNT wide characters worth of space in +- WS, but the number of characters read is at most COUNT - 1. The +- extra character space is used to hold the null wide character at +- the end of the string. +- +- If the system is already at end of file when you call `fgetws', +- then the contents of the array WS are unchanged and a null pointer +- is returned. A null pointer is also returned if a read error +- occurs. Otherwise, the return value is the pointer WS. +- +- *Warning:* If the input data has a null wide character (which are +- null bytes in the input stream), you can't tell. So don't use +- `fgetws' unless you know the data cannot contain a null. Don't use +- it to read files edited by the user because, if the user inserts a +- null character, you should either handle it properly or print a +- clear error message. +- +- - Function: char * fgets_unlocked (char *S, int COUNT, FILE *STREAM) +- The `fgets_unlocked' function is equivalent to the `fgets' +- function except that it does not implicitly lock the stream. +- +- This function is a GNU extension. +- +- - Function: wchar_t * fgetws_unlocked (wchar_t *WS, int COUNT, FILE +- *STREAM) +- The `fgetws_unlocked' function is equivalent to the `fgetws' +- function except that it does not implicitly lock the stream. +- +- This function is a GNU extension. +- +- - Deprecated function: char * gets (char *S) +- The function `gets' reads characters from the stream `stdin' up to +- the next newline character, and stores them in the string S. The +- newline character is discarded (note that this differs from the +- behavior of `fgets', which copies the newline character into the +- string). If `gets' encounters a read error or end-of-file, it +- returns a null pointer; otherwise it returns S. +- +- *Warning:* The `gets' function is *very dangerous* because it +- provides no protection against overflowing the string S. The GNU +- library includes it for compatibility only. You should *always* +- use `fgets' or `getline' instead. To remind you of this, the +- linker (if using GNU `ld') will issue a warning whenever you use +- `gets'. +- +- +-File: libc.info, Node: Unreading, Next: Block Input/Output, Prev: Line Input, Up: I/O on Streams +- +-Unreading +-========= +- +- In parser programs it is often useful to examine the next character +-in the input stream without removing it from the stream. This is called +-"peeking ahead" at the input because your program gets a glimpse of the +-input it will read next. +- +- Using stream I/O, you can peek ahead at input by first reading it and +-then "unreading" it (also called "pushing it back" on the stream). +-Unreading a character makes it available to be input again from the +-stream, by the next call to `fgetc' or other input function on that +-stream. +- +-* Menu: +- +-* Unreading Idea:: An explanation of unreading with pictures. +-* How Unread:: How to call `ungetc' to do unreading. +- +- +-File: libc.info, Node: Unreading Idea, Next: How Unread, Up: Unreading +- +-What Unreading Means +--------------------- +- +- Here is a pictorial explanation of unreading. Suppose you have a +-stream reading a file that contains just six characters, the letters +-`foobar'. Suppose you have read three characters so far. The +-situation looks like this: +- +- f o o b a r +- ^ +- +-so the next input character will be `b'. +- +- If instead of reading `b' you unread the letter `o', you get a +-situation like this: +- +- f o o b a r +- | +- o-- +- ^ +- +-so that the next input characters will be `o' and `b'. +- +- If you unread `9' instead of `o', you get this situation: +- +- f o o b a r +- | +- 9-- +- ^ +- +-so that the next input characters will be `9' and `b'. +- +- +-File: libc.info, Node: How Unread, Prev: Unreading Idea, Up: Unreading +- +-Using `ungetc' To Do Unreading +------------------------------- +- +- The function to unread a character is called `ungetc', because it +-reverses the action of `getc'. +- +- - Function: int ungetc (int C, FILE *STREAM) +- The `ungetc' function pushes back the character C onto the input +- stream STREAM. So the next input from STREAM will read C before +- anything else. +- +- If C is `EOF', `ungetc' does nothing and just returns `EOF'. This +- lets you call `ungetc' with the return value of `getc' without +- needing to check for an error from `getc'. +- +- The character that you push back doesn't have to be the same as +- the last character that was actually read from the stream. In +- fact, it isn't necessary to actually read any characters from the +- stream before unreading them with `ungetc'! But that is a strange +- way to write a program; usually `ungetc' is used only to unread a +- character that was just read from the same stream. The GNU C +- library supports this even on files opened in binary mode, but +- other systems might not. +- +- The GNU C library only supports one character of pushback--in other +- words, it does not work to call `ungetc' twice without doing input +- in between. Other systems might let you push back multiple +- characters; then reading from the stream retrieves the characters +- in the reverse order that they were pushed. +- +- Pushing back characters doesn't alter the file; only the internal +- buffering for the stream is affected. If a file positioning +- function (such as `fseek', `fseeko' or `rewind'; *note File +- Positioning::) is called, any pending pushed-back characters are +- discarded. +- +- Unreading a character on a stream that is at end of file clears the +- end-of-file indicator for the stream, because it makes the +- character of input available. After you read that character, +- trying to read again will encounter end of file. +- +- - Function: wint_t ungetwc (wint_t WC, FILE *STREAM) +- The `ungetwc' function behaves just like `ungetc' just that it +- pushes back a wide character. +- +- Here is an example showing the use of `getc' and `ungetc' to skip +-over whitespace characters. When this function reaches a +-non-whitespace character, it unreads that character to be seen again on +-the next read operation on the stream. +- +- #include +- #include +- +- void +- skip_whitespace (FILE *stream) +- { +- int c; +- do +- /* No need to check for `EOF' because it is not +- `isspace', and `ungetc' ignores `EOF'. */ +- c = getc (stream); +- while (isspace (c)); +- ungetc (c, stream); +- } +- +- +-File: libc.info, Node: Block Input/Output, Next: Formatted Output, Prev: Unreading, Up: I/O on Streams +- +-Block Input/Output +-================== +- +- This section describes how to do input and output operations on +-blocks of data. You can use these functions to read and write binary +-data, as well as to read and write text in fixed-size blocks instead of +-by characters or lines. +- +- Binary files are typically used to read and write blocks of data in +-the same format as is used to represent the data in a running program. +-In other words, arbitrary blocks of memory--not just character or string +-objects--can be written to a binary file, and meaningfully read in +-again by the same program. +- +- Storing data in binary form is often considerably more efficient than +-using the formatted I/O functions. Also, for floating-point numbers, +-the binary form avoids possible loss of precision in the conversion +-process. On the other hand, binary files can't be examined or modified +-easily using many standard file utilities (such as text editors), and +-are not portable between different implementations of the language, or +-different kinds of computers. +- +- These functions are declared in `stdio.h'. +- +- - Function: size_t fread (void *DATA, size_t SIZE, size_t COUNT, FILE +- *STREAM) +- This function reads up to COUNT objects of size SIZE into the +- array DATA, from the stream STREAM. It returns the number of +- objects actually read, which might be less than COUNT if a read +- error occurs or the end of the file is reached. This function +- returns a value of zero (and doesn't read anything) if either SIZE +- or COUNT is zero. +- +- If `fread' encounters end of file in the middle of an object, it +- returns the number of complete objects read, and discards the +- partial object. Therefore, the stream remains at the actual end +- of the file. +- +- - Function: size_t fread_unlocked (void *DATA, size_t SIZE, size_t +- COUNT, FILE *STREAM) +- The `fread_unlocked' function is equivalent to the `fread' +- function except that it does not implicitly lock the stream. +- +- This function is a GNU extension. +- +- - Function: size_t fwrite (const void *DATA, size_t SIZE, size_t +- COUNT, FILE *STREAM) +- This function writes up to COUNT objects of size SIZE from the +- array DATA, to the stream STREAM. The return value is normally +- COUNT, if the call succeeds. Any other value indicates some sort +- of error, such as running out of space. +- +- - Function: size_t fwrite_unlocked (const void *DATA, size_t SIZE, +- size_t COUNT, FILE *STREAM) +- The `fwrite_unlocked' function is equivalent to the `fwrite' +- function except that it does not implicitly lock the stream. +- +- This function is a GNU extension. +- +- +-File: libc.info, Node: Formatted Output, Next: Customizing Printf, Prev: Block Input/Output, Up: I/O on Streams +- +-Formatted Output +-================ +- +- The functions described in this section (`printf' and related +-functions) provide a convenient way to perform formatted output. You +-call `printf' with a "format string" or "template string" that +-specifies how to format the values of the remaining arguments. +- +- Unless your program is a filter that specifically performs line- or +-character-oriented processing, using `printf' or one of the other +-related functions described in this section is usually the easiest and +-most concise way to perform output. These functions are especially +-useful for printing error messages, tables of data, and the like. +- +-* Menu: +- +-* Formatted Output Basics:: Some examples to get you started. +-* Output Conversion Syntax:: General syntax of conversion +- specifications. +-* Table of Output Conversions:: Summary of output conversions and +- what they do. +-* Integer Conversions:: Details about formatting of integers. +-* Floating-Point Conversions:: Details about formatting of +- floating-point numbers. +-* Other Output Conversions:: Details about formatting of strings, +- characters, pointers, and the like. +-* Formatted Output Functions:: Descriptions of the actual functions. +-* Dynamic Output:: Functions that allocate memory for the output. +-* Variable Arguments Output:: `vprintf' and friends. +-* Parsing a Template String:: What kinds of args does a given template +- call for? +-* Example of Parsing:: Sample program using `parse_printf_format'. +- +- +-File: libc.info, Node: Formatted Output Basics, Next: Output Conversion Syntax, Up: Formatted Output +- +-Formatted Output Basics +------------------------ +- +- The `printf' function can be used to print any number of arguments. +-The template string argument you supply in a call provides information +-not only about the number of additional arguments, but also about their +-types and what style should be used for printing them. +- +- Ordinary characters in the template string are simply written to the +-output stream as-is, while "conversion specifications" introduced by a +-`%' character in the template cause subsequent arguments to be +-formatted and written to the output stream. For example, +- +- int pct = 37; +- char filename[] = "foo.txt"; +- printf ("Processing of `%s' is %d%% finished.\nPlease be patient.\n", +- filename, pct); +- +-produces output like +- +- Processing of `foo.txt' is 37% finished. +- Please be patient. +- +- This example shows the use of the `%d' conversion to specify that an +-`int' argument should be printed in decimal notation, the `%s' +-conversion to specify printing of a string argument, and the `%%' +-conversion to print a literal `%' character. +- +- There are also conversions for printing an integer argument as an +-unsigned value in octal, decimal, or hexadecimal radix (`%o', `%u', or +-`%x', respectively); or as a character value (`%c'). +- +- Floating-point numbers can be printed in normal, fixed-point notation +-using the `%f' conversion or in exponential notation using the `%e' +-conversion. The `%g' conversion uses either `%e' or `%f' format, +-depending on what is more appropriate for the magnitude of the +-particular number. +- +- You can control formatting more precisely by writing "modifiers" +-between the `%' and the character that indicates which conversion to +-apply. These slightly alter the ordinary behavior of the conversion. +-For example, most conversion specifications permit you to specify a +-minimum field width and a flag indicating whether you want the result +-left- or right-justified within the field. +- +- The specific flags and modifiers that are permitted and their +-interpretation vary depending on the particular conversion. They're all +-described in more detail in the following sections. Don't worry if this +-all seems excessively complicated at first; you can almost always get +-reasonable free-format output without using any of the modifiers at all. +-The modifiers are mostly used to make the output look "prettier" in +-tables. +- +- +-File: libc.info, Node: Output Conversion Syntax, Next: Table of Output Conversions, Prev: Formatted Output Basics, Up: Formatted Output +- +-Output Conversion Syntax +------------------------- +- +- This section provides details about the precise syntax of conversion +-specifications that can appear in a `printf' template string. +- +- Characters in the template string that are not part of a conversion +-specification are printed as-is to the output stream. Multibyte +-character sequences (*note Character Set Handling::) are permitted in a +-template string. +- +- The conversion specifications in a `printf' template string have the +-general form: +- +- % [ PARAM-NO $] FLAGS WIDTH [ . PRECISION ] TYPE CONVERSION +- +-or +- +- % [ PARAM-NO $] FLAGS WIDTH . * [ PARAM-NO $] TYPE CONVERSION +- +- For example, in the conversion specifier `%-10.8ld', the `-' is a +-flag, `10' specifies the field width, the precision is `8', the letter +-`l' is a type modifier, and `d' specifies the conversion style. (This +-particular type specifier says to print a `long int' argument in +-decimal notation, with a minimum of 8 digits left-justified in a field +-at least 10 characters wide.) +- +- In more detail, output conversion specifications consist of an +-initial `%' character followed in sequence by: +- +- * An optional specification of the parameter used for this format. +- Normally the parameters to the `printf' function are assigned to +- the formats in the order of appearance in the format string. But +- in some situations (such as message translation) this is not +- desirable and this extension allows an explicit parameter to be +- specified. +- +- The PARAM-NO parts of the format must be integers in the range of +- 1 to the maximum number of arguments present to the function call. +- Some implementations limit this number to a certainly upper +- bound. The exact limit can be retrieved by the following constant. +- +- - Macro: NL_ARGMAX +- The value of `NL_ARGMAX' is the maximum value allowed for the +- specification of an positional parameter in a `printf' call. +- The actual value in effect at runtime can be retrieved by +- using `sysconf' using the `_SC_NL_ARGMAX' parameter *note +- Sysconf Definition::. +- +- Some system have a quite low limit such as 9 for System V +- systems. The GNU C library has no real limit. +- +- If any of the formats has a specification for the parameter +- position all of them in the format string shall have one. +- Otherwise the behavior is undefined. +- +- * Zero or more "flag characters" that modify the normal behavior of +- the conversion specification. +- +- * An optional decimal integer specifying the "minimum field width". +- If the normal conversion produces fewer characters than this, the +- field is padded with spaces to the specified width. This is a +- _minimum_ value; if the normal conversion produces more characters +- than this, the field is _not_ truncated. Normally, the output is +- right-justified within the field. +- +- You can also specify a field width of `*'. This means that the +- next argument in the argument list (before the actual value to be +- printed) is used as the field width. The value must be an `int'. +- If the value is negative, this means to set the `-' flag (see +- below) and to use the absolute value as the field width. +- +- * An optional "precision" to specify the number of digits to be +- written for the numeric conversions. If the precision is +- specified, it consists of a period (`.') followed optionally by a +- decimal integer (which defaults to zero if omitted). +- +- You can also specify a precision of `*'. This means that the next +- argument in the argument list (before the actual value to be +- printed) is used as the precision. The value must be an `int', +- and is ignored if it is negative. If you specify `*' for both the +- field width and precision, the field width argument precedes the +- precision argument. Other C library versions may not recognize +- this syntax. +- +- * An optional "type modifier character", which is used to specify the +- data type of the corresponding argument if it differs from the +- default type. (For example, the integer conversions assume a type +- of `int', but you can specify `h', `l', or `L' for other integer +- types.) +- +- * A character that specifies the conversion to be applied. +- +- The exact options that are permitted and how they are interpreted +-vary between the different conversion specifiers. See the descriptions +-of the individual conversions for information about the particular +-options that they use. +- +- With the `-Wformat' option, the GNU C compiler checks calls to +-`printf' and related functions. It examines the format string and +-verifies that the correct number and types of arguments are supplied. +-There is also a GNU C syntax to tell the compiler that a function you +-write uses a `printf'-style format string. *Note Declaring Attributes +-of Functions: (gcc.info)Function Attributes, for more information. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-18 glibc-2.3.2-200304020432/manual/libc.info-18 +--- glibc-2.3.2/manual/libc.info-18 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-18 Thu Jan 1 01:00:00 1970 +@@ -1,1211 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Table of Output Conversions, Next: Integer Conversions, Prev: Output Conversion Syntax, Up: Formatted Output +- +-Table of Output Conversions +---------------------------- +- +- Here is a table summarizing what all the different conversions do: +- +-`%d', `%i' +- Print an integer as a signed decimal number. *Note Integer +- Conversions::, for details. `%d' and `%i' are synonymous for +- output, but are different when used with `scanf' for input (*note +- Table of Input Conversions::). +- +-`%o' +- Print an integer as an unsigned octal number. *Note Integer +- Conversions::, for details. +- +-`%u' +- Print an integer as an unsigned decimal number. *Note Integer +- Conversions::, for details. +- +-`%x', `%X' +- Print an integer as an unsigned hexadecimal number. `%x' uses +- lower-case letters and `%X' uses upper-case. *Note Integer +- Conversions::, for details. +- +-`%f' +- Print a floating-point number in normal (fixed-point) notation. +- *Note Floating-Point Conversions::, for details. +- +-`%e', `%E' +- Print a floating-point number in exponential notation. `%e' uses +- lower-case letters and `%E' uses upper-case. *Note Floating-Point +- Conversions::, for details. +- +-`%g', `%G' +- Print a floating-point number in either normal or exponential +- notation, whichever is more appropriate for its magnitude. `%g' +- uses lower-case letters and `%G' uses upper-case. *Note +- Floating-Point Conversions::, for details. +- +-`%a', `%A' +- Print a floating-point number in a hexadecimal fractional notation +- which the exponent to base 2 represented in decimal digits. `%a' +- uses lower-case letters and `%A' uses upper-case. *Note +- Floating-Point Conversions::, for details. +- +-`%c' +- Print a single character. *Note Other Output Conversions::. +- +-`%C' +- This is an alias for `%lc' which is supported for compatibility +- with the Unix standard. +- +-`%s' +- Print a string. *Note Other Output Conversions::. +- +-`%S' +- This is an alias for `%ls' which is supported for compatibility +- with the Unix standard. +- +-`%p' +- Print the value of a pointer. *Note Other Output Conversions::. +- +-`%n' +- Get the number of characters printed so far. *Note Other Output +- Conversions::. Note that this conversion specification never +- produces any output. +- +-`%m' +- Print the string corresponding to the value of `errno'. (This is +- a GNU extension.) *Note Other Output Conversions::. +- +-`%%' +- Print a literal `%' character. *Note Other Output Conversions::. +- +- If the syntax of a conversion specification is invalid, unpredictable +-things will happen, so don't do this. If there aren't enough function +-arguments provided to supply values for all the conversion +-specifications in the template string, or if the arguments are not of +-the correct types, the results are unpredictable. If you supply more +-arguments than conversion specifications, the extra argument values are +-simply ignored; this is sometimes useful. +- +- +-File: libc.info, Node: Integer Conversions, Next: Floating-Point Conversions, Prev: Table of Output Conversions, Up: Formatted Output +- +-Integer Conversions +-------------------- +- +- This section describes the options for the `%d', `%i', `%o', `%u', +-`%x', and `%X' conversion specifications. These conversions print +-integers in various formats. +- +- The `%d' and `%i' conversion specifications both print an `int' +-argument as a signed decimal number; while `%o', `%u', and `%x' print +-the argument as an unsigned octal, decimal, or hexadecimal number +-(respectively). The `%X' conversion specification is just like `%x' +-except that it uses the characters `ABCDEF' as digits instead of +-`abcdef'. +- +- The following flags are meaningful: +- +-`-' +- Left-justify the result in the field (instead of the normal +- right-justification). +- +-`+' +- For the signed `%d' and `%i' conversions, print a plus sign if the +- value is positive. +- +-` ' +- For the signed `%d' and `%i' conversions, if the result doesn't +- start with a plus or minus sign, prefix it with a space character +- instead. Since the `+' flag ensures that the result includes a +- sign, this flag is ignored if you supply both of them. +- +-`#' +- For the `%o' conversion, this forces the leading digit to be `0', +- as if by increasing the precision. For `%x' or `%X', this +- prefixes a leading `0x' or `0X' (respectively) to the result. +- This doesn't do anything useful for the `%d', `%i', or `%u' +- conversions. Using this flag produces output which can be parsed +- by the `strtoul' function (*note Parsing of Integers::) and +- `scanf' with the `%i' conversion (*note Numeric Input +- Conversions::). +- +-`'' +- Separate the digits into groups as specified by the locale +- specified for the `LC_NUMERIC' category; *note General Numeric::. +- This flag is a GNU extension. +- +-`0' +- Pad the field with zeros instead of spaces. The zeros are placed +- after any indication of sign or base. This flag is ignored if the +- `-' flag is also specified, or if a precision is specified. +- +- If a precision is supplied, it specifies the minimum number of +-digits to appear; leading zeros are produced if necessary. If you +-don't specify a precision, the number is printed with as many digits as +-it needs. If you convert a value of zero with an explicit precision of +-zero, then no characters at all are produced. +- +- Without a type modifier, the corresponding argument is treated as an +-`int' (for the signed conversions `%i' and `%d') or `unsigned int' (for +-the unsigned conversions `%o', `%u', `%x', and `%X'). Recall that +-since `printf' and friends are variadic, any `char' and `short' +-arguments are automatically converted to `int' by the default argument +-promotions. For arguments of other integer types, you can use these +-modifiers: +- +-`hh' +- Specifies that the argument is a `signed char' or `unsigned char', +- as appropriate. A `char' argument is converted to an `int' or +- `unsigned int' by the default argument promotions anyway, but the +- `h' modifier says to convert it back to a `char' again. +- +- This modifier was introduced in ISO C99. +- +-`h' +- Specifies that the argument is a `short int' or `unsigned short +- int', as appropriate. A `short' argument is converted to an `int' +- or `unsigned int' by the default argument promotions anyway, but +- the `h' modifier says to convert it back to a `short' again. +- +-`j' +- Specifies that the argument is a `intmax_t' or `uintmax_t', as +- appropriate. +- +- This modifier was introduced in ISO C99. +- +-`l' +- Specifies that the argument is a `long int' or `unsigned long +- int', as appropriate. Two `l' characters is like the `L' +- modifier, below. +- +- If used with `%c' or `%s' the corresponding parameter is +- considered as a wide character or wide character string +- respectively. This use of `l' was introduced in Amendment 1 to +- ISO C90. +- +-`L' +-`ll' +-`q' +- Specifies that the argument is a `long long int'. (This type is +- an extension supported by the GNU C compiler. On systems that +- don't support extra-long integers, this is the same as `long int'.) +- +- The `q' modifier is another name for the same thing, which comes +- from 4.4 BSD; a `long long int' is sometimes called a "quad" `int'. +- +-`t' +- Specifies that the argument is a `ptrdiff_t'. +- +- This modifier was introduced in ISO C99. +- +-`z' +-`Z' +- Specifies that the argument is a `size_t'. +- +- `z' was introduced in ISO C99. `Z' is a GNU extension predating +- this addition and should not be used in new code. +- +- Here is an example. Using the template string: +- +- "|%5d|%-5d|%+5d|%+-5d|% 5d|%05d|%5.0d|%5.2d|%d|\n" +- +-to print numbers using the different options for the `%d' conversion +-gives results like: +- +- | 0|0 | +0|+0 | 0|00000| | 00|0| +- | 1|1 | +1|+1 | 1|00001| 1| 01|1| +- | -1|-1 | -1|-1 | -1|-0001| -1| -01|-1| +- |100000|100000|+100000|+100000| 100000|100000|100000|100000|100000| +- +- In particular, notice what happens in the last case where the number +-is too large to fit in the minimum field width specified. +- +- Here are some more examples showing how unsigned integers print under +-various format options, using the template string: +- +- "|%5u|%5o|%5x|%5X|%#5o|%#5x|%#5X|%#10.8x|\n" +- +- | 0| 0| 0| 0| 0| 0| 0| 00000000| +- | 1| 1| 1| 1| 01| 0x1| 0X1|0x00000001| +- |100000|303240|186a0|186A0|0303240|0x186a0|0X186A0|0x000186a0| +- +- +-File: libc.info, Node: Floating-Point Conversions, Next: Other Output Conversions, Prev: Integer Conversions, Up: Formatted Output +- +-Floating-Point Conversions +--------------------------- +- +- This section discusses the conversion specifications for +-floating-point numbers: the `%f', `%e', `%E', `%g', and `%G' +-conversions. +- +- The `%f' conversion prints its argument in fixed-point notation, +-producing output of the form [`-']DDD`.'DDD, where the number of digits +-following the decimal point is controlled by the precision you specify. +- +- The `%e' conversion prints its argument in exponential notation, +-producing output of the form [`-']D`.'DDD`e'[`+'|`-']DD. Again, the +-number of digits following the decimal point is controlled by the +-precision. The exponent always contains at least two digits. The `%E' +-conversion is similar but the exponent is marked with the letter `E' +-instead of `e'. +- +- The `%g' and `%G' conversions print the argument in the style of +-`%e' or `%E' (respectively) if the exponent would be less than -4 or +-greater than or equal to the precision; otherwise they use the `%f' +-style. A precision of `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. +- +- The `%a' and `%A' conversions are meant for representing +-floating-point numbers exactly in textual form so that they can be +-exchanged as texts between different programs and/or machines. The +-numbers are represented is the form [`-']`0x'H`.'HHH`p'[`+'|`-']DD. At +-the left of the decimal-point character exactly one digit is print. +-This character is only `0' if the number is denormalized. Otherwise +-the value is unspecified; it is implementation dependent how many bits +-are used. The number of hexadecimal digits on the right side of the +-decimal-point character is equal to the precision. If the precision is +-zero it is determined to be large enough to provide an exact +-representation of the number (or it is large enough to distinguish two +-adjacent values if the `FLT_RADIX' is not a power of 2, *note Floating +-Point Parameters::). For the `%a' conversion lower-case characters are +-used to represent the hexadecimal number and the prefix and exponent +-sign are printed as `0x' and `p' respectively. Otherwise upper-case +-characters are used and `0X' and `P' are used for the representation of +-prefix and exponent string. The exponent to the base of two is printed +-as a decimal number using at least one digit but at most as many digits +-as necessary to represent the value exactly. +- +- If the value to be printed represents infinity or a NaN, the output +-is [`-']`inf' or `nan' respectively if the conversion specifier is +-`%a', `%e', `%f', or `%g' and it is [`-']`INF' or `NAN' respectively if +-the conversion is `%A', `%E', or `%G'. +- +- The following flags can be used to modify the behavior: +- +-`-' +- Left-justify the result in the field. Normally the result is +- right-justified. +- +-`+' +- Always include a plus or minus sign in the result. +- +-` ' +- If the result doesn't start with a plus or minus sign, prefix it +- with a space instead. Since the `+' flag ensures that the result +- includes a sign, this flag is ignored if you supply both of them. +- +-`#' +- Specifies that the result should always include a decimal point, +- even if no digits follow it. For the `%g' and `%G' conversions, +- this also forces trailing zeros after the decimal point to be left +- in place where they would otherwise be removed. +- +-`'' +- Separate the digits of the integer part of the result into groups +- as specified by the locale specified for the `LC_NUMERIC' category; +- *note General Numeric::. This flag is a GNU extension. +- +-`0' +- Pad the field with zeros instead of spaces; the zeros are placed +- after any sign. This flag is ignored if the `-' flag is also +- specified. +- +- The precision specifies how many digits follow the decimal-point +-character for the `%f', `%e', and `%E' conversions. For these +-conversions, the default precision is `6'. If the precision is +-explicitly `0', this suppresses the decimal point character entirely. +-For the `%g' and `%G' conversions, the precision specifies how many +-significant digits to print. Significant digits are the first digit +-before the decimal point, and all the digits after it. If the +-precision is `0' or not specified for `%g' or `%G', it is treated like +-a value of `1'. If the value being printed cannot be expressed +-accurately in the specified number of digits, the value is rounded to +-the nearest number that fits. +- +- Without a type modifier, the floating-point conversions use an +-argument of type `double'. (By the default argument promotions, any +-`float' arguments are automatically converted to `double'.) The +-following type modifier is supported: +- +-`L' +- An uppercase `L' specifies that the argument is a `long double'. +- +- Here are some examples showing how numbers print using the various +-floating-point conversions. All of the numbers were printed using this +-template string: +- +- "|%13.4a|%13.4f|%13.4e|%13.4g|\n" +- +- Here is the output: +- +- | 0x0.0000p+0| 0.0000| 0.0000e+00| 0| +- | 0x1.0000p-1| 0.5000| 5.0000e-01| 0.5| +- | 0x1.0000p+0| 1.0000| 1.0000e+00| 1| +- | -0x1.0000p+0| -1.0000| -1.0000e+00| -1| +- | 0x1.9000p+6| 100.0000| 1.0000e+02| 100| +- | 0x1.f400p+9| 1000.0000| 1.0000e+03| 1000| +- | 0x1.3880p+13| 10000.0000| 1.0000e+04| 1e+04| +- | 0x1.81c8p+13| 12345.0000| 1.2345e+04| 1.234e+04| +- | 0x1.86a0p+16| 100000.0000| 1.0000e+05| 1e+05| +- | 0x1.e240p+16| 123456.0000| 1.2346e+05| 1.235e+05| +- +- Notice how the `%g' conversion drops trailing zeros. +- +- +-File: libc.info, Node: Other Output Conversions, Next: Formatted Output Functions, Prev: Floating-Point Conversions, Up: Formatted Output +- +-Other Output Conversions +------------------------- +- +- This section describes miscellaneous conversions for `printf'. +- +- The `%c' conversion prints a single character. In case there is no +-`l' modifier the `int' argument is first converted to an `unsigned +-char'. Then, if used in a wide stream function, the character is +-converted into the corresponding wide character. The `-' flag can be +-used to specify left-justification in the field, but no other flags are +-defined, and no precision or type modifier can be given. For example: +- +- printf ("%c%c%c%c%c", 'h', 'e', 'l', 'l', 'o'); +- +-prints `hello'. +- +- If there is a `l' modifier present the argument is expected to be of +-type `wint_t'. If used in a multibyte function the wide character is +-converted into a multibyte character before being added to the output. +-In this case more than one output byte can be produced. +- +- The `%s' conversion prints a string. If no `l' modifier is present +-the corresponding argument must be of type `char *' (or `const char +-*'). If used in a wide stream function the string is first converted +-in a wide character string. A precision can be specified to indicate +-the maximum number of characters to write; otherwise characters in the +-string up to but not including the terminating null character are +-written to the output stream. The `-' flag can be used to specify +-left-justification in the field, but no other flags or type modifiers +-are defined for this conversion. For example: +- +- printf ("%3s%-6s", "no", "where"); +- +-prints ` nowhere '. +- +- If there is a `l' modifier present the argument is expected to be of +-type `wchar_t' (or `const wchar_t *'). +- +- If you accidentally pass a null pointer as the argument for a `%s' +-conversion, the GNU library prints it as `(null)'. We think this is +-more useful than crashing. But it's not good practice to pass a null +-argument intentionally. +- +- The `%m' conversion prints the string corresponding to the error +-code in `errno'. *Note Error Messages::. Thus: +- +- fprintf (stderr, "can't open `%s': %m\n", filename); +- +-is equivalent to: +- +- fprintf (stderr, "can't open `%s': %s\n", filename, strerror (errno)); +- +-The `%m' conversion is a GNU C library extension. +- +- The `%p' conversion prints a pointer value. The corresponding +-argument must be of type `void *'. In practice, you can use any type +-of pointer. +- +- In the GNU system, non-null pointers are printed as unsigned +-integers, as if a `%#x' conversion were used. Null pointers print as +-`(nil)'. (Pointers might print differently in other systems.) +- +- For example: +- +- printf ("%p", "testing"); +- +-prints `0x' followed by a hexadecimal number--the address of the string +-constant `"testing"'. It does not print the word `testing'. +- +- You can supply the `-' flag with the `%p' conversion to specify +-left-justification, but no other flags, precision, or type modifiers +-are defined. +- +- The `%n' conversion is unlike any of the other output conversions. +-It uses an argument which must be a pointer to an `int', but instead of +-printing anything it stores the number of characters printed so far by +-this call at that location. The `h' and `l' type modifiers are +-permitted to specify that the argument is of type `short int *' or +-`long int *' instead of `int *', but no flags, field width, or +-precision are permitted. +- +- For example, +- +- int nchar; +- printf ("%d %s%n\n", 3, "bears", &nchar); +- +-prints: +- +- 3 bears +- +-and sets `nchar' to `7', because `3 bears' is seven characters. +- +- The `%%' conversion prints a literal `%' character. This conversion +-doesn't use an argument, and no flags, field width, precision, or type +-modifiers are permitted. +- +- +-File: libc.info, Node: Formatted Output Functions, Next: Dynamic Output, Prev: Other Output Conversions, Up: Formatted Output +- +-Formatted Output Functions +--------------------------- +- +- This section describes how to call `printf' and related functions. +-Prototypes for these functions are in the header file `stdio.h'. +-Because these functions take a variable number of arguments, you _must_ +-declare prototypes for them before using them. Of course, the easiest +-way to make sure you have all the right prototypes is to just include +-`stdio.h'. +- +- - Function: int printf (const char *TEMPLATE, ...) +- The `printf' function prints the optional arguments under the +- control of the template string TEMPLATE to the stream `stdout'. +- It returns the number of characters printed, or a negative value +- if there was an output error. +- +- - Function: int wprintf (const wchar_t *TEMPLATE, ...) +- The `wprintf' function prints the optional arguments under the +- control of the wide template string TEMPLATE to the stream +- `stdout'. It returns the number of wide characters printed, or a +- negative value if there was an output error. +- +- - Function: int fprintf (FILE *STREAM, const char *TEMPLATE, ...) +- This function is just like `printf', except that the output is +- written to the stream STREAM instead of `stdout'. +- +- - Function: int fwprintf (FILE *STREAM, const wchar_t *TEMPLATE, ...) +- This function is just like `wprintf', except that the output is +- written to the stream STREAM instead of `stdout'. +- +- - Function: int sprintf (char *S, const char *TEMPLATE, ...) +- This is like `printf', except that the output is stored in the +- character array S instead of written to a stream. A null +- character is written to mark the end of the string. +- +- The `sprintf' function returns the number of characters stored in +- the array S, not including the terminating null character. +- +- The behavior of this function is undefined if copying takes place +- between objects that overlap--for example, if S is also given as +- an argument to be printed under control of the `%s' conversion. +- *Note Copying and Concatenation::. +- +- *Warning:* The `sprintf' function can be *dangerous* because it +- can potentially output more characters than can fit in the +- allocation size of the string S. Remember that the field width +- given in a conversion specification is only a _minimum_ value. +- +- To avoid this problem, you can use `snprintf' or `asprintf', +- described below. +- +- - Function: int swprintf (wchar_t *S, size_t SIZE, const wchar_t +- *TEMPLATE, ...) +- This is like `wprintf', except that the output is stored in the +- wide character array WS instead of written to a stream. A null +- wide character is written to mark the end of the string. The SIZE +- argument specifies the maximum number of characters to produce. +- The trailing null character is counted towards this limit, so you +- should allocate at least SIZE wide characters for the string WS. +- +- The return value is the number of characters generated for the +- given input, excluding the trailing null. If not all output fits +- into the provided buffer a negative value is returned. You should +- try again with a bigger output string. _Note:_ this is different +- from how `snprintf' handles this situation. +- +- Note that the corresponding narrow stream function takes fewer +- parameters. `swprintf' in fact corresponds to the `snprintf' +- function. Since the `sprintf' function can be dangerous and should +- be avoided the ISO C committee refused to make the same mistake +- again and decided to not define an function exactly corresponding +- to `sprintf'. +- +- - Function: int snprintf (char *S, size_t SIZE, const char *TEMPLATE, +- ...) +- The `snprintf' function is similar to `sprintf', except that the +- SIZE argument specifies the maximum number of characters to +- produce. The trailing null character is counted towards this +- limit, so you should allocate at least SIZE characters for the +- string S. +- +- The return value is the number of characters which would be +- generated for the given input, excluding the trailing null. If +- this value is greater or equal to SIZE, not all characters from +- the result have been stored in S. You should try again with a +- bigger output string. Here is an example of doing this: +- +- /* Construct a message describing the value of a variable +- whose name is NAME and whose value is VALUE. */ +- char * +- make_message (char *name, char *value) +- { +- /* Guess we need no more than 100 chars of space. */ +- int size = 100; +- char *buffer = (char *) xmalloc (size); +- int nchars; +- if (buffer == NULL) +- return NULL; +- +- /* Try to print in the allocated space. */ +- nchars = snprintf (buffer, size, "value of %s is %s", +- name, value); +- if (nchars >= size) +- { +- /* Reallocate buffer now that we know +- how much space is needed. */ +- buffer = (char *) xrealloc (buffer, nchars + 1); +- +- if (buffer != NULL) +- /* Try again. */ +- snprintf (buffer, size, "value of %s is %s", +- name, value); +- } +- /* The last call worked, return the string. */ +- return buffer; +- } +- +- In practice, it is often easier just to use `asprintf', below. +- +- *Attention:* In versions of the GNU C library prior to 2.1 the +- return value is the number of characters stored, not including the +- terminating null; unless there was not enough space in S to store +- the result in which case `-1' is returned. This was changed in +- order to comply with the ISO C99 standard. +- +- +-File: libc.info, Node: Dynamic Output, Next: Variable Arguments Output, Prev: Formatted Output Functions, Up: Formatted Output +- +-Dynamically Allocating Formatted Output +---------------------------------------- +- +- The functions in this section do formatted output and place the +-results in dynamically allocated memory. +- +- - Function: int asprintf (char **PTR, const char *TEMPLATE, ...) +- This function is similar to `sprintf', except that it dynamically +- allocates a string (as with `malloc'; *note Unconstrained +- Allocation::) to hold the output, instead of putting the output in +- a buffer you allocate in advance. The PTR argument should be the +- address of a `char *' object, and `asprintf' stores a pointer to +- the newly allocated string at that location. +- +- The return value is the number of characters allocated for the +- buffer, or less than zero if an error occurred. Usually this means +- that the buffer could not be allocated. +- +- Here is how to use `asprintf' to get the same result as the +- `snprintf' example, but more easily: +- +- /* Construct a message describing the value of a variable +- whose name is NAME and whose value is VALUE. */ +- char * +- make_message (char *name, char *value) +- { +- char *result; +- if (asprintf (&result, "value of %s is %s", name, value) < 0) +- return NULL; +- return result; +- } +- +- - Function: int obstack_printf (struct obstack *OBSTACK, const char +- *TEMPLATE, ...) +- This function is similar to `asprintf', except that it uses the +- obstack OBSTACK to allocate the space. *Note Obstacks::. +- +- The characters are written onto the end of the current object. To +- get at them, you must finish the object with `obstack_finish' +- (*note Growing Objects::). +- +- +-File: libc.info, Node: Variable Arguments Output, Next: Parsing a Template String, Prev: Dynamic Output, Up: Formatted Output +- +-Variable Arguments Output Functions +------------------------------------ +- +- The functions `vprintf' and friends are provided so that you can +-define your own variadic `printf'-like functions that make use of the +-same internals as the built-in formatted output functions. +- +- The most natural way to define such functions would be to use a +-language construct to say, "Call `printf' and pass this template plus +-all of my arguments after the first five." But there is no way to do +-this in C, and it would be hard to provide a way, since at the C +-language level there is no way to tell how many arguments your function +-received. +- +- Since that method is impossible, we provide alternative functions, +-the `vprintf' series, which lets you pass a `va_list' to describe "all +-of my arguments after the first five." +- +- When it is sufficient to define a macro rather than a real function, +-the GNU C compiler provides a way to do this much more easily with +-macros. For example: +- +- #define myprintf(a, b, c, d, e, rest...) \ +- printf (mytemplate , ## rest) +- +-*Note Macros with Variable Numbers of Arguments: (gcc.info)Macro +-Varargs, for details. But this is limited to macros, and does not +-apply to real functions at all. +- +- Before calling `vprintf' or the other functions listed in this +-section, you _must_ call `va_start' (*note Variadic Functions::) to +-initialize a pointer to the variable arguments. Then you can call +-`va_arg' to fetch the arguments that you want to handle yourself. This +-advances the pointer past those arguments. +- +- Once your `va_list' pointer is pointing at the argument of your +-choice, you are ready to call `vprintf'. That argument and all +-subsequent arguments that were passed to your function are used by +-`vprintf' along with the template that you specified separately. +- +- In some other systems, the `va_list' pointer may become invalid +-after the call to `vprintf', so you must not use `va_arg' after you +-call `vprintf'. Instead, you should call `va_end' to retire the +-pointer from service. However, you can safely call `va_start' on +-another pointer variable and begin fetching the arguments again through +-that pointer. Calling `vprintf' does not destroy the argument list of +-your function, merely the particular pointer that you passed to it. +- +- GNU C does not have such restrictions. You can safely continue to +-fetch arguments from a `va_list' pointer after passing it to `vprintf', +-and `va_end' is a no-op. (Note, however, that subsequent `va_arg' +-calls will fetch the same arguments which `vprintf' previously used.) +- +- Prototypes for these functions are declared in `stdio.h'. +- +- - Function: int vprintf (const char *TEMPLATE, va_list AP) +- This function is similar to `printf' except that, instead of taking +- a variable number of arguments directly, it takes an argument list +- pointer AP. +- +- - Function: int vwprintf (const wchar_t *TEMPLATE, va_list AP) +- This function is similar to `wprintf' except that, instead of +- taking a variable number of arguments directly, it takes an +- argument list pointer AP. +- +- - Function: int vfprintf (FILE *STREAM, const char *TEMPLATE, va_list +- AP) +- This is the equivalent of `fprintf' with the variable argument list +- specified directly as for `vprintf'. +- +- - Function: int vfwprintf (FILE *STREAM, const wchar_t *TEMPLATE, +- va_list AP) +- This is the equivalent of `fwprintf' with the variable argument +- list specified directly as for `vwprintf'. +- +- - Function: int vsprintf (char *S, const char *TEMPLATE, va_list AP) +- This is the equivalent of `sprintf' with the variable argument list +- specified directly as for `vprintf'. +- +- - Function: int vswprintf (wchar_t *S, size_t SIZE, const wchar_t +- *TEMPLATE, va_list AP) +- This is the equivalent of `swprintf' with the variable argument +- list specified directly as for `vwprintf'. +- +- - Function: int vsnprintf (char *S, size_t SIZE, const char *TEMPLATE, +- va_list AP) +- This is the equivalent of `snprintf' with the variable argument +- list specified directly as for `vprintf'. +- +- - Function: int vasprintf (char **PTR, const char *TEMPLATE, va_list +- AP) +- The `vasprintf' function is the equivalent of `asprintf' with the +- variable argument list specified directly as for `vprintf'. +- +- - Function: int obstack_vprintf (struct obstack *OBSTACK, const char +- *TEMPLATE, va_list AP) +- The `obstack_vprintf' function is the equivalent of +- `obstack_printf' with the variable argument list specified directly +- as for `vprintf'. +- +- Here's an example showing how you might use `vfprintf'. This is a +-function that prints error messages to the stream `stderr', along with +-a prefix indicating the name of the program (*note Error Messages::, +-for a description of `program_invocation_short_name'). +- +- #include +- #include +- +- void +- eprintf (const char *template, ...) +- { +- va_list ap; +- extern char *program_invocation_short_name; +- +- fprintf (stderr, "%s: ", program_invocation_short_name); +- va_start (ap, template); +- vfprintf (stderr, template, ap); +- va_end (ap); +- } +- +-You could call `eprintf' like this: +- +- eprintf ("file `%s' does not exist\n", filename); +- +- In GNU C, there is a special construct you can use to let the +-compiler know that a function uses a `printf'-style format string. +-Then it can check the number and types of arguments in each call to the +-function, and warn you when they do not match the format string. For +-example, take this declaration of `eprintf': +- +- void eprintf (const char *template, ...) +- __attribute__ ((format (printf, 1, 2))); +- +-This tells the compiler that `eprintf' uses a format string like +-`printf' (as opposed to `scanf'; *note Formatted Input::); the format +-string appears as the first argument; and the arguments to satisfy the +-format begin with the second. *Note Declaring Attributes of Functions: +-(gcc.info)Function Attributes, for more information. +- +- +-File: libc.info, Node: Parsing a Template String, Next: Example of Parsing, Prev: Variable Arguments Output, Up: Formatted Output +- +-Parsing a Template String +-------------------------- +- +- You can use the function `parse_printf_format' to obtain information +-about the number and types of arguments that are expected by a given +-template string. This function permits interpreters that provide +-interfaces to `printf' to avoid passing along invalid arguments from +-the user's program, which could cause a crash. +- +- All the symbols described in this section are declared in the header +-file `printf.h'. +- +- - Function: size_t parse_printf_format (const char *TEMPLATE, size_t +- N, int *ARGTYPES) +- This function returns information about the number and types of +- arguments expected by the `printf' template string TEMPLATE. The +- information is stored in the array ARGTYPES; each element of this +- array describes one argument. This information is encoded using +- the various `PA_' macros, listed below. +- +- The argument N specifies the number of elements in the array +- ARGTYPES. This is the maximum number of elements that +- `parse_printf_format' will try to write. +- +- `parse_printf_format' returns the total number of arguments +- required by TEMPLATE. If this number is greater than N, then the +- information returned describes only the first N arguments. If you +- want information about additional arguments, allocate a bigger +- array and call `parse_printf_format' again. +- +- The argument types are encoded as a combination of a basic type and +-modifier flag bits. +- +- - Macro: int PA_FLAG_MASK +- This macro is a bitmask for the type modifier flag bits. You can +- write the expression `(argtypes[i] & PA_FLAG_MASK)' to extract +- just the flag bits for an argument, or `(argtypes[i] & +- ~PA_FLAG_MASK)' to extract just the basic type code. +- +- Here are symbolic constants that represent the basic types; they +-stand for integer values. +- +-`PA_INT' +- This specifies that the base type is `int'. +- +-`PA_CHAR' +- This specifies that the base type is `int', cast to `char'. +- +-`PA_STRING' +- This specifies that the base type is `char *', a null-terminated +- string. +- +-`PA_POINTER' +- This specifies that the base type is `void *', an arbitrary +- pointer. +- +-`PA_FLOAT' +- This specifies that the base type is `float'. +- +-`PA_DOUBLE' +- This specifies that the base type is `double'. +- +-`PA_LAST' +- You can define additional base types for your own programs as +- offsets from `PA_LAST'. For example, if you have data types `foo' +- and `bar' with their own specialized `printf' conversions, you +- could define encodings for these types as: +- +- #define PA_FOO PA_LAST +- #define PA_BAR (PA_LAST + 1) +- +- Here are the flag bits that modify a basic type. They are combined +-with the code for the basic type using inclusive-or. +- +-`PA_FLAG_PTR' +- If this bit is set, it indicates that the encoded type is a +- pointer to the base type, rather than an immediate value. For +- example, `PA_INT|PA_FLAG_PTR' represents the type `int *'. +- +-`PA_FLAG_SHORT' +- If this bit is set, it indicates that the base type is modified +- with `short'. (This corresponds to the `h' type modifier.) +- +-`PA_FLAG_LONG' +- If this bit is set, it indicates that the base type is modified +- with `long'. (This corresponds to the `l' type modifier.) +- +-`PA_FLAG_LONG_LONG' +- If this bit is set, it indicates that the base type is modified +- with `long long'. (This corresponds to the `L' type modifier.) +- +-`PA_FLAG_LONG_DOUBLE' +- This is a synonym for `PA_FLAG_LONG_LONG', used by convention with +- a base type of `PA_DOUBLE' to indicate a type of `long double'. +- +- For an example of using these facilities, see *Note Example of +-Parsing::. +- +- +-File: libc.info, Node: Example of Parsing, Prev: Parsing a Template String, Up: Formatted Output +- +-Example of Parsing a Template String +------------------------------------- +- +- Here is an example of decoding argument types for a format string. +-We assume this is part of an interpreter which contains arguments of +-type `NUMBER', `CHAR', `STRING' and `STRUCTURE' (and perhaps others +-which are not valid here). +- +- /* Test whether the NARGS specified objects +- in the vector ARGS are valid +- for the format string FORMAT: +- if so, return 1. +- If not, return 0 after printing an error message. */ +- +- int +- validate_args (char *format, int nargs, OBJECT *args) +- { +- int *argtypes; +- int nwanted; +- +- /* Get the information about the arguments. +- Each conversion specification must be at least two characters +- long, so there cannot be more specifications than half the +- length of the string. */ +- +- argtypes = (int *) alloca (strlen (format) / 2 * sizeof (int)); +- nwanted = parse_printf_format (string, nelts, argtypes); +- +- /* Check the number of arguments. */ +- if (nwanted > nargs) +- { +- error ("too few arguments (at least %d required)", nwanted); +- return 0; +- } +- +- /* Check the C type wanted for each argument +- and see if the object given is suitable. */ +- for (i = 0; i < nwanted; i++) +- { +- int wanted; +- +- if (argtypes[i] & PA_FLAG_PTR) +- wanted = STRUCTURE; +- else +- switch (argtypes[i] & ~PA_FLAG_MASK) +- { +- case PA_INT: +- case PA_FLOAT: +- case PA_DOUBLE: +- wanted = NUMBER; +- break; +- case PA_CHAR: +- wanted = CHAR; +- break; +- case PA_STRING: +- wanted = STRING; +- break; +- case PA_POINTER: +- wanted = STRUCTURE; +- break; +- } +- if (TYPE (args[i]) != wanted) +- { +- error ("type mismatch for arg number %d", i); +- return 0; +- } +- } +- return 1; +- } +- +- +-File: libc.info, Node: Customizing Printf, Next: Formatted Input, Prev: Formatted Output, Up: I/O on Streams +- +-Customizing `printf' +-==================== +- +- The GNU C library lets you define your own custom conversion +-specifiers for `printf' template strings, to teach `printf' clever ways +-to print the important data structures of your program. +- +- The way you do this is by registering the conversion with the +-function `register_printf_function'; see *Note Registering New +-Conversions::. One of the arguments you pass to this function is a +-pointer to a handler function that produces the actual output; see +-*Note Defining the Output Handler::, for information on how to write +-this function. +- +- You can also install a function that just returns information about +-the number and type of arguments expected by the conversion specifier. +-*Note Parsing a Template String::, for information about this. +- +- The facilities of this section are declared in the header file +-`printf.h'. +- +-* Menu: +- +-* Registering New Conversions:: Using `register_printf_function' +- to register a new output conversion. +-* Conversion Specifier Options:: The handler must be able to get +- the options specified in the +- template when it is called. +-* Defining the Output Handler:: Defining the handler and arginfo +- functions that are passed as arguments +- to `register_printf_function'. +-* Printf Extension Example:: How to define a `printf' +- handler function. +-* Predefined Printf Handlers:: Predefined `printf' handlers. +- +- *Portability Note:* The ability to extend the syntax of `printf' +-template strings is a GNU extension. ISO standard C has nothing +-similar. +- +- +-File: libc.info, Node: Registering New Conversions, Next: Conversion Specifier Options, Up: Customizing Printf +- +-Registering New Conversions +---------------------------- +- +- The function to register a new output conversion is +-`register_printf_function', declared in `printf.h'. +- +- - Function: int register_printf_function (int SPEC, printf_function +- HANDLER-FUNCTION, printf_arginfo_function ARGINFO-FUNCTION) +- This function defines the conversion specifier character SPEC. +- Thus, if SPEC is `'Y'', it defines the conversion `%Y'. You can +- redefine the built-in conversions like `%s', but flag characters +- like `#' and type modifiers like `l' can never be used as +- conversions; calling `register_printf_function' for those +- characters has no effect. It is advisable not to use lowercase +- letters, since the ISO C standard warns that additional lowercase +- letters may be standardized in future editions of the standard. +- +- The HANDLER-FUNCTION is the function called by `printf' and +- friends when this conversion appears in a template string. *Note +- Defining the Output Handler::, for information about how to define +- a function to pass as this argument. If you specify a null +- pointer, any existing handler function for SPEC is removed. +- +- The ARGINFO-FUNCTION is the function called by +- `parse_printf_format' when this conversion appears in a template +- string. *Note Parsing a Template String::, for information about +- this. +- +- *Attention:* In the GNU C library versions before 2.0 the +- ARGINFO-FUNCTION function did not need to be installed unless the +- user used the `parse_printf_format' function. This has changed. +- Now a call to any of the `printf' functions will call this +- function when this format specifier appears in the format string. +- +- The return value is `0' on success, and `-1' on failure (which +- occurs if SPEC is out of range). +- +- You can redefine the standard output conversions, but this is +- probably not a good idea because of the potential for confusion. +- Library routines written by other people could break if you do +- this. +- +- +-File: libc.info, Node: Conversion Specifier Options, Next: Defining the Output Handler, Prev: Registering New Conversions, Up: Customizing Printf +- +-Conversion Specifier Options +----------------------------- +- +- If you define a meaning for `%A', what if the template contains +-`%+23A' or `%-#A'? To implement a sensible meaning for these, the +-handler when called needs to be able to get the options specified in +-the template. +- +- Both the HANDLER-FUNCTION and ARGINFO-FUNCTION accept an argument +-that points to a `struct printf_info', which contains information about +-the options appearing in an instance of the conversion specifier. This +-data type is declared in the header file `printf.h'. +- +- - Type: struct printf_info +- This structure is used to pass information about the options +- appearing in an instance of a conversion specifier in a `printf' +- template string to the handler and arginfo functions for that +- specifier. It contains the following members: +- +- `int prec' +- This is the precision specified. The value is `-1' if no +- precision was specified. If the precision was given as `*', +- the `printf_info' structure passed to the handler function +- contains the actual value retrieved from the argument list. +- But the structure passed to the arginfo function contains a +- value of `INT_MIN', since the actual value is not known. +- +- `int width' +- This is the minimum field width specified. The value is `0' +- if no width was specified. If the field width was given as +- `*', the `printf_info' structure passed to the handler +- function contains the actual value retrieved from the +- argument list. But the structure passed to the arginfo +- function contains a value of `INT_MIN', since the actual +- value is not known. +- +- `wchar_t spec' +- This is the conversion specifier character specified. It's +- stored in the structure so that you can register the same +- handler function for multiple characters, but still have a +- way to tell them apart when the handler function is called. +- +- `unsigned int is_long_double' +- This is a boolean that is true if the `L', `ll', or `q' type +- modifier was specified. For integer conversions, this +- indicates `long long int', as opposed to `long double' for +- floating point conversions. +- +- `unsigned int is_char' +- This is a boolean that is true if the `hh' type modifier was +- specified. +- +- `unsigned int is_short' +- This is a boolean that is true if the `h' type modifier was +- specified. +- +- `unsigned int is_long' +- This is a boolean that is true if the `l' type modifier was +- specified. +- +- `unsigned int alt' +- This is a boolean that is true if the `#' flag was specified. +- +- `unsigned int space' +- This is a boolean that is true if the ` ' flag was specified. +- +- `unsigned int left' +- This is a boolean that is true if the `-' flag was specified. +- +- `unsigned int showsign' +- This is a boolean that is true if the `+' flag was specified. +- +- `unsigned int group' +- This is a boolean that is true if the `'' flag was specified. +- +- `unsigned int extra' +- This flag has a special meaning depending on the context. It +- could be used freely by the user-defined handlers but when +- called from the `printf' function this variable always +- contains the value `0'. +- +- `unsigned int wide' +- This flag is set if the stream is wide oriented. +- +- `wchar_t pad' +- This is the character to use for padding the output to the +- minimum field width. The value is `'0'' if the `0' flag was +- specified, and `' '' otherwise. +- +- +-File: libc.info, Node: Defining the Output Handler, Next: Printf Extension Example, Prev: Conversion Specifier Options, Up: Customizing Printf +- +-Defining the Output Handler +---------------------------- +- +- Now let's look at how to define the handler and arginfo functions +-which are passed as arguments to `register_printf_function'. +- +- *Compatibility Note:* The interface changed in GNU libc version 2.0. +-Previously the third argument was of type `va_list *'. +- +- You should define your handler functions with a prototype like: +- +- int FUNCTION (FILE *stream, const struct printf_info *info, +- const void *const *args) +- +- The STREAM argument passed to the handler function is the stream to +-which it should write output. +- +- The INFO argument is a pointer to a structure that contains +-information about the various options that were included with the +-conversion in the template string. You should not modify this structure +-inside your handler function. *Note Conversion Specifier Options::, for +-a description of this data structure. +- +- The ARGS is a vector of pointers to the arguments data. The number +-of arguments was determined by calling the argument information +-function provided by the user. +- +- Your handler function should return a value just like `printf' does: +-it should return the number of characters it has written, or a negative +-value to indicate an error. +- +- - Data Type: printf_function +- This is the data type that a handler function should have. +- +- If you are going to use `parse_printf_format' in your application, +-you must also define a function to pass as the ARGINFO-FUNCTION +-argument for each new conversion you install with +-`register_printf_function'. +- +- You have to define these functions with a prototype like: +- +- int FUNCTION (const struct printf_info *info, +- size_t n, int *argtypes) +- +- The return value from the function should be the number of arguments +-the conversion expects. The function should also fill in no more than +-N elements of the ARGTYPES array with information about the types of +-each of these arguments. This information is encoded using the various +-`PA_' macros. (You will notice that this is the same calling +-convention `parse_printf_format' itself uses.) +- +- - Data Type: printf_arginfo_function +- This type is used to describe functions that return information +- about the number and type of arguments used by a conversion +- specifier. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-19 glibc-2.3.2-200304020432/manual/libc.info-19 +--- glibc-2.3.2/manual/libc.info-19 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-19 Thu Jan 1 01:00:00 1970 +@@ -1,1181 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Printf Extension Example, Next: Predefined Printf Handlers, Prev: Defining the Output Handler, Up: Customizing Printf +- +-`printf' Extension Example +--------------------------- +- +- Here is an example showing how to define a `printf' handler function. +-This program defines a data structure called a `Widget' and defines the +-`%W' conversion to print information about `Widget *' arguments, +-including the pointer value and the name stored in the data structure. +-The `%W' conversion supports the minimum field width and +-left-justification options, but ignores everything else. +- +- #include +- #include +- #include +- +- typedef struct +- { +- char *name; +- } +- Widget; +- +- int +- print_widget (FILE *stream, +- const struct printf_info *info, +- const void *const *args) +- { +- const Widget *w; +- char *buffer; +- int len; +- +- /* Format the output into a string. */ +- w = *((const Widget **) (args[0])); +- len = asprintf (&buffer, "", w, w->name); +- if (len == -1) +- return -1; +- +- /* Pad to the minimum field width and print to the stream. */ +- len = fprintf (stream, "%*s", +- (info->left ? -info->width : info->width), +- buffer); +- +- /* Clean up and return. */ +- free (buffer); +- return len; +- } +- +- +- int +- print_widget_arginfo (const struct printf_info *info, size_t n, +- int *argtypes) +- { +- /* We always take exactly one argument and this is a pointer to the +- structure.. */ +- if (n > 0) +- argtypes[0] = PA_POINTER; +- return 1; +- } +- +- +- int +- main (void) +- { +- /* Make a widget to print. */ +- Widget mywidget; +- mywidget.name = "mywidget"; +- +- /* Register the print function for widgets. */ +- register_printf_function ('W', print_widget, print_widget_arginfo); +- +- /* Now print the widget. */ +- printf ("|%W|\n", &mywidget); +- printf ("|%35W|\n", &mywidget); +- printf ("|%-35W|\n", &mywidget); +- +- return 0; +- } +- +- The output produced by this program looks like: +- +- || +- | | +- | | +- +- +-File: libc.info, Node: Predefined Printf Handlers, Prev: Printf Extension Example, Up: Customizing Printf +- +-Predefined `printf' Handlers +----------------------------- +- +- The GNU libc also contains a concrete and useful application of the +-`printf' handler extension. There are two functions available which +-implement a special way to print floating-point numbers. +- +- - Function: int printf_size (FILE *FP, const struct printf_info *INFO, +- const void *const *ARGS) +- Print a given floating point number as for the format `%f' except +- that there is a postfix character indicating the divisor for the +- number to make this less than 1000. There are two possible +- divisors: powers of 1024 or powers of 1000. Which one is used +- depends on the format character specified while registered this +- handler. If the character is of lower case, 1024 is used. For +- upper case characters, 1000 is used. +- +- The postfix tag corresponds to bytes, kilobytes, megabytes, +- gigabytes, etc. The full table is: +- +- +------+--------------+--------+--------+---------------+ +- |low|Multiplier|From|Upper|Multiplier| +- +------+--------------+--------+--------+---------------+ +- |' '|1||' '|1| +- +------+--------------+--------+--------+---------------+ +- |k|2^10 (1024)|kilo|K|10^3 (1000)| +- +------+--------------+--------+--------+---------------+ +- |m|2^20|mega|M|10^6| +- +------+--------------+--------+--------+---------------+ +- |g|2^30|giga|G|10^9| +- +------+--------------+--------+--------+---------------+ +- |t|2^40|tera|T|10^12| +- +------+--------------+--------+--------+---------------+ +- |p|2^50|peta|P|10^15| +- +------+--------------+--------+--------+---------------+ +- |e|2^60|exa|E|10^18| +- +------+--------------+--------+--------+---------------+ +- |z|2^70|zetta|Z|10^21| +- +------+--------------+--------+--------+---------------+ +- |y|2^80|yotta|Y|10^24| +- +------+--------------+--------+--------+---------------+ +- +- The default precision is 3, i.e., 1024 is printed with a lower-case +- format character as if it were `%.3fk' and will yield `1.000k'. +- +- Due to the requirements of `register_printf_function' we must also +-provide the function which returns information about the arguments. +- +- - Function: int printf_size_info (const struct printf_info *INFO, +- size_t N, int *ARGTYPES) +- This function will return in ARGTYPES the information about the +- used parameters in the way the `vfprintf' implementation expects +- it. The format always takes one argument. +- +- To use these functions both functions must be registered with a call +-like +- +- register_printf_function ('B', printf_size, printf_size_info); +- +- Here we register the functions to print numbers as powers of 1000 +-since the format character `'B'' is an upper-case character. If we +-would additionally use `'b'' in a line like +- +- register_printf_function ('b', printf_size, printf_size_info); +- +-we could also print using a power of 1024. Please note that all that is +-different in these two lines is the format specifier. The +-`printf_size' function knows about the difference between lower and +-upper case format specifiers. +- +- The use of `'B'' and `'b'' is no coincidence. Rather it is the +-preferred way to use this functionality since it is available on some +-other systems which also use format specifiers. +- +- +-File: libc.info, Node: Formatted Input, Next: EOF and Errors, Prev: Customizing Printf, Up: I/O on Streams +- +-Formatted Input +-=============== +- +- The functions described in this section (`scanf' and related +-functions) provide facilities for formatted input analogous to the +-formatted output facilities. These functions provide a mechanism for +-reading arbitrary values under the control of a "format string" or +-"template string". +- +-* Menu: +- +-* Formatted Input Basics:: Some basics to get you started. +-* Input Conversion Syntax:: Syntax of conversion specifications. +-* Table of Input Conversions:: Summary of input conversions and what they do. +-* Numeric Input Conversions:: Details of conversions for reading numbers. +-* String Input Conversions:: Details of conversions for reading strings. +-* Dynamic String Input:: String conversions that `malloc' the buffer. +-* Other Input Conversions:: Details of miscellaneous other conversions. +-* Formatted Input Functions:: Descriptions of the actual functions. +-* Variable Arguments Input:: `vscanf' and friends. +- +- +-File: libc.info, Node: Formatted Input Basics, Next: Input Conversion Syntax, Up: Formatted Input +- +-Formatted Input Basics +----------------------- +- +- Calls to `scanf' are superficially similar to calls to `printf' in +-that arbitrary arguments are read under the control of a template +-string. While the syntax of the conversion specifications in the +-template is very similar to that for `printf', the interpretation of +-the template is oriented more towards free-format input and simple +-pattern matching, rather than fixed-field formatting. For example, +-most `scanf' conversions skip over any amount of "white space" +-(including spaces, tabs, and newlines) in the input file, and there is +-no concept of precision for the numeric input conversions as there is +-for the corresponding output conversions. Ordinarily, non-whitespace +-characters in the template are expected to match characters in the +-input stream exactly, but a matching failure is distinct from an input +-error on the stream. +- +- Another area of difference between `scanf' and `printf' is that you +-must remember to supply pointers rather than immediate values as the +-optional arguments to `scanf'; the values that are read are stored in +-the objects that the pointers point to. Even experienced programmers +-tend to forget this occasionally, so if your program is getting strange +-errors that seem to be related to `scanf', you might want to +-double-check this. +- +- When a "matching failure" occurs, `scanf' returns immediately, +-leaving the first non-matching character as the next character to be +-read from the stream. The normal return value from `scanf' is the +-number of values that were assigned, so you can use this to determine if +-a matching error happened before all the expected values were read. +- +- The `scanf' function is typically used for things like reading in +-the contents of tables. For example, here is a function that uses +-`scanf' to initialize an array of `double': +- +- void +- readarray (double *array, int n) +- { +- int i; +- for (i=0; i scanf ("%a[a-zA-Z0-9] = %a[^\n]\n", +- &variable, &value)) +- { +- invalid_input_error (); +- return 0; +- } +- +- ... +- } +- +- +-File: libc.info, Node: Other Input Conversions, Next: Formatted Input Functions, Prev: Dynamic String Input, Up: Formatted Input +- +-Other Input Conversions +------------------------ +- +- This section describes the miscellaneous input conversions. +- +- The `%p' conversion is used to read a pointer value. It recognizes +-the same syntax used by the `%p' output conversion for `printf' (*note +-Other Output Conversions::); that is, a hexadecimal number just as the +-`%x' conversion accepts. The corresponding argument should be of type +-`void **'; that is, the address of a place to store a pointer. +- +- The resulting pointer value is not guaranteed to be valid if it was +-not originally written during the same program execution that reads it +-in. +- +- The `%n' conversion produces the number of characters read so far by +-this call. The corresponding argument should be of type `int *'. This +-conversion works in the same way as the `%n' conversion for `printf'; +-see *Note Other Output Conversions::, for an example. +- +- The `%n' conversion is the only mechanism for determining the +-success of literal matches or conversions with suppressed assignments. +-If the `%n' follows the locus of a matching failure, then no value is +-stored for it since `scanf' returns before processing the `%n'. If you +-store `-1' in that argument slot before calling `scanf', the presence +-of `-1' after `scanf' indicates an error occurred before the `%n' was +-reached. +- +- Finally, the `%%' conversion matches a literal `%' character in the +-input stream, without using an argument. This conversion does not +-permit any flags, field width, or type modifier to be specified. +- +- +-File: libc.info, Node: Formatted Input Functions, Next: Variable Arguments Input, Prev: Other Input Conversions, Up: Formatted Input +- +-Formatted Input Functions +-------------------------- +- +- Here are the descriptions of the functions for performing formatted +-input. Prototypes for these functions are in the header file `stdio.h'. +- +- - Function: int scanf (const char *TEMPLATE, ...) +- The `scanf' function reads formatted input from the stream `stdin' +- under the control of the template string TEMPLATE. The optional +- arguments are pointers to the places which receive the resulting +- values. +- +- The return value is normally the number of successful assignments. +- If an end-of-file condition is detected before any matches are +- performed, including matches against whitespace and literal +- characters in the template, then `EOF' is returned. +- +- - Function: int wscanf (const wchar_t *TEMPLATE, ...) +- The `wscanf' function reads formatted input from the stream +- `stdin' under the control of the template string TEMPLATE. The +- optional arguments are pointers to the places which receive the +- resulting values. +- +- The return value is normally the number of successful assignments. +- If an end-of-file condition is detected before any matches are +- performed, including matches against whitespace and literal +- characters in the template, then `WEOF' is returned. +- +- - Function: int fscanf (FILE *STREAM, const char *TEMPLATE, ...) +- This function is just like `scanf', except that the input is read +- from the stream STREAM instead of `stdin'. +- +- - Function: int fwscanf (FILE *STREAM, const wchar_t *TEMPLATE, ...) +- This function is just like `wscanf', except that the input is read +- from the stream STREAM instead of `stdin'. +- +- - Function: int sscanf (const char *S, const char *TEMPLATE, ...) +- This is like `scanf', except that the characters are taken from the +- null-terminated string S instead of from a stream. Reaching the +- end of the string is treated as an end-of-file condition. +- +- The behavior of this function is undefined if copying takes place +- between objects that overlap--for example, if S is also given as +- an argument to receive a string read under control of the `%s', +- `%S', or `%[' conversion. +- +- - Function: int swscanf (const wchar_t *WS, const char *TEMPLATE, ...) +- This is like `wscanf', except that the characters are taken from +- the null-terminated string WS instead of from a stream. Reaching +- the end of the string is treated as an end-of-file condition. +- +- The behavior of this function is undefined if copying takes place +- between objects that overlap--for example, if WS is also given as +- an argument to receive a string read under control of the `%s', +- `%S', or `%[' conversion. +- +- +-File: libc.info, Node: Variable Arguments Input, Prev: Formatted Input Functions, Up: Formatted Input +- +-Variable Arguments Input Functions +----------------------------------- +- +- The functions `vscanf' and friends are provided so that you can +-define your own variadic `scanf'-like functions that make use of the +-same internals as the built-in formatted output functions. These +-functions are analogous to the `vprintf' series of output functions. +-*Note Variable Arguments Output::, for important information on how to +-use them. +- +- *Portability Note:* The functions listed in this section were +-introduced in ISO C99 and were before available as GNU extensions. +- +- - Function: int vscanf (const char *TEMPLATE, va_list AP) +- This function is similar to `scanf', but instead of taking a +- variable number of arguments directly, it takes an argument list +- pointer AP of type `va_list' (*note Variadic Functions::). +- +- - Function: int vwscanf (const wchar_t *TEMPLATE, va_list AP) +- This function is similar to `wscanf', but instead of taking a +- variable number of arguments directly, it takes an argument list +- pointer AP of type `va_list' (*note Variadic Functions::). +- +- - Function: int vfscanf (FILE *STREAM, const char *TEMPLATE, va_list +- AP) +- This is the equivalent of `fscanf' with the variable argument list +- specified directly as for `vscanf'. +- +- - Function: int vfwscanf (FILE *STREAM, const wchar_t *TEMPLATE, +- va_list AP) +- This is the equivalent of `fwscanf' with the variable argument list +- specified directly as for `vwscanf'. +- +- - Function: int vsscanf (const char *S, const char *TEMPLATE, va_list +- AP) +- This is the equivalent of `sscanf' with the variable argument list +- specified directly as for `vscanf'. +- +- - Function: int vswscanf (const wchar_t *S, const wchar_t *TEMPLATE, +- va_list AP) +- This is the equivalent of `swscanf' with the variable argument list +- specified directly as for `vwscanf'. +- +- In GNU C, there is a special construct you can use to let the +-compiler know that a function uses a `scanf'-style format string. Then +-it can check the number and types of arguments in each call to the +-function, and warn you when they do not match the format string. For +-details, *Note Declaring Attributes of Functions: (gcc.info)Function +-Attributes. +- +- +-File: libc.info, Node: EOF and Errors, Next: Error Recovery, Prev: Formatted Input, Up: I/O on Streams +- +-End-Of-File and Errors +-====================== +- +- Many of the functions described in this chapter return the value of +-the macro `EOF' to indicate unsuccessful completion of the operation. +-Since `EOF' is used to report both end of file and random errors, it's +-often better to use the `feof' function to check explicitly for end of +-file and `ferror' to check for errors. These functions check +-indicators that are part of the internal state of the stream object, +-indicators set if the appropriate condition was detected by a previous +-I/O operation on that stream. +- +- - Macro: int EOF +- This macro is an integer value that is returned by a number of +- narrow stream functions to indicate an end-of-file condition, or +- some other error situation. With the GNU library, `EOF' is `-1'. +- In other libraries, its value may be some other negative number. +- +- This symbol is declared in `stdio.h'. +- +- - Macro: int WEOF +- This macro is an integer value that is returned by a number of wide +- stream functions to indicate an end-of-file condition, or some +- other error situation. With the GNU library, `WEOF' is `-1'. In +- other libraries, its value may be some other negative number. +- +- This symbol is declared in `wchar.h'. +- +- - Function: int feof (FILE *STREAM) +- The `feof' function returns nonzero if and only if the end-of-file +- indicator for the stream STREAM is set. +- +- This symbol is declared in `stdio.h'. +- +- - Function: int feof_unlocked (FILE *STREAM) +- The `feof_unlocked' function is equivalent to the `feof' function +- except that it does not implicitly lock the stream. +- +- This function is a GNU extension. +- +- This symbol is declared in `stdio.h'. +- +- - Function: int ferror (FILE *STREAM) +- The `ferror' function returns nonzero if and only if the error +- indicator for the stream STREAM is set, indicating that an error +- has occurred on a previous operation on the stream. +- +- This symbol is declared in `stdio.h'. +- +- - Function: int ferror_unlocked (FILE *STREAM) +- The `ferror_unlocked' function is equivalent to the `ferror' +- function except that it does not implicitly lock the stream. +- +- This function is a GNU extension. +- +- This symbol is declared in `stdio.h'. +- +- In addition to setting the error indicator associated with the +-stream, the functions that operate on streams also set `errno' in the +-same way as the corresponding low-level functions that operate on file +-descriptors. For example, all of the functions that perform output to a +-stream--such as `fputc', `printf', and `fflush'--are implemented in +-terms of `write', and all of the `errno' error conditions defined for +-`write' are meaningful for these functions. For more information about +-the descriptor-level I/O functions, see *Note Low-Level I/O::. +- +- +-File: libc.info, Node: Error Recovery, Next: Binary Streams, Prev: EOF and Errors, Up: I/O on Streams +- +-Recovering from errors +-====================== +- +- You may explicitly clear the error and EOF flags with the `clearerr' +-function. +- +- - Function: void clearerr (FILE *STREAM) +- This function clears the end-of-file and error indicators for the +- stream STREAM. +- +- The file positioning functions (*note File Positioning::) also +- clear the end-of-file indicator for the stream. +- +- - Function: void clearerr_unlocked (FILE *STREAM) +- The `clearerr_unlocked' function is equivalent to the `clearerr' +- function except that it does not implicitly lock the stream. +- +- This function is a GNU extension. +- +- Note that it is _not_ correct to just clear the error flag and retry +-a failed stream operation. After a failed write, any number of +-characters since the last buffer flush may have been committed to the +-file, while some buffered data may have been discarded. Merely retrying +-can thus cause lost or repeated data. +- +- A failed read may leave the file pointer in an inappropriate +-position for a second try. In both cases, you should seek to a known +-position before retrying. +- +- Most errors that can happen are not recoverable -- a second try will +-always fail again in the same way. So usually it is best to give up and +-report the error to the user, rather than install complicated recovery +-logic. +- +- One important exception is `EINTR' (*note Interrupted Primitives::). +-Many stream I/O implementations will treat it as an ordinary error, +-which can be quite inconvenient. You can avoid this hassle by +-installing all signals with the `SA_RESTART' flag. +- +- For similar reasons, setting nonblocking I/O on a stream's file +-descriptor is not usually advisable. +- +- +-File: libc.info, Node: Binary Streams, Next: File Positioning, Prev: Error Recovery, Up: I/O on Streams +- +-Text and Binary Streams +-======================= +- +- The GNU system and other POSIX-compatible operating systems organize +-all files as uniform sequences of characters. However, some other +-systems make a distinction between files containing text and files +-containing binary data, and the input and output facilities of ISO C +-provide for this distinction. This section tells you how to write +-programs portable to such systems. +- +- When you open a stream, you can specify either a "text stream" or a +-"binary stream". You indicate that you want a binary stream by +-specifying the `b' modifier in the OPENTYPE argument to `fopen'; see +-*Note Opening Streams::. Without this option, `fopen' opens the file +-as a text stream. +- +- Text and binary streams differ in several ways: +- +- * The data read from a text stream is divided into "lines" which are +- terminated by newline (`'\n'') characters, while a binary stream is +- simply a long series of characters. A text stream might on some +- systems fail to handle lines more than 254 characters long +- (including the terminating newline character). +- +- * On some systems, text files can contain only printing characters, +- horizontal tab characters, and newlines, and so text streams may +- not support other characters. However, binary streams can handle +- any character value. +- +- * Space characters that are written immediately preceding a newline +- character in a text stream may disappear when the file is read in +- again. +- +- * More generally, there need not be a one-to-one mapping between +- characters that are read from or written to a text stream, and the +- characters in the actual file. +- +- Since a binary stream is always more capable and more predictable +-than a text stream, you might wonder what purpose text streams serve. +-Why not simply always use binary streams? The answer is that on these +-operating systems, text and binary streams use different file formats, +-and the only way to read or write "an ordinary file of text" that can +-work with other text-oriented programs is through a text stream. +- +- In the GNU library, and on all POSIX systems, there is no difference +-between text streams and binary streams. When you open a stream, you +-get the same kind of stream regardless of whether you ask for binary. +-This stream can handle any file content, and has none of the +-restrictions that text streams sometimes have. +- +- +-File: libc.info, Node: File Positioning, Next: Portable Positioning, Prev: Binary Streams, Up: I/O on Streams +- +-File Positioning +-================ +- +- The "file position" of a stream describes where in the file the +-stream is currently reading or writing. I/O on the stream advances the +-file position through the file. In the GNU system, the file position is +-represented as an integer, which counts the number of bytes from the +-beginning of the file. *Note File Position::. +- +- During I/O to an ordinary disk file, you can change the file position +-whenever you wish, so as to read or write any portion of the file. Some +-other kinds of files may also permit this. Files which support changing +-the file position are sometimes referred to as "random-access" files. +- +- You can use the functions in this section to examine or modify the +-file position indicator associated with a stream. The symbols listed +-below are declared in the header file `stdio.h'. +- +- - Function: long int ftell (FILE *STREAM) +- This function returns the current file position of the stream +- STREAM. +- +- This function can fail if the stream doesn't support file +- positioning, or if the file position can't be represented in a +- `long int', and possibly for other reasons as well. If a failure +- occurs, a value of `-1' is returned. +- +- - Function: off_t ftello (FILE *STREAM) +- The `ftello' function is similar to `ftell', except that it +- returns a value of type `off_t'. Systems which support this type +- use it to describe all file positions, unlike the POSIX +- specification which uses a long int. The two are not necessarily +- the same size. Therefore, using ftell can lead to problems if the +- implementation is written on top of a POSIX compliant low-level +- I/O implementation, and using `ftello' is preferable whenever it +- is available. +- +- If this function fails it returns `(off_t) -1'. This can happen +- due to missing support for file positioning or internal errors. +- Otherwise the return value is the current file position. +- +- The function is an extension defined in the Unix Single +- Specification version 2. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a +- 32 bit system this function is in fact `ftello64'. I.e., the LFS +- interface transparently replaces the old interface. +- +- - Function: off64_t ftello64 (FILE *STREAM) +- This function is similar to `ftello' with the only difference that +- the return value is of type `off64_t'. This also requires that the +- stream STREAM was opened using either `fopen64', `freopen64', or +- `tmpfile64' since otherwise the underlying file operations to +- position the file pointer beyond the 2^31 bytes limit might fail. +- +- If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32 +- bits machine this function is available under the name `ftello' +- and so transparently replaces the old interface. +- +- - Function: int fseek (FILE *STREAM, long int OFFSET, int WHENCE) +- The `fseek' function is used to change the file position of the +- stream STREAM. The value of WHENCE must be one of the constants +- `SEEK_SET', `SEEK_CUR', or `SEEK_END', to indicate whether the +- OFFSET is relative to the beginning of the file, the current file +- position, or the end of the file, respectively. +- +- This function returns a value of zero if the operation was +- successful, and a nonzero value to indicate failure. A successful +- call also clears the end-of-file indicator of STREAM and discards +- any characters that were "pushed back" by the use of `ungetc'. +- +- `fseek' either flushes any buffered output before setting the file +- position or else remembers it so it will be written later in its +- proper place in the file. +- +- - Function: int fseeko (FILE *STREAM, off_t OFFSET, int WHENCE) +- This function is similar to `fseek' but it corrects a problem with +- `fseek' in a system with POSIX types. Using a value of type `long +- int' for the offset is not compatible with POSIX. `fseeko' uses +- the correct type `off_t' for the OFFSET parameter. +- +- For this reason it is a good idea to prefer `ftello' whenever it is +- available since its functionality is (if different at all) closer +- the underlying definition. +- +- The functionality and return value is the same as for `fseek'. +- +- The function is an extension defined in the Unix Single +- Specification version 2. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a +- 32 bit system this function is in fact `fseeko64'. I.e., the LFS +- interface transparently replaces the old interface. +- +- - Function: int fseeko64 (FILE *STREAM, off64_t OFFSET, int WHENCE) +- This function is similar to `fseeko' with the only difference that +- the OFFSET parameter is of type `off64_t'. This also requires +- that the stream STREAM was opened using either `fopen64', +- `freopen64', or `tmpfile64' since otherwise the underlying file +- operations to position the file pointer beyond the 2^31 bytes +- limit might fail. +- +- If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32 +- bits machine this function is available under the name `fseeko' +- and so transparently replaces the old interface. +- +- *Portability Note:* In non-POSIX systems, `ftell', `ftello', `fseek' +-and `fseeko' might work reliably only on binary streams. *Note Binary +-Streams::. +- +- The following symbolic constants are defined for use as the WHENCE +-argument to `fseek'. They are also used with the `lseek' function +-(*note I/O Primitives::) and to specify offsets for file locks (*note +-Control Operations::). +- +- - Macro: int SEEK_SET +- This is an integer constant which, when used as the WHENCE +- argument to the `fseek' or `fseeko' function, specifies that the +- offset provided is relative to the beginning of the file. +- +- - Macro: int SEEK_CUR +- This is an integer constant which, when used as the WHENCE +- argument to the `fseek' or `fseeko' function, specifies that the +- offset provided is relative to the current file position. +- +- - Macro: int SEEK_END +- This is an integer constant which, when used as the WHENCE +- argument to the `fseek' or `fseeko' function, specifies that the +- offset provided is relative to the end of the file. +- +- - Function: void rewind (FILE *STREAM) +- The `rewind' function positions the stream STREAM at the beginning +- of the file. It is equivalent to calling `fseek' or `fseeko' on +- the STREAM with an OFFSET argument of `0L' and a WHENCE argument +- of `SEEK_SET', except that the return value is discarded and the +- error indicator for the stream is reset. +- +- These three aliases for the `SEEK_...' constants exist for the sake +-of compatibility with older BSD systems. They are defined in two +-different header files: `fcntl.h' and `sys/file.h'. +- +-`L_SET' +- An alias for `SEEK_SET'. +- +-`L_INCR' +- An alias for `SEEK_CUR'. +- +-`L_XTND' +- An alias for `SEEK_END'. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-2 glibc-2.3.2-200304020432/manual/libc.info-2 +--- glibc-2.3.2/manual/libc.info-2 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-2 Thu Jan 1 01:00:00 1970 +@@ -1,1004 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Introduction, Next: Error Reporting, Prev: Top, Up: Top +- +-Introduction +-************ +- +- The C language provides no built-in facilities for performing such +-common operations as input/output, memory management, string +-manipulation, and the like. Instead, these facilities are defined in a +-standard "library", which you compile and link with your programs. +- +- The GNU C library, described in this document, defines all of the +-library functions that are specified by the ISO C standard, as well as +-additional features specific to POSIX and other derivatives of the Unix +-operating system, and extensions specific to the GNU system. +- +- The purpose of this manual is to tell you how to use the facilities +-of the GNU library. We have mentioned which features belong to which +-standards to help you identify things that are potentially non-portable +-to other systems. But the emphasis in this manual is not on strict +-portability. +- +-* Menu: +- +-* Getting Started:: What this manual is for and how to use it. +-* Standards and Portability:: Standards and sources upon which the GNU +- C library is based. +-* Using the Library:: Some practical uses for the library. +-* Roadmap to the Manual:: Overview of the remaining chapters in +- this manual. +- +- +-File: libc.info, Node: Getting Started, Next: Standards and Portability, Up: Introduction +- +-Getting Started +-=============== +- +- This manual is written with the assumption that you are at least +-somewhat familiar with the C programming language and basic programming +-concepts. Specifically, familiarity with ISO standard C (*note ISO +-C::), rather than "traditional" pre-ISO C dialects, is assumed. +- +- The GNU C library includes several "header files", each of which +-provides definitions and declarations for a group of related facilities; +-this information is used by the C compiler when processing your program. +-For example, the header file `stdio.h' declares facilities for +-performing input and output, and the header file `string.h' declares +-string processing utilities. The organization of this manual generally +-follows the same division as the header files. +- +- If you are reading this manual for the first time, you should read +-all of the introductory material and skim the remaining chapters. +-There are a _lot_ of functions in the GNU C library and it's not +-realistic to expect that you will be able to remember exactly _how_ to +-use each and every one of them. It's more important to become +-generally familiar with the kinds of facilities that the library +-provides, so that when you are writing your programs you can recognize +-_when_ to make use of library functions, and _where_ in this manual you +-can find more specific information about them. +- +- +-File: libc.info, Node: Standards and Portability, Next: Using the Library, Prev: Getting Started, Up: Introduction +- +-Standards and Portability +-========================= +- +- This section discusses the various standards and other sources that +-the GNU C library is based upon. These sources include the ISO C and +-POSIX standards, and the System V and Berkeley Unix implementations. +- +- The primary focus of this manual is to tell you how to make effective +-use of the GNU library facilities. But if you are concerned about +-making your programs compatible with these standards, or portable to +-operating systems other than GNU, this can affect how you use the +-library. This section gives you an overview of these standards, so that +-you will know what they are when they are mentioned in other parts of +-the manual. +- +- *Note Library Summary::, for an alphabetical list of the functions +-and other symbols provided by the library. This list also states which +-standards each function or symbol comes from. +- +-* Menu: +- +-* ISO C:: The international standard for the C +- programming language. +-* POSIX:: The ISO/IEC 9945 (aka IEEE 1003) standards +- for operating systems. +-* Berkeley Unix:: BSD and SunOS. +-* SVID:: The System V Interface Description. +-* XPG:: The X/Open Portability Guide. +- +- +-File: libc.info, Node: ISO C, Next: POSIX, Up: Standards and Portability +- +-ISO C +------ +- +- The GNU C library is compatible with the C standard adopted by the +-American National Standards Institute (ANSI): `American National +-Standard X3.159-1989--"ANSI C"' and later by the International +-Standardization Organization (ISO): `ISO/IEC 9899:1990, "Programming +-languages--C"'. We here refer to the standard as ISO C since this is +-the more general standard in respect of ratification. The header files +-and library facilities that make up the GNU library are a superset of +-those specified by the ISO C standard. +- +- If you are concerned about strict adherence to the ISO C standard, +-you should use the `-ansi' option when you compile your programs with +-the GNU C compiler. This tells the compiler to define _only_ ISO +-standard features from the library header files, unless you explicitly +-ask for additional features. *Note Feature Test Macros::, for +-information on how to do this. +- +- Being able to restrict the library to include only ISO C features is +-important because ISO C puts limitations on what names can be defined +-by the library implementation, and the GNU extensions don't fit these +-limitations. *Note Reserved Names::, for more information about these +-restrictions. +- +- This manual does not attempt to give you complete details on the +-differences between ISO C and older dialects. It gives advice on how +-to write programs to work portably under multiple C dialects, but does +-not aim for completeness. +- +- +-File: libc.info, Node: POSIX, Next: Berkeley Unix, Prev: ISO C, Up: Standards and Portability +- +-POSIX (The Portable Operating System Interface) +------------------------------------------------ +- +- The GNU library is also compatible with the ISO "POSIX" family of +-standards, known more formally as the "Portable Operating System +-Interface for Computer Environments" (ISO/IEC 9945). They were also +-published as ANSI/IEEE Std 1003. POSIX is derived mostly from various +-versions of the Unix operating system. +- +- The library facilities specified by the POSIX standards are a +-superset of those required by ISO C; POSIX specifies additional +-features for ISO C functions, as well as specifying new additional +-functions. In general, the additional requirements and functionality +-defined by the POSIX standards are aimed at providing lower-level +-support for a particular kind of operating system environment, rather +-than general programming language support which can run in many diverse +-operating system environments. +- +- The GNU C library implements all of the functions specified in +-`ISO/IEC 9945-1:1996, the POSIX System Application Program Interface', +-commonly referred to as POSIX.1. The primary extensions to the ISO C +-facilities specified by this standard include file system interface +-primitives (*note File System Interface::), device-specific terminal +-control functions (*note Low-Level Terminal Interface::), and process +-control functions (*note Processes::). +- +- Some facilities from `ISO/IEC 9945-2:1993, the POSIX Shell and +-Utilities standard' (POSIX.2) are also implemented in the GNU library. +-These include utilities for dealing with regular expressions and other +-pattern matching facilities (*note Pattern Matching::). +- +- +-File: libc.info, Node: Berkeley Unix, Next: SVID, Prev: POSIX, Up: Standards and Portability +- +-Berkeley Unix +-------------- +- +- The GNU C library defines facilities from some versions of Unix which +-are not formally standardized, specifically from the 4.2 BSD, 4.3 BSD, +-and 4.4 BSD Unix systems (also known as "Berkeley Unix") and from +-"SunOS" (a popular 4.2 BSD derivative that includes some Unix System V +-functionality). These systems support most of the ISO C and POSIX +-facilities, and 4.4 BSD and newer releases of SunOS in fact support +-them all. +- +- The BSD facilities include symbolic links (*note Symbolic Links::), +-the `select' function (*note Waiting for I/O::), the BSD signal +-functions (*note BSD Signal Handling::), and sockets (*note Sockets::). +- +- +-File: libc.info, Node: SVID, Next: XPG, Prev: Berkeley Unix, Up: Standards and Portability +- +-SVID (The System V Interface Description) +------------------------------------------ +- +- The "System V Interface Description" (SVID) is a document describing +-the AT&T Unix System V operating system. It is to some extent a +-superset of the POSIX standard (*note POSIX::). +- +- The GNU C library defines most of the facilities required by the SVID +-that are not also required by the ISO C or POSIX standards, for +-compatibility with System V Unix and other Unix systems (such as +-SunOS) which include these facilities. However, many of the more +-obscure and less generally useful facilities required by the SVID are +-not included. (In fact, Unix System V itself does not provide them +-all.) +- +- The supported facilities from System V include the methods for +-inter-process communication and shared memory, the `hsearch' and +-`drand48' families of functions, `fmtmsg' and several of the +-mathematical functions. +- +- +-File: libc.info, Node: XPG, Prev: SVID, Up: Standards and Portability +- +-XPG (The X/Open Portability Guide) +----------------------------------- +- +- The X/Open Portability Guide, published by the X/Open Company, Ltd., +-is a more general standard than POSIX. X/Open owns the Unix copyright +-and the XPG specifies the requirements for systems which are intended +-to be a Unix system. +- +- The GNU C library complies to the X/Open Portability Guide, Issue +-4.2, with all extensions common to XSI (X/Open System Interface) +-compliant systems and also all X/Open UNIX extensions. +- +- The additions on top of POSIX are mainly derived from functionality +-available in System V and BSD systems. Some of the really bad mistakes +-in System V systems were corrected, though. Since fulfilling the XPG +-standard with the Unix extensions is a precondition for getting the +-Unix brand chances are good that the functionality is available on +-commercial systems. +- +- +-File: libc.info, Node: Using the Library, Next: Roadmap to the Manual, Prev: Standards and Portability, Up: Introduction +- +-Using the Library +-================= +- +- This section describes some of the practical issues involved in using +-the GNU C library. +- +-* Menu: +- +-* Header Files:: How to include the header files in your +- programs. +-* Macro Definitions:: Some functions in the library may really +- be implemented as macros. +-* Reserved Names:: The C standard reserves some names for +- the library, and some for users. +-* Feature Test Macros:: How to control what names are defined. +- +- +-File: libc.info, Node: Header Files, Next: Macro Definitions, Up: Using the Library +- +-Header Files +------------- +- +- Libraries for use by C programs really consist of two parts: "header +-files" that define types and macros and declare variables and +-functions; and the actual library or "archive" that contains the +-definitions of the variables and functions. +- +- (Recall that in C, a "declaration" merely provides information that +-a function or variable exists and gives its type. For a function +-declaration, information about the types of its arguments might be +-provided as well. The purpose of declarations is to allow the compiler +-to correctly process references to the declared variables and functions. +-A "definition", on the other hand, actually allocates storage for a +-variable or says what a function does.) +- +- In order to use the facilities in the GNU C library, you should be +-sure that your program source files include the appropriate header +-files. This is so that the compiler has declarations of these +-facilities available and can correctly process references to them. +-Once your program has been compiled, the linker resolves these +-references to the actual definitions provided in the archive file. +- +- Header files are included into a program source file by the +-`#include' preprocessor directive. The C language supports two forms +-of this directive; the first, +- +- #include "HEADER" +- +-is typically used to include a header file HEADER that you write +-yourself; this would contain definitions and declarations describing the +-interfaces between the different parts of your particular application. +-By contrast, +- +- #include +- +-is typically used to include a header file `file.h' that contains +-definitions and declarations for a standard library. This file would +-normally be installed in a standard place by your system administrator. +-You should use this second form for the C library header files. +- +- Typically, `#include' directives are placed at the top of the C +-source file, before any other code. If you begin your source files with +-some comments explaining what the code in the file does (a good idea), +-put the `#include' directives immediately afterwards, following the +-feature test macro definition (*note Feature Test Macros::). +- +- For more information about the use of header files and `#include' +-directives, *note Header Files: (cpp.info)Header Files.. +- +- The GNU C library provides several header files, each of which +-contains the type and macro definitions and variable and function +-declarations for a group of related facilities. This means that your +-programs may need to include several header files, depending on exactly +-which facilities you are using. +- +- Some library header files include other library header files +-automatically. However, as a matter of programming style, you should +-not rely on this; it is better to explicitly include all the header +-files required for the library facilities you are using. The GNU C +-library header files have been written in such a way that it doesn't +-matter if a header file is accidentally included more than once; +-including a header file a second time has no effect. Likewise, if your +-program needs to include multiple header files, the order in which they +-are included doesn't matter. +- +- *Compatibility Note:* Inclusion of standard header files in any +-order and any number of times works in any ISO C implementation. +-However, this has traditionally not been the case in many older C +-implementations. +- +- Strictly speaking, you don't _have to_ include a header file to use +-a function it declares; you could declare the function explicitly +-yourself, according to the specifications in this manual. But it is +-usually better to include the header file because it may define types +-and macros that are not otherwise available and because it may define +-more efficient macro replacements for some functions. It is also a sure +-way to have the correct declaration. +- +- +-File: libc.info, Node: Macro Definitions, Next: Reserved Names, Prev: Header Files, Up: Using the Library +- +-Macro Definitions of Functions +------------------------------- +- +- If we describe something as a function in this manual, it may have a +-macro definition as well. This normally has no effect on how your +-program runs--the macro definition does the same thing as the function +-would. In particular, macro equivalents for library functions evaluate +-arguments exactly once, in the same way that a function call would. The +-main reason for these macro definitions is that sometimes they can +-produce an inline expansion that is considerably faster than an actual +-function call. +- +- Taking the address of a library function works even if it is also +-defined as a macro. This is because, in this context, the name of the +-function isn't followed by the left parenthesis that is syntactically +-necessary to recognize a macro call. +- +- You might occasionally want to avoid using the macro definition of a +-function--perhaps to make your program easier to debug. There are two +-ways you can do this: +- +- * You can avoid a macro definition in a specific use by enclosing +- the name of the function in parentheses. This works because the +- name of the function doesn't appear in a syntactic context where +- it is recognizable as a macro call. +- +- * You can suppress any macro definition for a whole source file by +- using the `#undef' preprocessor directive, unless otherwise stated +- explicitly in the description of that facility. +- +- For example, suppose the header file `stdlib.h' declares a function +-named `abs' with +- +- extern int abs (int); +- +-and also provides a macro definition for `abs'. Then, in: +- +- #include +- int f (int *i) { return abs (++*i); } +- +-the reference to `abs' might refer to either a macro or a function. On +-the other hand, in each of the following examples the reference is to a +-function and not a macro. +- +- #include +- int g (int *i) { return (abs) (++*i); } +- +- #undef abs +- int h (int *i) { return abs (++*i); } +- +- Since macro definitions that double for a function behave in exactly +-the same way as the actual function version, there is usually no need +-for any of these methods. In fact, removing macro definitions usually +-just makes your program slower. +- +- +-File: libc.info, Node: Reserved Names, Next: Feature Test Macros, Prev: Macro Definitions, Up: Using the Library +- +-Reserved Names +--------------- +- +- The names of all library types, macros, variables and functions that +-come from the ISO C standard are reserved unconditionally; your program +-*may not* redefine these names. All other library names are reserved +-if your program explicitly includes the header file that defines or +-declares them. There are several reasons for these restrictions: +- +- * Other people reading your code could get very confused if you were +- using a function named `exit' to do something completely different +- from what the standard `exit' function does, for example. +- Preventing this situation helps to make your programs easier to +- understand and contributes to modularity and maintainability. +- +- * It avoids the possibility of a user accidentally redefining a +- library function that is called by other library functions. If +- redefinition were allowed, those other functions would not work +- properly. +- +- * It allows the compiler to do whatever special optimizations it +- pleases on calls to these functions, without the possibility that +- they may have been redefined by the user. Some library +- facilities, such as those for dealing with variadic arguments +- (*note Variadic Functions::) and non-local exits (*note Non-Local +- Exits::), actually require a considerable amount of cooperation on +- the part of the C compiler, and with respect to the +- implementation, it might be easier for the compiler to treat these +- as built-in parts of the language. +- +- In addition to the names documented in this manual, reserved names +-include all external identifiers (global functions and variables) that +-begin with an underscore (`_') and all identifiers regardless of use +-that begin with either two underscores or an underscore followed by a +-capital letter are reserved names. This is so that the library and +-header files can define functions, variables, and macros for internal +-purposes without risk of conflict with names in user programs. +- +- Some additional classes of identifier names are reserved for future +-extensions to the C language or the POSIX.1 environment. While using +-these names for your own purposes right now might not cause a problem, +-they do raise the possibility of conflict with future versions of the C +-or POSIX standards, so you should avoid these names. +- +- * Names beginning with a capital `E' followed a digit or uppercase +- letter may be used for additional error code names. *Note Error +- Reporting::. +- +- * Names that begin with either `is' or `to' followed by a lowercase +- letter may be used for additional character testing and conversion +- functions. *Note Character Handling::. +- +- * Names that begin with `LC_' followed by an uppercase letter may be +- used for additional macros specifying locale attributes. *Note +- Locales::. +- +- * Names of all existing mathematics functions (*note Mathematics::) +- suffixed with `f' or `l' are reserved for corresponding functions +- that operate on `float' and `long double' arguments, respectively. +- +- * Names that begin with `SIG' followed by an uppercase letter are +- reserved for additional signal names. *Note Standard Signals::. +- +- * Names that begin with `SIG_' followed by an uppercase letter are +- reserved for additional signal actions. *Note Basic Signal +- Handling::. +- +- * Names beginning with `str', `mem', or `wcs' followed by a +- lowercase letter are reserved for additional string and array +- functions. *Note String and Array Utilities::. +- +- * Names that end with `_t' are reserved for additional type names. +- +- In addition, some individual header files reserve names beyond those +-that they actually define. You only need to worry about these +-restrictions if your program includes that particular header file. +- +- * The header file `dirent.h' reserves names prefixed with `d_'. +- +- * The header file `fcntl.h' reserves names prefixed with `l_', `F_', +- `O_', and `S_'. +- +- * The header file `grp.h' reserves names prefixed with `gr_'. +- +- * The header file `limits.h' reserves names suffixed with `_MAX'. +- +- * The header file `pwd.h' reserves names prefixed with `pw_'. +- +- * The header file `signal.h' reserves names prefixed with `sa_' and +- `SA_'. +- +- * The header file `sys/stat.h' reserves names prefixed with `st_' +- and `S_'. +- +- * The header file `sys/times.h' reserves names prefixed with `tms_'. +- +- * The header file `termios.h' reserves names prefixed with `c_', +- `V', `I', `O', and `TC'; and names prefixed with `B' followed by a +- digit. +- +- +-File: libc.info, Node: Feature Test Macros, Prev: Reserved Names, Up: Using the Library +- +-Feature Test Macros +-------------------- +- +- The exact set of features available when you compile a source file +-is controlled by which "feature test macros" you define. +- +- If you compile your programs using `gcc -ansi', you get only the +-ISO C library features, unless you explicitly request additional +-features by defining one or more of the feature macros. *Note GNU CC +-Command Options: (gcc.info)Invoking GCC, for more information about GCC +-options. +- +- You should define these macros by using `#define' preprocessor +-directives at the top of your source code files. These directives +-_must_ come before any `#include' of a system header file. It is best +-to make them the very first thing in the file, preceded only by +-comments. You could also use the `-D' option to GCC, but it's better +-if you make the source files indicate their own meaning in a +-self-contained way. +- +- This system exists to allow the library to conform to multiple +-standards. Although the different standards are often described as +-supersets of each other, they are usually incompatible because larger +-standards require functions with names that smaller ones reserve to the +-user program. This is not mere pedantry -- it has been a problem in +-practice. For instance, some non-GNU programs define functions named +-`getline' that have nothing to do with this library's `getline'. They +-would not be compilable if all features were enabled indiscriminately. +- +- This should not be used to verify that a program conforms to a +-limited standard. It is insufficient for this purpose, as it will not +-protect you from including header files outside the standard, or +-relying on semantics undefined within the standard. +- +- - Macro: _POSIX_SOURCE +- If you define this macro, then the functionality from the POSIX.1 +- standard (IEEE Standard 1003.1) is available, as well as all of the +- ISO C facilities. +- +- The state of `_POSIX_SOURCE' is irrelevant if you define the macro +- `_POSIX_C_SOURCE' to a positive integer. +- +- - Macro: _POSIX_C_SOURCE +- Define this macro to a positive integer to control which POSIX +- functionality is made available. The greater the value of this +- macro, the more functionality is made available. +- +- If you define this macro to a value greater than or equal to `1', +- then the functionality from the 1990 edition of the POSIX.1 +- standard (IEEE Standard 1003.1-1990) is made available. +- +- If you define this macro to a value greater than or equal to `2', +- then the functionality from the 1992 edition of the POSIX.2 +- standard (IEEE Standard 1003.2-1992) is made available. +- +- If you define this macro to a value greater than or equal to +- `199309L', then the functionality from the 1993 edition of the +- POSIX.1b standard (IEEE Standard 1003.1b-1993) is made available. +- +- Greater values for `_POSIX_C_SOURCE' will enable future extensions. +- The POSIX standards process will define these values as necessary, +- and the GNU C Library should support them some time after they +- become standardized. The 1996 edition of POSIX.1 (ISO/IEC 9945-1: +- 1996) states that if you define `_POSIX_C_SOURCE' to a value +- greater than or equal to `199506L', then the functionality from +- the 1996 edition is made available. +- +- - Macro: _BSD_SOURCE +- If you define this macro, functionality derived from 4.3 BSD Unix +- is included as well as the ISO C, POSIX.1, and POSIX.2 material. +- +- Some of the features derived from 4.3 BSD Unix conflict with the +- corresponding features specified by the POSIX.1 standard. If this +- macro is defined, the 4.3 BSD definitions take precedence over the +- POSIX definitions. +- +- Due to the nature of some of the conflicts between 4.3 BSD and +- POSIX.1, you need to use a special "BSD compatibility library" +- when linking programs compiled for BSD compatibility. This is +- because some functions must be defined in two different ways, one +- of them in the normal C library, and one of them in the +- compatibility library. If your program defines `_BSD_SOURCE', you +- must give the option `-lbsd-compat' to the compiler or linker when +- linking the program, to tell it to find functions in this special +- compatibility library before looking for them in the normal C +- library. +- +- - Macro: _SVID_SOURCE +- If you define this macro, functionality derived from SVID is +- included as well as the ISO C, POSIX.1, POSIX.2, and X/Open +- material. +- +- - Macro: _XOPEN_SOURCE +- - Macro: _XOPEN_SOURCE_EXTENDED +- If you define this macro, functionality described in the X/Open +- Portability Guide is included. This is a superset of the POSIX.1 +- and POSIX.2 functionality and in fact `_POSIX_SOURCE' and +- `_POSIX_C_SOURCE' are automatically defined. +- +- As the unification of all Unices, functionality only available in +- BSD and SVID is also included. +- +- If the macro `_XOPEN_SOURCE_EXTENDED' is also defined, even more +- functionality is available. The extra functions will make all +- functions available which are necessary for the X/Open Unix brand. +- +- If the macro `_XOPEN_SOURCE' has the value 500 this includes all +- functionality described so far plus some new definitions from the +- Single Unix Specification, version 2. +- +- - Macro: _LARGEFILE_SOURCE +- If this macro is defined some extra functions are available which +- rectify a few shortcomings in all previous standards. +- Specifically, the functions `fseeko' and `ftello' are available. +- Without these functions the difference between the ISO C interface +- (`fseek', `ftell') and the low-level POSIX interface (`lseek') +- would lead to problems. +- +- This macro was introduced as part of the Large File Support +- extension (LFS). +- +- - Macro: _LARGEFILE64_SOURCE +- If you define this macro an additional set of functions is made +- available which enables 32 bit systems to use files of sizes beyond +- the usual limit of 2GB. This interface is not available if the +- system does not support files that large. On systems where the +- natural file size limit is greater than 2GB (i.e., on 64 bit +- systems) the new functions are identical to the replaced functions. +- +- The new functionality is made available by a new set of types and +- functions which replace the existing ones. The names of these new +- objects contain `64' to indicate the intention, e.g., `off_t' vs. +- `off64_t' and `fseeko' vs. `fseeko64'. +- +- This macro was introduced as part of the Large File Support +- extension (LFS). It is a transition interface for the period when +- 64 bit offsets are not generally used (see `_FILE_OFFSET_BITS'). +- +- - Macro: _FILE_OFFSET_BITS +- This macro determines which file system interface shall be used, +- one replacing the other. Whereas `_LARGEFILE64_SOURCE' makes the +- 64 bit interface available as an additional interface, +- `_FILE_OFFSET_BITS' allows the 64 bit interface to replace the old +- interface. +- +- If `_FILE_OFFSET_BITS' is undefined, or if it is defined to the +- value `32', nothing changes. The 32 bit interface is used and +- types like `off_t' have a size of 32 bits on 32 bit systems. +- +- If the macro is defined to the value `64', the large file interface +- replaces the old interface. I.e., the functions are not made +- available under different names (as they are with +- `_LARGEFILE64_SOURCE'). Instead the old function names now +- reference the new functions, e.g., a call to `fseeko' now indeed +- calls `fseeko64'. +- +- This macro should only be selected if the system provides +- mechanisms for handling large files. On 64 bit systems this macro +- has no effect since the `*64' functions are identical to the +- normal functions. +- +- This macro was introduced as part of the Large File Support +- extension (LFS). +- +- - Macro: _ISOC99_SOURCE +- Until the revised ISO C standard is widely adopted the new features +- are not automatically enabled. The GNU libc nevertheless has a +- complete implementation of the new standard and to enable the new +- features the macro `_ISOC99_SOURCE' should be defined. +- +- - Macro: _GNU_SOURCE +- If you define this macro, everything is included: ISO C89, +- ISO C99, POSIX.1, POSIX.2, BSD, SVID, X/Open, LFS, and GNU +- extensions. In the cases where POSIX.1 conflicts with BSD, the +- POSIX definitions take precedence. +- +- If you want to get the full effect of `_GNU_SOURCE' but make the +- BSD definitions take precedence over the POSIX definitions, use +- this sequence of definitions: +- +- #define _GNU_SOURCE +- #define _BSD_SOURCE +- #define _SVID_SOURCE +- +- Note that if you do this, you must link your program with the BSD +- compatibility library by passing the `-lbsd-compat' option to the +- compiler or linker. *Note:* If you forget to do this, you may get +- very strange errors at run time. +- +- - Macro: _REENTRANT +- - Macro: _THREAD_SAFE +- If you define one of these macros, reentrant versions of several +- functions get declared. Some of the functions are specified in +- POSIX.1c but many others are only available on a few other systems +- or are unique to GNU libc. The problem is the delay in the +- standardization of the thread safe C library interface. +- +- Unlike on some other systems, no special version of the C library +- must be used for linking. There is only one version but while +- compiling this it must have been specified to compile as thread +- safe. +- +- We recommend you use `_GNU_SOURCE' in new programs. If you don't +-specify the `-ansi' option to GCC and don't define any of these macros +-explicitly, the effect is the same as defining `_POSIX_C_SOURCE' to 2 +-and `_POSIX_SOURCE', `_SVID_SOURCE', and `_BSD_SOURCE' to 1. +- +- When you define a feature test macro to request a larger class of +-features, it is harmless to define in addition a feature test macro for +-a subset of those features. For example, if you define +-`_POSIX_C_SOURCE', then defining `_POSIX_SOURCE' as well has no effect. +-Likewise, if you define `_GNU_SOURCE', then defining either +-`_POSIX_SOURCE' or `_POSIX_C_SOURCE' or `_SVID_SOURCE' as well has no +-effect. +- +- Note, however, that the features of `_BSD_SOURCE' are not a subset of +-any of the other feature test macros supported. This is because it +-defines BSD features that take precedence over the POSIX features that +-are requested by the other macros. For this reason, defining +-`_BSD_SOURCE' in addition to the other feature test macros does have an +-effect: it causes the BSD features to take priority over the conflicting +-POSIX features. +- +- +-File: libc.info, Node: Roadmap to the Manual, Prev: Using the Library, Up: Introduction +- +-Roadmap to the Manual +-===================== +- +- Here is an overview of the contents of the remaining chapters of +-this manual. +- +- * *Note Error Reporting::, describes how errors detected by the +- library are reported. +- +- * *Note Language Features::, contains information about library +- support for standard parts of the C language, including things +- like the `sizeof' operator and the symbolic constant `NULL', how +- to write functions accepting variable numbers of arguments, and +- constants describing the ranges and other properties of the +- numerical types. There is also a simple debugging mechanism which +- allows you to put assertions in your code, and have diagnostic +- messages printed if the tests fail. +- +- * *Note Memory::, describes the GNU library's facilities for +- managing and using virtual and real memory, including dynamic +- allocation of virtual memory. If you do not know in advance how +- much memory your program needs, you can allocate it dynamically +- instead, and manipulate it via pointers. +- +- * *Note Character Handling::, contains information about character +- classification functions (such as `isspace') and functions for +- performing case conversion. +- +- * *Note String and Array Utilities::, has descriptions of functions +- for manipulating strings (null-terminated character arrays) and +- general byte arrays, including operations such as copying and +- comparison. +- +- * *Note I/O Overview::, gives an overall look at the input and output +- facilities in the library, and contains information about basic +- concepts such as file names. +- +- * *Note I/O on Streams::, describes I/O operations involving streams +- (or `FILE *' objects). These are the normal C library functions +- from `stdio.h'. +- +- * *Note Low-Level I/O::, contains information about I/O operations +- on file descriptors. File descriptors are a lower-level mechanism +- specific to the Unix family of operating systems. +- +- * *Note File System Interface::, has descriptions of operations on +- entire files, such as functions for deleting and renaming them and +- for creating new directories. This chapter also contains +- information about how you can access the attributes of a file, +- such as its owner and file protection modes. +- +- * *Note Pipes and FIFOs::, contains information about simple +- interprocess communication mechanisms. Pipes allow communication +- between two related processes (such as between a parent and +- child), while FIFOs allow communication between processes sharing +- a common file system on the same machine. +- +- * *Note Sockets::, describes a more complicated interprocess +- communication mechanism that allows processes running on different +- machines to communicate over a network. This chapter also +- contains information about Internet host addressing and how to use +- the system network databases. +- +- * *Note Low-Level Terminal Interface::, describes how you can change +- the attributes of a terminal device. If you want to disable echo +- of characters typed by the user, for example, read this chapter. +- +- * *Note Mathematics::, contains information about the math library +- functions. These include things like random-number generators and +- remainder functions on integers as well as the usual trigonometric +- and exponential functions on floating-point numbers. +- +- * *Note Low-Level Arithmetic Functions: Arithmetic, describes +- functions for simple arithmetic, analysis of floating-point +- values, and reading numbers from strings. +- +- * *Note Searching and Sorting::, contains information about functions +- for searching and sorting arrays. You can use these functions on +- any kind of array by providing an appropriate comparison function. +- +- * *Note Pattern Matching::, presents functions for matching regular +- expressions and shell file name patterns, and for expanding words +- as the shell does. +- +- * *Note Date and Time::, describes functions for measuring both +- calendar time and CPU time, as well as functions for setting +- alarms and timers. +- +- * *Note Character Set Handling::, contains information about +- manipulating characters and strings using character sets larger +- than will fit in the usual `char' data type. +- +- * *Note Locales::, describes how selecting a particular country or +- language affects the behavior of the library. For example, the +- locale affects collation sequences for strings and how monetary +- values are formatted. +- +- * *Note Non-Local Exits::, contains descriptions of the `setjmp' and +- `longjmp' functions. These functions provide a facility for +- `goto'-like jumps which can jump from one function to another. +- +- * *Note Signal Handling::, tells you all about signals--what they +- are, how to establish a handler that is called when a particular +- kind of signal is delivered, and how to prevent signals from +- arriving during critical sections of your program. +- +- * *Note Program Basics::, tells how your programs can access their +- command-line arguments and environment variables. +- +- * *Note Processes::, contains information about how to start new +- processes and run programs. +- +- * *Note Job Control::, describes functions for manipulating process +- groups and the controlling terminal. This material is probably +- only of interest if you are writing a shell or other program which +- handles job control specially. +- +- * *Note Name Service Switch::, describes the services which are +- available for looking up names in the system databases, how to +- determine which service is used for which database, and how these +- services are implemented so that contributors can design their own +- services. +- +- * *Note User Database::, and *Note Group Database::, tell you how to +- access the system user and group databases. +- +- * *Note System Management::, describes functions for controlling and +- getting information about the hardware and software configuration +- your program is executing under. +- +- * *Note System Configuration::, tells you how you can get +- information about various operating system limits. Most of these +- parameters are provided for compatibility with POSIX. +- +- * *Note Library Summary::, gives a summary of all the functions, +- variables, and macros in the library, with complete data types and +- function prototypes, and says what standard or system each is +- derived from. +- +- * *Note Maintenance::, explains how to build and install the GNU C +- library on your system, how to report any bugs you might find, and +- how to add new functions or port the library to a new system. +- +- If you already know the name of the facility you are interested in, +-you can look it up in *Note Library Summary::. This gives you a +-summary of its syntax and a pointer to where you can find a more +-detailed description. This appendix is particularly useful if you just +-want to verify the order and type of arguments to a function, for +-example. It also tells you what standard or system each function, +-variable, or macro is derived from. +- +- +-File: libc.info, Node: Error Reporting, Next: Memory, Prev: Introduction, Up: Top +- +-Error Reporting +-*************** +- +- Many functions in the GNU C library detect and report error +-conditions, and sometimes your programs need to check for these error +-conditions. For example, when you open an input file, you should +-verify that the file was actually opened correctly, and print an error +-message or take other appropriate action if the call to the library +-function failed. +- +- This chapter describes how the error reporting facility works. Your +-program should include the header file `errno.h' to use this facility. +- +-* Menu: +- +-* Checking for Errors:: How errors are reported by library functions. +-* Error Codes:: Error code macros; all of these expand +- into integer constant values. +-* Error Messages:: Mapping error codes onto error messages. +- +- +-File: libc.info, Node: Checking for Errors, Next: Error Codes, Up: Error Reporting +- +-Checking for Errors +-=================== +- +- Most library functions return a special value to indicate that they +-have failed. The special value is typically `-1', a null pointer, or a +-constant such as `EOF' that is defined for that purpose. But this +-return value tells you only that an error has occurred. To find out +-what kind of error it was, you need to look at the error code stored in +-the variable `errno'. This variable is declared in the header file +-`errno.h'. +- +- - Variable: volatile int errno +- The variable `errno' contains the system error number. You can +- change the value of `errno'. +- +- Since `errno' is declared `volatile', it might be changed +- asynchronously by a signal handler; see *Note Defining Handlers::. +- However, a properly written signal handler saves and restores the +- value of `errno', so you generally do not need to worry about this +- possibility except when writing signal handlers. +- +- The initial value of `errno' at program startup is zero. Many +- library functions are guaranteed to set it to certain nonzero +- values when they encounter certain kinds of errors. These error +- conditions are listed for each function. These functions do not +- change `errno' when they succeed; thus, the value of `errno' after +- a successful call is not necessarily zero, and you should not use +- `errno' to determine _whether_ a call failed. The proper way to +- do that is documented for each function. _If_ the call failed, +- you can examine `errno'. +- +- Many library functions can set `errno' to a nonzero value as a +- result of calling other library functions which might fail. You +- should assume that any library function might alter `errno' when +- the function returns an error. +- +- *Portability Note:* ISO C specifies `errno' as a "modifiable +- lvalue" rather than as a variable, permitting it to be implemented +- as a macro. For example, its expansion might involve a function +- call, like `*_errno ()'. In fact, that is what it is on the GNU +- system itself. The GNU library, on non-GNU systems, does whatever +- is right for the particular system. +- +- There are a few library functions, like `sqrt' and `atan', that +- return a perfectly legitimate value in case of an error, but also +- set `errno'. For these functions, if you want to check to see +- whether an error occurred, the recommended method is to set `errno' +- to zero before calling the function, and then check its value +- afterward. +- +- All the error codes have symbolic names; they are macros defined in +-`errno.h'. The names start with `E' and an upper-case letter or digit; +-you should consider names of this form to be reserved names. *Note +-Reserved Names::. +- +- The error code values are all positive integers and are all distinct, +-with one exception: `EWOULDBLOCK' and `EAGAIN' are the same. Since the +-values are distinct, you can use them as labels in a `switch' +-statement; just don't use both `EWOULDBLOCK' and `EAGAIN'. Your +-program should not make any other assumptions about the specific values +-of these symbolic constants. +- +- The value of `errno' doesn't necessarily have to correspond to any +-of these macros, since some library functions might return other error +-codes of their own for other situations. The only values that are +-guaranteed to be meaningful for a particular library function are the +-ones that this manual lists for that function. +- +- On non-GNU systems, almost any system call can return `EFAULT' if it +-is given an invalid pointer as an argument. Since this could only +-happen as a result of a bug in your program, and since it will not +-happen on the GNU system, we have saved space by not mentioning +-`EFAULT' in the descriptions of individual functions. +- +- In some Unix systems, many system calls can also return `EFAULT' if +-given as an argument a pointer into the stack, and the kernel for some +-obscure reason fails in its attempt to extend the stack. If this ever +-happens, you should probably try using statically or dynamically +-allocated memory instead of stack memory on that system. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-20 glibc-2.3.2-200304020432/manual/libc.info-20 +--- glibc-2.3.2/manual/libc.info-20 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-20 Thu Jan 1 01:00:00 1970 +@@ -1,1137 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Portable Positioning, Next: Stream Buffering, Prev: File Positioning, Up: I/O on Streams +- +-Portable File-Position Functions +-================================ +- +- On the GNU system, the file position is truly a character count. You +-can specify any character count value as an argument to `fseek' or +-`fseeko' and get reliable results for any random access file. However, +-some ISO C systems do not represent file positions in this way. +- +- On some systems where text streams truly differ from binary streams, +-it is impossible to represent the file position of a text stream as a +-count of characters from the beginning of the file. For example, the +-file position on some systems must encode both a record offset within +-the file, and a character offset within the record. +- +- As a consequence, if you want your programs to be portable to these +-systems, you must observe certain rules: +- +- * The value returned from `ftell' on a text stream has no predictable +- relationship to the number of characters you have read so far. +- The only thing you can rely on is that you can use it subsequently +- as the OFFSET argument to `fseek' or `fseeko' to move back to the +- same file position. +- +- * In a call to `fseek' or `fseeko' on a text stream, either the +- OFFSET must be zero, or WHENCE must be `SEEK_SET' and and the +- OFFSET must be the result of an earlier call to `ftell' on the +- same stream. +- +- * The value of the file position indicator of a text stream is +- undefined while there are characters that have been pushed back +- with `ungetc' that haven't been read or discarded. *Note +- Unreading::. +- +- But even if you observe these rules, you may still have trouble for +-long files, because `ftell' and `fseek' use a `long int' value to +-represent the file position. This type may not have room to encode all +-the file positions in a large file. Using the `ftello' and `fseeko' +-functions might help here since the `off_t' type is expected to be able +-to hold all file position values but this still does not help to handle +-additional information which must be associated with a file position. +- +- So if you do want to support systems with peculiar encodings for the +-file positions, it is better to use the functions `fgetpos' and +-`fsetpos' instead. These functions represent the file position using +-the data type `fpos_t', whose internal representation varies from +-system to system. +- +- These symbols are declared in the header file `stdio.h'. +- +- - Data Type: fpos_t +- This is the type of an object that can encode information about the +- file position of a stream, for use by the functions `fgetpos' and +- `fsetpos'. +- +- In the GNU system, `fpos_t' is an opaque data structure that +- contains internal data to represent file offset and conversion +- state information. In other systems, it might have a different +- internal representation. +- +- When compiling with `_FILE_OFFSET_BITS == 64' on a 32 bit machine +- this type is in fact equivalent to `fpos64_t' since the LFS +- interface transparently replaces the old interface. +- +- - Data Type: fpos64_t +- This is the type of an object that can encode information about the +- file position of a stream, for use by the functions `fgetpos64' and +- `fsetpos64'. +- +- In the GNU system, `fpos64_t' is an opaque data structure that +- contains internal data to represent file offset and conversion +- state information. In other systems, it might have a different +- internal representation. +- +- - Function: int fgetpos (FILE *STREAM, fpos_t *POSITION) +- This function stores the value of the file position indicator for +- the stream STREAM in the `fpos_t' object pointed to by POSITION. +- If successful, `fgetpos' returns zero; otherwise it returns a +- nonzero value and stores an implementation-defined positive value +- in `errno'. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a +- 32 bit system the function is in fact `fgetpos64'. I.e., the LFS +- interface transparently replaces the old interface. +- +- - Function: int fgetpos64 (FILE *STREAM, fpos64_t *POSITION) +- This function is similar to `fgetpos' but the file position is +- returned in a variable of type `fpos64_t' to which POSITION points. +- +- If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32 +- bits machine this function is available under the name `fgetpos' +- and so transparently replaces the old interface. +- +- - Function: int fsetpos (FILE *STREAM, const fpos_t *POSITION) +- This function sets the file position indicator for the stream +- STREAM to the position POSITION, which must have been set by a +- previous call to `fgetpos' on the same stream. If successful, +- `fsetpos' clears the end-of-file indicator on the stream, discards +- any characters that were "pushed back" by the use of `ungetc', and +- returns a value of zero. Otherwise, `fsetpos' returns a nonzero +- value and stores an implementation-defined positive value in +- `errno'. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a +- 32 bit system the function is in fact `fsetpos64'. I.e., the LFS +- interface transparently replaces the old interface. +- +- - Function: int fsetpos64 (FILE *STREAM, const fpos64_t *POSITION) +- This function is similar to `fsetpos' but the file position used +- for positioning is provided in a variable of type `fpos64_t' to +- which POSITION points. +- +- If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32 +- bits machine this function is available under the name `fsetpos' +- and so transparently replaces the old interface. +- +- +-File: libc.info, Node: Stream Buffering, Next: Other Kinds of Streams, Prev: Portable Positioning, Up: I/O on Streams +- +-Stream Buffering +-================ +- +- Characters that are written to a stream are normally accumulated and +-transmitted asynchronously to the file in a block, instead of appearing +-as soon as they are output by the application program. Similarly, +-streams often retrieve input from the host environment in blocks rather +-than on a character-by-character basis. This is called "buffering". +- +- If you are writing programs that do interactive input and output +-using streams, you need to understand how buffering works when you +-design the user interface to your program. Otherwise, you might find +-that output (such as progress or prompt messages) doesn't appear when +-you intended it to, or displays some other unexpected behavior. +- +- This section deals only with controlling when characters are +-transmitted between the stream and the file or device, and _not_ with +-how things like echoing, flow control, and the like are handled on +-specific classes of devices. For information on common control +-operations on terminal devices, see *Note Low-Level Terminal +-Interface::. +- +- You can bypass the stream buffering facilities altogether by using +-the low-level input and output functions that operate on file +-descriptors instead. *Note Low-Level I/O::. +- +-* Menu: +- +-* Buffering Concepts:: Terminology is defined here. +-* Flushing Buffers:: How to ensure that output buffers are flushed. +-* Controlling Buffering:: How to specify what kind of buffering to use. +- +- +-File: libc.info, Node: Buffering Concepts, Next: Flushing Buffers, Up: Stream Buffering +- +-Buffering Concepts +------------------- +- +- There are three different kinds of buffering strategies: +- +- * Characters written to or read from an "unbuffered" stream are +- transmitted individually to or from the file as soon as possible. +- +- * Characters written to a "line buffered" stream are transmitted to +- the file in blocks when a newline character is encountered. +- +- * Characters written to or read from a "fully buffered" stream are +- transmitted to or from the file in blocks of arbitrary size. +- +- Newly opened streams are normally fully buffered, with one +-exception: a stream connected to an interactive device such as a +-terminal is initially line buffered. *Note Controlling Buffering::, +-for information on how to select a different kind of buffering. +-Usually the automatic selection gives you the most convenient kind of +-buffering for the file or device you open. +- +- The use of line buffering for interactive devices implies that output +-messages ending in a newline will appear immediately--which is usually +-what you want. Output that doesn't end in a newline might or might not +-show up immediately, so if you want them to appear immediately, you +-should flush buffered output explicitly with `fflush', as described in +-*Note Flushing Buffers::. +- +- +-File: libc.info, Node: Flushing Buffers, Next: Controlling Buffering, Prev: Buffering Concepts, Up: Stream Buffering +- +-Flushing Buffers +----------------- +- +- "Flushing" output on a buffered stream means transmitting all +-accumulated characters to the file. There are many circumstances when +-buffered output on a stream is flushed automatically: +- +- * When you try to do output and the output buffer is full. +- +- * When the stream is closed. *Note Closing Streams::. +- +- * When the program terminates by calling `exit'. *Note Normal +- Termination::. +- +- * When a newline is written, if the stream is line buffered. +- +- * Whenever an input operation on _any_ stream actually reads data +- from its file. +- +- If you want to flush the buffered output at another time, call +-`fflush', which is declared in the header file `stdio.h'. +- +- - Function: int fflush (FILE *STREAM) +- This function causes any buffered output on STREAM to be delivered +- to the file. If STREAM is a null pointer, then `fflush' causes +- buffered output on _all_ open output streams to be flushed. +- +- This function returns `EOF' if a write error occurs, or zero +- otherwise. +- +- - Function: int fflush_unlocked (FILE *STREAM) +- The `fflush_unlocked' function is equivalent to the `fflush' +- function except that it does not implicitly lock the stream. +- +- The `fflush' function can be used to flush all streams currently +-opened. While this is useful in some situations it does often more than +-necessary since it might be done in situations when terminal input is +-required and the program wants to be sure that all output is visible on +-the terminal. But this means that only line buffered streams have to be +-flushed. Solaris introduced a function especially for this. It was +-always available in the GNU C library in some form but never officially +-exported. +- +- - Function: void _flushlbf (void) +- The `_flushlbf' function flushes all line buffered streams +- currently opened. +- +- This function is declared in the `stdio_ext.h' header. +- +- *Compatibility Note:* Some brain-damaged operating systems have been +-known to be so thoroughly fixated on line-oriented input and output +-that flushing a line buffered stream causes a newline to be written! +-Fortunately, this "feature" seems to be becoming less common. You do +-not need to worry about this in the GNU system. +- +- In some situations it might be useful to not flush the output pending +-for a stream but instead simply forget it. If transmission is costly +-and the output is not needed anymore this is valid reasoning. In this +-situation a non-standard function introduced in Solaris and available in +-the GNU C library can be used. +- +- - Function: void __fpurge (FILE *STREAM) +- The `__fpurge' function causes the buffer of the stream STREAM to +- be emptied. If the stream is currently in read mode all input in +- the buffer is lost. If the stream is in output mode the buffered +- output is not written to the device (or whatever other underlying +- storage) and the buffer the cleared. +- +- This function is declared in `stdio_ext.h'. +- +- +-File: libc.info, Node: Controlling Buffering, Prev: Flushing Buffers, Up: Stream Buffering +- +-Controlling Which Kind of Buffering +------------------------------------ +- +- After opening a stream (but before any other operations have been +-performed on it), you can explicitly specify what kind of buffering you +-want it to have using the `setvbuf' function. +- +- The facilities listed in this section are declared in the header +-file `stdio.h'. +- +- - Function: int setvbuf (FILE *STREAM, char *BUF, int MODE, size_t +- SIZE) +- This function is used to specify that the stream STREAM should +- have the buffering mode MODE, which can be either `_IOFBF' (for +- full buffering), `_IOLBF' (for line buffering), or `_IONBF' (for +- unbuffered input/output). +- +- If you specify a null pointer as the BUF argument, then `setvbuf' +- allocates a buffer itself using `malloc'. This buffer will be +- freed when you close the stream. +- +- Otherwise, BUF should be a character array that can hold at least +- SIZE characters. You should not free the space for this array as +- long as the stream remains open and this array remains its buffer. +- You should usually either allocate it statically, or `malloc' +- (*note Unconstrained Allocation::) the buffer. Using an automatic +- array is not a good idea unless you close the file before exiting +- the block that declares the array. +- +- While the array remains a stream buffer, the stream I/O functions +- will use the buffer for their internal purposes. You shouldn't +- try to access the values in the array directly while the stream is +- using it for buffering. +- +- The `setvbuf' function returns zero on success, or a nonzero value +- if the value of MODE is not valid or if the request could not be +- honored. +- +- - Macro: int _IOFBF +- The value of this macro is an integer constant expression that can +- be used as the MODE argument to the `setvbuf' function to specify +- that the stream should be fully buffered. +- +- - Macro: int _IOLBF +- The value of this macro is an integer constant expression that can +- be used as the MODE argument to the `setvbuf' function to specify +- that the stream should be line buffered. +- +- - Macro: int _IONBF +- The value of this macro is an integer constant expression that can +- be used as the MODE argument to the `setvbuf' function to specify +- that the stream should be unbuffered. +- +- - Macro: int BUFSIZ +- The value of this macro is an integer constant expression that is +- good to use for the SIZE argument to `setvbuf'. This value is +- guaranteed to be at least `256'. +- +- The value of `BUFSIZ' is chosen on each system so as to make stream +- I/O efficient. So it is a good idea to use `BUFSIZ' as the size +- for the buffer when you call `setvbuf'. +- +- Actually, you can get an even better value to use for the buffer +- size by means of the `fstat' system call: it is found in the +- `st_blksize' field of the file attributes. *Note Attribute +- Meanings::. +- +- Sometimes people also use `BUFSIZ' as the allocation size of +- buffers used for related purposes, such as strings used to receive +- a line of input with `fgets' (*note Character Input::). There is +- no particular reason to use `BUFSIZ' for this instead of any other +- integer, except that it might lead to doing I/O in chunks of an +- efficient size. +- +- - Function: void setbuf (FILE *STREAM, char *BUF) +- If BUF is a null pointer, the effect of this function is +- equivalent to calling `setvbuf' with a MODE argument of `_IONBF'. +- Otherwise, it is equivalent to calling `setvbuf' with BUF, and a +- MODE of `_IOFBF' and a SIZE argument of `BUFSIZ'. +- +- The `setbuf' function is provided for compatibility with old code; +- use `setvbuf' in all new programs. +- +- - Function: void setbuffer (FILE *STREAM, char *BUF, size_t SIZE) +- If BUF is a null pointer, this function makes STREAM unbuffered. +- Otherwise, it makes STREAM fully buffered using BUF as the buffer. +- The SIZE argument specifies the length of BUF. +- +- This function is provided for compatibility with old BSD code. Use +- `setvbuf' instead. +- +- - Function: void setlinebuf (FILE *STREAM) +- This function makes STREAM be line buffered, and allocates the +- buffer for you. +- +- This function is provided for compatibility with old BSD code. Use +- `setvbuf' instead. +- +- It is possible to query whether a given stream is line buffered or +-not using a non-standard function introduced in Solaris and available +-in the GNU C library. +- +- - Function: int __flbf (FILE *STREAM) +- The `__flbf' function will return a nonzero value in case the +- stream STREAM is line buffered. Otherwise the return value is +- zero. +- +- This function is declared in the `stdio_ext.h' header. +- +- Two more extensions allow to determine the size of the buffer and how +-much of it is used. These functions were also introduced in Solaris. +- +- - Function: size_t __fbufsize (FILE *STREAM) +- The `__fbufsize' function return the size of the buffer in the +- stream STREAM. This value can be used to optimize the use of the +- stream. +- +- This function is declared in the `stdio_ext.h' header. +- +- - Function: size_t __fpending (FILE *STREAM) The `__fpending' +- function returns the number of bytes currently in the output +- buffer. For wide-oriented stream the measuring unit is wide +- characters. This function should not be used on buffers in read +- mode or opened read-only. +- +- This function is declared in the `stdio_ext.h' header. +- +- +-File: libc.info, Node: Other Kinds of Streams, Next: Formatted Messages, Prev: Stream Buffering, Up: I/O on Streams +- +-Other Kinds of Streams +-====================== +- +- The GNU library provides ways for you to define additional kinds of +-streams that do not necessarily correspond to an open file. +- +- One such type of stream takes input from or writes output to a +-string. These kinds of streams are used internally to implement the +-`sprintf' and `sscanf' functions. You can also create such a stream +-explicitly, using the functions described in *Note String Streams::. +- +- More generally, you can define streams that do input/output to +-arbitrary objects using functions supplied by your program. This +-protocol is discussed in *Note Custom Streams::. +- +- *Portability Note:* The facilities described in this section are +-specific to GNU. Other systems or C implementations might or might not +-provide equivalent functionality. +- +-* Menu: +- +-* String Streams:: Streams that get data from or put data in +- a string or memory buffer. +-* Obstack Streams:: Streams that store data in an obstack. +-* Custom Streams:: Defining your own streams with an arbitrary +- input data source and/or output data sink. +- +- +-File: libc.info, Node: String Streams, Next: Obstack Streams, Up: Other Kinds of Streams +- +-String Streams +--------------- +- +- The `fmemopen' and `open_memstream' functions allow you to do I/O to +-a string or memory buffer. These facilities are declared in `stdio.h'. +- +- - Function: FILE * fmemopen (void *BUF, size_t SIZE, const char +- *OPENTYPE) +- This function opens a stream that allows the access specified by +- the OPENTYPE argument, that reads from or writes to the buffer +- specified by the argument BUF. This array must be at least SIZE +- bytes long. +- +- If you specify a null pointer as the BUF argument, `fmemopen' +- dynamically allocates an array SIZE bytes long (as with `malloc'; +- *note Unconstrained Allocation::). This is really only useful if +- you are going to write things to the buffer and then read them back +- in again, because you have no way of actually getting a pointer to +- the buffer (for this, try `open_memstream', below). The buffer is +- freed when the stream is closed. +- +- The argument OPENTYPE is the same as in `fopen' (*note Opening +- Streams::). If the OPENTYPE specifies append mode, then the +- initial file position is set to the first null character in the +- buffer. Otherwise the initial file position is at the beginning +- of the buffer. +- +- When a stream open for writing is flushed or closed, a null +- character (zero byte) is written at the end of the buffer if it +- fits. You should add an extra byte to the SIZE argument to +- account for this. Attempts to write more than SIZE bytes to the +- buffer result in an error. +- +- For a stream open for reading, null characters (zero bytes) in the +- buffer do not count as "end of file". Read operations indicate +- end of file only when the file position advances past SIZE bytes. +- So, if you want to read characters from a null-terminated string, +- you should supply the length of the string as the SIZE argument. +- +- Here is an example of using `fmemopen' to create a stream for +-reading from a string: +- +- #include +- +- static char buffer[] = "foobar"; +- +- int +- main (void) +- { +- int ch; +- FILE *stream; +- +- stream = fmemopen (buffer, strlen (buffer), "r"); +- while ((ch = fgetc (stream)) != EOF) +- printf ("Got %c\n", ch); +- fclose (stream); +- +- return 0; +- } +- +- This program produces the following output: +- +- Got f +- Got o +- Got o +- Got b +- Got a +- Got r +- +- - Function: FILE * open_memstream (char **PTR, size_t *SIZELOC) +- This function opens a stream for writing to a buffer. The buffer +- is allocated dynamically (as with `malloc'; *note Unconstrained +- Allocation::) and grown as necessary. +- +- When the stream is closed with `fclose' or flushed with `fflush', +- the locations PTR and SIZELOC are updated to contain the pointer +- to the buffer and its size. The values thus stored remain valid +- only as long as no further output on the stream takes place. If +- you do more output, you must flush the stream again to store new +- values before you use them again. +- +- A null character is written at the end of the buffer. This null +- character is _not_ included in the size value stored at SIZELOC. +- +- You can move the stream's file position with `fseek' or `fseeko' +- (*note File Positioning::). Moving the file position past the end +- of the data already written fills the intervening space with +- zeroes. +- +- Here is an example of using `open_memstream': +- +- #include +- +- int +- main (void) +- { +- char *bp; +- size_t size; +- FILE *stream; +- +- stream = open_memstream (&bp, &size); +- fprintf (stream, "hello"); +- fflush (stream); +- printf ("buf = `%s', size = %d\n", bp, size); +- fprintf (stream, ", world"); +- fclose (stream); +- printf ("buf = `%s', size = %d\n", bp, size); +- +- return 0; +- } +- +- This program produces the following output: +- +- buf = `hello', size = 5 +- buf = `hello, world', size = 12 +- +- +-File: libc.info, Node: Obstack Streams, Next: Custom Streams, Prev: String Streams, Up: Other Kinds of Streams +- +-Obstack Streams +---------------- +- +- You can open an output stream that puts it data in an obstack. +-*Note Obstacks::. +- +- - Function: FILE * open_obstack_stream (struct obstack *OBSTACK) +- This function opens a stream for writing data into the obstack +- OBSTACK. This starts an object in the obstack and makes it grow +- as data is written (*note Growing Objects::). +- +- Calling `fflush' on this stream updates the current size of the +- object to match the amount of data that has been written. After a +- call to `fflush', you can examine the object temporarily. +- +- You can move the file position of an obstack stream with `fseek' or +- `fseeko' (*note File Positioning::). Moving the file position past +- the end of the data written fills the intervening space with zeros. +- +- To make the object permanent, update the obstack with `fflush', and +- then use `obstack_finish' to finalize the object and get its +- address. The following write to the stream starts a new object in +- the obstack, and later writes add to that object until you do +- another `fflush' and `obstack_finish'. +- +- But how do you find out how long the object is? You can get the +- length in bytes by calling `obstack_object_size' (*note Status of +- an Obstack::), or you can null-terminate the object like this: +- +- obstack_1grow (OBSTACK, 0); +- +- Whichever one you do, you must do it _before_ calling +- `obstack_finish'. (You can do both if you wish.) +- +- Here is a sample function that uses `open_obstack_stream': +- +- char * +- make_message_string (const char *a, int b) +- { +- FILE *stream = open_obstack_stream (&message_obstack); +- output_task (stream); +- fprintf (stream, ": "); +- fprintf (stream, a, b); +- fprintf (stream, "\n"); +- fclose (stream); +- obstack_1grow (&message_obstack, 0); +- return obstack_finish (&message_obstack); +- } +- +- +-File: libc.info, Node: Custom Streams, Prev: Obstack Streams, Up: Other Kinds of Streams +- +-Programming Your Own Custom Streams +------------------------------------ +- +- This section describes how you can make a stream that gets input +-from an arbitrary data source or writes output to an arbitrary data sink +-programmed by you. We call these "custom streams". The functions and +-types described here are all GNU extensions. +- +-* Menu: +- +-* Streams and Cookies:: The "cookie" records where to fetch or +- store data that is read or written. +-* Hook Functions:: How you should define the four "hook +- functions" that a custom stream needs. +- +- +-File: libc.info, Node: Streams and Cookies, Next: Hook Functions, Up: Custom Streams +- +-Custom Streams and Cookies +-.......................... +- +- Inside every custom stream is a special object called the "cookie". +-This is an object supplied by you which records where to fetch or store +-the data read or written. It is up to you to define a data type to use +-for the cookie. The stream functions in the library never refer +-directly to its contents, and they don't even know what the type is; +-they record its address with type `void *'. +- +- To implement a custom stream, you must specify _how_ to fetch or +-store the data in the specified place. You do this by defining "hook +-functions" to read, write, change "file position", and close the +-stream. All four of these functions will be passed the stream's cookie +-so they can tell where to fetch or store the data. The library +-functions don't know what's inside the cookie, but your functions will +-know. +- +- When you create a custom stream, you must specify the cookie pointer, +-and also the four hook functions stored in a structure of type +-`cookie_io_functions_t'. +- +- These facilities are declared in `stdio.h'. +- +- - Data Type: cookie_io_functions_t +- This is a structure type that holds the functions that define the +- communications protocol between the stream and its cookie. It has +- the following members: +- +- `cookie_read_function_t *read' +- This is the function that reads data from the cookie. If the +- value is a null pointer instead of a function, then read +- operations on this stream always return `EOF'. +- +- `cookie_write_function_t *write' +- This is the function that writes data to the cookie. If the +- value is a null pointer instead of a function, then data +- written to the stream is discarded. +- +- `cookie_seek_function_t *seek' +- This is the function that performs the equivalent of file +- positioning on the cookie. If the value is a null pointer +- instead of a function, calls to `fseek' or `fseeko' on this +- stream can only seek to locations within the buffer; any +- attempt to seek outside the buffer will return an `ESPIPE' +- error. +- +- `cookie_close_function_t *close' +- This function performs any appropriate cleanup on the cookie +- when closing the stream. If the value is a null pointer +- instead of a function, nothing special is done to close the +- cookie when the stream is closed. +- +- - Function: FILE * fopencookie (void *COOKIE, const char *OPENTYPE, +- cookie_io_functions_t IO-FUNCTIONS) +- This function actually creates the stream for communicating with +- the COOKIE using the functions in the IO-FUNCTIONS argument. The +- OPENTYPE argument is interpreted as for `fopen'; see *Note Opening +- Streams::. (But note that the "truncate on open" option is +- ignored.) The new stream is fully buffered. +- +- The `fopencookie' function returns the newly created stream, or a +- null pointer in case of an error. +- +- +-File: libc.info, Node: Hook Functions, Prev: Streams and Cookies, Up: Custom Streams +- +-Custom Stream Hook Functions +-............................ +- +- Here are more details on how you should define the four hook +-functions that a custom stream needs. +- +- You should define the function to read data from the cookie as: +- +- ssize_t READER (void *COOKIE, char *BUFFER, size_t SIZE) +- +- This is very similar to the `read' function; see *Note I/O +-Primitives::. Your function should transfer up to SIZE bytes into the +-BUFFER, and return the number of bytes read, or zero to indicate +-end-of-file. You can return a value of `-1' to indicate an error. +- +- You should define the function to write data to the cookie as: +- +- ssize_t WRITER (void *COOKIE, const char *BUFFER, size_t SIZE) +- +- This is very similar to the `write' function; see *Note I/O +-Primitives::. Your function should transfer up to SIZE bytes from the +-buffer, and return the number of bytes written. You can return a value +-of `-1' to indicate an error. +- +- You should define the function to perform seek operations on the +-cookie as: +- +- int SEEKER (void *COOKIE, fpos_t *POSITION, int WHENCE) +- +- For this function, the POSITION and WHENCE arguments are interpreted +-as for `fgetpos'; see *Note Portable Positioning::. In the GNU +-library, `fpos_t' is equivalent to `off_t' or `long int', and simply +-represents the number of bytes from the beginning of the file. +- +- After doing the seek operation, your function should store the +-resulting file position relative to the beginning of the file in +-POSITION. Your function should return a value of `0' on success and +-`-1' to indicate an error. +- +- You should define the function to do cleanup operations on the cookie +-appropriate for closing the stream as: +- +- int CLEANER (void *COOKIE) +- +- Your function should return `-1' to indicate an error, and `0' +-otherwise. +- +- - Data Type: cookie_read_function +- This is the data type that the read function for a custom stream +- should have. If you declare the function as shown above, this is +- the type it will have. +- +- - Data Type: cookie_write_function +- The data type of the write function for a custom stream. +- +- - Data Type: cookie_seek_function +- The data type of the seek function for a custom stream. +- +- - Data Type: cookie_close_function +- The data type of the close function for a custom stream. +- +- +-File: libc.info, Node: Formatted Messages, Prev: Other Kinds of Streams, Up: I/O on Streams +- +-Formatted Messages +-================== +- +- On systems which are based on System V messages of programs +-(especially the system tools) are printed in a strict form using the +-`fmtmsg' function. The uniformity sometimes helps the user to +-interpret messages and the strictness tests of the `fmtmsg' function +-ensure that the programmer follows some minimal requirements. +- +-* Menu: +- +-* Printing Formatted Messages:: The `fmtmsg' function. +-* Adding Severity Classes:: Add more severity classes. +-* Example:: How to use `fmtmsg' and `addseverity'. +- +- +-File: libc.info, Node: Printing Formatted Messages, Next: Adding Severity Classes, Up: Formatted Messages +- +-Printing Formatted Messages +---------------------------- +- +- Messages can be printed to standard error and/or to the console. To +-select the destination the programmer can use the following two values, +-bitwise OR combined if wanted, for the CLASSIFICATION parameter of +-`fmtmsg': +- +-`MM_PRINT' +- Display the message in standard error. +- +-`MM_CONSOLE' +- Display the message on the system console. +- +- The erroneous piece of the system can be signalled by exactly one of +-the following values which also is bitwise ORed with the CLASSIFICATION +-parameter to `fmtmsg': +- +-`MM_HARD' +- The source of the condition is some hardware. +- +-`MM_SOFT' +- The source of the condition is some software. +- +-`MM_FIRM' +- The source of the condition is some firmware. +- +- A third component of the CLASSIFICATION parameter to `fmtmsg' can +-describe the part of the system which detects the problem. This is +-done by using exactly one of the following values: +- +-`MM_APPL' +- The erroneous condition is detected by the application. +- +-`MM_UTIL' +- The erroneous condition is detected by a utility. +- +-`MM_OPSYS' +- The erroneous condition is detected by the operating system. +- +- A last component of CLASSIFICATION can signal the results of this +-message. Exactly one of the following values can be used: +- +-`MM_RECOVER' +- It is a recoverable error. +- +-`MM_NRECOV' +- It is a non-recoverable error. +- +- - Function: int fmtmsg (long int CLASSIFICATION, const char *LABEL, +- int SEVERITY, const char *TEXT, const char *ACTION, const +- char *TAG) +- Display a message described by its parameters on the device(s) +- specified in the CLASSIFICATION parameter. The LABEL parameter +- identifies the source of the message. The string should consist +- of two colon separated parts where the first part has not more +- than 10 and the second part not more than 14 characters. The TEXT +- parameter describes the condition of the error, the ACTION +- parameter possible steps to recover from the error and the TAG +- parameter is a reference to the online documentation where more +- information can be found. It should contain the LABEL value and a +- unique identification number. +- +- Each of the parameters can be a special value which means this +- value is to be omitted. The symbolic names for these values are: +- +- `MM_NULLLBL' +- Ignore LABEL parameter. +- +- `MM_NULLSEV' +- Ignore SEVERITY parameter. +- +- `MM_NULLMC' +- Ignore CLASSIFICATION parameter. This implies that nothing is +- actually printed. +- +- `MM_NULLTXT' +- Ignore TEXT parameter. +- +- `MM_NULLACT' +- Ignore ACTION parameter. +- +- `MM_NULLTAG' +- Ignore TAG parameter. +- +- There is another way certain fields can be omitted from the output +- to standard error. This is described below in the description of +- environment variables influencing the behavior. +- +- The SEVERITY parameter can have one of the values in the following +- table: +- +- `MM_NOSEV' +- Nothing is printed, this value is the same as `MM_NULLSEV'. +- +- `MM_HALT' +- This value is printed as `HALT'. +- +- `MM_ERROR' +- This value is printed as `ERROR'. +- +- `MM_WARNING' +- This value is printed as `WARNING'. +- +- `MM_INFO' +- This value is printed as `INFO'. +- +- The numeric value of these five macros are between `0' and `4'. +- Using the environment variable `SEV_LEVEL' or using the +- `addseverity' function one can add more severity levels with their +- corresponding string to print. This is described below (*note +- Adding Severity Classes::). +- +- If no parameter is ignored the output looks like this: +- +- LABEL: SEVERITY-STRING: TEXT +- TO FIX: ACTION TAG +- +- The colons, new line characters and the `TO FIX' string are +- inserted if necessary, i.e., if the corresponding parameter is not +- ignored. +- +- This function is specified in the X/Open Portability Guide. It is +- also available on all systems derived from System V. +- +- The function returns the value `MM_OK' if no error occurred. If +- only the printing to standard error failed, it returns `MM_NOMSG'. +- If printing to the console fails, it returns `MM_NOCON'. If +- nothing is printed `MM_NOTOK' is returned. Among situations where +- all outputs fail this last value is also returned if a parameter +- value is incorrect. +- +- There are two environment variables which influence the behavior of +-`fmtmsg'. The first is `MSGVERB'. It is used to control the output +-actually happening on standard error (_not_ the console output). Each +-of the five fields can explicitly be enabled. To do this the user has +-to put the `MSGVERB' variable with a format like the following in the +-environment before calling the `fmtmsg' function the first time: +- +- MSGVERB=KEYWORD[:KEYWORD[:...]] +- +- Valid KEYWORDs are `label', `severity', `text', `action', and `tag'. +-If the environment variable is not given or is the empty string, a not +-supported keyword is given or the value is somehow else invalid, no +-part of the message is masked out. +- +- The second environment variable which influences the behavior of +-`fmtmsg' is `SEV_LEVEL'. This variable and the change in the behavior +-of `fmtmsg' is not specified in the X/Open Portability Guide. It is +-available in System V systems, though. It can be used to introduce new +-severity levels. By default, only the five severity levels described +-above are available. Any other numeric value would make `fmtmsg' print +-nothing. +- +- If the user puts `SEV_LEVEL' with a format like +- +- SEV_LEVEL=[DESCRIPTION[:DESCRIPTION[:...]]] +- +-in the environment of the process before the first call to `fmtmsg', +-where DESCRIPTION has a value of the form +- +- SEVERITY-KEYWORD,LEVEL,PRINTSTRING +- +- The SEVERITY-KEYWORD part is not used by `fmtmsg' but it has to be +-present. The LEVEL part is a string representation of a number. The +-numeric value must be a number greater than 4. This value must be used +-in the SEVERITY parameter of `fmtmsg' to select this class. It is not +-possible to overwrite any of the predefined classes. The PRINTSTRING +-is the string printed when a message of this class is processed by +-`fmtmsg' (see above, `fmtsmg' does not print the numeric value but +-instead the string representation). +- +- +-File: libc.info, Node: Adding Severity Classes, Next: Example, Prev: Printing Formatted Messages, Up: Formatted Messages +- +-Adding Severity Classes +------------------------ +- +- There is another possibility to introduce severity classes besides +-using the environment variable `SEV_LEVEL'. This simplifies the task of +-introducing new classes in a running program. One could use the +-`setenv' or `putenv' function to set the environment variable, but this +-is toilsome. +- +- - Function: int addseverity (int SEVERITY, const char *STRING) +- This function allows the introduction of new severity classes +- which can be addressed by the SEVERITY parameter of the `fmtmsg' +- function. The SEVERITY parameter of `addseverity' must match the +- value for the parameter with the same name of `fmtmsg', and STRING +- is the string printed in the actual messages instead of the numeric +- value. +- +- If STRING is `NULL' the severity class with the numeric value +- according to SEVERITY is removed. +- +- It is not possible to overwrite or remove one of the default +- severity classes. All calls to `addseverity' with SEVERITY set to +- one of the values for the default classes will fail. +- +- The return value is `MM_OK' if the task was successfully performed. +- If the return value is `MM_NOTOK' something went wrong. This could +- mean that no more memory is available or a class is not available +- when it has to be removed. +- +- This function is not specified in the X/Open Portability Guide +- although the `fmtsmg' function is. It is available on System V +- systems. +- +- +-File: libc.info, Node: Example, Prev: Adding Severity Classes, Up: Formatted Messages +- +-How to use `fmtmsg' and `addseverity' +-------------------------------------- +- +- Here is a simple example program to illustrate the use of the both +-functions described in this section. +- +- #include +- +- int +- main (void) +- { +- addseverity (5, "NOTE2"); +- fmtmsg (MM_PRINT, "only1field", MM_INFO, "text2", "action2", "tag2"); +- fmtmsg (MM_PRINT, "UX:cat", 5, "invalid syntax", "refer to manual", +- "UX:cat:001"); +- fmtmsg (MM_PRINT, "label:foo", 6, "text", "action", "tag"); +- return 0; +- } +- +- The second call to `fmtmsg' illustrates a use of this function as it +-usually occurs on System V systems, which heavily use this function. +-It seems worthwhile to give a short explanation here of how this system +-works on System V. The value of the LABEL field (`UX:cat') says that +-the error occurred in the Unix program `cat'. The explanation of the +-error follows and the value for the ACTION parameter is `"refer to +-manual"'. One could be more specific here, if necessary. The TAG +-field contains, as proposed above, the value of the string given for +-the LABEL parameter, and additionally a unique ID (`001' in this case). +-For a GNU environment this string could contain a reference to the +-corresponding node in the Info page for the program. +- +-Running this program without specifying the `MSGVERB' and `SEV_LEVEL' +-function produces the following output: +- +- UX:cat: NOTE2: invalid syntax +- TO FIX: refer to manual UX:cat:001 +- +- We see the different fields of the message and how the extra glue +-(the colons and the `TO FIX' string) are printed. But only one of the +-three calls to `fmtmsg' produced output. The first call does not print +-anything because the LABEL parameter is not in the correct form. The +-string must contain two fields, separated by a colon (*note Printing +-Formatted Messages::). The third `fmtmsg' call produced no output +-since the class with the numeric value `6' is not defined. Although a +-class with numeric value `5' is also not defined by default, the call +-to `addseverity' introduces it and the second call to `fmtmsg' produces +-the above output. +- +- When we change the environment of the program to contain +-`SEV_LEVEL=XXX,6,NOTE' when running it we get a different result: +- +- UX:cat: NOTE2: invalid syntax +- TO FIX: refer to manual UX:cat:001 +- label:foo: NOTE: text +- TO FIX: action tag +- +- Now the third call to `fmtmsg' produced some output and we see how +-the string `NOTE' from the environment variable appears in the message. +- +- Now we can reduce the output by specifying which fields we are +-interested in. If we additionally set the environment variable +-`MSGVERB' to the value `severity:label:action' we get the following +-output: +- +- UX:cat: NOTE2 +- TO FIX: refer to manual +- label:foo: NOTE +- TO FIX: action +- +-I.e., the output produced by the TEXT and the TAG parameters to +-`fmtmsg' vanished. Please also note that now there is no colon after +-the `NOTE' and `NOTE2' strings in the output. This is not necessary +-since there is no more output on this line because the text is missing. +- +- +-File: libc.info, Node: Low-Level I/O, Next: File System Interface, Prev: I/O on Streams, Up: Top +- +-Low-Level Input/Output +-********************** +- +- This chapter describes functions for performing low-level +-input/output operations on file descriptors. These functions include +-the primitives for the higher-level I/O functions described in *Note +-I/O on Streams::, as well as functions for performing low-level control +-operations for which there are no equivalents on streams. +- +- Stream-level I/O is more flexible and usually more convenient; +-therefore, programmers generally use the descriptor-level functions only +-when necessary. These are some of the usual reasons: +- +- * For reading binary files in large chunks. +- +- * For reading an entire file into core before parsing it. +- +- * To perform operations other than data transfer, which can only be +- done with a descriptor. (You can use `fileno' to get the +- descriptor corresponding to a stream.) +- +- * To pass descriptors to a child process. (The child can create its +- own stream to use a descriptor that it inherits, but cannot +- inherit a stream directly.) +- +-* Menu: +- +-* Opening and Closing Files:: How to open and close file +- descriptors. +-* I/O Primitives:: Reading and writing data. +-* File Position Primitive:: Setting a descriptor's file +- position. +-* Descriptors and Streams:: Converting descriptor to stream +- or vice-versa. +-* Stream/Descriptor Precautions:: Precautions needed if you use both +- descriptors and streams. +-* Scatter-Gather:: Fast I/O to discontinuous buffers. +-* Memory-mapped I/O:: Using files like memory. +-* Waiting for I/O:: How to check for input or output +- on multiple file descriptors. +-* Synchronizing I/O:: Making sure all I/O actions completed. +-* Asynchronous I/O:: Perform I/O in parallel. +-* Control Operations:: Various other operations on file +- descriptors. +-* Duplicating Descriptors:: Fcntl commands for duplicating +- file descriptors. +-* Descriptor Flags:: Fcntl commands for manipulating +- flags associated with file +- descriptors. +-* File Status Flags:: Fcntl commands for manipulating +- flags associated with open files. +-* File Locks:: Fcntl commands for implementing +- file locking. +-* Interrupt Input:: Getting an asynchronous signal when +- input arrives. +-* IOCTLs:: Generic I/O Control operations. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-21 glibc-2.3.2-200304020432/manual/libc.info-21 +--- glibc-2.3.2/manual/libc.info-21 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-21 Thu Jan 1 01:00:00 1970 +@@ -1,962 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Opening and Closing Files, Next: I/O Primitives, Up: Low-Level I/O +- +-Opening and Closing Files +-========================= +- +- This section describes the primitives for opening and closing files +-using file descriptors. The `open' and `creat' functions are declared +-in the header file `fcntl.h', while `close' is declared in `unistd.h'. +- +- - Function: int open (const char *FILENAME, int FLAGS[, mode_t MODE]) +- The `open' function creates and returns a new file descriptor for +- the file named by FILENAME. Initially, the file position +- indicator for the file is at the beginning of the file. The +- argument MODE is used only when a file is created, but it doesn't +- hurt to supply the argument in any case. +- +- The FLAGS argument controls how the file is to be opened. This is +- a bit mask; you create the value by the bitwise OR of the +- appropriate parameters (using the `|' operator in C). *Note File +- Status Flags::, for the parameters available. +- +- The normal return value from `open' is a non-negative integer file +- descriptor. In the case of an error, a value of -1 is returned +- instead. In addition to the usual file name errors (*note File +- Name Errors::), the following `errno' error conditions are defined +- for this function: +- +- `EACCES' +- The file exists but is not readable/writable as requested by +- the FLAGS argument, the file does not exist and the directory +- is unwritable so it cannot be created. +- +- `EEXIST' +- Both `O_CREAT' and `O_EXCL' are set, and the named file +- already exists. +- +- `EINTR' +- The `open' operation was interrupted by a signal. *Note +- Interrupted Primitives::. +- +- `EISDIR' +- The FLAGS argument specified write access, and the file is a +- directory. +- +- `EMFILE' +- The process has too many files open. The maximum number of +- file descriptors is controlled by the `RLIMIT_NOFILE' +- resource limit; *note Limits on Resources::. +- +- `ENFILE' +- The entire system, or perhaps the file system which contains +- the directory, cannot support any additional open files at +- the moment. (This problem cannot happen on the GNU system.) +- +- `ENOENT' +- The named file does not exist, and `O_CREAT' is not specified. +- +- `ENOSPC' +- The directory or file system that would contain the new file +- cannot be extended, because there is no disk space left. +- +- `ENXIO' +- `O_NONBLOCK' and `O_WRONLY' are both set in the FLAGS +- argument, the file named by FILENAME is a FIFO (*note Pipes +- and FIFOs::), and no process has the file open for reading. +- +- `EROFS' +- The file resides on a read-only file system and any of +- `O_WRONLY', `O_RDWR', and `O_TRUNC' are set in the FLAGS +- argument, or `O_CREAT' is set and the file does not already +- exist. +- +- If on a 32 bit machine the sources are translated with +- `_FILE_OFFSET_BITS == 64' the function `open' returns a file +- descriptor opened in the large file mode which enables the file +- handling functions to use files up to 2^63 bytes in size and +- offset from -2^63 to 2^63. This happens transparently for the user +- since all of the lowlevel file handling functions are equally +- replaced. +- +- This function is a cancellation point in multi-threaded programs. +- This is a problem if the thread allocates some resources (like +- memory, file descriptors, semaphores or whatever) at the time +- `open' is called. If the thread gets canceled these resources +- stay allocated until the program ends. To avoid this calls to +- `open' should be protected using cancellation handlers. +- +- The `open' function is the underlying primitive for the `fopen' +- and `freopen' functions, that create streams. +- +- - Function: int open64 (const char *FILENAME, int FLAGS[, mode_t MODE]) +- This function is similar to `open'. It returns a file descriptor +- which can be used to access the file named by FILENAME. The only +- difference is that on 32 bit systems the file is opened in the +- large file mode. I.e., file length and file offsets can exceed 31 +- bits. +- +- When the sources are translated with `_FILE_OFFSET_BITS == 64' this +- function is actually available under the name `open'. I.e., the +- new, extended API using 64 bit file sizes and offsets transparently +- replaces the old API. +- +- - Obsolete function: int creat (const char *FILENAME, mode_t MODE) +- This function is obsolete. The call: +- +- creat (FILENAME, MODE) +- +- is equivalent to: +- +- open (FILENAME, O_WRONLY | O_CREAT | O_TRUNC, MODE) +- +- If on a 32 bit machine the sources are translated with +- `_FILE_OFFSET_BITS == 64' the function `creat' returns a file +- descriptor opened in the large file mode which enables the file +- handling functions to use files up to 2^63 in size and offset from +- -2^63 to 2^63. This happens transparently for the user since all +- of the lowlevel file handling functions are equally replaced. +- +- - Obsolete function: int creat64 (const char *FILENAME, mode_t MODE) +- This function is similar to `creat'. It returns a file descriptor +- which can be used to access the file named by FILENAME. The only +- the difference is that on 32 bit systems the file is opened in the +- large file mode. I.e., file length and file offsets can exceed 31 +- bits. +- +- To use this file descriptor one must not use the normal operations +- but instead the counterparts named `*64', e.g., `read64'. +- +- When the sources are translated with `_FILE_OFFSET_BITS == 64' this +- function is actually available under the name `open'. I.e., the +- new, extended API using 64 bit file sizes and offsets transparently +- replaces the old API. +- +- - Function: int close (int FILEDES) +- The function `close' closes the file descriptor FILEDES. Closing +- a file has the following consequences: +- +- * The file descriptor is deallocated. +- +- * Any record locks owned by the process on the file are +- unlocked. +- +- * When all file descriptors associated with a pipe or FIFO have +- been closed, any unread data is discarded. +- +- This function is a cancellation point in multi-threaded programs. +- This is a problem if the thread allocates some resources (like +- memory, file descriptors, semaphores or whatever) at the time +- `close' is called. If the thread gets canceled these resources +- stay allocated until the program ends. To avoid this, calls to +- `close' should be protected using cancellation handlers. +- +- The normal return value from `close' is 0; a value of -1 is +- returned in case of failure. The following `errno' error +- conditions are defined for this function: +- +- `EBADF' +- The FILEDES argument is not a valid file descriptor. +- +- `EINTR' +- The `close' call was interrupted by a signal. *Note +- Interrupted Primitives::. Here is an example of how to +- handle `EINTR' properly: +- +- TEMP_FAILURE_RETRY (close (desc)); +- +- `ENOSPC' +- `EIO' +- `EDQUOT' +- When the file is accessed by NFS, these errors from `write' +- can sometimes not be detected until `close'. *Note I/O +- Primitives::, for details on their meaning. +- +- Please note that there is _no_ separate `close64' function. This +- is not necessary since this function does not determine nor depend +- on the mode of the file. The kernel which performs the `close' +- operation knows which mode the descriptor is used for and can +- handle this situation. +- +- To close a stream, call `fclose' (*note Closing Streams::) instead +-of trying to close its underlying file descriptor with `close'. This +-flushes any buffered output and updates the stream object to indicate +-that it is closed. +- +- +-File: libc.info, Node: I/O Primitives, Next: File Position Primitive, Prev: Opening and Closing Files, Up: Low-Level I/O +- +-Input and Output Primitives +-=========================== +- +- This section describes the functions for performing primitive input +-and output operations on file descriptors: `read', `write', and +-`lseek'. These functions are declared in the header file `unistd.h'. +- +- - Data Type: ssize_t +- This data type is used to represent the sizes of blocks that can be +- read or written in a single operation. It is similar to `size_t', +- but must be a signed type. +- +- - Function: ssize_t read (int FILEDES, void *BUFFER, size_t SIZE) +- The `read' function reads up to SIZE bytes from the file with +- descriptor FILEDES, storing the results in the BUFFER. (This is +- not necessarily a character string, and no terminating null +- character is added.) +- +- The return value is the number of bytes actually read. This might +- be less than SIZE; for example, if there aren't that many bytes +- left in the file or if there aren't that many bytes immediately +- available. The exact behavior depends on what kind of file it is. +- Note that reading less than SIZE bytes is not an error. +- +- A value of zero indicates end-of-file (except if the value of the +- SIZE argument is also zero). This is not considered an error. If +- you keep calling `read' while at end-of-file, it will keep +- returning zero and doing nothing else. +- +- If `read' returns at least one character, there is no way you can +- tell whether end-of-file was reached. But if you did reach the +- end, the next read will return zero. +- +- In case of an error, `read' returns -1. The following `errno' +- error conditions are defined for this function: +- +- `EAGAIN' +- Normally, when no input is immediately available, `read' +- waits for some input. But if the `O_NONBLOCK' flag is set +- for the file (*note File Status Flags::), `read' returns +- immediately without reading any data, and reports this error. +- +- *Compatibility Note:* Most versions of BSD Unix use a +- different error code for this: `EWOULDBLOCK'. In the GNU +- library, `EWOULDBLOCK' is an alias for `EAGAIN', so it +- doesn't matter which name you use. +- +- On some systems, reading a large amount of data from a +- character special file can also fail with `EAGAIN' if the +- kernel cannot find enough physical memory to lock down the +- user's pages. This is limited to devices that transfer with +- direct memory access into the user's memory, which means it +- does not include terminals, since they always use separate +- buffers inside the kernel. This problem never happens in the +- GNU system. +- +- Any condition that could result in `EAGAIN' can instead +- result in a successful `read' which returns fewer bytes than +- requested. Calling `read' again immediately would result in +- `EAGAIN'. +- +- `EBADF' +- The FILEDES argument is not a valid file descriptor, or is +- not open for reading. +- +- `EINTR' +- `read' was interrupted by a signal while it was waiting for +- input. *Note Interrupted Primitives::. A signal will not +- necessary cause `read' to return `EINTR'; it may instead +- result in a successful `read' which returns fewer bytes than +- requested. +- +- `EIO' +- For many devices, and for disk files, this error code +- indicates a hardware error. +- +- `EIO' also occurs when a background process tries to read +- from the controlling terminal, and the normal action of +- stopping the process by sending it a `SIGTTIN' signal isn't +- working. This might happen if the signal is being blocked or +- ignored, or because the process group is orphaned. *Note Job +- Control::, for more information about job control, and *Note +- Signal Handling::, for information about signals. +- +- Please note that there is no function named `read64'. This is not +- necessary since this function does not directly modify or handle +- the possibly wide file offset. Since the kernel handles this state +- internally, the `read' function can be used for all cases. +- +- This function is a cancellation point in multi-threaded programs. +- This is a problem if the thread allocates some resources (like +- memory, file descriptors, semaphores or whatever) at the time +- `read' is called. If the thread gets canceled these resources +- stay allocated until the program ends. To avoid this, calls to +- `read' should be protected using cancellation handlers. +- +- The `read' function is the underlying primitive for all of the +- functions that read from streams, such as `fgetc'. +- +- - Function: ssize_t pread (int FILEDES, void *BUFFER, size_t SIZE, +- off_t OFFSET) +- The `pread' function is similar to the `read' function. The first +- three arguments are identical, and the return values and error +- codes also correspond. +- +- The difference is the fourth argument and its handling. The data +- block is not read from the current position of the file descriptor +- `filedes'. Instead the data is read from the file starting at +- position OFFSET. The position of the file descriptor itself is +- not affected by the operation. The value is the same as before +- the call. +- +- When the source file is compiled with `_FILE_OFFSET_BITS == 64' the +- `pread' function is in fact `pread64' and the type `off_t' has 64 +- bits, which makes it possible to handle files up to 2^63 bytes in +- length. +- +- The return value of `pread' describes the number of bytes read. +- In the error case it returns -1 like `read' does and the error +- codes are also the same, with these additions: +- +- `EINVAL' +- The value given for OFFSET is negative and therefore illegal. +- +- `ESPIPE' +- The file descriptor FILEDES is associate with a pipe or a +- FIFO and this device does not allow positioning of the file +- pointer. +- +- The function is an extension defined in the Unix Single +- Specification version 2. +- +- - Function: ssize_t pread64 (int FILEDES, void *BUFFER, size_t SIZE, +- off64_t OFFSET) +- This function is similar to the `pread' function. The difference +- is that the OFFSET parameter is of type `off64_t' instead of +- `off_t' which makes it possible on 32 bit machines to address +- files larger than 2^31 bytes and up to 2^63 bytes. The file +- descriptor `filedes' must be opened using `open64' since otherwise +- the large offsets possible with `off64_t' will lead to errors with +- a descriptor in small file mode. +- +- When the source file is compiled with `_FILE_OFFSET_BITS == 64' on +- a 32 bit machine this function is actually available under the name +- `pread' and so transparently replaces the 32 bit interface. +- +- - Function: ssize_t write (int FILEDES, const void *BUFFER, size_t +- SIZE) +- The `write' function writes up to SIZE bytes from BUFFER to the +- file with descriptor FILEDES. The data in BUFFER is not +- necessarily a character string and a null character is output like +- any other character. +- +- The return value is the number of bytes actually written. This +- may be SIZE, but can always be smaller. Your program should +- always call `write' in a loop, iterating until all the data is +- written. +- +- Once `write' returns, the data is enqueued to be written and can be +- read back right away, but it is not necessarily written out to +- permanent storage immediately. You can use `fsync' when you need +- to be sure your data has been permanently stored before +- continuing. (It is more efficient for the system to batch up +- consecutive writes and do them all at once when convenient. +- Normally they will always be written to disk within a minute or +- less.) Modern systems provide another function `fdatasync' which +- guarantees integrity only for the file data and is therefore +- faster. You can use the `O_FSYNC' open mode to make `write' always +- store the data to disk before returning; *note Operating Modes::. +- +- In the case of an error, `write' returns -1. The following +- `errno' error conditions are defined for this function: +- +- `EAGAIN' +- Normally, `write' blocks until the write operation is +- complete. But if the `O_NONBLOCK' flag is set for the file +- (*note Control Operations::), it returns immediately without +- writing any data and reports this error. An example of a +- situation that might cause the process to block on output is +- writing to a terminal device that supports flow control, +- where output has been suspended by receipt of a STOP +- character. +- +- *Compatibility Note:* Most versions of BSD Unix use a +- different error code for this: `EWOULDBLOCK'. In the GNU +- library, `EWOULDBLOCK' is an alias for `EAGAIN', so it +- doesn't matter which name you use. +- +- On some systems, writing a large amount of data from a +- character special file can also fail with `EAGAIN' if the +- kernel cannot find enough physical memory to lock down the +- user's pages. This is limited to devices that transfer with +- direct memory access into the user's memory, which means it +- does not include terminals, since they always use separate +- buffers inside the kernel. This problem does not arise in the +- GNU system. +- +- `EBADF' +- The FILEDES argument is not a valid file descriptor, or is +- not open for writing. +- +- `EFBIG' +- The size of the file would become larger than the +- implementation can support. +- +- `EINTR' +- The `write' operation was interrupted by a signal while it was +- blocked waiting for completion. A signal will not +- necessarily cause `write' to return `EINTR'; it may instead +- result in a successful `write' which writes fewer bytes than +- requested. *Note Interrupted Primitives::. +- +- `EIO' +- For many devices, and for disk files, this error code +- indicates a hardware error. +- +- `ENOSPC' +- The device containing the file is full. +- +- `EPIPE' +- This error is returned when you try to write to a pipe or +- FIFO that isn't open for reading by any process. When this +- happens, a `SIGPIPE' signal is also sent to the process; see +- *Note Signal Handling::. +- +- Unless you have arranged to prevent `EINTR' failures, you should +- check `errno' after each failing call to `write', and if the error +- was `EINTR', you should simply repeat the call. *Note Interrupted +- Primitives::. The easy way to do this is with the macro +- `TEMP_FAILURE_RETRY', as follows: +- +- nbytes = TEMP_FAILURE_RETRY (write (desc, buffer, count)); +- +- Please note that there is no function named `write64'. This is not +- necessary since this function does not directly modify or handle +- the possibly wide file offset. Since the kernel handles this state +- internally the `write' function can be used for all cases. +- +- This function is a cancellation point in multi-threaded programs. +- This is a problem if the thread allocates some resources (like +- memory, file descriptors, semaphores or whatever) at the time +- `write' is called. If the thread gets canceled these resources +- stay allocated until the program ends. To avoid this, calls to +- `write' should be protected using cancellation handlers. +- +- The `write' function is the underlying primitive for all of the +- functions that write to streams, such as `fputc'. +- +- - Function: ssize_t pwrite (int FILEDES, const void *BUFFER, size_t +- SIZE, off_t OFFSET) +- The `pwrite' function is similar to the `write' function. The +- first three arguments are identical, and the return values and +- error codes also correspond. +- +- The difference is the fourth argument and its handling. The data +- block is not written to the current position of the file descriptor +- `filedes'. Instead the data is written to the file starting at +- position OFFSET. The position of the file descriptor itself is +- not affected by the operation. The value is the same as before +- the call. +- +- When the source file is compiled with `_FILE_OFFSET_BITS == 64' the +- `pwrite' function is in fact `pwrite64' and the type `off_t' has +- 64 bits, which makes it possible to handle files up to 2^63 bytes +- in length. +- +- The return value of `pwrite' describes the number of written bytes. +- In the error case it returns -1 like `write' does and the error +- codes are also the same, with these additions: +- +- `EINVAL' +- The value given for OFFSET is negative and therefore illegal. +- +- `ESPIPE' +- The file descriptor FILEDES is associated with a pipe or a +- FIFO and this device does not allow positioning of the file +- pointer. +- +- The function is an extension defined in the Unix Single +- Specification version 2. +- +- - Function: ssize_t pwrite64 (int FILEDES, const void *BUFFER, size_t +- SIZE, off64_t OFFSET) +- This function is similar to the `pwrite' function. The difference +- is that the OFFSET parameter is of type `off64_t' instead of +- `off_t' which makes it possible on 32 bit machines to address +- files larger than 2^31 bytes and up to 2^63 bytes. The file +- descriptor `filedes' must be opened using `open64' since otherwise +- the large offsets possible with `off64_t' will lead to errors with +- a descriptor in small file mode. +- +- When the source file is compiled using `_FILE_OFFSET_BITS == 64' +- on a 32 bit machine this function is actually available under the +- name `pwrite' and so transparently replaces the 32 bit interface. +- +- +-File: libc.info, Node: File Position Primitive, Next: Descriptors and Streams, Prev: I/O Primitives, Up: Low-Level I/O +- +-Setting the File Position of a Descriptor +-========================================= +- +- Just as you can set the file position of a stream with `fseek', you +-can set the file position of a descriptor with `lseek'. This specifies +-the position in the file for the next `read' or `write' operation. +-*Note File Positioning::, for more information on the file position and +-what it means. +- +- To read the current file position value from a descriptor, use +-`lseek (DESC, 0, SEEK_CUR)'. +- +- - Function: off_t lseek (int FILEDES, off_t OFFSET, int WHENCE) +- The `lseek' function is used to change the file position of the +- file with descriptor FILEDES. +- +- The WHENCE argument specifies how the OFFSET should be +- interpreted, in the same way as for the `fseek' function, and it +- must be one of the symbolic constants `SEEK_SET', `SEEK_CUR', or +- `SEEK_END'. +- +- `SEEK_SET' +- Specifies that WHENCE is a count of characters from the +- beginning of the file. +- +- `SEEK_CUR' +- Specifies that WHENCE is a count of characters from the +- current file position. This count may be positive or +- negative. +- +- `SEEK_END' +- Specifies that WHENCE is a count of characters from the end of +- the file. A negative count specifies a position within the +- current extent of the file; a positive count specifies a +- position past the current end. If you set the position past +- the current end, and actually write data, you will extend the +- file with zeros up to that position. +- +- The return value from `lseek' is normally the resulting file +- position, measured in bytes from the beginning of the file. You +- can use this feature together with `SEEK_CUR' to read the current +- file position. +- +- If you want to append to the file, setting the file position to the +- current end of file with `SEEK_END' is not sufficient. Another +- process may write more data after you seek but before you write, +- extending the file so the position you write onto clobbers their +- data. Instead, use the `O_APPEND' operating mode; *note Operating +- Modes::. +- +- You can set the file position past the current end of the file. +- This does not by itself make the file longer; `lseek' never +- changes the file. But subsequent output at that position will +- extend the file. Characters between the previous end of file and +- the new position are filled with zeros. Extending the file in +- this way can create a "hole": the blocks of zeros are not actually +- allocated on disk, so the file takes up less space than it appears +- to; it is then called a "sparse file". +- +- If the file position cannot be changed, or the operation is in +- some way invalid, `lseek' returns a value of -1. The following +- `errno' error conditions are defined for this function: +- +- `EBADF' +- The FILEDES is not a valid file descriptor. +- +- `EINVAL' +- The WHENCE argument value is not valid, or the resulting file +- offset is not valid. A file offset is invalid. +- +- `ESPIPE' +- The FILEDES corresponds to an object that cannot be +- positioned, such as a pipe, FIFO or terminal device. +- (POSIX.1 specifies this error only for pipes and FIFOs, but +- in the GNU system, you always get `ESPIPE' if the object is +- not seekable.) +- +- When the source file is compiled with `_FILE_OFFSET_BITS == 64' the +- `lseek' function is in fact `lseek64' and the type `off_t' has 64 +- bits which makes it possible to handle files up to 2^63 bytes in +- length. +- +- This function is a cancellation point in multi-threaded programs. +- This is a problem if the thread allocates some resources (like +- memory, file descriptors, semaphores or whatever) at the time +- `lseek' is called. If the thread gets canceled these resources +- stay allocated until the program ends. To avoid this calls to +- `lseek' should be protected using cancellation handlers. +- +- The `lseek' function is the underlying primitive for the `fseek', +- `fseeko', `ftell', `ftello' and `rewind' functions, which operate +- on streams instead of file descriptors. +- +- - Function: off64_t lseek64 (int FILEDES, off64_t OFFSET, int WHENCE) +- This function is similar to the `lseek' function. The difference +- is that the OFFSET parameter is of type `off64_t' instead of +- `off_t' which makes it possible on 32 bit machines to address +- files larger than 2^31 bytes and up to 2^63 bytes. The file +- descriptor `filedes' must be opened using `open64' since otherwise +- the large offsets possible with `off64_t' will lead to errors with +- a descriptor in small file mode. +- +- When the source file is compiled with `_FILE_OFFSET_BITS == 64' on +- a 32 bits machine this function is actually available under the +- name `lseek' and so transparently replaces the 32 bit interface. +- +- You can have multiple descriptors for the same file if you open the +-file more than once, or if you duplicate a descriptor with `dup'. +-Descriptors that come from separate calls to `open' have independent +-file positions; using `lseek' on one descriptor has no effect on the +-other. For example, +- +- { +- int d1, d2; +- char buf[4]; +- d1 = open ("foo", O_RDONLY); +- d2 = open ("foo", O_RDONLY); +- lseek (d1, 1024, SEEK_SET); +- read (d2, buf, 4); +- } +- +-will read the first four characters of the file `foo'. (The +-error-checking code necessary for a real program has been omitted here +-for brevity.) +- +- By contrast, descriptors made by duplication share a common file +-position with the original descriptor that was duplicated. Anything +-which alters the file position of one of the duplicates, including +-reading or writing data, affects all of them alike. Thus, for example, +- +- { +- int d1, d2, d3; +- char buf1[4], buf2[4]; +- d1 = open ("foo", O_RDONLY); +- d2 = dup (d1); +- d3 = dup (d2); +- lseek (d3, 1024, SEEK_SET); +- read (d1, buf1, 4); +- read (d2, buf2, 4); +- } +- +-will read four characters starting with the 1024'th character of `foo', +-and then four more characters starting with the 1028'th character. +- +- - Data Type: off_t +- This is an arithmetic data type used to represent file sizes. In +- the GNU system, this is equivalent to `fpos_t' or `long int'. +- +- If the source is compiled with `_FILE_OFFSET_BITS == 64' this type +- is transparently replaced by `off64_t'. +- +- - Data Type: off64_t +- This type is used similar to `off_t'. The difference is that even +- on 32 bit machines, where the `off_t' type would have 32 bits, +- `off64_t' has 64 bits and so is able to address files up to 2^63 +- bytes in length. +- +- When compiling with `_FILE_OFFSET_BITS == 64' this type is +- available under the name `off_t'. +- +- These aliases for the `SEEK_...' constants exist for the sake of +-compatibility with older BSD systems. They are defined in two +-different header files: `fcntl.h' and `sys/file.h'. +- +-`L_SET' +- An alias for `SEEK_SET'. +- +-`L_INCR' +- An alias for `SEEK_CUR'. +- +-`L_XTND' +- An alias for `SEEK_END'. +- +- +-File: libc.info, Node: Descriptors and Streams, Next: Stream/Descriptor Precautions, Prev: File Position Primitive, Up: Low-Level I/O +- +-Descriptors and Streams +-======================= +- +- Given an open file descriptor, you can create a stream for it with +-the `fdopen' function. You can get the underlying file descriptor for +-an existing stream with the `fileno' function. These functions are +-declared in the header file `stdio.h'. +- +- - Function: FILE * fdopen (int FILEDES, const char *OPENTYPE) +- The `fdopen' function returns a new stream for the file descriptor +- FILEDES. +- +- The OPENTYPE argument is interpreted in the same way as for the +- `fopen' function (*note Opening Streams::), except that the `b' +- option is not permitted; this is because GNU makes no distinction +- between text and binary files. Also, `"w"' and `"w+"' do not +- cause truncation of the file; these have an effect only when +- opening a file, and in this case the file has already been opened. +- You must make sure that the OPENTYPE argument matches the actual +- mode of the open file descriptor. +- +- The return value is the new stream. If the stream cannot be +- created (for example, if the modes for the file indicated by the +- file descriptor do not permit the access specified by the OPENTYPE +- argument), a null pointer is returned instead. +- +- In some other systems, `fdopen' may fail to detect that the modes +- for file descriptor do not permit the access specified by +- `opentype'. The GNU C library always checks for this. +- +- For an example showing the use of the `fdopen' function, see *Note +-Creating a Pipe::. +- +- - Function: int fileno (FILE *STREAM) +- This function returns the file descriptor associated with the +- stream STREAM. If an error is detected (for example, if the STREAM +- is not valid) or if STREAM does not do I/O to a file, `fileno' +- returns -1. +- +- - Function: int fileno_unlocked (FILE *STREAM) +- The `fileno_unlocked' function is equivalent to the `fileno' +- function except that it does not implicitly lock the stream if the +- state is `FSETLOCKING_INTERNAL'. +- +- This function is a GNU extension. +- +- There are also symbolic constants defined in `unistd.h' for the file +-descriptors belonging to the standard streams `stdin', `stdout', and +-`stderr'; see *Note Standard Streams::. +- +-`STDIN_FILENO' +- This macro has value `0', which is the file descriptor for +- standard input. +- +-`STDOUT_FILENO' +- This macro has value `1', which is the file descriptor for +- standard output. +- +-`STDERR_FILENO' +- This macro has value `2', which is the file descriptor for +- standard error output. +- +- +-File: libc.info, Node: Stream/Descriptor Precautions, Next: Scatter-Gather, Prev: Descriptors and Streams, Up: Low-Level I/O +- +-Dangers of Mixing Streams and Descriptors +-========================================= +- +- You can have multiple file descriptors and streams (let's call both +-streams and descriptors "channels" for short) connected to the same +-file, but you must take care to avoid confusion between channels. There +-are two cases to consider: "linked" channels that share a single file +-position value, and "independent" channels that have their own file +-positions. +- +- It's best to use just one channel in your program for actual data +-transfer to any given file, except when all the access is for input. +-For example, if you open a pipe (something you can only do at the file +-descriptor level), either do all I/O with the descriptor, or construct a +-stream from the descriptor with `fdopen' and then do all I/O with the +-stream. +- +-* Menu: +- +-* Linked Channels:: Dealing with channels sharing a file position. +-* Independent Channels:: Dealing with separately opened, unlinked channels. +-* Cleaning Streams:: Cleaning a stream makes it safe to use +- another channel. +- +- +-File: libc.info, Node: Linked Channels, Next: Independent Channels, Up: Stream/Descriptor Precautions +- +-Linked Channels +---------------- +- +- Channels that come from a single opening share the same file +-position; we call them "linked" channels. Linked channels result when +-you make a stream from a descriptor using `fdopen', when you get a +-descriptor from a stream with `fileno', when you copy a descriptor with +-`dup' or `dup2', and when descriptors are inherited during `fork'. For +-files that don't support random access, such as terminals and pipes, +-_all_ channels are effectively linked. On random-access files, all +-append-type output streams are effectively linked to each other. +- +- If you have been using a stream for I/O (or have just opened the +-stream), and you want to do I/O using another channel (either a stream +-or a descriptor) that is linked to it, you must first "clean up" the +-stream that you have been using. *Note Cleaning Streams::. +- +- Terminating a process, or executing a new program in the process, +-destroys all the streams in the process. If descriptors linked to these +-streams persist in other processes, their file positions become +-undefined as a result. To prevent this, you must clean up the streams +-before destroying them. +- +- +-File: libc.info, Node: Independent Channels, Next: Cleaning Streams, Prev: Linked Channels, Up: Stream/Descriptor Precautions +- +-Independent Channels +--------------------- +- +- When you open channels (streams or descriptors) separately on a +-seekable file, each channel has its own file position. These are called +-"independent channels". +- +- The system handles each channel independently. Most of the time, +-this is quite predictable and natural (especially for input): each +-channel can read or write sequentially at its own place in the file. +-However, if some of the channels are streams, you must take these +-precautions: +- +- * You should clean an output stream after use, before doing anything +- else that might read or write from the same part of the file. +- +- * You should clean an input stream before reading data that may have +- been modified using an independent channel. Otherwise, you might +- read obsolete data that had been in the stream's buffer. +- +- If you do output to one channel at the end of the file, this will +-certainly leave the other independent channels positioned somewhere +-before the new end. You cannot reliably set their file positions to the +-new end of file before writing, because the file can always be extended +-by another process between when you set the file position and when you +-write the data. Instead, use an append-type descriptor or stream; they +-always output at the current end of the file. In order to make the +-end-of-file position accurate, you must clean the output channel you +-were using, if it is a stream. +- +- It's impossible for two channels to have separate file pointers for a +-file that doesn't support random access. Thus, channels for reading or +-writing such files are always linked, never independent. Append-type +-channels are also always linked. For these channels, follow the rules +-for linked channels; see *Note Linked Channels::. +- +- +-File: libc.info, Node: Cleaning Streams, Prev: Independent Channels, Up: Stream/Descriptor Precautions +- +-Cleaning Streams +----------------- +- +- On the GNU system, you can clean up any stream with `fclean': +- +- - Function: int fclean (FILE *STREAM) +- Clean up the stream STREAM so that its buffer is empty. If STREAM +- is doing output, force it out. If STREAM is doing input, give the +- data in the buffer back to the system, arranging to reread it. +- +- On other systems, you can use `fflush' to clean a stream in most +-cases. +- +- You can skip the `fclean' or `fflush' if you know the stream is +-already clean. A stream is clean whenever its buffer is empty. For +-example, an unbuffered stream is always clean. An input stream that is +-at end-of-file is clean. A line-buffered stream is clean when the last +-character output was a newline. However, a just-opened input stream +-might not be clean, as its input buffer might not be empty. +- +- There is one case in which cleaning a stream is impossible on most +-systems. This is when the stream is doing input from a file that is not +-random-access. Such streams typically read ahead, and when the file is +-not random access, there is no way to give back the excess data already +-read. When an input stream reads from a random-access file, `fflush' +-does clean the stream, but leaves the file pointer at an unpredictable +-place; you must set the file pointer before doing any further I/O. On +-the GNU system, using `fclean' avoids both of these problems. +- +- Closing an output-only stream also does `fflush', so this is a valid +-way of cleaning an output stream. On the GNU system, closing an input +-stream does `fclean'. +- +- You need not clean a stream before using its descriptor for control +-operations such as setting terminal modes; these operations don't affect +-the file position and are not affected by it. You can use any +-descriptor for these operations, and all channels are affected +-simultaneously. However, text already "output" to a stream but still +-buffered by the stream will be subject to the new terminal modes when +-subsequently flushed. To make sure "past" output is covered by the +-terminal settings that were in effect at the time, flush the output +-streams for that terminal before setting the modes. *Note Terminal +-Modes::. +- +- +-File: libc.info, Node: Scatter-Gather, Next: Memory-mapped I/O, Prev: Stream/Descriptor Precautions, Up: Low-Level I/O +- +-Fast Scatter-Gather I/O +-======================= +- +- Some applications may need to read or write data to multiple buffers, +-which are separated in memory. Although this can be done easily enough +-with multiple calls to `read' and `write', it is inefficient because +-there is overhead associated with each kernel call. +- +- Instead, many platforms provide special high-speed primitives to +-perform these "scatter-gather" operations in a single kernel call. The +-GNU C library will provide an emulation on any system that lacks these +-primitives, so they are not a portability threat. They are defined in +-`sys/uio.h'. +- +- These functions are controlled with arrays of `iovec' structures, +-which describe the location and size of each buffer. +- +- - Data Type: struct iovec +- The `iovec' structure describes a buffer. It contains two fields: +- +- `void *iov_base' +- Contains the address of a buffer. +- +- `size_t iov_len' +- Contains the length of the buffer. +- +- +- - Function: ssize_t readv (int FILEDES, const struct iovec *VECTOR, +- int COUNT) +- The `readv' function reads data from FILEDES and scatters it into +- the buffers described in VECTOR, which is taken to be COUNT +- structures long. As each buffer is filled, data is sent to the +- next. +- +- Note that `readv' is not guaranteed to fill all the buffers. It +- may stop at any point, for the same reasons `read' would. +- +- The return value is a count of bytes (_not_ buffers) read, 0 +- indicating end-of-file, or -1 indicating an error. The possible +- errors are the same as in `read'. +- +- +- - Function: ssize_t writev (int FILEDES, const struct iovec *VECTOR, +- int COUNT) +- The `writev' function gathers data from the buffers described in +- VECTOR, which is taken to be COUNT structures long, and writes +- them to `filedes'. As each buffer is written, it moves on to the +- next. +- +- Like `readv', `writev' may stop midstream under the same +- conditions `write' would. +- +- The return value is a count of bytes written, or -1 indicating an +- error. The possible errors are the same as in `write'. +- +- +- Note that if the buffers are small (under about 1kB), high-level +-streams may be easier to use than these functions. However, `readv' and +-`writev' are more efficient when the individual buffers themselves (as +-opposed to the total output), are large. In that case, a high-level +-stream would not be able to cache the data effectively. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-22 glibc-2.3.2-200304020432/manual/libc.info-22 +--- glibc-2.3.2/manual/libc.info-22 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-22 Thu Jan 1 01:00:00 1970 +@@ -1,1103 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Memory-mapped I/O, Next: Waiting for I/O, Prev: Scatter-Gather, Up: Low-Level I/O +- +-Memory-mapped I/O +-================= +- +- On modern operating systems, it is possible to "mmap" (pronounced +-"em-map") a file to a region of memory. When this is done, the file can +-be accessed just like an array in the program. +- +- This is more efficient than `read' or `write', as only the regions +-of the file that a program actually accesses are loaded. Accesses to +-not-yet-loaded parts of the mmapped region are handled in the same way +-as swapped out pages. +- +- Since mmapped pages can be stored back to their file when physical +-memory is low, it is possible to mmap files orders of magnitude larger +-than both the physical memory _and_ swap space. The only limit is +-address space. The theoretical limit is 4GB on a 32-bit machine - +-however, the actual limit will be smaller since some areas will be +-reserved for other purposes. If the LFS interface is used the file size +-on 32-bit systems is not limited to 2GB (offsets are signed which +-reduces the addressable area of 4GB by half); the full 64-bit are +-available. +- +- Memory mapping only works on entire pages of memory. Thus, addresses +-for mapping must be page-aligned, and length values will be rounded up. +-To determine the size of a page the machine uses one should use +- +- size_t page_size = (size_t) sysconf (_SC_PAGESIZE); +- +-These functions are declared in `sys/mman.h'. +- +- - Function: void * mmap (void *ADDRESS, size_t LENGTH,int PROTECT, int +- FLAGS, int FILEDES, off_t OFFSET) +- The `mmap' function creates a new mapping, connected to bytes +- (OFFSET) to (OFFSET + LENGTH - 1) in the file open on FILEDES. A +- new reference for the file specified by FILEDES is created, which +- is not removed by closing the file. +- +- ADDRESS gives a preferred starting address for the mapping. +- `NULL' expresses no preference. Any previous mapping at that +- address is automatically removed. The address you give may still be +- changed, unless you use the `MAP_FIXED' flag. +- +- PROTECT contains flags that control what kind of access is +- permitted. They include `PROT_READ', `PROT_WRITE', and +- `PROT_EXEC', which permit reading, writing, and execution, +- respectively. Inappropriate access will cause a segfault (*note +- Program Error Signals::). +- +- Note that most hardware designs cannot support write permission +- without read permission, and many do not distinguish read and +- execute permission. Thus, you may receive wider permissions than +- you ask for, and mappings of write-only files may be denied even +- if you do not use `PROT_READ'. +- +- FLAGS contains flags that control the nature of the map. One of +- `MAP_SHARED' or `MAP_PRIVATE' must be specified. +- +- They include: +- +- `MAP_PRIVATE' +- This specifies that writes to the region should never be +- written back to the attached file. Instead, a copy is made +- for the process, and the region will be swapped normally if +- memory runs low. No other process will see the changes. +- +- Since private mappings effectively revert to ordinary memory +- when written to, you must have enough virtual memory for a +- copy of the entire mmapped region if you use this mode with +- `PROT_WRITE'. +- +- `MAP_SHARED' +- This specifies that writes to the region will be written back +- to the file. Changes made will be shared immediately with +- other processes mmaping the same file. +- +- Note that actual writing may take place at any time. You +- need to use `msync', described below, if it is important that +- other processes using conventional I/O get a consistent view +- of the file. +- +- `MAP_FIXED' +- This forces the system to use the exact mapping address +- specified in ADDRESS and fail if it can't. +- +- `MAP_ANONYMOUS' +- `MAP_ANON' +- This flag tells the system to create an anonymous mapping, +- not connected to a file. FILEDES and OFF are ignored, and +- the region is initialized with zeros. +- +- Anonymous maps are used as the basic primitive to extend the +- heap on some systems. They are also useful to share data +- between multiple tasks without creating a file. +- +- On some systems using private anonymous mmaps is more +- efficient than using `malloc' for large blocks. This is not +- an issue with the GNU C library, as the included `malloc' +- automatically uses `mmap' where appropriate. +- +- `mmap' returns the address of the new mapping, or -1 for an error. +- +- Possible errors include: +- +- `EINVAL' +- Either ADDRESS was unusable, or inconsistent FLAGS were given. +- +- `EACCES' +- FILEDES was not open for the type of access specified in +- PROTECT. +- +- `ENOMEM' +- Either there is not enough memory for the operation, or the +- process is out of address space. +- +- `ENODEV' +- This file is of a type that doesn't support mapping. +- +- `ENOEXEC' +- The file is on a filesystem that doesn't support mapping. +- +- +- - Function: void * mmap64 (void *ADDRESS, size_t LENGTH,int PROTECT, +- int FLAGS, int FILEDES, off64_t OFFSET) +- The `mmap64' function is equivalent to the `mmap' function but the +- OFFSET parameter is of type `off64_t'. On 32-bit systems this +- allows the file associated with the FILEDES descriptor to be +- larger than 2GB. FILEDES must be a descriptor returned from a +- call to `open64' or `fopen64' and `freopen64' where the descriptor +- is retrieved with `fileno'. +- +- When the sources are translated with `_FILE_OFFSET_BITS == 64' this +- function is actually available under the name `mmap'. I.e., the +- new, extended API using 64 bit file sizes and offsets transparently +- replaces the old API. +- +- - Function: int munmap (void *ADDR, size_t LENGTH) +- `munmap' removes any memory maps from (ADDR) to (ADDR + LENGTH). +- LENGTH should be the length of the mapping. +- +- It is safe to unmap multiple mappings in one command, or include +- unmapped space in the range. It is also possible to unmap only +- part of an existing mapping. However, only entire pages can be +- removed. If LENGTH is not an even number of pages, it will be +- rounded up. +- +- It returns 0 for success and -1 for an error. +- +- One error is possible: +- +- `EINVAL' +- The memory range given was outside the user mmap range or +- wasn't page aligned. +- +- +- - Function: int msync (void *ADDRESS, size_t LENGTH, int FLAGS) +- When using shared mappings, the kernel can write the file at any +- time before the mapping is removed. To be certain data has +- actually been written to the file and will be accessible to +- non-memory-mapped I/O, it is necessary to use this function. +- +- It operates on the region ADDRESS to (ADDRESS + LENGTH). It may +- be used on part of a mapping or multiple mappings, however the +- region given should not contain any unmapped space. +- +- FLAGS can contain some options: +- +- `MS_SYNC' +- This flag makes sure the data is actually written _to disk_. +- Normally `msync' only makes sure that accesses to a file with +- conventional I/O reflect the recent changes. +- +- `MS_ASYNC' +- This tells `msync' to begin the synchronization, but not to +- wait for it to complete. +- +- `msync' returns 0 for success and -1 for error. Errors include: +- +- `EINVAL' +- An invalid region was given, or the FLAGS were invalid. +- +- `EFAULT' +- There is no existing mapping in at least part of the given +- region. +- +- +- - Function: void * mremap (void *ADDRESS, size_t LENGTH, size_t +- NEW_LENGTH, int FLAG) +- This function can be used to change the size of an existing memory +- area. ADDRESS and LENGTH must cover a region entirely mapped in +- the same `mmap' statement. A new mapping with the same +- characteristics will be returned with the length NEW_LENGTH. +- +- One option is possible, `MREMAP_MAYMOVE'. If it is given in FLAGS, +- the system may remove the existing mapping and create a new one of +- the desired length in another location. +- +- The address of the resulting mapping is returned, or -1. Possible +- error codes include: +- +- `EFAULT' +- There is no existing mapping in at least part of the original +- region, or the region covers two or more distinct mappings. +- +- `EINVAL' +- The address given is misaligned or inappropriate. +- +- `EAGAIN' +- The region has pages locked, and if extended it would exceed +- the process's resource limit for locked pages. *Note Limits +- on Resources::. +- +- `ENOMEM' +- The region is private writable, and insufficient virtual +- memory is available to extend it. Also, this error will +- occur if `MREMAP_MAYMOVE' is not given and the extension +- would collide with another mapped region. +- +- +- This function is only available on a few systems. Except for +-performing optional optimizations one should not rely on this function. +- +- Not all file descriptors may be mapped. Sockets, pipes, and most +-devices only allow sequential access and do not fit into the mapping +-abstraction. In addition, some regular files may not be mmapable, and +-older kernels may not support mapping at all. Thus, programs using +-`mmap' should have a fallback method to use should it fail. *Note Mmap: +-(standards)Mmap. +- +- - Function: int madvise (void *ADDR, size_t LENGTH, int ADVICE) +- This function can be used to provide the system with ADVICE about +- the intended usage patterns of the memory region starting at ADDR +- and extending LENGTH bytes. +- +- The valid BSD values for ADVICE are: +- +- `MADV_NORMAL' +- The region should receive no further special treatment. +- +- `MADV_RANDOM' +- The region will be accessed via random page references. The +- kernel should page-in the minimal number of pages for each +- page fault. +- +- `MADV_SEQUENTIAL' +- The region will be accessed via sequential page references. +- This may cause the kernel to aggressively read-ahead, +- expecting further sequential references after any page fault +- within this region. +- +- `MADV_WILLNEED' +- The region will be needed. The pages within this region may +- be pre-faulted in by the kernel. +- +- `MADV_DONTNEED' +- The region is no longer needed. The kernel may free these +- pages, causing any changes to the pages to be lost, as well +- as swapped out pages to be discarded. +- +- The POSIX names are slightly different, but with the same meanings: +- +- `POSIX_MADV_NORMAL' +- This corresponds with BSD's `MADV_NORMAL'. +- +- `POSIX_MADV_RANDOM' +- This corresponds with BSD's `MADV_RANDOM'. +- +- `POSIX_MADV_SEQUENTIAL' +- This corresponds with BSD's `MADV_SEQUENTIAL'. +- +- `POSIX_MADV_WILLNEED' +- This corresponds with BSD's `MADV_WILLNEED'. +- +- `POSIX_MADV_DONTNEED' +- This corresponds with BSD's `MADV_DONTNEED'. +- +- `msync' returns 0 for success and -1 for error. Errors include: +- `EINVAL' +- An invalid region was given, or the ADVICE was invalid. +- +- `EFAULT' +- There is no existing mapping in at least part of the given +- region. +- +- +- +-File: libc.info, Node: Waiting for I/O, Next: Synchronizing I/O, Prev: Memory-mapped I/O, Up: Low-Level I/O +- +-Waiting for Input or Output +-=========================== +- +- Sometimes a program needs to accept input on multiple input channels +-whenever input arrives. For example, some workstations may have devices +-such as a digitizing tablet, function button box, or dial box that are +-connected via normal asynchronous serial interfaces; good user interface +-style requires responding immediately to input on any device. Another +-example is a program that acts as a server to several other processes +-via pipes or sockets. +- +- You cannot normally use `read' for this purpose, because this blocks +-the program until input is available on one particular file descriptor; +-input on other channels won't wake it up. You could set nonblocking +-mode and poll each file descriptor in turn, but this is very +-inefficient. +- +- A better solution is to use the `select' function. This blocks the +-program until input or output is ready on a specified set of file +-descriptors, or until a timer expires, whichever comes first. This +-facility is declared in the header file `sys/types.h'. +- +- In the case of a server socket (*note Listening::), we say that +-"input" is available when there are pending connections that could be +-accepted (*note Accepting Connections::). `accept' for server sockets +-blocks and interacts with `select' just as `read' does for normal input. +- +- The file descriptor sets for the `select' function are specified as +-`fd_set' objects. Here is the description of the data type and some +-macros for manipulating these objects. +- +- - Data Type: fd_set +- The `fd_set' data type represents file descriptor sets for the +- `select' function. It is actually a bit array. +- +- - Macro: int FD_SETSIZE +- The value of this macro is the maximum number of file descriptors +- that a `fd_set' object can hold information about. On systems +- with a fixed maximum number, `FD_SETSIZE' is at least that number. +- On some systems, including GNU, there is no absolute limit on the +- number of descriptors open, but this macro still has a constant +- value which controls the number of bits in an `fd_set'; if you get +- a file descriptor with a value as high as `FD_SETSIZE', you cannot +- put that descriptor into an `fd_set'. +- +- - Macro: void FD_ZERO (fd_set *SET) +- This macro initializes the file descriptor set SET to be the empty +- set. +- +- - Macro: void FD_SET (int FILEDES, fd_set *SET) +- This macro adds FILEDES to the file descriptor set SET. +- +- - Macro: void FD_CLR (int FILEDES, fd_set *SET) +- This macro removes FILEDES from the file descriptor set SET. +- +- - Macro: int FD_ISSET (int FILEDES, fd_set *SET) +- This macro returns a nonzero value (true) if FILEDES is a member +- of the file descriptor set SET, and zero (false) otherwise. +- +- Next, here is the description of the `select' function itself. +- +- - Function: int select (int NFDS, fd_set *READ-FDS, fd_set *WRITE-FDS, +- fd_set *EXCEPT-FDS, struct timeval *TIMEOUT) +- The `select' function blocks the calling process until there is +- activity on any of the specified sets of file descriptors, or +- until the timeout period has expired. +- +- The file descriptors specified by the READ-FDS argument are +- checked to see if they are ready for reading; the WRITE-FDS file +- descriptors are checked to see if they are ready for writing; and +- the EXCEPT-FDS file descriptors are checked for exceptional +- conditions. You can pass a null pointer for any of these +- arguments if you are not interested in checking for that kind of +- condition. +- +- A file descriptor is considered ready for reading if it is not at +- end of file. A server socket is considered ready for reading if +- there is a pending connection which can be accepted with `accept'; +- *note Accepting Connections::. A client socket is ready for +- writing when its connection is fully established; *note +- Connecting::. +- +- "Exceptional conditions" does not mean errors--errors are reported +- immediately when an erroneous system call is executed, and do not +- constitute a state of the descriptor. Rather, they include +- conditions such as the presence of an urgent message on a socket. +- (*Note Sockets::, for information on urgent messages.) +- +- The `select' function checks only the first NFDS file descriptors. +- The usual thing is to pass `FD_SETSIZE' as the value of this +- argument. +- +- The TIMEOUT specifies the maximum time to wait. If you pass a +- null pointer for this argument, it means to block indefinitely +- until one of the file descriptors is ready. Otherwise, you should +- provide the time in `struct timeval' format; see *Note +- High-Resolution Calendar::. Specify zero as the time (a `struct +- timeval' containing all zeros) if you want to find out which +- descriptors are ready without waiting if none are ready. +- +- The normal return value from `select' is the total number of ready +- file descriptors in all of the sets. Each of the argument sets is +- overwritten with information about the descriptors that are ready +- for the corresponding operation. Thus, to see if a particular +- descriptor DESC has input, use `FD_ISSET (DESC, READ-FDS)' after +- `select' returns. +- +- If `select' returns because the timeout period expires, it returns +- a value of zero. +- +- Any signal will cause `select' to return immediately. So if your +- program uses signals, you can't rely on `select' to keep waiting +- for the full time specified. If you want to be sure of waiting +- for a particular amount of time, you must check for `EINTR' and +- repeat the `select' with a newly calculated timeout based on the +- current time. See the example below. See also *Note Interrupted +- Primitives::. +- +- If an error occurs, `select' returns `-1' and does not modify the +- argument file descriptor sets. The following `errno' error +- conditions are defined for this function: +- +- `EBADF' +- One of the file descriptor sets specified an invalid file +- descriptor. +- +- `EINTR' +- The operation was interrupted by a signal. *Note Interrupted +- Primitives::. +- +- `EINVAL' +- The TIMEOUT argument is invalid; one of the components is +- negative or too large. +- +- *Portability Note:* The `select' function is a BSD Unix feature. +- +- Here is an example showing how you can use `select' to establish a +-timeout period for reading from a file descriptor. The `input_timeout' +-function blocks the calling process until input is available on the +-file descriptor, or until the timeout period expires. +- +- #include +- #include +- #include +- #include +- #include +- +- int +- input_timeout (int filedes, unsigned int seconds) +- { +- fd_set set; +- struct timeval timeout; +- +- /* Initialize the file descriptor set. */ +- FD_ZERO (&set); +- FD_SET (filedes, &set); +- +- /* Initialize the timeout data structure. */ +- timeout.tv_sec = seconds; +- timeout.tv_usec = 0; +- +- /* `select' returns 0 if timeout, 1 if input available, -1 if error. */ +- return TEMP_FAILURE_RETRY (select (FD_SETSIZE, +- &set, NULL, NULL, +- &timeout)); +- } +- +- int +- main (void) +- { +- fprintf (stderr, "select returned %d.\n", +- input_timeout (STDIN_FILENO, 5)); +- return 0; +- } +- +- There is another example showing the use of `select' to multiplex +-input from multiple sockets in *Note Server Example::. +- +- +-File: libc.info, Node: Synchronizing I/O, Next: Asynchronous I/O, Prev: Waiting for I/O, Up: Low-Level I/O +- +-Synchronizing I/O operations +-============================ +- +- In most modern operating systems, the normal I/O operations are not +-executed synchronously. I.e., even if a `write' system call returns, +-this does not mean the data is actually written to the media, e.g., the +-disk. +- +- In situations where synchronization points are necessary, you can use +-special functions which ensure that all operations finish before they +-return. +- +- - Function: int sync (void) +- A call to this function will not return as long as there is data +- which has not been written to the device. All dirty buffers in +- the kernel will be written and so an overall consistent system can +- be achieved (if no other process in parallel writes data). +- +- A prototype for `sync' can be found in `unistd.h'. +- +- The return value is zero to indicate no error. +- +- Programs more often want to ensure that data written to a given file +-is committed, rather than all data in the system. For this, `sync' is +-overkill. +- +- - Function: int fsync (int FILDES) +- The `fsync' function can be used to make sure all data associated +- with the open file FILDES is written to the device associated with +- the descriptor. The function call does not return unless all +- actions have finished. +- +- A prototype for `fsync' can be found in `unistd.h'. +- +- This function is a cancellation point in multi-threaded programs. +- This is a problem if the thread allocates some resources (like +- memory, file descriptors, semaphores or whatever) at the time +- `fsync' is called. If the thread gets canceled these resources +- stay allocated until the program ends. To avoid this, calls to +- `fsync' should be protected using cancellation handlers. +- +- The return value of the function is zero if no error occurred. +- Otherwise it is -1 and the global variable ERRNO is set to the +- following values: +- `EBADF' +- The descriptor FILDES is not valid. +- +- `EINVAL' +- No synchronization is possible since the system does not +- implement this. +- +- Sometimes it is not even necessary to write all data associated with +-a file descriptor. E.g., in database files which do not change in size +-it is enough to write all the file content data to the device. +-Meta-information, like the modification time etc., are not that +-important and leaving such information uncommitted does not prevent a +-successful recovering of the file in case of a problem. +- +- - Function: int fdatasync (int FILDES) +- When a call to the `fdatasync' function returns, it is ensured +- that all of the file data is written to the device. For all +- pending I/O operations, the parts guaranteeing data integrity +- finished. +- +- Not all systems implement the `fdatasync' operation. On systems +- missing this functionality `fdatasync' is emulated by a call to +- `fsync' since the performed actions are a superset of those +- required by `fdatasync'. +- +- The prototype for `fdatasync' is in `unistd.h'. +- +- The return value of the function is zero if no error occurred. +- Otherwise it is -1 and the global variable ERRNO is set to the +- following values: +- `EBADF' +- The descriptor FILDES is not valid. +- +- `EINVAL' +- No synchronization is possible since the system does not +- implement this. +- +- +-File: libc.info, Node: Asynchronous I/O, Next: Control Operations, Prev: Synchronizing I/O, Up: Low-Level I/O +- +-Perform I/O Operations in Parallel +-================================== +- +- The POSIX.1b standard defines a new set of I/O operations which can +-significantly reduce the time an application spends waiting at I/O. The +-new functions allow a program to initiate one or more I/O operations and +-then immediately resume normal work while the I/O operations are +-executed in parallel. This functionality is available if the +-`unistd.h' file defines the symbol `_POSIX_ASYNCHRONOUS_IO'. +- +- These functions are part of the library with realtime functions named +-`librt'. They are not actually part of the `libc' binary. The +-implementation of these functions can be done using support in the +-kernel (if available) or using an implementation based on threads at +-userlevel. In the latter case it might be necessary to link +-applications with the thread library `libpthread' in addition to +-`librt'. +- +- All AIO operations operate on files which were opened previously. +-There might be arbitrarily many operations running for one file. The +-asynchronous I/O operations are controlled using a data structure named +-`struct aiocb' ("AIO control block"). It is defined in `aio.h' as +-follows. +- +- - Data Type: struct aiocb +- The POSIX.1b standard mandates that the `struct aiocb' structure +- contains at least the members described in the following table. +- There might be more elements which are used by the implementation, +- but depending upon these elements is not portable and is highly +- deprecated. +- +- `int aio_fildes' +- This element specifies the file descriptor to be used for the +- operation. It must be a legal descriptor, otherwise the +- operation will fail. +- +- The device on which the file is opened must allow the seek +- operation. I.e., it is not possible to use any of the AIO +- operations on devices like terminals where an `lseek' call +- would lead to an error. +- +- `off_t aio_offset' +- This element specifies the offset in the file at which the +- operation (input or output) is performed. Since the +- operations are carried out in arbitrary order and more than +- one operation for one file descriptor can be started, one +- cannot expect a current read/write position of the file +- descriptor. +- +- `volatile void *aio_buf' +- This is a pointer to the buffer with the data to be written +- or the place where the read data is stored. +- +- `size_t aio_nbytes' +- This element specifies the length of the buffer pointed to by +- `aio_buf'. +- +- `int aio_reqprio' +- If the platform has defined `_POSIX_PRIORITIZED_IO' and +- `_POSIX_PRIORITY_SCHEDULING', the AIO requests are processed +- based on the current scheduling priority. The `aio_reqprio' +- element can then be used to lower the priority of the AIO +- operation. +- +- `struct sigevent aio_sigevent' +- This element specifies how the calling process is notified +- once the operation terminates. If the `sigev_notify' element +- is `SIGEV_NONE', no notification is sent. If it is +- `SIGEV_SIGNAL', the signal determined by `sigev_signo' is +- sent. Otherwise, `sigev_notify' must be `SIGEV_THREAD'. In +- this case, a thread is created which starts executing the +- function pointed to by `sigev_notify_function'. +- +- `int aio_lio_opcode' +- This element is only used by the `lio_listio' and +- `lio_listio64' functions. Since these functions allow an +- arbitrary number of operations to start at once, and each +- operation can be input or output (or nothing), the +- information must be stored in the control block. The +- possible values are: +- +- `LIO_READ' +- Start a read operation. Read from the file at position +- `aio_offset' and store the next `aio_nbytes' bytes in the +- buffer pointed to by `aio_buf'. +- +- `LIO_WRITE' +- Start a write operation. Write `aio_nbytes' bytes +- starting at `aio_buf' into the file starting at position +- `aio_offset'. +- +- `LIO_NOP' +- Do nothing for this control block. This value is useful +- sometimes when an array of `struct aiocb' values +- contains holes, i.e., some of the values must not be +- handled although the whole array is presented to the +- `lio_listio' function. +- +- When the sources are compiled using `_FILE_OFFSET_BITS == 64' on a +- 32 bit machine, this type is in fact `struct aiocb64', since the +- LFS interface transparently replaces the `struct aiocb' definition. +- +- For use with the AIO functions defined in the LFS, there is a +-similar type defined which replaces the types of the appropriate +-members with larger types but otherwise is equivalent to `struct +-aiocb'. Particularly, all member names are the same. +- +- - Data Type: struct aiocb64 +- `int aio_fildes' +- This element specifies the file descriptor which is used for +- the operation. It must be a legal descriptor since otherwise +- the operation fails for obvious reasons. +- +- The device on which the file is opened must allow the seek +- operation. I.e., it is not possible to use any of the AIO +- operations on devices like terminals where an `lseek' call +- would lead to an error. +- +- `off64_t aio_offset' +- This element specifies at which offset in the file the +- operation (input or output) is performed. Since the +- operation are carried in arbitrary order and more than one +- operation for one file descriptor can be started, one cannot +- expect a current read/write position of the file descriptor. +- +- `volatile void *aio_buf' +- This is a pointer to the buffer with the data to be written +- or the place where the read data is stored. +- +- `size_t aio_nbytes' +- This element specifies the length of the buffer pointed to by +- `aio_buf'. +- +- `int aio_reqprio' +- If for the platform `_POSIX_PRIORITIZED_IO' and +- `_POSIX_PRIORITY_SCHEDULING' are defined the AIO requests are +- processed based on the current scheduling priority. The +- `aio_reqprio' element can then be used to lower the priority +- of the AIO operation. +- +- `struct sigevent aio_sigevent' +- This element specifies how the calling process is notified +- once the operation terminates. If the `sigev_notify', +- element is `SIGEV_NONE' no notification is sent. If it is +- `SIGEV_SIGNAL', the signal determined by `sigev_signo' is +- sent. Otherwise, `sigev_notify' must be `SIGEV_THREAD' in +- which case a thread which starts executing the function +- pointed to by `sigev_notify_function'. +- +- `int aio_lio_opcode' +- This element is only used by the `lio_listio' and +- `[lio_listio64' functions. Since these functions allow an +- arbitrary number of operations to start at once, and since +- each operation can be input or output (or nothing), the +- information must be stored in the control block. See the +- description of `struct aiocb' for a description of the +- possible values. +- +- When the sources are compiled using `_FILE_OFFSET_BITS == 64' on a +- 32 bit machine, this type is available under the name `struct +- aiocb64', since the LFS transparently replaces the old interface. +- +-* Menu: +- +-* Asynchronous Reads/Writes:: Asynchronous Read and Write Operations. +-* Status of AIO Operations:: Getting the Status of AIO Operations. +-* Synchronizing AIO Operations:: Getting into a consistent state. +-* Cancel AIO Operations:: Cancellation of AIO Operations. +-* Configuration of AIO:: How to optimize the AIO implementation. +- +- +-File: libc.info, Node: Asynchronous Reads/Writes, Next: Status of AIO Operations, Up: Asynchronous I/O +- +-Asynchronous Read and Write Operations +--------------------------------------- +- +- - Function: int aio_read (struct aiocb *AIOCBP) +- This function initiates an asynchronous read operation. It +- immediately returns after the operation was enqueued or when an +- error was encountered. +- +- The first `aiocbp->aio_nbytes' bytes of the file for which +- `aiocbp->aio_fildes' is a descriptor are written to the buffer +- starting at `aiocbp->aio_buf'. Reading starts at the absolute +- position `aiocbp->aio_offset' in the file. +- +- If prioritized I/O is supported by the platform the +- `aiocbp->aio_reqprio' value is used to adjust the priority before +- the request is actually enqueued. +- +- The calling process is notified about the termination of the read +- request according to the `aiocbp->aio_sigevent' value. +- +- When `aio_read' returns, the return value is zero if no error +- occurred that can be found before the process is enqueued. If +- such an early error is found, the function returns -1 and sets +- `errno' to one of the following values: +- +- `EAGAIN' +- The request was not enqueued due to (temporarily) exceeded +- resource limitations. +- +- `ENOSYS' +- The `aio_read' function is not implemented. +- +- `EBADF' +- The `aiocbp->aio_fildes' descriptor is not valid. This +- condition need not be recognized before enqueueing the +- request and so this error might also be signaled +- asynchronously. +- +- `EINVAL' +- The `aiocbp->aio_offset' or `aiocbp->aio_reqpiro' value is +- invalid. This condition need not be recognized before +- enqueueing the request and so this error might also be +- signaled asynchronously. +- +- If `aio_read' returns zero, the current status of the request can +- be queried using `aio_error' and `aio_return' functions. As long +- as the value returned by `aio_error' is `EINPROGRESS' the +- operation has not yet completed. If `aio_error' returns zero, the +- operation successfully terminated, otherwise the value is to be +- interpreted as an error code. If the function terminated, the +- result of the operation can be obtained using a call to +- `aio_return'. The returned value is the same as an equivalent +- call to `read' would have returned. Possible error codes returned +- by `aio_error' are: +- +- `EBADF' +- The `aiocbp->aio_fildes' descriptor is not valid. +- +- `ECANCELED' +- The operation was canceled before the operation was finished +- (*note Cancel AIO Operations::) +- +- `EINVAL' +- The `aiocbp->aio_offset' value is invalid. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' this +- function is in fact `aio_read64' since the LFS interface +- transparently replaces the normal implementation. +- +- - Function: int aio_read64 (struct aiocb *AIOCBP) +- This function is similar to the `aio_read' function. The only +- difference is that on 32 bit machines, the file descriptor should +- be opened in the large file mode. Internally, `aio_read64' uses +- functionality equivalent to `lseek64' (*note File Position +- Primitive::) to position the file descriptor correctly for the +- reading, as opposed to `lseek' functionality used in `aio_read'. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64', this +- function is available under the name `aio_read' and so +- transparently replaces the interface for small files on 32 bit +- machines. +- +- To write data asynchronously to a file, there exists an equivalent +-pair of functions with a very similar interface. +- +- - Function: int aio_write (struct aiocb *AIOCBP) +- This function initiates an asynchronous write operation. The +- function call immediately returns after the operation was enqueued +- or if before this happens an error was encountered. +- +- The first `aiocbp->aio_nbytes' bytes from the buffer starting at +- `aiocbp->aio_buf' are written to the file for which +- `aiocbp->aio_fildes' is an descriptor, starting at the absolute +- position `aiocbp->aio_offset' in the file. +- +- If prioritized I/O is supported by the platform, the +- `aiocbp->aio_reqprio' value is used to adjust the priority before +- the request is actually enqueued. +- +- The calling process is notified about the termination of the read +- request according to the `aiocbp->aio_sigevent' value. +- +- When `aio_write' returns, the return value is zero if no error +- occurred that can be found before the process is enqueued. If +- such an early error is found the function returns -1 and sets +- `errno' to one of the following values. +- +- `EAGAIN' +- The request was not enqueued due to (temporarily) exceeded +- resource limitations. +- +- `ENOSYS' +- The `aio_write' function is not implemented. +- +- `EBADF' +- The `aiocbp->aio_fildes' descriptor is not valid. This +- condition may not be recognized before enqueueing the +- request, and so this error might also be signaled +- asynchronously. +- +- `EINVAL' +- The `aiocbp->aio_offset' or `aiocbp->aio_reqprio' value is +- invalid. This condition may not be recognized before +- enqueueing the request and so this error might also be +- signaled asynchronously. +- +- In the case `aio_write' returns zero, the current status of the +- request can be queried using `aio_error' and `aio_return' +- functions. As long as the value returned by `aio_error' is +- `EINPROGRESS' the operation has not yet completed. If `aio_error' +- returns zero, the operation successfully terminated, otherwise the +- value is to be interpreted as an error code. If the function +- terminated, the result of the operation can be get using a call to +- `aio_return'. The returned value is the same as an equivalent +- call to `read' would have returned. Possible error codes returned +- by `aio_error' are: +- +- `EBADF' +- The `aiocbp->aio_fildes' descriptor is not valid. +- +- `ECANCELED' +- The operation was canceled before the operation was finished. +- (*note Cancel AIO Operations::) +- +- `EINVAL' +- The `aiocbp->aio_offset' value is invalid. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64', this +- function is in fact `aio_write64' since the LFS interface +- transparently replaces the normal implementation. +- +- - Function: int aio_write64 (struct aiocb *AIOCBP) +- This function is similar to the `aio_write' function. The only +- difference is that on 32 bit machines the file descriptor should +- be opened in the large file mode. Internally `aio_write64' uses +- functionality equivalent to `lseek64' (*note File Position +- Primitive::) to position the file descriptor correctly for the +- writing, as opposed to `lseek' functionality used in `aio_write'. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64', this +- function is available under the name `aio_write' and so +- transparently replaces the interface for small files on 32 bit +- machines. +- +- Besides these functions with the more or less traditional interface, +-POSIX.1b also defines a function which can initiate more than one +-operation at a time, and which can handle freely mixed read and write +-operations. It is therefore similar to a combination of `readv' and +-`writev'. +- +- - Function: int lio_listio (int MODE, struct aiocb *const LIST[], int +- NENT, struct sigevent *SIG) +- The `lio_listio' function can be used to enqueue an arbitrary +- number of read and write requests at one time. The requests can +- all be meant for the same file, all for different files or every +- solution in between. +- +- `lio_listio' gets the NENT requests from the array pointed to by +- LIST. The operation to be performed is determined by the +- `aio_lio_opcode' member in each element of LIST. If this field is +- `LIO_READ' a read operation is enqueued, similar to a call of +- `aio_read' for this element of the array (except that the way the +- termination is signalled is different, as we will see below). If +- the `aio_lio_opcode' member is `LIO_WRITE' a write operation is +- enqueued. Otherwise the `aio_lio_opcode' must be `LIO_NOP' in +- which case this element of LIST is simply ignored. This +- "operation" is useful in situations where one has a fixed array of +- `struct aiocb' elements from which only a few need to be handled at +- a time. Another situation is where the `lio_listio' call was +- canceled before all requests are processed (*note Cancel AIO +- Operations::) and the remaining requests have to be reissued. +- +- The other members of each element of the array pointed to by +- `list' must have values suitable for the operation as described in +- the documentation for `aio_read' and `aio_write' above. +- +- The MODE argument determines how `lio_listio' behaves after having +- enqueued all the requests. If MODE is `LIO_WAIT' it waits until +- all requests terminated. Otherwise MODE must be `LIO_NOWAIT' and +- in this case the function returns immediately after having +- enqueued all the requests. In this case the caller gets a +- notification of the termination of all requests according to the +- SIG parameter. If SIG is `NULL' no notification is send. +- Otherwise a signal is sent or a thread is started, just as +- described in the description for `aio_read' or `aio_write'. +- +- If MODE is `LIO_WAIT', the return value of `lio_listio' is 0 when +- all requests completed successfully. Otherwise the function +- return -1 and `errno' is set accordingly. To find out which +- request or requests failed one has to use the `aio_error' function +- on all the elements of the array LIST. +- +- In case MODE is `LIO_NOWAIT', the function returns 0 if all +- requests were enqueued correctly. The current state of the +- requests can be found using `aio_error' and `aio_return' as +- described above. If `lio_listio' returns -1 in this mode, the +- global variable `errno' is set accordingly. If a request did not +- yet terminate, a call to `aio_error' returns `EINPROGRESS'. If +- the value is different, the request is finished and the error +- value (or 0) is returned and the result of the operation can be +- retrieved using `aio_return'. +- +- Possible values for `errno' are: +- +- `EAGAIN' +- The resources necessary to queue all the requests are not +- available at the moment. The error status for each element +- of LIST must be checked to determine which request failed. +- +- Another reason could be that the system wide limit of AIO +- requests is exceeded. This cannot be the case for the +- implementation on GNU systems since no arbitrary limits exist. +- +- `EINVAL' +- The MODE parameter is invalid or NENT is larger than +- `AIO_LISTIO_MAX'. +- +- `EIO' +- One or more of the request's I/O operations failed. The +- error status of each request should be checked to determine +- which one failed. +- +- `ENOSYS' +- The `lio_listio' function is not supported. +- +- If the MODE parameter is `LIO_NOWAIT' and the caller cancels a +- request, the error status for this request returned by `aio_error' +- is `ECANCELED'. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64', this +- function is in fact `lio_listio64' since the LFS interface +- transparently replaces the normal implementation. +- +- - Function: int lio_listio64 (int MODE, struct aiocb *const LIST, int +- NENT, struct sigevent *SIG) +- This function is similar to the `lio_listio' function. The only +- difference is that on 32 bit machines, the file descriptor should +- be opened in the large file mode. Internally, `lio_listio64' uses +- functionality equivalent to `lseek64' (*note File Position +- Primitive::) to position the file descriptor correctly for the +- reading or writing, as opposed to `lseek' functionality used in +- `lio_listio'. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64', this +- function is available under the name `lio_listio' and so +- transparently replaces the interface for small files on 32 bit +- machines. +- +- +-File: libc.info, Node: Status of AIO Operations, Next: Synchronizing AIO Operations, Prev: Asynchronous Reads/Writes, Up: Asynchronous I/O +- +-Getting the Status of AIO Operations +------------------------------------- +- +- As already described in the documentation of the functions in the +-last section, it must be possible to get information about the status +-of an I/O request. When the operation is performed truly +-asynchronously (as with `aio_read' and `aio_write' and with +-`lio_listio' when the mode is `LIO_NOWAIT'), one sometimes needs to +-know whether a specific request already terminated and if so, what the +-result was. The following two functions allow you to get this kind of +-information. +- +- - Function: int aio_error (const struct aiocb *AIOCBP) +- This function determines the error state of the request described +- by the `struct aiocb' variable pointed to by AIOCBP. If the +- request has not yet terminated the value returned is always +- `EINPROGRESS'. Once the request has terminated the value +- `aio_error' returns is either 0 if the request completed +- successfully or it returns the value which would be stored in the +- `errno' variable if the request would have been done using `read', +- `write', or `fsync'. +- +- The function can return `ENOSYS' if it is not implemented. It +- could also return `EINVAL' if the AIOCBP parameter does not refer +- to an asynchronous operation whose return status is not yet known. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' this +- function is in fact `aio_error64' since the LFS interface +- transparently replaces the normal implementation. +- +- - Function: int aio_error64 (const struct aiocb64 *AIOCBP) +- This function is similar to `aio_error' with the only difference +- that the argument is a reference to a variable of type `struct +- aiocb64'. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' this +- function is available under the name `aio_error' and so +- transparently replaces the interface for small files on 32 bit +- machines. +- +- - Function: ssize_t aio_return (const struct aiocb *AIOCBP) +- This function can be used to retrieve the return status of the +- operation carried out by the request described in the variable +- pointed to by AIOCBP. As long as the error status of this request +- as returned by `aio_error' is `EINPROGRESS' the return of this +- function is undefined. +- +- Once the request is finished this function can be used exactly +- once to retrieve the return value. Following calls might lead to +- undefined behavior. The return value itself is the value which +- would have been returned by the `read', `write', or `fsync' call. +- +- The function can return `ENOSYS' if it is not implemented. It +- could also return `EINVAL' if the AIOCBP parameter does not refer +- to an asynchronous operation whose return status is not yet known. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' this +- function is in fact `aio_return64' since the LFS interface +- transparently replaces the normal implementation. +- +- - Function: int aio_return64 (const struct aiocb64 *AIOCBP) +- This function is similar to `aio_return' with the only difference +- that the argument is a reference to a variable of type `struct +- aiocb64'. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' this +- function is available under the name `aio_return' and so +- transparently replaces the interface for small files on 32 bit +- machines. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-23 glibc-2.3.2-200304020432/manual/libc.info-23 +--- glibc-2.3.2/manual/libc.info-23 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-23 Thu Jan 1 01:00:00 1970 +@@ -1,1221 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Synchronizing AIO Operations, Next: Cancel AIO Operations, Prev: Status of AIO Operations, Up: Asynchronous I/O +- +-Getting into a Consistent State +-------------------------------- +- +- When dealing with asynchronous operations it is sometimes necessary +-to get into a consistent state. This would mean for AIO that one wants +-to know whether a certain request or a group of request were processed. +-This could be done by waiting for the notification sent by the system +-after the operation terminated, but this sometimes would mean wasting +-resources (mainly computation time). Instead POSIX.1b defines two +-functions which will help with most kinds of consistency. +- +- The `aio_fsync' and `aio_fsync64' functions are only available if +-the symbol `_POSIX_SYNCHRONIZED_IO' is defined in `unistd.h'. +- +- - Function: int aio_fsync (int OP, struct aiocb *AIOCBP) +- Calling this function forces all I/O operations operating queued +- at the time of the function call operating on the file descriptor +- `aiocbp->aio_fildes' into the synchronized I/O completion state +- (*note Synchronizing I/O::). The `aio_fsync' function returns +- immediately but the notification through the method described in +- `aiocbp->aio_sigevent' will happen only after all requests for this +- file descriptor have terminated and the file is synchronized. +- This also means that requests for this very same file descriptor +- which are queued after the synchronization request are not +- affected. +- +- If OP is `O_DSYNC' the synchronization happens as with a call to +- `fdatasync'. Otherwise OP should be `O_SYNC' and the +- synchronization happens as with `fsync'. +- +- As long as the synchronization has not happened, a call to +- `aio_error' with the reference to the object pointed to by AIOCBP +- returns `EINPROGRESS'. Once the synchronization is done +- `aio_error' return 0 if the synchronization was not successful. +- Otherwise the value returned is the value to which the `fsync' or +- `fdatasync' function would have set the `errno' variable. In this +- case nothing can be assumed about the consistency for the data +- written to this file descriptor. +- +- The return value of this function is 0 if the request was +- successfully enqueued. Otherwise the return value is -1 and +- `errno' is set to one of the following values: +- +- `EAGAIN' +- The request could not be enqueued due to temporary lack of +- resources. +- +- `EBADF' +- The file descriptor `aiocbp->aio_fildes' is not valid or not +- open for writing. +- +- `EINVAL' +- The implementation does not support I/O synchronization or +- the OP parameter is other than `O_DSYNC' and `O_SYNC'. +- +- `ENOSYS' +- This function is not implemented. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' this +- function is in fact `aio_fsync64' since the LFS interface +- transparently replaces the normal implementation. +- +- - Function: int aio_fsync64 (int OP, struct aiocb64 *AIOCBP) +- This function is similar to `aio_fsync' with the only difference +- that the argument is a reference to a variable of type `struct +- aiocb64'. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' this +- function is available under the name `aio_fsync' and so +- transparently replaces the interface for small files on 32 bit +- machines. +- +- Another method of synchronization is to wait until one or more +-requests of a specific set terminated. This could be achieved by the +-`aio_*' functions to notify the initiating process about the +-termination but in some situations this is not the ideal solution. In +-a program which constantly updates clients somehow connected to the +-server it is not always the best solution to go round robin since some +-connections might be slow. On the other hand letting the `aio_*' +-function notify the caller might also be not the best solution since +-whenever the process works on preparing data for on client it makes no +-sense to be interrupted by a notification since the new client will not +-be handled before the current client is served. For situations like +-this `aio_suspend' should be used. +- +- - Function: int aio_suspend (const struct aiocb *const LIST[], int +- NENT, const struct timespec *TIMEOUT) +- When calling this function, the calling thread is suspended until +- at least one of the requests pointed to by the NENT elements of the +- array LIST has completed. If any of the requests has already +- completed at the time `aio_suspend' is called, the function returns +- immediately. Whether a request has terminated or not is +- determined by comparing the error status of the request with +- `EINPROGRESS'. If an element of LIST is `NULL', the entry is +- simply ignored. +- +- If no request has finished, the calling process is suspended. If +- TIMEOUT is `NULL', the process is not woken until a request has +- finished. If TIMEOUT is not `NULL', the process remains suspended +- at least as long as specified in TIMEOUT. In this case, +- `aio_suspend' returns with an error. +- +- The return value of the function is 0 if one or more requests from +- the LIST have terminated. Otherwise the function returns -1 and +- `errno' is set to one of the following values: +- +- `EAGAIN' +- None of the requests from the LIST completed in the time +- specified by TIMEOUT. +- +- `EINTR' +- A signal interrupted the `aio_suspend' function. This signal +- might also be sent by the AIO implementation while signalling +- the termination of one of the requests. +- +- `ENOSYS' +- The `aio_suspend' function is not implemented. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' this +- function is in fact `aio_suspend64' since the LFS interface +- transparently replaces the normal implementation. +- +- - Function: int aio_suspend64 (const struct aiocb64 *const LIST[], int +- NENT, const struct timespec *TIMEOUT) +- This function is similar to `aio_suspend' with the only difference +- that the argument is a reference to a variable of type `struct +- aiocb64'. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' this +- function is available under the name `aio_suspend' and so +- transparently replaces the interface for small files on 32 bit +- machines. +- +- +-File: libc.info, Node: Cancel AIO Operations, Next: Configuration of AIO, Prev: Synchronizing AIO Operations, Up: Asynchronous I/O +- +-Cancellation of AIO Operations +------------------------------- +- +- When one or more requests are asynchronously processed, it might be +-useful in some situations to cancel a selected operation, e.g., if it +-becomes obvious that the written data is no longer accurate and would +-have to be overwritten soon. As an example, assume an application, +-which writes data in files in a situation where new incoming data would +-have to be written in a file which will be updated by an enqueued +-request. The POSIX AIO implementation provides such a function, but +-this function is not capable of forcing the cancellation of the +-request. It is up to the implementation to decide whether it is +-possible to cancel the operation or not. Therefore using this function +-is merely a hint. +- +- - Function: int aio_cancel (int FILDES, struct aiocb *AIOCBP) +- The `aio_cancel' function can be used to cancel one or more +- outstanding requests. If the AIOCBP parameter is `NULL', the +- function tries to cancel all of the outstanding requests which +- would process the file descriptor FILDES (i.e., whose `aio_fildes' +- member is FILDES). If AIOCBP is not `NULL', `aio_cancel' attempts +- to cancel the specific request pointed to by AIOCBP. +- +- For requests which were successfully canceled, the normal +- notification about the termination of the request should take +- place. I.e., depending on the `struct sigevent' object which +- controls this, nothing happens, a signal is sent or a thread is +- started. If the request cannot be canceled, it terminates the +- usual way after performing the operation. +- +- After a request is successfully canceled, a call to `aio_error' +- with a reference to this request as the parameter will return +- `ECANCELED' and a call to `aio_return' will return -1. If the +- request wasn't canceled and is still running the error status is +- still `EINPROGRESS'. +- +- The return value of the function is `AIO_CANCELED' if there were +- requests which haven't terminated and which were successfully +- canceled. If there is one or more requests left which couldn't be +- canceled, the return value is `AIO_NOTCANCELED'. In this case +- `aio_error' must be used to find out which of the, perhaps +- multiple, requests (in AIOCBP is `NULL') weren't successfully +- canceled. If all requests already terminated at the time +- `aio_cancel' is called the return value is `AIO_ALLDONE'. +- +- If an error occurred during the execution of `aio_cancel' the +- function returns -1 and sets `errno' to one of the following +- values. +- +- `EBADF' +- The file descriptor FILDES is not valid. +- +- `ENOSYS' +- `aio_cancel' is not implemented. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64', this +- function is in fact `aio_cancel64' since the LFS interface +- transparently replaces the normal implementation. +- +- - Function: int aio_cancel64 (int FILDES, struct aiocb64 *AIOCBP) +- This function is similar to `aio_cancel' with the only difference +- that the argument is a reference to a variable of type `struct +- aiocb64'. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64', this +- function is available under the name `aio_cancel' and so +- transparently replaces the interface for small files on 32 bit +- machines. +- +- +-File: libc.info, Node: Configuration of AIO, Prev: Cancel AIO Operations, Up: Asynchronous I/O +- +-How to optimize the AIO implementation +--------------------------------------- +- +- The POSIX standard does not specify how the AIO functions are +-implemented. They could be system calls, but it is also possible to +-emulate them at userlevel. +- +- At the point of this writing, the available implementation is a +-userlevel implementation which uses threads for handling the enqueued +-requests. While this implementation requires making some decisions +-about limitations, hard limitations are something which is best avoided +-in the GNU C library. Therefore, the GNU C library provides a means +-for tuning the AIO implementation according to the individual use. +- +- - Data Type: struct aioinit +- This data type is used to pass the configuration or tunable +- parameters to the implementation. The program has to initialize +- the members of this struct and pass it to the implementation using +- the `aio_init' function. +- +- `int aio_threads' +- This member specifies the maximal number of threads which may +- be used at any one time. +- +- `int aio_num' +- This number provides an estimate on the maximal number of +- simultaneously enqueued requests. +- +- `int aio_locks' +- Unused. +- +- `int aio_usedba' +- Unused. +- +- `int aio_debug' +- Unused. +- +- `int aio_numusers' +- Unused. +- +- `int aio_reserved[2]' +- Unused. +- +- - Function: void aio_init (const struct aioinit *INIT) +- This function must be called before any other AIO function. +- Calling it is completely voluntary, as it is only meant to help +- the AIO implementation perform better. +- +- Before calling the `aio_init', function the members of a variable +- of type `struct aioinit' must be initialized. Then a reference to +- this variable is passed as the parameter to `aio_init' which itself +- may or may not pay attention to the hints. +- +- The function has no return value and no error cases are defined. +- It is a extension which follows a proposal from the SGI +- implementation in Irix 6. It is not covered by POSIX.1b or Unix98. +- +- +-File: libc.info, Node: Control Operations, Next: Duplicating Descriptors, Prev: Asynchronous I/O, Up: Low-Level I/O +- +-Control Operations on Files +-=========================== +- +- This section describes how you can perform various other operations +-on file descriptors, such as inquiring about or setting flags describing +-the status of the file descriptor, manipulating record locks, and the +-like. All of these operations are performed by the function `fcntl'. +- +- The second argument to the `fcntl' function is a command that +-specifies which operation to perform. The function and macros that name +-various flags that are used with it are declared in the header file +-`fcntl.h'. Many of these flags are also used by the `open' function; +-see *Note Opening and Closing Files::. +- +- - Function: int fcntl (int FILEDES, int COMMAND, ...) +- The `fcntl' function performs the operation specified by COMMAND +- on the file descriptor FILEDES. Some commands require additional +- arguments to be supplied. These additional arguments and the +- return value and error conditions are given in the detailed +- descriptions of the individual commands. +- +- Briefly, here is a list of what the various commands are. +- +- `F_DUPFD' +- Duplicate the file descriptor (return another file descriptor +- pointing to the same open file). *Note Duplicating +- Descriptors::. +- +- `F_GETFD' +- Get flags associated with the file descriptor. *Note +- Descriptor Flags::. +- +- `F_SETFD' +- Set flags associated with the file descriptor. *Note +- Descriptor Flags::. +- +- `F_GETFL' +- Get flags associated with the open file. *Note File Status +- Flags::. +- +- `F_SETFL' +- Set flags associated with the open file. *Note File Status +- Flags::. +- +- `F_GETLK' +- Get a file lock. *Note File Locks::. +- +- `F_SETLK' +- Set or clear a file lock. *Note File Locks::. +- +- `F_SETLKW' +- Like `F_SETLK', but wait for completion. *Note File Locks::. +- +- `F_GETOWN' +- Get process or process group ID to receive `SIGIO' signals. +- *Note Interrupt Input::. +- +- `F_SETOWN' +- Set process or process group ID to receive `SIGIO' signals. +- *Note Interrupt Input::. +- +- This function is a cancellation point in multi-threaded programs. +- This is a problem if the thread allocates some resources (like +- memory, file descriptors, semaphores or whatever) at the time +- `fcntl' is called. If the thread gets canceled these resources +- stay allocated until the program ends. To avoid this calls to +- `fcntl' should be protected using cancellation handlers. +- +- +-File: libc.info, Node: Duplicating Descriptors, Next: Descriptor Flags, Prev: Control Operations, Up: Low-Level I/O +- +-Duplicating Descriptors +-======================= +- +- You can "duplicate" a file descriptor, or allocate another file +-descriptor that refers to the same open file as the original. Duplicate +-descriptors share one file position and one set of file status flags +-(*note File Status Flags::), but each has its own set of file descriptor +-flags (*note Descriptor Flags::). +- +- The major use of duplicating a file descriptor is to implement +-"redirection" of input or output: that is, to change the file or pipe +-that a particular file descriptor corresponds to. +- +- You can perform this operation using the `fcntl' function with the +-`F_DUPFD' command, but there are also convenient functions `dup' and +-`dup2' for duplicating descriptors. +- +- The `fcntl' function and flags are declared in `fcntl.h', while +-prototypes for `dup' and `dup2' are in the header file `unistd.h'. +- +- - Function: int dup (int OLD) +- This function copies descriptor OLD to the first available +- descriptor number (the first number not currently open). It is +- equivalent to `fcntl (OLD, F_DUPFD, 0)'. +- +- - Function: int dup2 (int OLD, int NEW) +- This function copies the descriptor OLD to descriptor number NEW. +- +- If OLD is an invalid descriptor, then `dup2' does nothing; it does +- not close NEW. Otherwise, the new duplicate of OLD replaces any +- previous meaning of descriptor NEW, as if NEW were closed first. +- +- If OLD and NEW are different numbers, and OLD is a valid +- descriptor number, then `dup2' is equivalent to: +- +- close (NEW); +- fcntl (OLD, F_DUPFD, NEW) +- +- However, `dup2' does this atomically; there is no instant in the +- middle of calling `dup2' at which NEW is closed and not yet a +- duplicate of OLD. +- +- - Macro: int F_DUPFD +- This macro is used as the COMMAND argument to `fcntl', to copy the +- file descriptor given as the first argument. +- +- The form of the call in this case is: +- +- fcntl (OLD, F_DUPFD, NEXT-FILEDES) +- +- The NEXT-FILEDES argument is of type `int' and specifies that the +- file descriptor returned should be the next available one greater +- than or equal to this value. +- +- The return value from `fcntl' with this command is normally the +- value of the new file descriptor. A return value of -1 indicates +- an error. The following `errno' error conditions are defined for +- this command: +- +- `EBADF' +- The OLD argument is invalid. +- +- `EINVAL' +- The NEXT-FILEDES argument is invalid. +- +- `EMFILE' +- There are no more file descriptors available--your program is +- already using the maximum. In BSD and GNU, the maximum is +- controlled by a resource limit that can be changed; *note +- Limits on Resources::, for more information about the +- `RLIMIT_NOFILE' limit. +- +- `ENFILE' is not a possible error code for `dup2' because `dup2' +- does not create a new opening of a file; duplicate descriptors do +- not count toward the limit which `ENFILE' indicates. `EMFILE' is +- possible because it refers to the limit on distinct descriptor +- numbers in use in one process. +- +- Here is an example showing how to use `dup2' to do redirection. +-Typically, redirection of the standard streams (like `stdin') is done +-by a shell or shell-like program before calling one of the `exec' +-functions (*note Executing a File::) to execute a new program in a +-child process. When the new program is executed, it creates and +-initializes the standard streams to point to the corresponding file +-descriptors, before its `main' function is invoked. +- +- So, to redirect standard input to a file, the shell could do +-something like: +- +- pid = fork (); +- if (pid == 0) +- { +- char *filename; +- char *program; +- int file; +- ... +- file = TEMP_FAILURE_RETRY (open (filename, O_RDONLY)); +- dup2 (file, STDIN_FILENO); +- TEMP_FAILURE_RETRY (close (file)); +- execv (program, NULL); +- } +- +- There is also a more detailed example showing how to implement +-redirection in the context of a pipeline of processes in *Note +-Launching Jobs::. +- +- +-File: libc.info, Node: Descriptor Flags, Next: File Status Flags, Prev: Duplicating Descriptors, Up: Low-Level I/O +- +-File Descriptor Flags +-===================== +- +- "File descriptor flags" are miscellaneous attributes of a file +-descriptor. These flags are associated with particular file +-descriptors, so that if you have created duplicate file descriptors +-from a single opening of a file, each descriptor has its own set of +-flags. +- +- Currently there is just one file descriptor flag: `FD_CLOEXEC', +-which causes the descriptor to be closed if you use any of the +-`exec...' functions (*note Executing a File::). +- +- The symbols in this section are defined in the header file `fcntl.h'. +- +- - Macro: int F_GETFD +- This macro is used as the COMMAND argument to `fcntl', to specify +- that it should return the file descriptor flags associated with +- the FILEDES argument. +- +- The normal return value from `fcntl' with this command is a +- nonnegative number which can be interpreted as the bitwise OR of +- the individual flags (except that currently there is only one flag +- to use). +- +- In case of an error, `fcntl' returns -1. The following `errno' +- error conditions are defined for this command: +- +- `EBADF' +- The FILEDES argument is invalid. +- +- - Macro: int F_SETFD +- This macro is used as the COMMAND argument to `fcntl', to specify +- that it should set the file descriptor flags associated with the +- FILEDES argument. This requires a third `int' argument to specify +- the new flags, so the form of the call is: +- +- fcntl (FILEDES, F_SETFD, NEW-FLAGS) +- +- The normal return value from `fcntl' with this command is an +- unspecified value other than -1, which indicates an error. The +- flags and error conditions are the same as for the `F_GETFD' +- command. +- +- The following macro is defined for use as a file descriptor flag with +-the `fcntl' function. The value is an integer constant usable as a bit +-mask value. +- +- - Macro: int FD_CLOEXEC +- This flag specifies that the file descriptor should be closed when +- an `exec' function is invoked; see *Note Executing a File::. When +- a file descriptor is allocated (as with `open' or `dup'), this bit +- is initially cleared on the new file descriptor, meaning that +- descriptor will survive into the new program after `exec'. +- +- If you want to modify the file descriptor flags, you should get the +-current flags with `F_GETFD' and modify the value. Don't assume that +-the flags listed here are the only ones that are implemented; your +-program may be run years from now and more flags may exist then. For +-example, here is a function to set or clear the flag `FD_CLOEXEC' +-without altering any other flags: +- +- /* Set the `FD_CLOEXEC' flag of DESC if VALUE is nonzero, +- or clear the flag if VALUE is 0. +- Return 0 on success, or -1 on error with `errno' set. */ +- +- int +- set_cloexec_flag (int desc, int value) +- { +- int oldflags = fcntl (desc, F_GETFD, 0); +- /* If reading the flags failed, return error indication now. */ +- if (oldflags < 0) +- return oldflags; +- /* Set just the flag we want to set. */ +- if (value != 0) +- oldflags |= FD_CLOEXEC; +- else +- oldflags &= ~FD_CLOEXEC; +- /* Store modified flag word in the descriptor. */ +- return fcntl (desc, F_SETFD, oldflags); +- } +- +- +-File: libc.info, Node: File Status Flags, Next: File Locks, Prev: Descriptor Flags, Up: Low-Level I/O +- +-File Status Flags +-================= +- +- "File status flags" are used to specify attributes of the opening of +-a file. Unlike the file descriptor flags discussed in *Note Descriptor +-Flags::, the file status flags are shared by duplicated file descriptors +-resulting from a single opening of the file. The file status flags are +-specified with the FLAGS argument to `open'; *note Opening and Closing +-Files::. +- +- File status flags fall into three categories, which are described in +-the following sections. +- +- * *Note Access Modes::, specify what type of access is allowed to the +- file: reading, writing, or both. They are set by `open' and are +- returned by `fcntl', but cannot be changed. +- +- * *Note Open-time Flags::, control details of what `open' will do. +- These flags are not preserved after the `open' call. +- +- * *Note Operating Modes::, affect how operations such as `read' and +- `write' are done. They are set by `open', and can be fetched or +- changed with `fcntl'. +- +- The symbols in this section are defined in the header file `fcntl.h'. +- +-* Menu: +- +-* Access Modes:: Whether the descriptor can read or write. +-* Open-time Flags:: Details of `open'. +-* Operating Modes:: Special modes to control I/O operations. +-* Getting File Status Flags:: Fetching and changing these flags. +- +- +-File: libc.info, Node: Access Modes, Next: Open-time Flags, Up: File Status Flags +- +-File Access Modes +------------------ +- +- The file access modes allow a file descriptor to be used for reading, +-writing, or both. (In the GNU system, they can also allow none of +-these, and allow execution of the file as a program.) The access modes +-are chosen when the file is opened, and never change. +- +- - Macro: int O_RDONLY +- Open the file for read access. +- +- - Macro: int O_WRONLY +- Open the file for write access. +- +- - Macro: int O_RDWR +- Open the file for both reading and writing. +- +- In the GNU system (and not in other systems), `O_RDONLY' and +-`O_WRONLY' are independent bits that can be bitwise-ORed together, and +-it is valid for either bit to be set or clear. This means that +-`O_RDWR' is the same as `O_RDONLY|O_WRONLY'. A file access mode of +-zero is permissible; it allows no operations that do input or output to +-the file, but does allow other operations such as `fchmod'. On the GNU +-system, since "read-only" or "write-only" is a misnomer, `fcntl.h' +-defines additional names for the file access modes. These names are +-preferred when writing GNU-specific code. But most programs will want +-to be portable to other POSIX.1 systems and should use the POSIX.1 +-names above instead. +- +- - Macro: int O_READ +- Open the file for reading. Same as `O_RDONLY'; only defined on +- GNU. +- +- - Macro: int O_WRITE +- Open the file for writing. Same as `O_WRONLY'; only defined on +- GNU. +- +- - Macro: int O_EXEC +- Open the file for executing. Only defined on GNU. +- +- To determine the file access mode with `fcntl', you must extract the +-access mode bits from the retrieved file status flags. In the GNU +-system, you can just test the `O_READ' and `O_WRITE' bits in the flags +-word. But in other POSIX.1 systems, reading and writing access modes +-are not stored as distinct bit flags. The portable way to extract the +-file access mode bits is with `O_ACCMODE'. +- +- - Macro: int O_ACCMODE +- This macro stands for a mask that can be bitwise-ANDed with the +- file status flag value to produce a value representing the file +- access mode. The mode will be `O_RDONLY', `O_WRONLY', or `O_RDWR'. +- (In the GNU system it could also be zero, and it never includes the +- `O_EXEC' bit.) +- +- +-File: libc.info, Node: Open-time Flags, Next: Operating Modes, Prev: Access Modes, Up: File Status Flags +- +-Open-time Flags +---------------- +- +- The open-time flags specify options affecting how `open' will behave. +-These options are not preserved once the file is open. The exception to +-this is `O_NONBLOCK', which is also an I/O operating mode and so it +-_is_ saved. *Note Opening and Closing Files::, for how to call `open'. +- +- There are two sorts of options specified by open-time flags. +- +- * "File name translation flags" affect how `open' looks up the file +- name to locate the file, and whether the file can be created. +- +- * "Open-time action flags" specify extra operations that `open' will +- perform on the file once it is open. +- +- Here are the file name translation flags. +- +- - Macro: int O_CREAT +- If set, the file will be created if it doesn't already exist. +- +- - Macro: int O_EXCL +- If both `O_CREAT' and `O_EXCL' are set, then `open' fails if the +- specified file already exists. This is guaranteed to never +- clobber an existing file. +- +- - Macro: int O_NONBLOCK +- This prevents `open' from blocking for a "long time" to open the +- file. This is only meaningful for some kinds of files, usually +- devices such as serial ports; when it is not meaningful, it is +- harmless and ignored. Often opening a port to a modem blocks +- until the modem reports carrier detection; if `O_NONBLOCK' is +- specified, `open' will return immediately without a carrier. +- +- Note that the `O_NONBLOCK' flag is overloaded as both an I/O +- operating mode and a file name translation flag. This means that +- specifying `O_NONBLOCK' in `open' also sets nonblocking I/O mode; +- *note Operating Modes::. To open the file without blocking but do +- normal I/O that blocks, you must call `open' with `O_NONBLOCK' set +- and then call `fcntl' to turn the bit off. +- +- - Macro: int O_NOCTTY +- If the named file is a terminal device, don't make it the +- controlling terminal for the process. *Note Job Control::, for +- information about what it means to be the controlling terminal. +- +- In the GNU system and 4.4 BSD, opening a file never makes it the +- controlling terminal and `O_NOCTTY' is zero. However, other +- systems may use a nonzero value for `O_NOCTTY' and set the +- controlling terminal when you open a file that is a terminal +- device; so to be portable, use `O_NOCTTY' when it is important to +- avoid this. +- +- The following three file name translation flags exist only in the +-GNU system. +- +- - Macro: int O_IGNORE_CTTY +- Do not recognize the named file as the controlling terminal, even +- if it refers to the process's existing controlling terminal +- device. Operations on the new file descriptor will never induce +- job control signals. *Note Job Control::. +- +- - Macro: int O_NOLINK +- If the named file is a symbolic link, open the link itself instead +- of the file it refers to. (`fstat' on the new file descriptor will +- return the information returned by `lstat' on the link's name.) +- +- - Macro: int O_NOTRANS +- If the named file is specially translated, do not invoke the +- translator. Open the bare file the translator itself sees. +- +- The open-time action flags tell `open' to do additional operations +-which are not really related to opening the file. The reason to do them +-as part of `open' instead of in separate calls is that `open' can do +-them atomically. +- +- - Macro: int O_TRUNC +- Truncate the file to zero length. This option is only useful for +- regular files, not special files such as directories or FIFOs. +- POSIX.1 requires that you open the file for writing to use +- `O_TRUNC'. In BSD and GNU you must have permission to write the +- file to truncate it, but you need not open for write access. +- +- This is the only open-time action flag specified by POSIX.1. +- There is no good reason for truncation to be done by `open', +- instead of by calling `ftruncate' afterwards. The `O_TRUNC' flag +- existed in Unix before `ftruncate' was invented, and is retained +- for backward compatibility. +- +- The remaining operating modes are BSD extensions. They exist only +-on some systems. On other systems, these macros are not defined. +- +- - Macro: int O_SHLOCK +- Acquire a shared lock on the file, as with `flock'. *Note File +- Locks::. +- +- If `O_CREAT' is specified, the locking is done atomically when +- creating the file. You are guaranteed that no other process will +- get the lock on the new file first. +- +- - Macro: int O_EXLOCK +- Acquire an exclusive lock on the file, as with `flock'. *Note +- File Locks::. This is atomic like `O_SHLOCK'. +- +- +-File: libc.info, Node: Operating Modes, Next: Getting File Status Flags, Prev: Open-time Flags, Up: File Status Flags +- +-I/O Operating Modes +-------------------- +- +- The operating modes affect how input and output operations using a +-file descriptor work. These flags are set by `open' and can be fetched +-and changed with `fcntl'. +- +- - Macro: int O_APPEND +- The bit that enables append mode for the file. If set, then all +- `write' operations write the data at the end of the file, extending +- it, regardless of the current file position. This is the only +- reliable way to append to a file. In append mode, you are +- guaranteed that the data you write will always go to the current +- end of the file, regardless of other processes writing to the +- file. Conversely, if you simply set the file position to the end +- of file and write, then another process can extend the file after +- you set the file position but before you write, resulting in your +- data appearing someplace before the real end of file. +- +- - Macro: int O_NONBLOCK +- The bit that enables nonblocking mode for the file. If this bit +- is set, `read' requests on the file can return immediately with a +- failure status if there is no input immediately available, instead +- of blocking. Likewise, `write' requests can also return +- immediately with a failure status if the output can't be written +- immediately. +- +- Note that the `O_NONBLOCK' flag is overloaded as both an I/O +- operating mode and a file name translation flag; *note Open-time +- Flags::. +- +- - Macro: int O_NDELAY +- This is an obsolete name for `O_NONBLOCK', provided for +- compatibility with BSD. It is not defined by the POSIX.1 standard. +- +- The remaining operating modes are BSD and GNU extensions. They +-exist only on some systems. On other systems, these macros are not +-defined. +- +- - Macro: int O_ASYNC +- The bit that enables asynchronous input mode. If set, then `SIGIO' +- signals will be generated when input is available. *Note +- Interrupt Input::. +- +- Asynchronous input mode is a BSD feature. +- +- - Macro: int O_FSYNC +- The bit that enables synchronous writing for the file. If set, +- each `write' call will make sure the data is reliably stored on +- disk before returning. Synchronous writing is a BSD feature. +- +- - Macro: int O_SYNC +- This is another name for `O_FSYNC'. They have the same value. +- +- - Macro: int O_NOATIME +- If this bit is set, `read' will not update the access time of the +- file. *Note File Times::. This is used by programs that do +- backups, so that backing a file up does not count as reading it. +- Only the owner of the file or the superuser may use this bit. +- +- This is a GNU extension. +- +- +-File: libc.info, Node: Getting File Status Flags, Prev: Operating Modes, Up: File Status Flags +- +-Getting and Setting File Status Flags +-------------------------------------- +- +- The `fcntl' function can fetch or change file status flags. +- +- - Macro: int F_GETFL +- This macro is used as the COMMAND argument to `fcntl', to read the +- file status flags for the open file with descriptor FILEDES. +- +- The normal return value from `fcntl' with this command is a +- nonnegative number which can be interpreted as the bitwise OR of +- the individual flags. Since the file access modes are not +- single-bit values, you can mask off other bits in the returned +- flags with `O_ACCMODE' to compare them. +- +- In case of an error, `fcntl' returns -1. The following `errno' +- error conditions are defined for this command: +- +- `EBADF' +- The FILEDES argument is invalid. +- +- - Macro: int F_SETFL +- This macro is used as the COMMAND argument to `fcntl', to set the +- file status flags for the open file corresponding to the FILEDES +- argument. This command requires a third `int' argument to specify +- the new flags, so the call looks like this: +- +- fcntl (FILEDES, F_SETFL, NEW-FLAGS) +- +- You can't change the access mode for the file in this way; that is, +- whether the file descriptor was opened for reading or writing. +- +- The normal return value from `fcntl' with this command is an +- unspecified value other than -1, which indicates an error. The +- error conditions are the same as for the `F_GETFL' command. +- +- If you want to modify the file status flags, you should get the +-current flags with `F_GETFL' and modify the value. Don't assume that +-the flags listed here are the only ones that are implemented; your +-program may be run years from now and more flags may exist then. For +-example, here is a function to set or clear the flag `O_NONBLOCK' +-without altering any other flags: +- +- /* Set the `O_NONBLOCK' flag of DESC if VALUE is nonzero, +- or clear the flag if VALUE is 0. +- Return 0 on success, or -1 on error with `errno' set. */ +- +- int +- set_nonblock_flag (int desc, int value) +- { +- int oldflags = fcntl (desc, F_GETFL, 0); +- /* If reading the flags failed, return error indication now. */ +- if (oldflags == -1) +- return -1; +- /* Set just the flag we want to set. */ +- if (value != 0) +- oldflags |= O_NONBLOCK; +- else +- oldflags &= ~O_NONBLOCK; +- /* Store modified flag word in the descriptor. */ +- return fcntl (desc, F_SETFL, oldflags); +- } +- +- +-File: libc.info, Node: File Locks, Next: Interrupt Input, Prev: File Status Flags, Up: Low-Level I/O +- +-File Locks +-========== +- +- The remaining `fcntl' commands are used to support "record locking", +-which permits multiple cooperating programs to prevent each other from +-simultaneously accessing parts of a file in error-prone ways. +- +- An "exclusive" or "write" lock gives a process exclusive access for +-writing to the specified part of the file. While a write lock is in +-place, no other process can lock that part of the file. +- +- A "shared" or "read" lock prohibits any other process from +-requesting a write lock on the specified part of the file. However, +-other processes can request read locks. +- +- The `read' and `write' functions do not actually check to see +-whether there are any locks in place. If you want to implement a +-locking protocol for a file shared by multiple processes, your +-application must do explicit `fcntl' calls to request and clear locks +-at the appropriate points. +- +- Locks are associated with processes. A process can only have one +-kind of lock set for each byte of a given file. When any file +-descriptor for that file is closed by the process, all of the locks +-that process holds on that file are released, even if the locks were +-made using other descriptors that remain open. Likewise, locks are +-released when a process exits, and are not inherited by child processes +-created using `fork' (*note Creating a Process::). +- +- When making a lock, use a `struct flock' to specify what kind of +-lock and where. This data type and the associated macros for the +-`fcntl' function are declared in the header file `fcntl.h'. +- +- - Data Type: struct flock +- This structure is used with the `fcntl' function to describe a file +- lock. It has these members: +- +- `short int l_type' +- Specifies the type of the lock; one of `F_RDLCK', `F_WRLCK', +- or `F_UNLCK'. +- +- `short int l_whence' +- This corresponds to the WHENCE argument to `fseek' or +- `lseek', and specifies what the offset is relative to. Its +- value can be one of `SEEK_SET', `SEEK_CUR', or `SEEK_END'. +- +- `off_t l_start' +- This specifies the offset of the start of the region to which +- the lock applies, and is given in bytes relative to the point +- specified by `l_whence' member. +- +- `off_t l_len' +- This specifies the length of the region to be locked. A +- value of `0' is treated specially; it means the region +- extends to the end of the file. +- +- `pid_t l_pid' +- This field is the process ID (*note Process Creation +- Concepts::) of the process holding the lock. It is filled in +- by calling `fcntl' with the `F_GETLK' command, but is ignored +- when making a lock. +- +- - Macro: int F_GETLK +- This macro is used as the COMMAND argument to `fcntl', to specify +- that it should get information about a lock. This command +- requires a third argument of type `struct flock *' to be passed to +- `fcntl', so that the form of the call is: +- +- fcntl (FILEDES, F_GETLK, LOCKP) +- +- If there is a lock already in place that would block the lock +- described by the LOCKP argument, information about that lock +- overwrites `*LOCKP'. Existing locks are not reported if they are +- compatible with making a new lock as specified. Thus, you should +- specify a lock type of `F_WRLCK' if you want to find out about both +- read and write locks, or `F_RDLCK' if you want to find out about +- write locks only. +- +- There might be more than one lock affecting the region specified +- by the LOCKP argument, but `fcntl' only returns information about +- one of them. The `l_whence' member of the LOCKP structure is set +- to `SEEK_SET' and the `l_start' and `l_len' fields set to identify +- the locked region. +- +- If no lock applies, the only change to the LOCKP structure is to +- update the `l_type' to a value of `F_UNLCK'. +- +- The normal return value from `fcntl' with this command is an +- unspecified value other than -1, which is reserved to indicate an +- error. The following `errno' error conditions are defined for +- this command: +- +- `EBADF' +- The FILEDES argument is invalid. +- +- `EINVAL' +- Either the LOCKP argument doesn't specify valid lock +- information, or the file associated with FILEDES doesn't +- support locks. +- +- - Macro: int F_SETLK +- This macro is used as the COMMAND argument to `fcntl', to specify +- that it should set or clear a lock. This command requires a third +- argument of type `struct flock *' to be passed to `fcntl', so that +- the form of the call is: +- +- fcntl (FILEDES, F_SETLK, LOCKP) +- +- If the process already has a lock on any part of the region, the +- old lock on that part is replaced with the new lock. You can +- remove a lock by specifying a lock type of `F_UNLCK'. +- +- If the lock cannot be set, `fcntl' returns immediately with a value +- of -1. This function does not block waiting for other processes +- to release locks. If `fcntl' succeeds, it return a value other +- than -1. +- +- The following `errno' error conditions are defined for this +- function: +- +- `EAGAIN' +- `EACCES' +- The lock cannot be set because it is blocked by an existing +- lock on the file. Some systems use `EAGAIN' in this case, +- and other systems use `EACCES'; your program should treat +- them alike, after `F_SETLK'. (The GNU system always uses +- `EAGAIN'.) +- +- `EBADF' +- Either: the FILEDES argument is invalid; you requested a read +- lock but the FILEDES is not open for read access; or, you +- requested a write lock but the FILEDES is not open for write +- access. +- +- `EINVAL' +- Either the LOCKP argument doesn't specify valid lock +- information, or the file associated with FILEDES doesn't +- support locks. +- +- `ENOLCK' +- The system has run out of file lock resources; there are +- already too many file locks in place. +- +- Well-designed file systems never report this error, because +- they have no limitation on the number of locks. However, you +- must still take account of the possibility of this error, as +- it could result from network access to a file system on +- another machine. +- +- - Macro: int F_SETLKW +- This macro is used as the COMMAND argument to `fcntl', to specify +- that it should set or clear a lock. It is just like the `F_SETLK' +- command, but causes the process to block (or wait) until the +- request can be specified. +- +- This command requires a third argument of type `struct flock *', as +- for the `F_SETLK' command. +- +- The `fcntl' return values and errors are the same as for the +- `F_SETLK' command, but these additional `errno' error conditions +- are defined for this command: +- +- `EINTR' +- The function was interrupted by a signal while it was waiting. +- *Note Interrupted Primitives::. +- +- `EDEADLK' +- The specified region is being locked by another process. But +- that process is waiting to lock a region which the current +- process has locked, so waiting for the lock would result in +- deadlock. The system does not guarantee that it will detect +- all such conditions, but it lets you know if it notices one. +- +- The following macros are defined for use as values for the `l_type' +-member of the `flock' structure. The values are integer constants. +- +-`F_RDLCK' +- This macro is used to specify a read (or shared) lock. +- +-`F_WRLCK' +- This macro is used to specify a write (or exclusive) lock. +- +-`F_UNLCK' +- This macro is used to specify that the region is unlocked. +- +- As an example of a situation where file locking is useful, consider a +-program that can be run simultaneously by several different users, that +-logs status information to a common file. One example of such a program +-might be a game that uses a file to keep track of high scores. Another +-example might be a program that records usage or accounting information +-for billing purposes. +- +- Having multiple copies of the program simultaneously writing to the +-file could cause the contents of the file to become mixed up. But you +-can prevent this kind of problem by setting a write lock on the file +-before actually writing to the file. +- +- If the program also needs to read the file and wants to make sure +-that the contents of the file are in a consistent state, then it can +-also use a read lock. While the read lock is set, no other process can +-lock that part of the file for writing. +- +- Remember that file locks are only a _voluntary_ protocol for +-controlling access to a file. There is still potential for access to +-the file by programs that don't use the lock protocol. +- +- +-File: libc.info, Node: Interrupt Input, Next: IOCTLs, Prev: File Locks, Up: Low-Level I/O +- +-Interrupt-Driven Input +-====================== +- +- If you set the `O_ASYNC' status flag on a file descriptor (*note +-File Status Flags::), a `SIGIO' signal is sent whenever input or output +-becomes possible on that file descriptor. The process or process group +-to receive the signal can be selected by using the `F_SETOWN' command +-to the `fcntl' function. If the file descriptor is a socket, this also +-selects the recipient of `SIGURG' signals that are delivered when +-out-of-band data arrives on that socket; see *Note Out-of-Band Data::. +-(`SIGURG' is sent in any situation where `select' would report the +-socket as having an "exceptional condition". *Note Waiting for I/O::.) +- +- If the file descriptor corresponds to a terminal device, then `SIGIO' +-signals are sent to the foreground process group of the terminal. +-*Note Job Control::. +- +- The symbols in this section are defined in the header file `fcntl.h'. +- +- - Macro: int F_GETOWN +- This macro is used as the COMMAND argument to `fcntl', to specify +- that it should get information about the process or process group +- to which `SIGIO' signals are sent. (For a terminal, this is +- actually the foreground process group ID, which you can get using +- `tcgetpgrp'; see *Note Terminal Access Functions::.) +- +- The return value is interpreted as a process ID; if negative, its +- absolute value is the process group ID. +- +- The following `errno' error condition is defined for this command: +- +- `EBADF' +- The FILEDES argument is invalid. +- +- - Macro: int F_SETOWN +- This macro is used as the COMMAND argument to `fcntl', to specify +- that it should set the process or process group to which `SIGIO' +- signals are sent. This command requires a third argument of type +- `pid_t' to be passed to `fcntl', so that the form of the call is: +- +- fcntl (FILEDES, F_SETOWN, PID) +- +- The PID argument should be a process ID. You can also pass a +- negative number whose absolute value is a process group ID. +- +- The return value from `fcntl' with this command is -1 in case of +- error and some other value if successful. The following `errno' +- error conditions are defined for this command: +- +- `EBADF' +- The FILEDES argument is invalid. +- +- `ESRCH' +- There is no process or process group corresponding to PID. +- +- +-File: libc.info, Node: IOCTLs, Prev: Interrupt Input, Up: Low-Level I/O +- +-Generic I/O Control operations +-============================== +- +- The GNU system can handle most input/output operations on many +-different devices and objects in terms of a few file primitives - +-`read', `write' and `lseek'. However, most devices also have a few +-peculiar operations which do not fit into this model. Such as: +- +- * Changing the character font used on a terminal. +- +- * Telling a magnetic tape system to rewind or fast forward. (Since +- they cannot move in byte increments, `lseek' is inapplicable). +- +- * Ejecting a disk from a drive. +- +- * Playing an audio track from a CD-ROM drive. +- +- * Maintaining routing tables for a network. +- +- +- Although some such objects such as sockets and terminals (1) have +-special functions of their own, it would not be practical to create +-functions for all these cases. +- +- Instead these minor operations, known as "IOCTL"s, are assigned code +-numbers and multiplexed through the `ioctl' function, defined in +-`sys/ioctl.h'. The code numbers themselves are defined in many +-different headers. +- +- - Function: int ioctl (int FILEDES, int COMMAND, ...) +- The `ioctl' function performs the generic I/O operation COMMAND on +- FILEDES. +- +- A third argument is usually present, either a single number or a +- pointer to a structure. The meaning of this argument, the +- returned value, and any error codes depends upon the command used. +- Often -1 is returned for a failure. +- +- +- On some systems, IOCTLs used by different devices share the same +-numbers. Thus, although use of an inappropriate IOCTL _usually_ only +-produces an error, you should not attempt to use device-specific IOCTLs +-on an unknown device. +- +- Most IOCTLs are OS-specific and/or only used in special system +-utilities, and are thus beyond the scope of this document. For an +-example of the use of an IOCTL, see *Note Out-of-Band Data::. +- +- ---------- Footnotes ---------- +- +- (1) Actually, the terminal-specific functions are implemented with +-IOCTLs on many platforms. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-24 glibc-2.3.2-200304020432/manual/libc.info-24 +--- glibc-2.3.2/manual/libc.info-24 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-24 Thu Jan 1 01:00:00 1970 +@@ -1,1174 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: File System Interface, Next: Pipes and FIFOs, Prev: Low-Level I/O, Up: Top +- +-File System Interface +-********************* +- +- This chapter describes the GNU C library's functions for manipulating +-files. Unlike the input and output functions (*note I/O on Streams::; +-*note Low-Level I/O::), these functions are concerned with operating on +-the files themselves rather than on their contents. +- +- Among the facilities described in this chapter are functions for +-examining or modifying directories, functions for renaming and deleting +-files, and functions for examining and setting file attributes such as +-access permissions and modification times. +- +-* Menu: +- +-* Working Directory:: This is used to resolve relative +- file names. +-* Accessing Directories:: Finding out what files a directory +- contains. +-* Working with Directory Trees:: Apply actions to all files or a selectable +- subset of a directory hierarchy. +-* Hard Links:: Adding alternate names to a file. +-* Symbolic Links:: A file that ``points to'' a file name. +-* Deleting Files:: How to delete a file, and what that means. +-* Renaming Files:: Changing a file's name. +-* Creating Directories:: A system call just for creating a directory. +-* File Attributes:: Attributes of individual files. +-* Making Special Files:: How to create special files. +-* Temporary Files:: Naming and creating temporary files. +- +- +-File: libc.info, Node: Working Directory, Next: Accessing Directories, Up: File System Interface +- +-Working Directory +-================= +- +- Each process has associated with it a directory, called its "current +-working directory" or simply "working directory", that is used in the +-resolution of relative file names (*note File Name Resolution::). +- +- When you log in and begin a new session, your working directory is +-initially set to the home directory associated with your login account +-in the system user database. You can find any user's home directory +-using the `getpwuid' or `getpwnam' functions; see *Note User Database::. +- +- Users can change the working directory using shell commands like +-`cd'. The functions described in this section are the primitives used +-by those commands and by other programs for examining and changing the +-working directory. +- +- Prototypes for these functions are declared in the header file +-`unistd.h'. +- +- - Function: char * getcwd (char *BUFFER, size_t SIZE) +- The `getcwd' function returns an absolute file name representing +- the current working directory, storing it in the character array +- BUFFER that you provide. The SIZE argument is how you tell the +- system the allocation size of BUFFER. +- +- The GNU library version of this function also permits you to +- specify a null pointer for the BUFFER argument. Then `getcwd' +- allocates a buffer automatically, as with `malloc' (*note +- Unconstrained Allocation::). If the SIZE is greater than zero, +- then the buffer is that large; otherwise, the buffer is as large +- as necessary to hold the result. +- +- The return value is BUFFER on success and a null pointer on +- failure. The following `errno' error conditions are defined for +- this function: +- +- `EINVAL' +- The SIZE argument is zero and BUFFER is not a null pointer. +- +- `ERANGE' +- The SIZE argument is less than the length of the working +- directory name. You need to allocate a bigger array and try +- again. +- +- `EACCES' +- Permission to read or search a component of the file name was +- denied. +- +- You could implement the behavior of GNU's `getcwd (NULL, 0)' using +-only the standard behavior of `getcwd': +- +- char * +- gnu_getcwd () +- { +- size_t size = 100; +- +- while (1) +- { +- char *buffer = (char *) xmalloc (size); +- if (getcwd (buffer, size) == buffer) +- return buffer; +- free (buffer); +- if (errno != ERANGE) +- return 0; +- size *= 2; +- } +- } +- +-*Note Malloc Examples::, for information about `xmalloc', which is not +-a library function but is a customary name used in most GNU software. +- +- - Deprecated Function: char * getwd (char *BUFFER) +- This is similar to `getcwd', but has no way to specify the size of +- the buffer. The GNU library provides `getwd' only for backwards +- compatibility with BSD. +- +- The BUFFER argument should be a pointer to an array at least +- `PATH_MAX' bytes long (*note Limits for Files::). In the GNU +- system there is no limit to the size of a file name, so this is not +- necessarily enough space to contain the directory name. That is +- why this function is deprecated. +- +- - Function: char * get_current_dir_name (void) +- This `get_current_dir_name' function is bascially equivalent to +- `getcwd (NULL, 0)'. The only difference is that the value of the +- `PWD' variable is returned if this value is correct. This is a +- subtle difference which is visible if the path described by the +- `PWD' value is using one or more symbol links in which case the +- value returned by `getcwd' can resolve the symbol links and +- therefore yield a different result. +- +- This function is a GNU extension. +- +- - Function: int chdir (const char *FILENAME) +- This function is used to set the process's working directory to +- FILENAME. +- +- The normal, successful return value from `chdir' is `0'. A value +- of `-1' is returned to indicate an error. The `errno' error +- conditions defined for this function are the usual file name +- syntax errors (*note File Name Errors::), plus `ENOTDIR' if the +- file FILENAME is not a directory. +- +- - Function: int fchdir (int FILEDES) +- This function is used to set the process's working directory to +- directory associated with the file descriptor FILEDES. +- +- The normal, successful return value from `fchdir' is `0'. A value +- of `-1' is returned to indicate an error. The following `errno' +- error conditions are defined for this function: +- +- `EACCES' +- Read permission is denied for the directory named by +- `dirname'. +- +- `EBADF' +- The FILEDES argument is not a valid file descriptor. +- +- `ENOTDIR' +- The file descriptor FILEDES is not associated with a +- directory. +- +- `EINTR' +- The function call was interrupt by a signal. +- +- `EIO' +- An I/O error occurred. +- +- +-File: libc.info, Node: Accessing Directories, Next: Working with Directory Trees, Prev: Working Directory, Up: File System Interface +- +-Accessing Directories +-===================== +- +- The facilities described in this section let you read the contents +-of a directory file. This is useful if you want your program to list +-all the files in a directory, perhaps as part of a menu. +- +- The `opendir' function opens a "directory stream" whose elements are +-directory entries. You use the `readdir' function on the directory +-stream to retrieve these entries, represented as `struct dirent' +-objects. The name of the file for each entry is stored in the `d_name' +-member of this structure. There are obvious parallels here to the +-stream facilities for ordinary files, described in *Note I/O on +-Streams::. +- +-* Menu: +- +-* Directory Entries:: Format of one directory entry. +-* Opening a Directory:: How to open a directory stream. +-* Reading/Closing Directory:: How to read directory entries from the stream. +-* Simple Directory Lister:: A very simple directory listing program. +-* Random Access Directory:: Rereading part of the directory +- already read with the same stream. +-* Scanning Directory Content:: Get entries for user selected subset of +- contents in given directory. +-* Simple Directory Lister Mark II:: Revised version of the program. +- +- +-File: libc.info, Node: Directory Entries, Next: Opening a Directory, Up: Accessing Directories +- +-Format of a Directory Entry +---------------------------- +- +- This section describes what you find in a single directory entry, as +-you might obtain it from a directory stream. All the symbols are +-declared in the header file `dirent.h'. +- +- - Data Type: struct dirent +- This is a structure type used to return information about directory +- entries. It contains the following fields: +- +- `char d_name[]' +- This is the null-terminated file name component. This is the +- only field you can count on in all POSIX systems. +- +- `ino_t d_fileno' +- This is the file serial number. For BSD compatibility, you +- can also refer to this member as `d_ino'. In the GNU system +- and most POSIX systems, for most files this the same as the +- `st_ino' member that `stat' will return for the file. *Note +- File Attributes::. +- +- `unsigned char d_namlen' +- This is the length of the file name, not including the +- terminating null character. Its type is `unsigned char' +- because that is the integer type of the appropriate size +- +- `unsigned char d_type' +- This is the type of the file, possibly unknown. The +- following constants are defined for its value: +- +- `DT_UNKNOWN' +- The type is unknown. On some systems this is the only +- value returned. +- +- `DT_REG' +- A regular file. +- +- `DT_DIR' +- A directory. +- +- `DT_FIFO' +- A named pipe, or FIFO. *Note FIFO Special Files::. +- +- `DT_SOCK' +- A local-domain socket. +- +- `DT_CHR' +- A character device. +- +- `DT_BLK' +- A block device. +- +- This member is a BSD extension. The symbol +- `_DIRENT_HAVE_D_TYPE' is defined if this member is available. +- On systems where it is used, it corresponds to the file type +- bits in the `st_mode' member of `struct statbuf'. If the +- value cannot be determine the member value is DT_UNKNOWN. +- These two macros convert between `d_type' values and +- `st_mode' values: +- +- - Function: int IFTODT (mode_t MODE) +- This returns the `d_type' value corresponding to MODE. +- +- - Function: mode_t DTTOIF (int DTYPE) +- This returns the `st_mode' value corresponding to DTYPE. +- +- This structure may contain additional members in the future. Their +- availability is always announced in the compilation environment by +- a macro names `_DIRENT_HAVE_D_XXX' where XXX is replaced by the +- name of the new member. For instance, the member `d_reclen' +- available on some systems is announced through the macro +- `_DIRENT_HAVE_D_RECLEN'. +- +- When a file has multiple names, each name has its own directory +- entry. The only way you can tell that the directory entries +- belong to a single file is that they have the same value for the +- `d_fileno' field. +- +- File attributes such as size, modification times etc., are part of +- the file itself, not of any particular directory entry. *Note +- File Attributes::. +- +- +-File: libc.info, Node: Opening a Directory, Next: Reading/Closing Directory, Prev: Directory Entries, Up: Accessing Directories +- +-Opening a Directory Stream +--------------------------- +- +- This section describes how to open a directory stream. All the +-symbols are declared in the header file `dirent.h'. +- +- - Data Type: DIR +- The `DIR' data type represents a directory stream. +- +- You shouldn't ever allocate objects of the `struct dirent' or `DIR' +-data types, since the directory access functions do that for you. +-Instead, you refer to these objects using the pointers returned by the +-following functions. +- +- - Function: DIR * opendir (const char *DIRNAME) +- The `opendir' function opens and returns a directory stream for +- reading the directory whose file name is DIRNAME. The stream has +- type `DIR *'. +- +- If unsuccessful, `opendir' returns a null pointer. In addition to +- the usual file name errors (*note File Name Errors::), the +- following `errno' error conditions are defined for this function: +- +- `EACCES' +- Read permission is denied for the directory named by +- `dirname'. +- +- `EMFILE' +- The process has too many files open. +- +- `ENFILE' +- The entire system, or perhaps the file system which contains +- the directory, cannot support any additional open files at +- the moment. (This problem cannot happen on the GNU system.) +- +- The `DIR' type is typically implemented using a file descriptor, +- and the `opendir' function in terms of the `open' function. *Note +- Low-Level I/O::. Directory streams and the underlying file +- descriptors are closed on `exec' (*note Executing a File::). +- +- In some situations it can be desirable to get hold of the file +-descriptor which is created by the `opendir' call. For instance, to +-switch the current working directory to the directory just read the +-`fchdir' function could be used. Historically the `DIR' type was +-exposed and programs could access the fields. This does not happen in +-the GNU C library. Instead a separate function is provided to allow +-access. +- +- - Function: int dirfd (DIR *DIRSTREAM) +- The function `dirfd' returns the file descriptor associated with +- the directory stream DIRSTREAM. This descriptor can be used until +- the directory is closed with `closedir'. If the directory stream +- implementation is not using file descriptors the return value is +- `-1'. +- +- +-File: libc.info, Node: Reading/Closing Directory, Next: Simple Directory Lister, Prev: Opening a Directory, Up: Accessing Directories +- +-Reading and Closing a Directory Stream +--------------------------------------- +- +- This section describes how to read directory entries from a directory +-stream, and how to close the stream when you are done with it. All the +-symbols are declared in the header file `dirent.h'. +- +- - Function: struct dirent * readdir (DIR *DIRSTREAM) +- This function reads the next entry from the directory. It normally +- returns a pointer to a structure containing information about the +- file. This structure is statically allocated and can be rewritten +- by a subsequent call. +- +- *Portability Note:* On some systems `readdir' may not return +- entries for `.' and `..', even though these are always valid file +- names in any directory. *Note File Name Resolution::. +- +- If there are no more entries in the directory or an error is +- detected, `readdir' returns a null pointer. The following `errno' +- error conditions are defined for this function: +- +- `EBADF' +- The DIRSTREAM argument is not valid. +- +- `readdir' is not thread safe. Multiple threads using `readdir' on +- the same DIRSTREAM may overwrite the return value. Use +- `readdir_r' when this is critical. +- +- - Function: int readdir_r (DIR *DIRSTREAM, struct dirent *ENTRY, +- struct dirent **RESULT) +- This function is the reentrant version of `readdir'. Like +- `readdir' it returns the next entry from the directory. But to +- prevent conflicts between simultaneously running threads the +- result is not stored in statically allocated memory. Instead the +- argument ENTRY points to a place to store the result. +- +- Normally `readdir_r' returns zero and sets `*RESULT' to ENTRY. If +- there are no more entries in the directory or an error is +- detected, `readdir_r' sets `*RESULT' to a null pointer and returns +- a nonzero error code, also stored in `errno', as described for +- `readdir'. +- +- *Portability Note:* On some systems `readdir_r' may not return a +- NUL terminated string for the file name, even when there is no +- `d_reclen' field in `struct dirent' and the file name is the +- maximum allowed size. Modern systems all have the `d_reclen' +- field, and on old systems multi-threading is not critical. In any +- case there is no such problem with the `readdir' function, so that +- even on systems without the `d_reclen' member one could use +- multiple threads by using external locking. +- +- It is also important to look at the definition of the `struct +- dirent' type. Simply passing a pointer to an object of this type +- for the second parameter of `readdir_r' might not be enough. Some +- systems don't define the `d_name' element sufficiently long. In +- this case the user has to provide additional space. There must be +- room for at least `NAME_MAX + 1' characters in the `d_name' array. +- Code to call `readdir_r' could look like this: +- +- union +- { +- struct dirent d; +- char b[offsetof (struct dirent, d_name) + NAME_MAX + 1]; +- } u; +- +- if (readdir_r (dir, &u.d, &res) == 0) +- ... +- +- To support large filesystems on 32-bit machines there are LFS +-variants of the last two functions. +- +- - Function: struct dirent64 * readdir64 (DIR *DIRSTREAM) +- The `readdir64' function is just like the `readdir' function +- except that it returns a pointer to a record of type `struct +- dirent64'. Some of the members of this data type (notably `d_ino') +- might have a different size to allow large filesystems. +- +- In all other aspects this function is equivalent to `readdir'. +- +- - Function: int readdir64_r (DIR *DIRSTREAM, struct dirent64 *ENTRY, +- struct dirent64 **RESULT) +- The `readdir64_r' function is equivalent to the `readdir_r' +- function except that it takes parameters of base type `struct +- dirent64' instead of `struct dirent' in the second and third +- position. The same precautions mentioned in the documentation of +- `readdir_r' also apply here. +- +- - Function: int closedir (DIR *DIRSTREAM) +- This function closes the directory stream DIRSTREAM. It returns +- `0' on success and `-1' on failure. +- +- The following `errno' error conditions are defined for this +- function: +- +- `EBADF' +- The DIRSTREAM argument is not valid. +- +- +-File: libc.info, Node: Simple Directory Lister, Next: Random Access Directory, Prev: Reading/Closing Directory, Up: Accessing Directories +- +-Simple Program to List a Directory +----------------------------------- +- +- Here's a simple program that prints the names of the files in the +-current working directory: +- +- #include +- #include +- #include +- +- int +- main (void) +- { +- DIR *dp; +- struct dirent *ep; +- +- dp = opendir ("./"); +- if (dp != NULL) +- { +- while (ep = readdir (dp)) +- puts (ep->d_name); +- (void) closedir (dp); +- } +- else +- perror ("Couldn't open the directory"); +- +- return 0; +- } +- +- The order in which files appear in a directory tends to be fairly +-random. A more useful program would sort the entries (perhaps by +-alphabetizing them) before printing them; see *Note Scanning Directory +-Content::, and *Note Array Sort Function::. +- +- +-File: libc.info, Node: Random Access Directory, Next: Scanning Directory Content, Prev: Simple Directory Lister, Up: Accessing Directories +- +-Random Access in a Directory Stream +------------------------------------ +- +- This section describes how to reread parts of a directory that you +-have already read from an open directory stream. All the symbols are +-declared in the header file `dirent.h'. +- +- - Function: void rewinddir (DIR *DIRSTREAM) +- The `rewinddir' function is used to reinitialize the directory +- stream DIRSTREAM, so that if you call `readdir' it returns +- information about the first entry in the directory again. This +- function also notices if files have been added or removed to the +- directory since it was opened with `opendir'. (Entries for these +- files might or might not be returned by `readdir' if they were +- added or removed since you last called `opendir' or `rewinddir'.) +- +- - Function: off_t telldir (DIR *DIRSTREAM) +- The `telldir' function returns the file position of the directory +- stream DIRSTREAM. You can use this value with `seekdir' to +- restore the directory stream to that position. +- +- - Function: void seekdir (DIR *DIRSTREAM, off_t POS) +- The `seekdir' function sets the file position of the directory +- stream DIRSTREAM to POS. The value POS must be the result of a +- previous call to `telldir' on this particular stream; closing and +- reopening the directory can invalidate values returned by +- `telldir'. +- +- +-File: libc.info, Node: Scanning Directory Content, Next: Simple Directory Lister Mark II, Prev: Random Access Directory, Up: Accessing Directories +- +-Scanning the Content of a Directory +------------------------------------ +- +- A higher-level interface to the directory handling functions is the +-`scandir' function. With its help one can select a subset of the +-entries in a directory, possibly sort them and get a list of names as +-the result. +- +- - Function: int scandir (const char *DIR, struct dirent ***NAMELIST, +- int (*SELECTOR) (const struct dirent *), int (*CMP) (const +- void *, const void *)) +- The `scandir' function scans the contents of the directory selected +- by DIR. The result in *NAMELIST is an array of pointers to +- structure of type `struct dirent' which describe all selected +- directory entries and which is allocated using `malloc'. Instead +- of always getting all directory entries returned, the user supplied +- function SELECTOR can be used to decide which entries are in the +- result. Only the entries for which SELECTOR returns a non-zero +- value are selected. +- +- Finally the entries in *NAMELIST are sorted using the +- user-supplied function CMP. The arguments passed to the CMP +- function are of type `struct dirent **', therefore one cannot +- directly use the `strcmp' or `strcoll' functions; instead see the +- functions `alphasort' and `versionsort' below. +- +- The return value of the function is the number of entries placed in +- *NAMELIST. If it is `-1' an error occurred (either the directory +- could not be opened for reading or the malloc call failed) and the +- global variable `errno' contains more information on the error. +- +- As described above the fourth argument to the `scandir' function +-must be a pointer to a sorting function. For the convenience of the +-programmer the GNU C library contains implementations of functions which +-are very helpful for this purpose. +- +- - Function: int alphasort (const void *A, const void *B) +- The `alphasort' function behaves like the `strcoll' function +- (*note String/Array Comparison::). The difference is that the +- arguments are not string pointers but instead they are of type +- `struct dirent **'. +- +- The return value of `alphasort' is less than, equal to, or greater +- than zero depending on the order of the two entries A and B. +- +- - Function: int versionsort (const void *A, const void *B) +- The `versionsort' function is like `alphasort' except that it uses +- the `strverscmp' function internally. +- +- If the filesystem supports large files we cannot use the `scandir' +-anymore since the `dirent' structure might not able to contain all the +-information. The LFS provides the new type `struct dirent64'. To use +-this we need a new function. +- +- - Function: int scandir64 (const char *DIR, struct dirent64 +- ***NAMELIST, int (*SELECTOR) (const struct dirent64 *), int +- (*CMP) (const void *, const void *)) +- The `scandir64' function works like the `scandir' function except +- that the directory entries it returns are described by elements of +- type `struct dirent64'. The function pointed to by SELECTOR is +- again used to select the desired entries, except that SELECTOR now +- must point to a function which takes a `struct dirent64 *' +- parameter. +- +- Similarly the CMP function should expect its two arguments to be +- of type `struct dirent64 **'. +- +- As CMP is now a function of a different type, the functions +-`alphasort' and `versionsort' cannot be supplied for that argument. +-Instead we provide the two replacement functions below. +- +- - Function: int alphasort64 (const void *A, const void *B) +- The `alphasort64' function behaves like the `strcoll' function +- (*note String/Array Comparison::). The difference is that the +- arguments are not string pointers but instead they are of type +- `struct dirent64 **'. +- +- Return value of `alphasort64' is less than, equal to, or greater +- than zero depending on the order of the two entries A and B. +- +- - Function: int versionsort64 (const void *A, const void *B) +- The `versionsort64' function is like `alphasort64', excepted that +- it uses the `strverscmp' function internally. +- +- It is important not to mix the use of `scandir' and the 64-bit +-comparison functions or vice versa. There are systems on which this +-works but on others it will fail miserably. +- +- +-File: libc.info, Node: Simple Directory Lister Mark II, Prev: Scanning Directory Content, Up: Accessing Directories +- +-Simple Program to List a Directory, Mark II +-------------------------------------------- +- +- Here is a revised version of the directory lister found above (*note +-Simple Directory Lister::). Using the `scandir' function we can avoid +-the functions which work directly with the directory contents. After +-the call the returned entries are available for direct use. +- +- #include +- #include +- +- static int +- one (struct dirent *unused) +- { +- return 1; +- } +- +- int +- main (void) +- { +- struct dirent **eps; +- int n; +- +- n = scandir ("./", &eps, one, alphasort); +- if (n >= 0) +- { +- int cnt; +- for (cnt = 0; cnt < n; ++cnt) +- puts (eps[cnt]->d_name); +- } +- else +- perror ("Couldn't open the directory"); +- +- return 0; +- } +- +- Note the simple selector function in this example. Since we want to +-see all directory entries we always return `1'. +- +- +-File: libc.info, Node: Working with Directory Trees, Next: Hard Links, Prev: Accessing Directories, Up: File System Interface +- +-Working with Directory Trees +-============================ +- +- The functions described so far for handling the files in a directory +-have allowed you to either retrieve the information bit by bit, or to +-process all the files as a group (see `scandir'). Sometimes it is +-useful to process whole hierarchies of directories and their contained +-files. The X/Open specification defines two functions to do this. The +-simpler form is derived from an early definition in System V systems +-and therefore this function is available on SVID-derived systems. The +-prototypes and required definitions can be found in the `ftw.h' header. +- +- There are four functions in this family: `ftw', `nftw' and their +-64-bit counterparts `ftw64' and `nftw64'. These functions take as one +-of their arguments a pointer to a callback function of the appropriate +-type. +- +- - Data Type: __ftw_func_t +- int (*) (const char *, const struct stat *, int) +- +- The type of callback functions given to the `ftw' function. The +- first parameter points to the file name, the second parameter to an +- object of type `struct stat' which is filled in for the file named +- in the first parameter. +- +- The last parameter is a flag giving more information about the +- current file. It can have the following values: +- +- `FTW_F' +- The item is either a normal file or a file which does not fit +- into one of the following categories. This could be special +- files, sockets etc. +- +- `FTW_D' +- The item is a directory. +- +- `FTW_NS' +- The `stat' call failed and so the information pointed to by +- the second paramater is invalid. +- +- `FTW_DNR' +- The item is a directory which cannot be read. +- +- `FTW_SL' +- The item is a symbolic link. Since symbolic links are +- normally followed seeing this value in a `ftw' callback +- function means the referenced file does not exist. The +- situation for `nftw' is different. +- +- This value is only available if the program is compiled with +- `_BSD_SOURCE' or `_XOPEN_EXTENDED' defined before including +- the first header. The original SVID systems do not have +- symbolic links. +- +- If the sources are compiled with `_FILE_OFFSET_BITS == 64' this +- type is in fact `__ftw64_func_t' since this mode changes `struct +- stat' to be `struct stat64'. +- +- For the LFS interface and for use in the function `ftw64', the +-header `ftw.h' defines another function type. +- +- - Data Type: __ftw64_func_t +- int (*) (const char *, const struct stat64 *, int) +- +- This type is used just like `__ftw_func_t' for the callback +- function, but this time is called from `ftw64'. The second +- parameter to the function is a pointer to a variable of type +- `struct stat64' which is able to represent the larger values. +- +- - Data Type: __nftw_func_t +- int (*) (const char *, const struct stat *, int, struct FTW *) +- +- The first three arguments are the same as for the `__ftw_func_t' +- type. However for the third argument some additional values are +- defined to allow finer differentiation: +- `FTW_DP' +- The current item is a directory and all subdirectories have +- already been visited and reported. This flag is returned +- instead of `FTW_D' if the `FTW_DEPTH' flag is passed to +- `nftw' (see below). +- +- `FTW_SLN' +- The current item is a stale symbolic link. The file it +- points to does not exist. +- +- The last parameter of the callback function is a pointer to a +- structure with some extra information as described below. +- +- If the sources are compiled with `_FILE_OFFSET_BITS == 64' this +- type is in fact `__nftw64_func_t' since this mode changes `struct +- stat' to be `struct stat64'. +- +- For the LFS interface there is also a variant of this data type +-available which has to be used with the `nftw64' function. +- +- - Data Type: __nftw64_func_t +- int (*) (const char *, const struct stat64 *, int, struct FTW *) +- +- This type is used just like `__nftw_func_t' for the callback +- function, but this time is called from `nftw64'. The second +- parameter to the function is this time a pointer to a variable of +- type `struct stat64' which is able to represent the larger values. +- +- - Data Type: struct FTW +- The information contained in this structure helps in interpreting +- the name parameter and gives some information about the current +- state of the traversal of the directory hierarchy. +- +- `int base' +- The value is the offset into the string passed in the first +- parameter to the callback function of the beginning of the +- file name. The rest of the string is the path of the file. +- This information is especially important if the `FTW_CHDIR' +- flag was set in calling `nftw' since then the current +- directory is the one the current item is found in. +- +- `int level' +- Whilst processing, the code tracks how many directories down +- it has gone to find the current file. This nesting level +- starts at 0 for files in the initial directory (or is zero +- for the initial file if a file was passed). +- +- - Function: int ftw (const char *FILENAME, __ftw_func_t FUNC, int +- DESCRIPTORS) +- The `ftw' function calls the callback function given in the +- parameter FUNC for every item which is found in the directory +- specified by FILENAME and all directories below. The function +- follows symbolic links if necessary but does not process an item +- twice. If FILENAME is not a directory then it itself is the only +- object returned to the callback function. +- +- The file name passed to the callback function is constructed by +- taking the FILENAME parameter and appending the names of all passed +- directories and then the local file name. So the callback +- function can use this parameter to access the file. `ftw' also +- calls `stat' for the file and passes that information on to the +- callback function. If this `stat' call was not successful the +- failure is indicated by setting the third argument of the callback +- function to `FTW_NS'. Otherwise it is set according to the +- description given in the account of `__ftw_func_t' above. +- +- The callback function is expected to return 0 to indicate that no +- error occurred and that processing should continue. If an error +- occurred in the callback function or it wants `ftw' to return +- immediately, the callback function can return a value other than +- 0. This is the only correct way to stop the function. The +- program must not use `setjmp' or similar techniques to continue +- from another place. This would leave resources allocated by the +- `ftw' function unfreed. +- +- The DESCRIPTORS parameter to `ftw' specifies how many file +- descriptors it is allowed to consume. The function runs faster +- the more descriptors it can use. For each level in the directory +- hierarchy at most one descriptor is used, but for very deep ones +- any limit on open file descriptors for the process or the system +- may be exceeded. Moreover, file descriptor limits in a +- multi-threaded program apply to all the threads as a group, and +- therefore it is a good idea to supply a reasonable limit to the +- number of open descriptors. +- +- The return value of the `ftw' function is 0 if all callback +- function calls returned 0 and all actions performed by the `ftw' +- succeeded. If a function call failed (other than calling `stat' +- on an item) the function returns -1. If a callback function +- returns a value other than 0 this value is returned as the return +- value of `ftw'. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a +- 32-bit system this function is in fact `ftw64', i.e. the LFS +- interface transparently replaces the old interface. +- +- - Function: int ftw64 (const char *FILENAME, __ftw64_func_t FUNC, int +- DESCRIPTORS) +- This function is similar to `ftw' but it can work on filesystems +- with large files. File information is reported using a variable +- of type `struct stat64' which is passed by reference to the +- callback function. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a +- 32-bit system this function is available under the name `ftw' and +- transparently replaces the old implementation. +- +- - Function: int nftw (const char *FILENAME, __nftw_func_t FUNC, int +- DESCRIPTORS, int FLAG) +- The `nftw' function works like the `ftw' functions. They call the +- callback function FUNC for all items found in the directory +- FILENAME and below. At most DESCRIPTORS file descriptors are +- consumed during the `nftw' call. +- +- One difference is that the callback function is of a different +- type. It is of type `struct FTW *' and provides the callback +- function with the extra information described above. +- +- A second difference is that `nftw' takes a fourth argument, which +- is 0 or a bitwise-OR combination of any of the following values. +- +- `FTW_PHYS' +- While traversing the directory symbolic links are not +- followed. Instead symbolic links are reported using the +- `FTW_SL' value for the type parameter to the callback +- function. If the file referenced by a symbolic link does not +- exist `FTW_SLN' is returned instead. +- +- `FTW_MOUNT' +- The callback function is only called for items which are on +- the same mounted filesystem as the directory given by the +- FILENAME parameter to `nftw'. +- +- `FTW_CHDIR' +- If this flag is given the current working directory is +- changed to the directory of the reported object before the +- callback function is called. When `ntfw' finally returns the +- current directory is restored to its original value. +- +- `FTW_DEPTH' +- If this option is specified then all subdirectories and files +- within them are processed before processing the top directory +- itself (depth-first processing). This also means the type +- flag given to the callback function is `FTW_DP' and not +- `FTW_D'. +- +- The return value is computed in the same way as for `ftw'. `nftw' +- returns 0 if no failures occurred and all callback functions +- returned 0. In case of internal errors, such as memory problems, +- the return value is -1 and ERRNO is set accordingly. If the +- return value of a callback invocation was non-zero then that value +- is returned. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a +- 32-bit system this function is in fact `nftw64', i.e. the LFS +- interface transparently replaces the old interface. +- +- - Function: int nftw64 (const char *FILENAME, __nftw64_func_t FUNC, +- int DESCRIPTORS, int FLAG) +- This function is similar to `nftw' but it can work on filesystems +- with large files. File information is reported using a variable +- of type `struct stat64' which is passed by reference to the +- callback function. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a +- 32-bit system this function is available under the name `nftw' and +- transparently replaces the old implementation. +- +- +-File: libc.info, Node: Hard Links, Next: Symbolic Links, Prev: Working with Directory Trees, Up: File System Interface +- +-Hard Links +-========== +- +- In POSIX systems, one file can have many names at the same time. +-All of the names are equally real, and no one of them is preferred to +-the others. +- +- To add a name to a file, use the `link' function. (The new name is +-also called a "hard link" to the file.) Creating a new link to a file +-does not copy the contents of the file; it simply makes a new name by +-which the file can be known, in addition to the file's existing name or +-names. +- +- One file can have names in several directories, so the organization +-of the file system is not a strict hierarchy or tree. +- +- In most implementations, it is not possible to have hard links to the +-same file in multiple file systems. `link' reports an error if you try +-to make a hard link to the file from another file system when this +-cannot be done. +- +- The prototype for the `link' function is declared in the header file +-`unistd.h'. +- +- - Function: int link (const char *OLDNAME, const char *NEWNAME) +- The `link' function makes a new link to the existing file named by +- OLDNAME, under the new name NEWNAME. +- +- This function returns a value of `0' if it is successful and `-1' +- on failure. In addition to the usual file name errors (*note File +- Name Errors::) for both OLDNAME and NEWNAME, the following `errno' +- error conditions are defined for this function: +- +- `EACCES' +- You are not allowed to write to the directory in which the +- new link is to be written. +- +- `EEXIST' +- There is already a file named NEWNAME. If you want to replace +- this link with a new link, you must remove the old link +- explicitly first. +- +- `EMLINK' +- There are already too many links to the file named by OLDNAME. +- (The maximum number of links to a file is `LINK_MAX'; see +- *Note Limits for Files::.) +- +- `ENOENT' +- The file named by OLDNAME doesn't exist. You can't make a +- link to a file that doesn't exist. +- +- `ENOSPC' +- The directory or file system that would contain the new link +- is full and cannot be extended. +- +- `EPERM' +- In the GNU system and some others, you cannot make links to +- directories. Many systems allow only privileged users to do +- so. This error is used to report the problem. +- +- `EROFS' +- The directory containing the new link can't be modified +- because it's on a read-only file system. +- +- `EXDEV' +- The directory specified in NEWNAME is on a different file +- system than the existing file. +- +- `EIO' +- A hardware error occurred while trying to read or write the +- to filesystem. +- +- +-File: libc.info, Node: Symbolic Links, Next: Deleting Files, Prev: Hard Links, Up: File System Interface +- +-Symbolic Links +-============== +- +- The GNU system supports "soft links" or "symbolic links". This is a +-kind of "file" that is essentially a pointer to another file name. +-Unlike hard links, symbolic links can be made to directories or across +-file systems with no restrictions. You can also make a symbolic link +-to a name which is not the name of any file. (Opening this link will +-fail until a file by that name is created.) Likewise, if the symbolic +-link points to an existing file which is later deleted, the symbolic +-link continues to point to the same file name even though the name no +-longer names any file. +- +- The reason symbolic links work the way they do is that special things +-happen when you try to open the link. The `open' function realizes you +-have specified the name of a link, reads the file name contained in the +-link, and opens that file name instead. The `stat' function likewise +-operates on the file that the symbolic link points to, instead of on +-the link itself. +- +- By contrast, other operations such as deleting or renaming the file +-operate on the link itself. The functions `readlink' and `lstat' also +-refrain from following symbolic links, because their purpose is to +-obtain information about the link. `link', the function that makes a +-hard link, does too. It makes a hard link to the symbolic link, which +-one rarely wants. +- +- Some systems have for some functions operating on files have a limit +-on how many symbolic links are followed when resolving a path name. The +-limit if it exists is published in the `sys/param.h' header file. +- +- - Macro: int MAXSYMLINKS +- The macro `MAXSYMLINKS' specifies how many symlinks some function +- will follow before returning `ELOOP'. Not all functions behave the +- same and this value is not the same a that returned for +- `_SC_SYMLOOP' by `sysconf'. In fact, the `sysconf' result can +- indicate that there is no fixed limit although `MAXSYMLINKS' +- exists and has a finite value. +- +- Prototypes for most of the functions listed in this section are in +-`unistd.h'. +- +- - Function: int symlink (const char *OLDNAME, const char *NEWNAME) +- The `symlink' function makes a symbolic link to OLDNAME named +- NEWNAME. +- +- The normal return value from `symlink' is `0'. A return value of +- `-1' indicates an error. In addition to the usual file name +- syntax errors (*note File Name Errors::), the following `errno' +- error conditions are defined for this function: +- +- `EEXIST' +- There is already an existing file named NEWNAME. +- +- `EROFS' +- The file NEWNAME would exist on a read-only file system. +- +- `ENOSPC' +- The directory or file system cannot be extended to make the +- new link. +- +- `EIO' +- A hardware error occurred while reading or writing data on +- the disk. +- +- +- - Function: int readlink (const char *FILENAME, char *BUFFER, size_t +- SIZE) +- The `readlink' function gets the value of the symbolic link +- FILENAME. The file name that the link points to is copied into +- BUFFER. This file name string is _not_ null-terminated; +- `readlink' normally returns the number of characters copied. The +- SIZE argument specifies the maximum number of characters to copy, +- usually the allocation size of BUFFER. +- +- If the return value equals SIZE, you cannot tell whether or not +- there was room to return the entire name. So make a bigger buffer +- and call `readlink' again. Here is an example: +- +- char * +- readlink_malloc (const char *filename) +- { +- int size = 100; +- char *buffer = NULL; +- +- while (1) +- { +- buffer = (char *) xrealloc (buffer, size); +- int nchars = readlink (filename, buffer, size); +- if (nchars < 0) +- { +- free (buffer); +- return NULL; +- } +- if (nchars < size) +- return buffer; +- size *= 2; +- } +- } +- +- A value of `-1' is returned in case of error. In addition to the +- usual file name errors (*note File Name Errors::), the following +- `errno' error conditions are defined for this function: +- +- `EINVAL' +- The named file is not a symbolic link. +- +- `EIO' +- A hardware error occurred while reading or writing data on +- the disk. +- +- In some situations it is desirable to resolve all the symbolic links +-to get the real name of a file where no prefix names a symbolic link +-which is followed and no filename in the path is `.' or `..'. This is +-for instance desirable if files have to be compare in which case +-different names can refer to the same inode. +- +- - Function: char * canonicalize_file_name (const char *NAME) +- The `canonicalize_file_name' function returns the absolute name of +- the file named by NAME which contains no `.', `..' components nor +- any repeated path separators (`/') or symlinks. The result is +- passed back as the return value of the function in a block of +- memory allocated with `malloc'. If the result is not used anymore +- the memory should be freed with a call to `free'. +- +- In any of the path components except the last one is missing the +- function returns a NULL pointer. This is also what is returned if +- the length of the path reaches or exceeds `PATH_MAX' characters. +- In any case `errno' is set accordingly. +- +- `ENAMETOOLONG' +- The resulting path is too long. This error only occurs on +- systems which have a limit on the file name length. +- +- `EACCES' +- At least one of the path components is not readable. +- +- `ENOENT' +- The input file name is empty. +- +- `ENOENT' +- At least one of the path components does not exist. +- +- `ELOOP' +- More than `MAXSYMLINKS' many symlinks have been followed. +- +- This function is a GNU extension and is declared in `stdlib.h'. +- +- The Unix standard includes a similar function which differs from +-`canonicalize_file_name' in that the user has to provide the buffer +-where the result is placed in. +- +- - Function: char * realpath (const char *restrict NAME, char *restrict +- RESOLVED) +- A call to `realpath' where the RESOLVED parameter is `NULL' +- behaves exactly like `canonicalize_file_name'. The function +- allocates a buffer for the file name and returns a pointer to it. +- If RESOLVED is not `NULL' it points to a buffer into which the +- result is copied. It is the callers responsibility to allocate a +- buffer which is large enough. On systems which define `PATH_MAX' +- this means the buffer must be large enough for a pathname of this +- size. For systems without limitations on the pathname length the +- requirement cannot be met and programs should not call `realpath' +- with anything but `NULL' for the second parameter. +- +- One other difference is that the buffer RESOLVED (if nonzero) will +- contain the part of the path component which does not exist or is +- not readable if the function returns `NULL' and `errno' is set to +- `EACCES' or `ENOENT'. +- +- This function is declared in `stdlib.h'. +- +- The advantage of using this function is that it is more widely +-available. The drawback is that it reports failures for long path on +-systems which have no limits on the file name length. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-25 glibc-2.3.2-200304020432/manual/libc.info-25 +--- glibc-2.3.2/manual/libc.info-25 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-25 Thu Jan 1 01:00:00 1970 +@@ -1,1163 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Deleting Files, Next: Renaming Files, Prev: Symbolic Links, Up: File System Interface +- +-Deleting Files +-============== +- +- You can delete a file with `unlink' or `remove'. +- +- Deletion actually deletes a file name. If this is the file's only +-name, then the file is deleted as well. If the file has other +-remaining names (*note Hard Links::), it remains accessible under those +-names. +- +- - Function: int unlink (const char *FILENAME) +- The `unlink' function deletes the file name FILENAME. If this is +- a file's sole name, the file itself is also deleted. (Actually, +- if any process has the file open when this happens, deletion is +- postponed until all processes have closed the file.) +- +- The function `unlink' is declared in the header file `unistd.h'. +- +- This function returns `0' on successful completion, and `-1' on +- error. In addition to the usual file name errors (*note File Name +- Errors::), the following `errno' error conditions are defined for +- this function: +- +- `EACCES' +- Write permission is denied for the directory from which the +- file is to be removed, or the directory has the sticky bit +- set and you do not own the file. +- +- `EBUSY' +- This error indicates that the file is being used by the +- system in such a way that it can't be unlinked. For example, +- you might see this error if the file name specifies the root +- directory or a mount point for a file system. +- +- `ENOENT' +- The file name to be deleted doesn't exist. +- +- `EPERM' +- On some systems `unlink' cannot be used to delete the name of +- a directory, or at least can only be used this way by a +- privileged user. To avoid such problems, use `rmdir' to +- delete directories. (In the GNU system `unlink' can never +- delete the name of a directory.) +- +- `EROFS' +- The directory containing the file name to be deleted is on a +- read-only file system and can't be modified. +- +- - Function: int rmdir (const char *FILENAME) +- The `rmdir' function deletes a directory. The directory must be +- empty before it can be removed; in other words, it can only contain +- entries for `.' and `..'. +- +- In most other respects, `rmdir' behaves like `unlink'. There are +- two additional `errno' error conditions defined for `rmdir': +- +- `ENOTEMPTY' +- `EEXIST' +- The directory to be deleted is not empty. +- +- These two error codes are synonymous; some systems use one, and +- some use the other. The GNU system always uses `ENOTEMPTY'. +- +- The prototype for this function is declared in the header file +- `unistd.h'. +- +- - Function: int remove (const char *FILENAME) +- This is the ISO C function to remove a file. It works like +- `unlink' for files and like `rmdir' for directories. `remove' is +- declared in `stdio.h'. +- +- +-File: libc.info, Node: Renaming Files, Next: Creating Directories, Prev: Deleting Files, Up: File System Interface +- +-Renaming Files +-============== +- +- The `rename' function is used to change a file's name. +- +- - Function: int rename (const char *OLDNAME, const char *NEWNAME) +- The `rename' function renames the file OLDNAME to NEWNAME. The +- file formerly accessible under the name OLDNAME is afterwards +- accessible as NEWNAME instead. (If the file had any other names +- aside from OLDNAME, it continues to have those names.) +- +- The directory containing the name NEWNAME must be on the same file +- system as the directory containing the name OLDNAME. +- +- One special case for `rename' is when OLDNAME and NEWNAME are two +- names for the same file. The consistent way to handle this case +- is to delete OLDNAME. However, in this case POSIX requires that +- `rename' do nothing and report success--which is inconsistent. We +- don't know what your operating system will do. +- +- If OLDNAME is not a directory, then any existing file named +- NEWNAME is removed during the renaming operation. However, if +- NEWNAME is the name of a directory, `rename' fails in this case. +- +- If OLDNAME is a directory, then either NEWNAME must not exist or +- it must name a directory that is empty. In the latter case, the +- existing directory named NEWNAME is deleted first. The name +- NEWNAME must not specify a subdirectory of the directory `oldname' +- which is being renamed. +- +- One useful feature of `rename' is that the meaning of NEWNAME +- changes "atomically" from any previously existing file by that +- name to its new meaning (i.e. the file that was called OLDNAME). +- There is no instant at which 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 NEWNAME will always be intact if it exists at all. +- +- If `rename' fails, it returns `-1'. In addition to the usual file +- name errors (*note File Name Errors::), the following `errno' +- error conditions are defined for this function: +- +- `EACCES' +- One of the directories containing NEWNAME or OLDNAME refuses +- write permission; or NEWNAME and OLDNAME are directories and +- write permission is refused for one of them. +- +- `EBUSY' +- A directory named by OLDNAME or NEWNAME is being used by the +- system in a way that prevents the renaming from working. +- This includes directories that are mount points for +- filesystems, and directories that are the current working +- directories of processes. +- +- `ENOTEMPTY' +- `EEXIST' +- The directory NEWNAME isn't empty. The GNU system always +- returns `ENOTEMPTY' for this, but some other systems return +- `EEXIST'. +- +- `EINVAL' +- OLDNAME is a directory that contains NEWNAME. +- +- `EISDIR' +- NEWNAME is a directory but the OLDNAME isn't. +- +- `EMLINK' +- The parent directory of NEWNAME would have too many links +- (entries). +- +- `ENOENT' +- The file OLDNAME doesn't exist. +- +- `ENOSPC' +- The directory that would contain NEWNAME has no room for +- another entry, and there is no space left in the file system +- to expand it. +- +- `EROFS' +- The operation would involve writing to a directory on a +- read-only file system. +- +- `EXDEV' +- The two file names NEWNAME and OLDNAME are on different file +- systems. +- +- +-File: libc.info, Node: Creating Directories, Next: File Attributes, Prev: Renaming Files, Up: File System Interface +- +-Creating Directories +-==================== +- +- Directories are created with the `mkdir' function. (There is also a +-shell command `mkdir' which does the same thing.) +- +- - Function: int mkdir (const char *FILENAME, mode_t MODE) +- The `mkdir' function creates a new, empty directory with name +- FILENAME. +- +- The argument MODE specifies the file permissions for the new +- directory file. *Note Permission Bits::, for more information +- about this. +- +- A return value of `0' indicates successful completion, and `-1' +- indicates failure. In addition to the usual file name syntax +- errors (*note File Name Errors::), the following `errno' error +- conditions are defined for this function: +- +- `EACCES' +- Write permission is denied for the parent directory in which +- the new directory is to be added. +- +- `EEXIST' +- A file named FILENAME already exists. +- +- `EMLINK' +- The parent directory has too many links (entries). +- +- Well-designed file systems never report this error, because +- they permit more links than your disk could possibly hold. +- However, you must still take account of the possibility of +- this error, as it could result from network access to a file +- system on another machine. +- +- `ENOSPC' +- The file system doesn't have enough room to create the new +- directory. +- +- `EROFS' +- The parent directory of the directory being created is on a +- read-only file system and cannot be modified. +- +- To use this function, your program should include the header file +- `sys/stat.h'. +- +- +-File: libc.info, Node: File Attributes, Next: Making Special Files, Prev: Creating Directories, Up: File System Interface +- +-File Attributes +-=============== +- +- When you issue an `ls -l' shell command on a file, it gives you +-information about the size of the file, who owns it, when it was last +-modified, etc. These are called the "file attributes", and are +-associated with the file itself and not a particular one of its names. +- +- This section contains information about how you can inquire about and +-modify the attributes of a file. +- +-* Menu: +- +-* Attribute Meanings:: The names of the file attributes, +- and what their values mean. +-* Reading Attributes:: How to read the attributes of a file. +-* Testing File Type:: Distinguishing ordinary files, +- directories, links... +-* File Owner:: How ownership for new files is determined, +- and how to change it. +-* Permission Bits:: How information about a file's access +- mode is stored. +-* Access Permission:: How the system decides who can access a file. +-* Setting Permissions:: How permissions for new files are assigned, +- and how to change them. +-* Testing File Access:: How to find out if your process can +- access a file. +-* File Times:: About the time attributes of a file. +-* File Size:: Manually changing the size of a file. +- +- +-File: libc.info, Node: Attribute Meanings, Next: Reading Attributes, Up: File Attributes +- +-The meaning of the File Attributes +----------------------------------- +- +- When you read the attributes of a file, they come back in a structure +-called `struct stat'. This section describes the names of the +-attributes, their data types, and what they mean. For the functions to +-read the attributes of a file, see *Note Reading Attributes::. +- +- The header file `sys/stat.h' declares all the symbols defined in +-this section. +- +- - Data Type: struct stat +- The `stat' structure type is used to return information about the +- attributes of a file. It contains at least the following members: +- +- `mode_t st_mode' +- Specifies the mode of the file. This includes file type +- information (*note Testing File Type::) and the file +- permission bits (*note Permission Bits::). +- +- `ino_t st_ino' +- The file serial number, which distinguishes this file from +- all other files on the same device. +- +- `dev_t st_dev' +- Identifies the device containing the file. The `st_ino' and +- `st_dev', taken together, uniquely identify the file. The +- `st_dev' value is not necessarily consistent across reboots or +- system crashes, however. +- +- `nlink_t st_nlink' +- The number of hard links to the file. This count keeps track +- of how many directories have entries for this file. If the +- count is ever decremented to zero, then the file itself is +- discarded as soon as no process still holds it open. +- Symbolic links are not counted in the total. +- +- `uid_t st_uid' +- The user ID of the file's owner. *Note File Owner::. +- +- `gid_t st_gid' +- The group ID of the file. *Note File Owner::. +- +- `off_t st_size' +- This specifies the size of a regular file in bytes. For +- files that are really devices this field isn't usually +- meaningful. For symbolic links this specifies the length of +- the file name the link refers to. +- +- `time_t st_atime' +- This is the last access time for the file. *Note File +- Times::. +- +- `unsigned long int st_atime_usec' +- This is the fractional part of the last access time for the +- file. *Note File Times::. +- +- `time_t st_mtime' +- This is the time of the last modification to the contents of +- the file. *Note File Times::. +- +- `unsigned long int st_mtime_usec' +- This is the fractional part of the time of the last +- modification to the contents of the file. *Note File Times::. +- +- `time_t st_ctime' +- This is the time of the last modification to the attributes +- of the file. *Note File Times::. +- +- `unsigned long int st_ctime_usec' +- This is the fractional part of the time of the last +- modification to the attributes of the file. *Note File +- Times::. +- +- `blkcnt_t st_blocks' +- This is the amount of disk space that the file occupies, +- measured in units of 512-byte blocks. +- +- The number of disk blocks is not strictly proportional to the +- size of the file, for two reasons: the file system may use +- some blocks for internal record keeping; and the file may be +- sparse--it may have "holes" which contain zeros but do not +- actually take up space on the disk. +- +- You can tell (approximately) whether a file is sparse by +- comparing this value with `st_size', like this: +- +- (st.st_blocks * 512 < st.st_size) +- +- This test is not perfect because a file that is just slightly +- sparse might not be detected as sparse at all. For practical +- applications, this is not a problem. +- +- `unsigned int st_blksize' +- The optimal block size for reading of writing this file, in +- bytes. You might use this size for allocating the buffer +- space for reading of writing the file. (This is unrelated to +- `st_blocks'.) +- +- The extensions for the Large File Support (LFS) require, even on +-32-bit machines, types which can handle file sizes up to 2^63. +-Therefore a new definition of `struct stat' is necessary. +- +- - Data Type: struct stat64 +- The members of this type are the same and have the same names as +- those in `struct stat'. The only difference is that the members +- `st_ino', `st_size', and `st_blocks' have a different type to +- support larger values. +- +- `mode_t st_mode' +- Specifies the mode of the file. This includes file type +- information (*note Testing File Type::) and the file +- permission bits (*note Permission Bits::). +- +- `ino64_t st_ino' +- The file serial number, which distinguishes this file from +- all other files on the same device. +- +- `dev_t st_dev' +- Identifies the device containing the file. The `st_ino' and +- `st_dev', taken together, uniquely identify the file. The +- `st_dev' value is not necessarily consistent across reboots or +- system crashes, however. +- +- `nlink_t st_nlink' +- The number of hard links to the file. This count keeps track +- of how many directories have entries for this file. If the +- count is ever decremented to zero, then the file itself is +- discarded as soon as no process still holds it open. +- Symbolic links are not counted in the total. +- +- `uid_t st_uid' +- The user ID of the file's owner. *Note File Owner::. +- +- `gid_t st_gid' +- The group ID of the file. *Note File Owner::. +- +- `off64_t st_size' +- This specifies the size of a regular file in bytes. For +- files that are really devices this field isn't usually +- meaningful. For symbolic links this specifies the length of +- the file name the link refers to. +- +- `time_t st_atime' +- This is the last access time for the file. *Note File +- Times::. +- +- `unsigned long int st_atime_usec' +- This is the fractional part of the last access time for the +- file. *Note File Times::. +- +- `time_t st_mtime' +- This is the time of the last modification to the contents of +- the file. *Note File Times::. +- +- `unsigned long int st_mtime_usec' +- This is the fractional part of the time of the last +- modification to the contents of the file. *Note File Times::. +- +- `time_t st_ctime' +- This is the time of the last modification to the attributes +- of the file. *Note File Times::. +- +- `unsigned long int st_ctime_usec' +- This is the fractional part of the time of the last +- modification to the attributes of the file. *Note File +- Times::. +- +- `blkcnt64_t st_blocks' +- This is the amount of disk space that the file occupies, +- measured in units of 512-byte blocks. +- +- `unsigned int st_blksize' +- The optimal block size for reading of writing this file, in +- bytes. You might use this size for allocating the buffer +- space for reading of writing the file. (This is unrelated to +- `st_blocks'.) +- +- Some of the file attributes have special data type names which exist +-specifically for those attributes. (They are all aliases for well-known +-integer types that you know and love.) These typedef names are defined +-in the header file `sys/types.h' as well as in `sys/stat.h'. Here is a +-list of them. +- +- - Data Type: mode_t +- This is an integer data type used to represent file modes. In the +- GNU system, this is equivalent to `unsigned int'. +- +- - Data Type: ino_t +- This is an arithmetic data type used to represent file serial +- numbers. (In Unix jargon, these are sometimes called "inode +- numbers".) In the GNU system, this type is equivalent to +- `unsigned long int'. +- +- If the source is compiled with `_FILE_OFFSET_BITS == 64' this type +- is transparently replaced by `ino64_t'. +- +- - Data Type: ino64_t +- This is an arithmetic data type used to represent file serial +- numbers for the use in LFS. In the GNU system, this type is +- equivalent to `unsigned long longint'. +- +- When compiling with `_FILE_OFFSET_BITS == 64' this type is +- available under the name `ino_t'. +- +- - Data Type: dev_t +- This is an arithmetic data type used to represent file device +- numbers. In the GNU system, this is equivalent to `int'. +- +- - Data Type: nlink_t +- This is an arithmetic data type used to represent file link counts. +- In the GNU system, this is equivalent to `unsigned short int'. +- +- - Data Type: blkcnt_t +- This is an arithmetic data type used to represent block counts. +- In the GNU system, this is equivalent to `unsigned long int'. +- +- If the source is compiled with `_FILE_OFFSET_BITS == 64' this type +- is transparently replaced by `blkcnt64_t'. +- +- - Data Type: blkcnt64_t +- This is an arithmetic data type used to represent block counts for +- the use in LFS. In the GNU system, this is equivalent to `unsigned +- long long int'. +- +- When compiling with `_FILE_OFFSET_BITS == 64' this type is +- available under the name `blkcnt_t'. +- +- +-File: libc.info, Node: Reading Attributes, Next: Testing File Type, Prev: Attribute Meanings, Up: File Attributes +- +-Reading the Attributes of a File +--------------------------------- +- +- To examine the attributes of files, use the functions `stat', +-`fstat' and `lstat'. They return the attribute information in a +-`struct stat' object. All three functions are declared in the header +-file `sys/stat.h'. +- +- - Function: int stat (const char *FILENAME, struct stat *BUF) +- The `stat' function returns information about the attributes of the +- file named by FILENAME in the structure pointed to by BUF. +- +- If FILENAME is the name of a symbolic link, the attributes you get +- describe the file that the link points to. If the link points to a +- nonexistent file name, then `stat' fails reporting a nonexistent +- file. +- +- The return value is `0' if the operation is successful, or `-1' on +- failure. In addition to the usual file name errors (*note File +- Name Errors::, the following `errno' error conditions are defined +- for this function: +- +- `ENOENT' +- The file named by FILENAME doesn't exist. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' this +- function is in fact `stat64' since the LFS interface transparently +- replaces the normal implementation. +- +- - Function: int stat64 (const char *FILENAME, struct stat64 *BUF) +- This function is similar to `stat' but it is also able to work on +- files larger then 2^31 bytes on 32-bit systems. To be able to do +- this the result is stored in a variable of type `struct stat64' to +- which BUF must point. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' this +- function is available under the name `stat' and so transparently +- replaces the interface for small files on 32-bit machines. +- +- - Function: int fstat (int FILEDES, struct stat *BUF) +- The `fstat' function is like `stat', except that it takes an open +- file descriptor as an argument instead of a file name. *Note +- Low-Level I/O::. +- +- Like `stat', `fstat' returns `0' on success and `-1' on failure. +- The following `errno' error conditions are defined for `fstat': +- +- `EBADF' +- The FILEDES argument is not a valid file descriptor. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' this +- function is in fact `fstat64' since the LFS interface transparently +- replaces the normal implementation. +- +- - Function: int fstat64 (int FILEDES, struct stat64 *BUF) +- This function is similar to `fstat' but is able to work on large +- files on 32-bit platforms. For large files the file descriptor +- FILEDES should be obtained by `open64' or `creat64'. The BUF +- pointer points to a variable of type `struct stat64' which is able +- to represent the larger values. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' this +- function is available under the name `fstat' and so transparently +- replaces the interface for small files on 32-bit machines. +- +- - Function: int lstat (const char *FILENAME, struct stat *BUF) +- The `lstat' function is like `stat', except that it does not +- follow symbolic links. If FILENAME is the name of a symbolic +- link, `lstat' returns information about the link itself; otherwise +- `lstat' works like `stat'. *Note Symbolic Links::. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' this +- function is in fact `lstat64' since the LFS interface transparently +- replaces the normal implementation. +- +- - Function: int lstat64 (const char *FILENAME, struct stat64 *BUF) +- This function is similar to `lstat' but it is also able to work on +- files larger then 2^31 bytes on 32-bit systems. To be able to do +- this the result is stored in a variable of type `struct stat64' to +- which BUF must point. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' this +- function is available under the name `lstat' and so transparently +- replaces the interface for small files on 32-bit machines. +- +- +-File: libc.info, Node: Testing File Type, Next: File Owner, Prev: Reading Attributes, Up: File Attributes +- +-Testing the Type of a File +--------------------------- +- +- The "file mode", stored in the `st_mode' field of the file +-attributes, contains two kinds of information: the file type code, and +-the access permission bits. This section discusses only the type code, +-which you can use to tell whether the file is a directory, socket, +-symbolic link, and so on. For details about access permissions see +-*Note Permission Bits::. +- +- There are two ways you can access the file type information in a file +-mode. Firstly, for each file type there is a "predicate macro" which +-examines a given file mode and returns whether it is of that type or +-not. Secondly, you can mask out the rest of the file mode to leave +-just the file type code, and compare this against constants for each of +-the supported file types. +- +- All of the symbols listed in this section are defined in the header +-file `sys/stat.h'. +- +- The following predicate macros test the type of a file, given the +-value M which is the `st_mode' field returned by `stat' on that file: +- +- - Macro: int S_ISDIR (mode_t M) +- This macro returns non-zero if the file is a directory. +- +- - Macro: int S_ISCHR (mode_t M) +- This macro returns non-zero if the file is a character special +- file (a device like a terminal). +- +- - Macro: int S_ISBLK (mode_t M) +- This macro returns non-zero if the file is a block special file (a +- device like a disk). +- +- - Macro: int S_ISREG (mode_t M) +- This macro returns non-zero if the file is a regular file. +- +- - Macro: int S_ISFIFO (mode_t M) +- This macro returns non-zero if the file is a FIFO special file, or +- a pipe. *Note Pipes and FIFOs::. +- +- - Macro: int S_ISLNK (mode_t M) +- This macro returns non-zero if the file is a symbolic link. *Note +- Symbolic Links::. +- +- - Macro: int S_ISSOCK (mode_t M) +- This macro returns non-zero if the file is a socket. *Note +- Sockets::. +- +- An alternate non-POSIX method of testing the file type is supported +-for compatibility with BSD. The mode can be bitwise AND-ed with +-`S_IFMT' to extract the file type code, and compared to the appropriate +-constant. For example, +- +- S_ISCHR (MODE) +- +-is equivalent to: +- +- ((MODE & S_IFMT) == S_IFCHR) +- +- - Macro: int S_IFMT +- This is a bit mask used to extract the file type code from a mode +- value. +- +- These are the symbolic names for the different file type codes: +- +-`S_IFDIR' +- This is the file type constant of a directory file. +- +-`S_IFCHR' +- This is the file type constant of a character-oriented device file. +- +-`S_IFBLK' +- This is the file type constant of a block-oriented device file. +- +-`S_IFREG' +- This is the file type constant of a regular file. +- +-`S_IFLNK' +- This is the file type constant of a symbolic link. +- +-`S_IFSOCK' +- This is the file type constant of a socket. +- +-`S_IFIFO' +- This is the file type constant of a FIFO or pipe. +- +- The POSIX.1b standard introduced a few more objects which possibly +-can be implemented as object in the filesystem. These are message +-queues, semaphores, and shared memory objects. To allow +-differentiating these objects from other files the POSIX standard +-introduces three new test macros. But unlike the other macros it does +-not take the value of the `st_mode' field as the parameter. Instead +-they expect a pointer to the whole `struct stat' structure. +- +- - Macro: int S_TYPEISMQ (struct stat *S) +- If the system implement POSIX message queues as distinct objects +- and the file is a message queue object, this macro returns a +- non-zero value. In all other cases the result is zero. +- +- - Macro: int S_TYPEISSEM (struct stat *S) +- If the system implement POSIX semaphores as distinct objects and +- the file is a semaphore object, this macro returns a non-zero +- value. In all other cases the result is zero. +- +- - Macro: int S_TYPEISSHM (struct stat *S) +- If the system implement POSIX shared memory objects as distinct +- objects and the file is an shared memory object, this macro +- returns a non-zero value. In all other cases the result is zero. +- +- +-File: libc.info, Node: File Owner, Next: Permission Bits, Prev: Testing File Type, Up: File Attributes +- +-File Owner +----------- +- +- Every file has an "owner" which is one of the registered user names +-defined on the system. Each file also has a "group" which is one of +-the defined groups. The file owner can often be useful for showing you +-who edited the file (especially when you edit with GNU Emacs), but its +-main purpose is for access control. +- +- The file owner and group play a role in determining access because +-the file has one set of access permission bits for the owner, another +-set that applies to users who belong to the file's group, and a third +-set of bits that applies to everyone else. *Note Access Permission::, +-for the details of how access is decided based on this data. +- +- When a file is created, its owner is set to the effective user ID of +-the process that creates it (*note Process Persona::). The file's +-group ID may be set to either the effective group ID of the process, or +-the group ID of the directory that contains the file, depending on the +-system where the file is stored. When you access a remote file system, +-it behaves according to its own rules, not according to the system your +-program is running on. Thus, your program must be prepared to encounter +-either kind of behavior no matter what kind of system you run it on. +- +- You can change the owner and/or group owner of an existing file using +-the `chown' function. This is the primitive for the `chown' and +-`chgrp' shell commands. +- +- The prototype for this function is declared in `unistd.h'. +- +- - Function: int chown (const char *FILENAME, uid_t OWNER, gid_t GROUP) +- The `chown' function changes the owner of the file FILENAME to +- OWNER, and its group owner to GROUP. +- +- Changing the owner of the file on certain systems clears the +- set-user-ID and set-group-ID permission bits. (This is because +- those bits may not be appropriate for the new owner.) Other file +- permission bits are not changed. +- +- The return value is `0' on success and `-1' on failure. In +- addition to the usual file name errors (*note File Name Errors::), +- the following `errno' error conditions are defined for this +- function: +- +- `EPERM' +- This process lacks permission to make the requested change. +- +- Only privileged users or the file's owner can change the +- file's group. On most file systems, only privileged users +- can change the file owner; some file systems allow you to +- change the owner if you are currently the owner. When you +- access a remote file system, the behavior you encounter is +- determined by the system that actually holds the file, not by +- the system your program is running on. +- +- *Note Options for Files::, for information about the +- `_POSIX_CHOWN_RESTRICTED' macro. +- +- `EROFS' +- The file is on a read-only file system. +- +- - Function: int fchown (int FILEDES, int OWNER, int GROUP) +- This is like `chown', except that it changes the owner of the open +- file with descriptor FILEDES. +- +- The return value from `fchown' is `0' on success and `-1' on +- failure. The following `errno' error codes are defined for this +- function: +- +- `EBADF' +- The FILEDES argument is not a valid file descriptor. +- +- `EINVAL' +- The FILEDES argument corresponds to a pipe or socket, not an +- ordinary file. +- +- `EPERM' +- This process lacks permission to make the requested change. +- For details see `chmod' above. +- +- `EROFS' +- The file resides on a read-only file system. +- +- +-File: libc.info, Node: Permission Bits, Next: Access Permission, Prev: File Owner, Up: File Attributes +- +-The Mode Bits for Access Permission +------------------------------------ +- +- The "file mode", stored in the `st_mode' field of the file +-attributes, contains two kinds of information: the file type code, and +-the access permission bits. This section discusses only the access +-permission bits, which control who can read or write the file. *Note +-Testing File Type::, for information about the file type code. +- +- All of the symbols listed in this section are defined in the header +-file `sys/stat.h'. +- +- These symbolic constants are defined for the file mode bits that +-control access permission for the file: +- +-`S_IRUSR' +-`S_IREAD' +- Read permission bit for the owner of the file. On many systems +- this bit is 0400. `S_IREAD' is an obsolete synonym provided for +- BSD compatibility. +- +-`S_IWUSR' +-`S_IWRITE' +- Write permission bit for the owner of the file. Usually 0200. +- `S_IWRITE' is an obsolete synonym provided for BSD compatibility. +- +-`S_IXUSR' +-`S_IEXEC' +- Execute (for ordinary files) or search (for directories) +- permission bit for the owner of the file. Usually 0100. +- `S_IEXEC' is an obsolete synonym provided for BSD compatibility. +- +-`S_IRWXU' +- This is equivalent to `(S_IRUSR | S_IWUSR | S_IXUSR)'. +- +-`S_IRGRP' +- Read permission bit for the group owner of the file. Usually 040. +- +-`S_IWGRP' +- Write permission bit for the group owner of the file. Usually 020. +- +-`S_IXGRP' +- Execute or search permission bit for the group owner of the file. +- Usually 010. +- +-`S_IRWXG' +- This is equivalent to `(S_IRGRP | S_IWGRP | S_IXGRP)'. +- +-`S_IROTH' +- Read permission bit for other users. Usually 04. +- +-`S_IWOTH' +- Write permission bit for other users. Usually 02. +- +-`S_IXOTH' +- Execute or search permission bit for other users. Usually 01. +- +-`S_IRWXO' +- This is equivalent to `(S_IROTH | S_IWOTH | S_IXOTH)'. +- +-`S_ISUID' +- This is the set-user-ID on execute bit, usually 04000. *Note How +- Change Persona::. +- +-`S_ISGID' +- This is the set-group-ID on execute bit, usually 02000. *Note How +- Change Persona::. +- +-`S_ISVTX' +- This is the "sticky" bit, usually 01000. +- +- For a directory it gives permission to delete a file in that +- directory only if you own that file. Ordinarily, a user can +- either delete all the files in a directory or cannot delete any of +- them (based on whether the user has write permission for the +- directory). The same restriction applies--you must have both +- write permission for the directory and own the file you want to +- delete. The one exception is that the owner of the directory can +- delete any file in the directory, no matter who owns it (provided +- the owner has given himself write permission for the directory). +- This is commonly used for the `/tmp' directory, where anyone may +- create files but not delete files created by other users. +- +- Originally the sticky bit on an executable file modified the +- swapping policies of the system. Normally, when a program +- terminated, its pages in core were immediately freed and reused. +- If the sticky bit was set on the executable file, the system kept +- the pages in core for a while as if the program were still +- running. This was advantageous for a program likely to be run +- many times in succession. This usage is obsolete in modern +- systems. When a program terminates, its pages always remain in +- core as long as there is no shortage of memory in the system. +- When the program is next run, its pages will still be in core if +- no shortage arose since the last run. +- +- On some modern systems where the sticky bit has no useful meaning +- for an executable file, you cannot set the bit at all for a +- non-directory. If you try, `chmod' fails with `EFTYPE'; *note +- Setting Permissions::. +- +- Some systems (particularly SunOS) have yet another use for the +- sticky bit. If the sticky bit is set on a file that is _not_ +- executable, it means the opposite: never cache the pages of this +- file at all. The main use of this is for the files on an NFS +- server machine which are used as the swap area of diskless client +- machines. The idea is that the pages of the file will be cached +- in the client's memory, so it is a waste of the server's memory to +- cache them a second time. With this usage the sticky bit also +- implies that the filesystem may fail to record the file's +- modification time onto disk reliably (the idea being that no-one +- cares for a swap file). +- +- This bit is only available on BSD systems (and those derived from +- them). Therefore one has to use the `_BSD_SOURCE' feature select +- macro to get the definition (*note Feature Test Macros::). +- +- The actual bit values of the symbols are listed in the table above +-so you can decode file mode values when debugging your programs. These +-bit values are correct for most systems, but they are not guaranteed. +- +- *Warning:* Writing explicit numbers for file permissions is bad +-practice. Not only is it not portable, it also requires everyone who +-reads your program to remember what the bits mean. To make your program +-clean use the symbolic names. +- +- +-File: libc.info, Node: Access Permission, Next: Setting Permissions, Prev: Permission Bits, Up: File Attributes +- +-How Your Access to a File is Decided +------------------------------------- +- +- Recall that the operating system normally decides access permission +-for a file based on the effective user and group IDs of the process and +-its supplementary group IDs, together with the file's owner, group and +-permission bits. These concepts are discussed in detail in *Note +-Process Persona::. +- +- If the effective user ID of the process matches the owner user ID of +-the file, then permissions for read, write, and execute/search are +-controlled by the corresponding "user" (or "owner") bits. Likewise, if +-any of the effective group ID or supplementary group IDs of the process +-matches the group owner ID of the file, then permissions are controlled +-by the "group" bits. Otherwise, permissions are controlled by the +-"other" bits. +- +- Privileged users, like `root', can access any file regardless of its +-permission bits. As a special case, for a file to be executable even +-by a privileged user, at least one of its execute bits must be set. +- +- +-File: libc.info, Node: Setting Permissions, Next: Testing File Access, Prev: Access Permission, Up: File Attributes +- +-Assigning File Permissions +--------------------------- +- +- The primitive functions for creating files (for example, `open' or +-`mkdir') take a MODE argument, which specifies the file permissions to +-give the newly created file. This mode is modified by the process's +-"file creation mask", or "umask", before it is used. +- +- The bits that are set in the file creation mask identify permissions +-that are always to be disabled for newly created files. For example, if +-you set all the "other" access bits in the mask, then newly created +-files are not accessible at all to processes in the "other" category, +-even if the MODE argument passed to the create function would permit +-such access. In other words, the file creation mask is the complement +-of the ordinary access permissions you want to grant. +- +- Programs that create files typically specify a MODE argument that +-includes all the permissions that make sense for the particular file. +-For an ordinary file, this is typically read and write permission for +-all classes of users. These permissions are then restricted as +-specified by the individual user's own file creation mask. +- +- To change the permission of an existing file given its name, call +-`chmod'. This function uses the specified permission bits and ignores +-the file creation mask. +- +- In normal use, the file creation mask is initialized by the user's +-login shell (using the `umask' shell command), and inherited by all +-subprocesses. Application programs normally don't need to worry about +-the file creation mask. It will automatically do what it is supposed to +-do. +- +- When your program needs to create a file and bypass the umask for its +-access permissions, the easiest way to do this is to use `fchmod' after +-opening the file, rather than changing the umask. In fact, changing +-the umask is usually done only by shells. They use the `umask' +-function. +- +- The functions in this section are declared in `sys/stat.h'. +- +- - Function: mode_t umask (mode_t MASK) +- The `umask' function sets the file creation mask of the current +- process to MASK, and returns the previous value of the file +- creation mask. +- +- Here is an example showing how to read the mask with `umask' +- without changing it permanently: +- +- mode_t +- read_umask (void) +- { +- mode_t mask = umask (0); +- umask (mask); +- return mask; +- } +- +- However, it is better to use `getumask' if you just want to read +- the mask value, because it is reentrant (at least if you use the +- GNU operating system). +- +- - Function: mode_t getumask (void) +- Return the current value of the file creation mask for the current +- process. This function is a GNU extension. +- +- - Function: int chmod (const char *FILENAME, mode_t MODE) +- The `chmod' function sets the access permission bits for the file +- named by FILENAME to MODE. +- +- If FILENAME is a symbolic link, `chmod' changes the permissions of +- the file pointed to by the link, not those of the link itself. +- +- This function returns `0' if successful and `-1' if not. In +- addition to the usual file name errors (*note File Name Errors::), +- the following `errno' error conditions are defined for this +- function: +- +- `ENOENT' +- The named file doesn't exist. +- +- `EPERM' +- This process does not have permission to change the access +- permissions of this file. Only the file's owner (as judged +- by the effective user ID of the process) or a privileged user +- can change them. +- +- `EROFS' +- The file resides on a read-only file system. +- +- `EFTYPE' +- MODE has the `S_ISVTX' bit (the "sticky bit") set, and the +- named file is not a directory. Some systems do not allow +- setting the sticky bit on non-directory files, and some do +- (and only some of those assign a useful meaning to the bit +- for non-directory files). +- +- You only get `EFTYPE' on systems where the sticky bit has no +- useful meaning for non-directory files, so it is always safe +- to just clear the bit in MODE and call `chmod' again. *Note +- Permission Bits::, for full details on the sticky bit. +- +- - Function: int fchmod (int FILEDES, int MODE) +- This is like `chmod', except that it changes the permissions of the +- currently open file given by FILEDES. +- +- The return value from `fchmod' is `0' on success and `-1' on +- failure. The following `errno' error codes are defined for this +- function: +- +- `EBADF' +- The FILEDES argument is not a valid file descriptor. +- +- `EINVAL' +- The FILEDES argument corresponds to a pipe or socket, or +- something else that doesn't really have access permissions. +- +- `EPERM' +- This process does not have permission to change the access +- permissions of this file. Only the file's owner (as judged +- by the effective user ID of the process) or a privileged user +- can change them. +- +- `EROFS' +- The file resides on a read-only file system. +- +- +-File: libc.info, Node: Testing File Access, Next: File Times, Prev: Setting Permissions, Up: File Attributes +- +-Testing Permission to Access a File +------------------------------------ +- +- In some situations it is desirable to allow programs to access files +-or devices even if this is not possible with the permissions granted to +-the user. One possible solution is to set the setuid-bit of the program +-file. If such a program is started the _effective_ user ID of the +-process is changed to that of the owner of the program file. So to +-allow write access to files like `/etc/passwd', which normally can be +-written only by the super-user, the modifying program will have to be +-owned by `root' and the setuid-bit must be set. +- +- But beside the files the program is intended to change the user +-should not be allowed to access any file to which s/he would not have +-access anyway. The program therefore must explicitly check whether _the +-user_ would have the necessary access to a file, before it reads or +-writes the file. +- +- To do this, use the function `access', which checks for access +-permission based on the process's _real_ user ID rather than the +-effective user ID. (The setuid feature does not alter the real user ID, +-so it reflects the user who actually ran the program.) +- +- There is another way you could check this access, which is easy to +-describe, but very hard to use. This is to examine the file mode bits +-and mimic the system's own access computation. This method is +-undesirable because many systems have additional access control +-features; your program cannot portably mimic them, and you would not +-want to try to keep track of the diverse features that different systems +-have. Using `access' is simple and automatically does whatever is +-appropriate for the system you are using. +- +- `access' is _only_ only appropriate to use in setuid programs. A +-non-setuid program will always use the effective ID rather than the +-real ID. +- +- The symbols in this section are declared in `unistd.h'. +- +- - Function: int access (const char *FILENAME, int HOW) +- The `access' function checks to see whether the file named by +- FILENAME can be accessed in the way specified by the HOW argument. +- The HOW argument either can be the bitwise OR of the flags +- `R_OK', `W_OK', `X_OK', or the existence test `F_OK'. +- +- This function uses the _real_ user and group IDs of the calling +- process, rather than the _effective_ IDs, to check for access +- permission. As a result, if you use the function from a `setuid' +- or `setgid' program (*note How Change Persona::), it gives +- information relative to the user who actually ran the program. +- +- The return value is `0' if the access is permitted, and `-1' +- otherwise. (In other words, treated as a predicate function, +- `access' returns true if the requested access is _denied_.) +- +- In addition to the usual file name errors (*note File Name +- Errors::), the following `errno' error conditions are defined for +- this function: +- +- `EACCES' +- The access specified by HOW is denied. +- +- `ENOENT' +- The file doesn't exist. +- +- `EROFS' +- Write permission was requested for a file on a read-only file +- system. +- +- These macros are defined in the header file `unistd.h' for use as +-the HOW argument to the `access' function. The values are integer +-constants. +- +- - Macro: int R_OK +- Flag meaning test for read permission. +- +- - Macro: int W_OK +- Flag meaning test for write permission. +- +- - Macro: int X_OK +- Flag meaning test for execute/search permission. +- +- - Macro: int F_OK +- Flag meaning test for existence of the file. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-26 glibc-2.3.2-200304020432/manual/libc.info-26 +--- glibc-2.3.2/manual/libc.info-26 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-26 Thu Jan 1 01:00:00 1970 +@@ -1,1233 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: File Times, Next: File Size, Prev: Testing File Access, Up: File Attributes +- +-File Times +----------- +- +- Each file has three time stamps associated with it: its access time, +-its modification time, and its attribute modification time. These +-correspond to the `st_atime', `st_mtime', and `st_ctime' members of the +-`stat' structure; see *Note File Attributes::. +- +- All of these times are represented in calendar time format, as +-`time_t' objects. This data type is defined in `time.h'. For more +-information about representation and manipulation of time values, see +-*Note Calendar Time::. +- +- Reading from a file updates its access time attribute, and writing +-updates its modification time. When a file is created, all three time +-stamps for that file are set to the current time. In addition, the +-attribute change time and modification time fields of the directory that +-contains the new entry are updated. +- +- Adding a new name for a file with the `link' function updates the +-attribute change time field of the file being linked, and both the +-attribute change time and modification time fields of the directory +-containing the new name. These same fields are affected if a file name +-is deleted with `unlink', `remove' or `rmdir'. Renaming a file with +-`rename' affects only the attribute change time and modification time +-fields of the two parent directories involved, and not the times for +-the file being renamed. +- +- Changing the attributes of a file (for example, with `chmod') +-updates its attribute change time field. +- +- You can also change some of the time stamps of a file explicitly +-using the `utime' function--all except the attribute change time. You +-need to include the header file `utime.h' to use this facility. +- +- - Data Type: struct utimbuf +- The `utimbuf' structure is used with the `utime' function to +- specify new access and modification times for a file. It contains +- the following members: +- +- `time_t actime' +- This is the access time for the file. +- +- `time_t modtime' +- This is the modification time for the file. +- +- - Function: int utime (const char *FILENAME, const struct utimbuf +- *TIMES) +- This function is used to modify the file times associated with the +- file named FILENAME. +- +- If TIMES is a null pointer, then the access and modification times +- of the file are set to the current time. Otherwise, they are set +- to the values from the `actime' and `modtime' members +- (respectively) of the `utimbuf' structure pointed to by TIMES. +- +- The attribute modification time for the file is set to the current +- time in either case (since changing the time stamps is itself a +- modification of the file attributes). +- +- The `utime' function returns `0' if successful and `-1' on +- failure. In addition to the usual file name errors (*note File +- Name Errors::), the following `errno' error conditions are defined +- for this function: +- +- `EACCES' +- There is a permission problem in the case where a null +- pointer was passed as the TIMES argument. In order to update +- the time stamp on the file, you must either be the owner of +- the file, have write permission for the file, or be a +- privileged user. +- +- `ENOENT' +- The file doesn't exist. +- +- `EPERM' +- If the TIMES argument is not a null pointer, you must either +- be the owner of the file or be a privileged user. +- +- `EROFS' +- The file lives on a read-only file system. +- +- Each of the three time stamps has a corresponding microsecond part, +-which extends its resolution. These fields are called `st_atime_usec', +-`st_mtime_usec', and `st_ctime_usec'; each has a value between 0 and +-999,999, which indicates the time in microseconds. They correspond to +-the `tv_usec' field of a `timeval' structure; see *Note High-Resolution +-Calendar::. +- +- The `utimes' function is like `utime', but also lets you specify the +-fractional part of the file times. The prototype for this function is +-in the header file `sys/time.h'. +- +- - Function: int utimes (const char *FILENAME, struct timeval TVP[2]) +- This function sets the file access and modification times of the +- file FILENAME. The new file access time is specified by `TVP[0]', +- and the new modification time by `TVP[1]'. Similar to `utime', if +- TVP is a null pointer then the access and modification times of +- the file are set to the current time. This function comes from +- BSD. +- +- The return values and error conditions are the same as for the +- `utime' function. +- +- - Function: int lutimes (const char *FILENAME, struct timeval TVP[2]) +- This function is like `utimes', except that it does not follow +- symbolic links. If FILENAME is the name of a symbolic link, +- `lutimes' sets the file access and modification times of the +- symbolic link special file itself (as seen by `lstat'; *note +- Symbolic Links::) while `utimes' sets the file access and +- modification times of the file the symbolic link refers to. This +- function comes from FreeBSD, and is not available on all platforms +- (if not available, it will fail with `ENOSYS'). +- +- The return values and error conditions are the same as for the +- `utime' function. +- +- - Function: int futimes (int *FD, struct timeval TVP[2]) +- This function is like `utimes', except that it takes an open file +- descriptor as an argument instead of a file name. *Note Low-Level +- I/O::. This function comes from FreeBSD, and is not available on +- all platforms (if not available, it will fail with `ENOSYS'). +- +- Like `utimes', `futimes' returns `0' on success and `-1' on +- failure. The following `errno' error conditions are defined for +- `futimes': +- +- `EACCES' +- There is a permission problem in the case where a null +- pointer was passed as the TIMES argument. In order to update +- the time stamp on the file, you must either be the owner of +- the file, have write permission for the file, or be a +- privileged user. +- +- `EBADF' +- The FILEDES argument is not a valid file descriptor. +- +- `EPERM' +- If the TIMES argument is not a null pointer, you must either +- be the owner of the file or be a privileged user. +- +- `EROFS' +- The file lives on a read-only file system. +- +- +-File: libc.info, Node: File Size, Prev: File Times, Up: File Attributes +- +-File Size +---------- +- +- Normally file sizes are maintained automatically. A file begins +-with a size of 0 and is automatically extended when data is written past +-its end. It is also possible to empty a file completely by an `open' +-or `fopen' call. +- +- However, sometimes it is necessary to _reduce_ the size of a file. +-This can be done with the `truncate' and `ftruncate' functions. They +-were introduced in BSD Unix. `ftruncate' was later added to POSIX.1. +- +- Some systems allow you to extend a file (creating holes) with these +-functions. This is useful when using memory-mapped I/O (*note +-Memory-mapped I/O::), where files are not automatically extended. +-However, it is not portable but must be implemented if `mmap' allows +-mapping of files (i.e., `_POSIX_MAPPED_FILES' is defined). +- +- Using these functions on anything other than a regular file gives +-_undefined_ results. On many systems, such a call will appear to +-succeed, without actually accomplishing anything. +- +- - Function: int truncate (const char *FILENAME, off_t LENGTH) +- The `truncate' function changes the size of FILENAME to LENGTH. +- If LENGTH is shorter than the previous length, data at the end +- will be lost. The file must be writable by the user to perform +- this operation. +- +- If LENGTH is longer, holes will be added to the end. However, some +- systems do not support this feature and will leave the file +- unchanged. +- +- When the source file is compiled with `_FILE_OFFSET_BITS == 64' the +- `truncate' function is in fact `truncate64' and the type `off_t' +- has 64 bits which makes it possible to handle files up to 2^63 +- bytes in length. +- +- The return value is 0 for success, or -1 for an error. In +- addition to the usual file name errors, the following errors may +- occur: +- +- `EACCES' +- The file is a directory or not writable. +- +- `EINVAL' +- LENGTH is negative. +- +- `EFBIG' +- The operation would extend the file beyond the limits of the +- operating system. +- +- `EIO' +- A hardware I/O error occurred. +- +- `EPERM' +- The file is "append-only" or "immutable". +- +- `EINTR' +- The operation was interrupted by a signal. +- +- +- - Function: int truncate64 (const char *NAME, off64_t LENGTH) +- This function is similar to the `truncate' function. The +- difference is that the LENGTH argument is 64 bits wide even on 32 +- bits machines, which allows the handling of files with sizes up to +- 2^63 bytes. +- +- When the source file is compiled with `_FILE_OFFSET_BITS == 64' on +- a 32 bits machine this function is actually available under the +- name `truncate' and so transparently replaces the 32 bits +- interface. +- +- - Function: int ftruncate (int FD, off_t LENGTH) +- This is like `truncate', but it works on a file descriptor FD for +- an opened file instead of a file name to identify the object. The +- file must be opened for writing to successfully carry out the +- operation. +- +- The POSIX standard leaves it implementation defined what happens +- if the specified new LENGTH of the file is bigger than the +- original size. The `ftruncate' function might simply leave the +- file alone and do nothing or it can increase the size to the +- desired size. In this later case the extended area should be +- zero-filled. So using `ftruncate' is no reliable way to increase +- the file size but if it is possible it is probably the fastest +- way. The function also operates on POSIX shared memory segments +- if these are implemented by the system. +- +- `ftruncate' is especially useful in combination with `mmap'. +- Since the mapped region must have a fixed size one cannot enlarge +- the file by writing something beyond the last mapped page. +- Instead one has to enlarge the file itself and then remap the file +- with the new size. The example below shows how this works. +- +- When the source file is compiled with `_FILE_OFFSET_BITS == 64' the +- `ftruncate' function is in fact `ftruncate64' and the type `off_t' +- has 64 bits which makes it possible to handle files up to 2^63 +- bytes in length. +- +- The return value is 0 for success, or -1 for an error. The +- following errors may occur: +- +- `EBADF' +- FD does not correspond to an open file. +- +- `EACCES' +- FD is a directory or not open for writing. +- +- `EINVAL' +- LENGTH is negative. +- +- `EFBIG' +- The operation would extend the file beyond the limits of the +- operating system. +- +- `EIO' +- A hardware I/O error occurred. +- +- `EPERM' +- The file is "append-only" or "immutable". +- +- `EINTR' +- The operation was interrupted by a signal. +- +- +- - Function: int ftruncate64 (int ID, off64_t LENGTH) +- This function is similar to the `ftruncate' function. The +- difference is that the LENGTH argument is 64 bits wide even on 32 +- bits machines which allows the handling of files with sizes up to +- 2^63 bytes. +- +- When the source file is compiled with `_FILE_OFFSET_BITS == 64' on +- a 32 bits machine this function is actually available under the +- name `ftruncate' and so transparently replaces the 32 bits +- interface. +- +- As announced here is a little example of how to use `ftruncate' in +-combination with `mmap': +- +- int fd; +- void *start; +- size_t len; +- +- int +- add (off_t at, void *block, size_t size) +- { +- if (at + size > len) +- { +- /* Resize the file and remap. */ +- size_t ps = sysconf (_SC_PAGESIZE); +- size_t ns = (at + size + ps - 1) & ~(ps - 1); +- void *np; +- if (ftruncate (fd, ns) < 0) +- return -1; +- np = mmap (NULL, ns, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); +- if (np == MAP_FAILED) +- return -1; +- start = np; +- len = ns; +- } +- memcpy ((char *) start + at, block, size); +- return 0; +- } +- +- The function `add' writes a block of memory at an arbitrary position +-in the file. If the current size of the file is too small it is +-extended. Note the it is extended by a round number of pages. This is +-a requirement of `mmap'. The program has to keep track of the real +-size, and when it has finished a final `ftruncate' call should set the +-real size of the file. +- +- +-File: libc.info, Node: Making Special Files, Next: Temporary Files, Prev: File Attributes, Up: File System Interface +- +-Making Special Files +-==================== +- +- The `mknod' function is the primitive for making special files, such +-as files that correspond to devices. The GNU library includes this +-function for compatibility with BSD. +- +- The prototype for `mknod' is declared in `sys/stat.h'. +- +- - Function: int mknod (const char *FILENAME, int MODE, int DEV) +- The `mknod' function makes a special file with name FILENAME. The +- MODE specifies the mode of the file, and may include the various +- special file bits, such as `S_IFCHR' (for a character special file) +- or `S_IFBLK' (for a block special file). *Note Testing File +- Type::. +- +- The DEV argument specifies which device the special file refers to. +- Its exact interpretation depends on the kind of special file being +- created. +- +- The return value is `0' on success and `-1' on error. In addition +- to the usual file name errors (*note File Name Errors::), the +- following `errno' error conditions are defined for this function: +- +- `EPERM' +- The calling process is not privileged. Only the superuser +- can create special files. +- +- `ENOSPC' +- The directory or file system that would contain the new file +- is full and cannot be extended. +- +- `EROFS' +- The directory containing the new file can't be modified +- because it's on a read-only file system. +- +- `EEXIST' +- There is already a file named FILENAME. If you want to +- replace this file, you must remove the old file explicitly +- first. +- +- +-File: libc.info, Node: Temporary Files, Prev: Making Special Files, Up: File System Interface +- +-Temporary Files +-=============== +- +- If you need to use a temporary file in your program, you can use the +-`tmpfile' function to open it. Or you can use the `tmpnam' (better: +-`tmpnam_r') function to provide a name for a temporary file and then +-you can open it in the usual way with `fopen'. +- +- The `tempnam' function is like `tmpnam' but lets you choose what +-directory temporary files will go in, and something about what their +-file names will look like. Important for multi-threaded programs is +-that `tempnam' is reentrant, while `tmpnam' is not since it returns a +-pointer to a static buffer. +- +- These facilities are declared in the header file `stdio.h'. +- +- - Function: FILE * tmpfile (void) +- This function creates a temporary binary file for update mode, as +- if by calling `fopen' with mode `"wb+"'. The file is deleted +- automatically when it is closed or when the program terminates. +- (On some other ISO C systems the file may fail to be deleted if +- the program terminates abnormally). +- +- This function is reentrant. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a +- 32-bit system this function is in fact `tmpfile64', i.e. the LFS +- interface transparently replaces the old interface. +- +- - Function: FILE * tmpfile64 (void) +- This function is similar to `tmpfile', but the stream it returns a +- pointer to was opened using `tmpfile64'. Therefore this stream can +- be used for files larger then 2^31 bytes on 32-bit machines. +- +- Please note that the return type is still `FILE *'. There is no +- special `FILE' type for the LFS interface. +- +- If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32 +- bits machine this function is available under the name `tmpfile' +- and so transparently replaces the old interface. +- +- - Function: char * tmpnam (char *RESULT) +- This function constructs and returns a valid file name that does +- not refer to any existing file. If the RESULT argument is a null +- pointer, the return value is a pointer to an internal static +- string, which might be modified by subsequent calls and therefore +- makes this function non-reentrant. Otherwise, the RESULT argument +- should be a pointer to an array of at least `L_tmpnam' characters, +- and the result is written into that array. +- +- It is possible for `tmpnam' to fail if you call it too many times +- without removing previously-created files. This is because the +- limited length of the temporary file names gives room for only a +- finite number of different names. If `tmpnam' fails it returns a +- null pointer. +- +- *Warning:* Between the time the pathname is constructed and the +- file is created another process might have created a file with the +- same name using `tmpnam', leading to a possible security hole. The +- implementation generates names which can hardly be predicted, but +- when opening the file you should use the `O_EXCL' flag. Using +- `tmpfile' or `mkstemp' is a safe way to avoid this problem. +- +- - Function: char * tmpnam_r (char *RESULT) +- This function is nearly identical to the `tmpnam' function, except +- that if RESULT is a null pointer it returns a null pointer. +- +- This guarantees reentrancy because the non-reentrant situation of +- `tmpnam' cannot happen here. +- +- *Warning*: This function has the same security problems as +- `tmpnam'. +- +- - Macro: int L_tmpnam +- The value of this macro is an integer constant expression that +- represents the minimum size of a string large enough to hold a +- file name generated by the `tmpnam' function. +- +- - Macro: int TMP_MAX +- The macro `TMP_MAX' is a lower bound for how many temporary names +- you can create with `tmpnam'. You can rely on being able to call +- `tmpnam' at least this many times before it might fail saying you +- have made too many temporary file names. +- +- With the GNU library, you can create a very large number of +- temporary file names. If you actually created the files, you +- would probably run out of disk space before you ran out of names. +- Some other systems have a fixed, small limit on the number of +- temporary files. The limit is never less than `25'. +- +- - Function: char * tempnam (const char *DIR, const char *PREFIX) +- This function generates a unique temporary file name. If PREFIX +- is not a null pointer, up to five characters of this string are +- used as a prefix for the file name. The return value is a string +- newly allocated with `malloc', so you should release its storage +- with `free' when it is no longer needed. +- +- Because the string is dynamically allocated this function is +- reentrant. +- +- The directory prefix for the temporary file name is determined by +- testing each of the following in sequence. The directory must +- exist and be writable. +- +- * The environment variable `TMPDIR', if it is defined. For +- security reasons this only happens if the program is not SUID +- or SGID enabled. +- +- * The DIR argument, if it is not a null pointer. +- +- * The value of the `P_tmpdir' macro. +- +- * The directory `/tmp'. +- +- This function is defined for SVID compatibility. +- +- *Warning:* Between the time the pathname is constructed and the +- file is created another process might have created a file with the +- same name using `tempnam', leading to a possible security hole. +- The implementation generates names which can hardly be predicted, +- but when opening the file you should use the `O_EXCL' flag. Using +- `tmpfile' or `mkstemp' is a safe way to avoid this problem. +- +- - SVID Macro: char * P_tmpdir +- This macro is the name of the default directory for temporary +- files. +- +- Older Unix systems did not have the functions just described. +-Instead they used `mktemp' and `mkstemp'. Both of these functions work +-by modifying a file name template string you pass. The last six +-characters of this string must be `XXXXXX'. These six `X's are +-replaced with six characters which make the whole string a unique file +-name. Usually the template string is something like +-`/tmp/PREFIXXXXXXX', and each program uses a unique PREFIX. +- +- *Note:* Because `mktemp' and `mkstemp' modify the template string, +-you _must not_ pass string constants to them. String constants are +-normally in read-only storage, so your program would crash when +-`mktemp' or `mkstemp' tried to modify the string. +- +- - Function: char * mktemp (char *TEMPLATE) +- The `mktemp' function generates a unique file name by modifying +- TEMPLATE as described above. If successful, it returns TEMPLATE +- as modified. If `mktemp' cannot find a unique file name, it makes +- TEMPLATE an empty string and returns that. If TEMPLATE does not +- end with `XXXXXX', `mktemp' returns a null pointer. +- +- *Warning:* Between the time the pathname is constructed and the +- file is created another process might have created a file with the +- same name using `mktemp', leading to a possible security hole. The +- implementation generates names which can hardly be predicted, but +- when opening the file you should use the `O_EXCL' flag. Using +- `mkstemp' is a safe way to avoid this problem. +- +- - Function: int mkstemp (char *TEMPLATE) +- The `mkstemp' function generates a unique file name just as +- `mktemp' does, but it also opens the file for you with `open' +- (*note Opening and Closing Files::). If successful, it modifies +- TEMPLATE in place and returns a file descriptor for that file open +- for reading and writing. If `mkstemp' cannot create a +- uniquely-named file, it returns `-1'. If TEMPLATE does not end +- with `XXXXXX', `mkstemp' returns `-1' and does not modify TEMPLATE. +- +- The file is opened using mode `0600'. If the file is meant to be +- used by other users this mode must be changed explicitly. +- +- Unlike `mktemp', `mkstemp' is actually guaranteed to create a unique +-file that cannot possibly clash with any other program trying to create +-a temporary file. This is because it works by calling `open' with the +-`O_EXCL' flag, which says you want to create a new file and get an +-error if the file already exists. +- +- - Function: char * mkdtemp (char *TEMPLATE) +- The `mkdtemp' function creates a directory with a unique name. If +- it succeeds, it overwrites TEMPLATE with the name of the +- directory, and returns TEMPLATE. As with `mktemp' and `mkstemp', +- TEMPLATE should be a string ending with `XXXXXX'. +- +- If `mkdtemp' cannot create an uniquely named directory, it returns +- `NULL' and sets ERRNO appropriately. If TEMPLATE does not end +- with `XXXXXX', `mkdtemp' returns `NULL' and does not modify +- TEMPLATE. ERRNO will be set to `EINVAL' in this case. +- +- The directory is created using mode `0700'. +- +- The directory created by `mkdtemp' cannot clash with temporary files +-or directories created by other users. This is because directory +-creation always works like `open' with `O_EXCL'. *Note Creating +-Directories::. +- +- The `mkdtemp' function comes from OpenBSD. +- +- +-File: libc.info, Node: Pipes and FIFOs, Next: Sockets, Prev: File System Interface, Up: Top +- +-Pipes and FIFOs +-*************** +- +- A "pipe" is a mechanism for interprocess communication; data written +-to the pipe by one process can be read by another process. The data is +-handled in a first-in, first-out (FIFO) order. The pipe has no name; it +-is created for one use and both ends must be inherited from the single +-process which created the pipe. +- +- A "FIFO special file" is similar to a pipe, but instead of being an +-anonymous, temporary connection, a FIFO has a name or names like any +-other file. Processes open the FIFO by name in order to communicate +-through it. +- +- A pipe or FIFO has to be open at both ends simultaneously. If you +-read from a pipe or FIFO file that doesn't have any processes writing +-to it (perhaps because they have all closed the file, or exited), the +-read returns end-of-file. Writing to a pipe or FIFO that doesn't have a +-reading process is treated as an error condition; it generates a +-`SIGPIPE' signal, and fails with error code `EPIPE' if the signal is +-handled or blocked. +- +- Neither pipes nor FIFO special files allow file positioning. Both +-reading and writing operations happen sequentially; reading from the +-beginning of the file and writing at the end. +- +-* Menu: +- +-* Creating a Pipe:: Making a pipe with the `pipe' function. +-* Pipe to a Subprocess:: Using a pipe to communicate with a +- child process. +-* FIFO Special Files:: Making a FIFO special file. +-* Pipe Atomicity:: When pipe (or FIFO) I/O is atomic. +- +- +-File: libc.info, Node: Creating a Pipe, Next: Pipe to a Subprocess, Up: Pipes and FIFOs +- +-Creating a Pipe +-=============== +- +- The primitive for creating a pipe is the `pipe' function. This +-creates both the reading and writing ends of the pipe. It is not very +-useful for a single process to use a pipe to talk to itself. In typical +-use, a process creates a pipe just before it forks one or more child +-processes (*note Creating a Process::). The pipe is then used for +-communication either between the parent or child processes, or between +-two sibling processes. +- +- The `pipe' function is declared in the header file `unistd.h'. +- +- - Function: int pipe (int FILEDES[2]) +- The `pipe' function creates a pipe and puts the file descriptors +- for the reading and writing ends of the pipe (respectively) into +- `FILEDES[0]' and `FILEDES[1]'. +- +- An easy way to remember that the input end comes first is that file +- descriptor `0' is standard input, and file descriptor `1' is +- standard output. +- +- If successful, `pipe' returns a value of `0'. On failure, `-1' is +- returned. The following `errno' error conditions are defined for +- this function: +- +- `EMFILE' +- The process has too many files open. +- +- `ENFILE' +- There are too many open files in the entire system. *Note +- Error Codes::, for more information about `ENFILE'. This +- error never occurs in the GNU system. +- +- Here is an example of a simple program that creates a pipe. This +-program uses the `fork' function (*note Creating a Process::) to create +-a child process. The parent process writes data to the pipe, which is +-read by the child process. +- +- #include +- #include +- #include +- #include +- +- /* Read characters from the pipe and echo them to `stdout'. */ +- +- void +- read_from_pipe (int file) +- { +- FILE *stream; +- int c; +- stream = fdopen (file, "r"); +- while ((c = fgetc (stream)) != EOF) +- putchar (c); +- fclose (stream); +- } +- +- /* Write some random text to the pipe. */ +- +- void +- write_to_pipe (int file) +- { +- FILE *stream; +- stream = fdopen (file, "w"); +- fprintf (stream, "hello, world!\n"); +- fprintf (stream, "goodbye, world!\n"); +- fclose (stream); +- } +- +- int +- main (void) +- { +- pid_t pid; +- int mypipe[2]; +- +- /* Create the pipe. */ +- if (pipe (mypipe)) +- { +- fprintf (stderr, "Pipe failed.\n"); +- return EXIT_FAILURE; +- } +- +- /* Create the child process. */ +- pid = fork (); +- if (pid == (pid_t) 0) +- { +- /* This is the child process. +- Close other end first. */ +- close (mypipe[1]); +- read_from_pipe (mypipe[0]); +- return EXIT_SUCCESS; +- } +- else if (pid < (pid_t) 0) +- { +- /* The fork failed. */ +- fprintf (stderr, "Fork failed.\n"); +- return EXIT_FAILURE; +- } +- else +- { +- /* This is the parent process. +- Close other end first. */ +- close (mypipe[0]); +- write_to_pipe (mypipe[1]); +- return EXIT_SUCCESS; +- } +- } +- +- +-File: libc.info, Node: Pipe to a Subprocess, Next: FIFO Special Files, Prev: Creating a Pipe, Up: Pipes and FIFOs +- +-Pipe to a Subprocess +-==================== +- +- A common use of pipes is to send data to or receive data from a +-program being run as a subprocess. One way of doing this is by using a +-combination of `pipe' (to create the pipe), `fork' (to create the +-subprocess), `dup2' (to force the subprocess to use the pipe as its +-standard input or output channel), and `exec' (to execute the new +-program). Or, you can use `popen' and `pclose'. +- +- The advantage of using `popen' and `pclose' is that the interface is +-much simpler and easier to use. But it doesn't offer as much +-flexibility as using the low-level functions directly. +- +- - Function: FILE * popen (const char *COMMAND, const char *MODE) +- The `popen' function is closely related to the `system' function; +- see *Note Running a Command::. It executes the shell command +- COMMAND as a subprocess. However, instead of waiting for the +- command to complete, it creates a pipe to the subprocess and +- returns a stream that corresponds to that pipe. +- +- If you specify a MODE argument of `"r"', you can read from the +- stream to retrieve data from the standard output channel of the +- subprocess. The subprocess inherits its standard input channel +- from the parent process. +- +- Similarly, if you specify a MODE argument of `"w"', you can write +- to the stream to send data to the standard input channel of the +- subprocess. The subprocess inherits its standard output channel +- from the parent process. +- +- In the event of an error `popen' returns a null pointer. This +- might happen if the pipe or stream cannot be created, if the +- subprocess cannot be forked, or if the program cannot be executed. +- +- - Function: int pclose (FILE *STREAM) +- The `pclose' function is used to close a stream created by `popen'. +- It waits for the child process to terminate and returns its status +- value, as for the `system' function. +- +- Here is an example showing how to use `popen' and `pclose' to filter +-output through another program, in this case the paging program `more'. +- +- #include +- #include +- +- void +- write_data (FILE * stream) +- { +- int i; +- for (i = 0; i < 100; i++) +- fprintf (stream, "%d\n", i); +- if (ferror (stream)) +- { +- fprintf (stderr, "Output to stream failed.\n"); +- exit (EXIT_FAILURE); +- } +- } +- +- int +- main (void) +- { +- FILE *output; +- +- output = popen ("more", "w"); +- if (!output) +- { +- fprintf (stderr, +- "incorrect parameters or too many files.\n"); +- return EXIT_FAILURE; +- } +- write_data (output); +- if (pclose (output) != 0) +- { +- fprintf (stderr, +- "Could not run more or other error.\n"); +- } +- return EXIT_SUCCESS; +- } +- +- +-File: libc.info, Node: FIFO Special Files, Next: Pipe Atomicity, Prev: Pipe to a Subprocess, Up: Pipes and FIFOs +- +-FIFO Special Files +-================== +- +- A FIFO special file is similar to a pipe, except that it is created +-in a different way. Instead of being an anonymous communications +-channel, a FIFO special file is entered into the file system by calling +-`mkfifo'. +- +- Once you have created a FIFO special file in this way, any process +-can open it for reading or writing, in the same way as an ordinary file. +-However, it has to be open at both ends simultaneously before you can +-proceed to do any input or output operations on it. Opening a FIFO for +-reading normally blocks until some other process opens the same FIFO for +-writing, and vice versa. +- +- The `mkfifo' function is declared in the header file `sys/stat.h'. +- +- - Function: int mkfifo (const char *FILENAME, mode_t MODE) +- The `mkfifo' function makes a FIFO special file with name +- FILENAME. The MODE argument is used to set the file's +- permissions; see *Note Setting Permissions::. +- +- The normal, successful return value from `mkfifo' is `0'. In the +- case of an error, `-1' is returned. In addition to the usual file +- name errors (*note File Name Errors::), the following `errno' +- error conditions are defined for this function: +- +- `EEXIST' +- The named file already exists. +- +- `ENOSPC' +- The directory or file system cannot be extended. +- +- `EROFS' +- The directory that would contain the file resides on a +- read-only file system. +- +- +-File: libc.info, Node: Pipe Atomicity, Prev: FIFO Special Files, Up: Pipes and FIFOs +- +-Atomicity of Pipe I/O +-===================== +- +- Reading or writing pipe data is "atomic" if the size of data written +-is not greater than `PIPE_BUF'. This means that the data transfer +-seems to be an instantaneous unit, in that nothing else in the system +-can observe a state in which it is partially complete. Atomic I/O may +-not begin right away (it may need to wait for buffer space or for data), +-but once it does begin it finishes immediately. +- +- Reading or writing a larger amount of data may not be atomic; for +-example, output data from other processes sharing the descriptor may be +-interspersed. Also, once `PIPE_BUF' characters have been written, +-further writes will block until some characters are read. +- +- *Note Limits for Files::, for information about the `PIPE_BUF' +-parameter. +- +- +-File: libc.info, Node: Sockets, Next: Low-Level Terminal Interface, Prev: Pipes and FIFOs, Up: Top +- +-Sockets +-******* +- +- This chapter describes the GNU facilities for interprocess +-communication using sockets. +- +- A "socket" is a generalized interprocess communication channel. +-Like a pipe, a socket is represented as a file descriptor. Unlike pipes +-sockets support communication between unrelated processes, and even +-between processes running on different machines that communicate over a +-network. Sockets are the primary means of communicating with other +-machines; `telnet', `rlogin', `ftp', `talk' and the other familiar +-network programs use sockets. +- +- Not all operating systems support sockets. In the GNU library, the +-header file `sys/socket.h' exists regardless of the operating system, +-and the socket functions always exist, but if the system does not +-really support sockets these functions always fail. +- +- *Incomplete:* We do not currently document the facilities for +-broadcast messages or for configuring Internet interfaces. The +-reentrant functions and some newer functions that are related to IPv6 +-aren't documented either so far. +- +-* Menu: +- +-* Socket Concepts:: Basic concepts you need to know about. +-* Communication Styles::Stream communication, datagrams and other styles. +-* Socket Addresses:: How socket names (``addresses'') work. +-* Interface Naming:: Identifying specific network interfaces. +-* Local Namespace:: Details about the local namespace. +-* Internet Namespace:: Details about the Internet namespace. +-* Misc Namespaces:: Other namespaces not documented fully here. +-* Open/Close Sockets:: Creating sockets and destroying them. +-* Connections:: Operations on sockets with connection state. +-* Datagrams:: Operations on datagram sockets. +-* Inetd:: Inetd is a daemon that starts servers on request. +- The most convenient way to write a server +- is to make it work with Inetd. +-* Socket Options:: Miscellaneous low-level socket options. +-* Networks Database:: Accessing the database of network names. +- +- +-File: libc.info, Node: Socket Concepts, Next: Communication Styles, Up: Sockets +- +-Socket Concepts +-=============== +- +- When you create a socket, you must specify the style of communication +-you want to use and the type of protocol that should implement it. The +-"communication style" of a socket defines the user-level semantics of +-sending and receiving data on the socket. Choosing a communication +-style specifies the answers to questions such as these: +- +- * *What are the units of data transmission?* Some communication +- styles regard the data as a sequence of bytes with no larger +- structure; others group the bytes into records (which are known in +- this context as "packets"). +- +- * *Can data be lost during normal operation?* Some communication +- styles guarantee that all the data sent arrives in the order it was +- sent (barring system or network crashes); other styles occasionally +- lose data as a normal part of operation, and may sometimes deliver +- packets more than once or in the wrong order. +- +- Designing a program to use unreliable communication styles usually +- involves taking precautions to detect lost or misordered packets +- and to retransmit data as needed. +- +- * *Is communication entirely with one partner?* Some communication +- styles are like a telephone call--you make a "connection" with one +- remote socket and then exchange data freely. Other styles are +- like mailing letters--you specify a destination address for each +- message you send. +- +- You must also choose a "namespace" for naming the socket. A socket +-name ("address") is meaningful only in the context of a particular +-namespace. In fact, even the data type to use for a socket name may +-depend on the namespace. Namespaces are also called "domains", but we +-avoid that word as it can be confused with other usage of the same +-term. Each namespace has a symbolic name that starts with `PF_'. A +-corresponding symbolic name starting with `AF_' designates the address +-format for that namespace. +- +- Finally you must choose the "protocol" to carry out the +-communication. The protocol determines what low-level mechanism is used +-to transmit and receive data. Each protocol is valid for a particular +-namespace and communication style; a namespace is sometimes called a +-"protocol family" because of this, which is why the namespace names +-start with `PF_'. +- +- The rules of a protocol apply to the data passing between two +-programs, perhaps on different computers; most of these rules are +-handled by the operating system and you need not know about them. What +-you do need to know about protocols is this: +- +- * In order to have communication between two sockets, they must +- specify the _same_ protocol. +- +- * Each protocol is meaningful with particular style/namespace +- combinations and cannot be used with inappropriate combinations. +- For example, the TCP protocol fits only the byte stream style of +- communication and the Internet namespace. +- +- * For each combination of style and namespace there is a "default +- protocol", which you can request by specifying 0 as the protocol +- number. And that's what you should normally do--use the default. +- +- Throughout the following description at various places +-variables/parameters to denote sizes are required. And here the trouble +-starts. In the first implementations the type of these variables was +-simply `int'. On most machines at that time an `int' was 32 bits wide, +-which created a _de facto_ standard requiring 32-bit variables. This +-is important since references to variables of this type are passed to +-the kernel. +- +- Then the POSIX people came and unified the interface with the words +-"all size values are of type `size_t'". On 64-bit machines `size_t' is +-64 bits wide, so pointers to variables were no longer possible. +- +- The Unix98 specification provides a solution by introducing a type +-`socklen_t'. This type is used in all of the cases that POSIX changed +-to use `size_t'. The only requirement of this type is that it be an +-unsigned type of at least 32 bits. Therefore, implementations which +-require that references to 32-bit variables be passed can be as happy +-as implementations which use 64-bit values. +- +- +-File: libc.info, Node: Communication Styles, Next: Socket Addresses, Prev: Socket Concepts, Up: Sockets +- +-Communication Styles +-==================== +- +- The GNU library includes support for several different kinds of +-sockets, each with different characteristics. This section describes +-the supported socket types. The symbolic constants listed here are +-defined in `sys/socket.h'. +- +- - Macro: int SOCK_STREAM +- The `SOCK_STREAM' style is like a pipe (*note Pipes and FIFOs::). +- It operates over a connection with a particular remote socket and +- transmits data reliably as a stream of bytes. +- +- Use of this style is covered in detail in *Note Connections::. +- +- - Macro: int SOCK_DGRAM +- The `SOCK_DGRAM' style is used for sending individually-addressed +- packets unreliably. It is the diametrical opposite of +- `SOCK_STREAM'. +- +- Each time you write data to a socket of this kind, that data +- becomes one packet. Since `SOCK_DGRAM' sockets do not have +- connections, you must specify the recipient address with each +- packet. +- +- The only guarantee that the system makes about your requests to +- transmit data is that it will try its best to deliver each packet +- you send. It may succeed with the sixth packet after failing with +- the fourth and fifth packets; the seventh packet may arrive before +- the sixth, and may arrive a second time after the sixth. +- +- The typical use for `SOCK_DGRAM' is in situations where it is +- acceptable to simply re-send a packet if no response is seen in a +- reasonable amount of time. +- +- *Note Datagrams::, for detailed information about how to use +- datagram sockets. +- +- - Macro: int SOCK_RAW +- This style provides access to low-level network protocols and +- interfaces. Ordinary user programs usually have no need to use +- this style. +- +- +-File: libc.info, Node: Socket Addresses, Next: Interface Naming, Prev: Communication Styles, Up: Sockets +- +-Socket Addresses +-================ +- +- The name of a socket is normally called an "address". The functions +-and symbols for dealing with socket addresses were named +-inconsistently, sometimes using the term "name" and sometimes using +-"address". You can regard these terms as synonymous where sockets are +-concerned. +- +- A socket newly created with the `socket' function has no address. +-Other processes can find it for communication only if you give it an +-address. We call this "binding" the address to the socket, and the way +-to do it is with the `bind' function. +- +- You need be concerned with the address of a socket if other processes +-are to find it and start communicating with it. You can specify an +-address for other sockets, but this is usually pointless; the first time +-you send data from a socket, or use it to initiate a connection, the +-system assigns an address automatically if you have not specified one. +- +- Occasionally a client needs to specify an address because the server +-discriminates based on address; for example, the rsh and rlogin +-protocols look at the client's socket address and only bypass password +-checking if it is less than `IPPORT_RESERVED' (*note Ports::). +- +- The details of socket addresses vary depending on what namespace you +-are using. *Note Local Namespace::, or *Note Internet Namespace::, for +-specific information. +- +- Regardless of the namespace, you use the same functions `bind' and +-`getsockname' to set and examine a socket's address. These functions +-use a phony data type, `struct sockaddr *', to accept the address. In +-practice, the address lives in a structure of some other data type +-appropriate to the address format you are using, but you cast its +-address to `struct sockaddr *' when you pass it to `bind'. +- +-* Menu: +- +-* Address Formats:: About `struct sockaddr'. +-* Setting Address:: Binding an address to a socket. +-* Reading Address:: Reading the address of a socket. +- +- +-File: libc.info, Node: Address Formats, Next: Setting Address, Up: Socket Addresses +- +-Address Formats +---------------- +- +- The functions `bind' and `getsockname' use the generic data type +-`struct sockaddr *' to represent a pointer to a socket address. You +-can't use this data type effectively to interpret an address or +-construct one; for that, you must use the proper data type for the +-socket's namespace. +- +- Thus, the usual practice is to construct an address of the proper +-namespace-specific type, then cast a pointer to `struct sockaddr *' +-when you call `bind' or `getsockname'. +- +- The one piece of information that you can get from the `struct +-sockaddr' data type is the "address format designator". This tells you +-which data type to use to understand the address fully. +- +- The symbols in this section are defined in the header file +-`sys/socket.h'. +- +- - Data Type: struct sockaddr +- The `struct sockaddr' type itself has the following members: +- +- `short int sa_family' +- This is the code for the address format of this address. It +- identifies the format of the data which follows. +- +- `char sa_data[14]' +- This is the actual socket address data, which is +- format-dependent. Its length also depends on the format, and +- may well be more than 14. The length 14 of `sa_data' is +- essentially arbitrary. +- +- Each address format has a symbolic name which starts with `AF_'. +-Each of them corresponds to a `PF_' symbol which designates the +-corresponding namespace. Here is a list of address format names: +- +-`AF_LOCAL' +- This designates the address format that goes with the local +- namespace. (`PF_LOCAL' is the name of that namespace.) *Note +- Local Namespace Details::, for information about this address +- format. +- +-`AF_UNIX' +- This is a synonym for `AF_LOCAL'. Although `AF_LOCAL' is mandated +- by POSIX.1g, `AF_UNIX' is portable to more systems. `AF_UNIX' was +- the traditional name stemming from BSD, so even most POSIX systems +- support it. It is also the name of choice in the Unix98 +- specification. (The same is true for `PF_UNIX' vs. `PF_LOCAL'). +- +-`AF_FILE' +- This is another synonym for `AF_LOCAL', for compatibility. +- (`PF_FILE' is likewise a synonym for `PF_LOCAL'.) +- +-`AF_INET' +- This designates the address format that goes with the Internet +- namespace. (`PF_INET' is the name of that namespace.) *Note +- Internet Address Formats::. +- +-`AF_INET6' +- This is similar to `AF_INET', but refers to the IPv6 protocol. +- (`PF_INET6' is the name of the corresponding namespace.) +- +-`AF_UNSPEC' +- This designates no particular address format. It is used only in +- rare cases, such as to clear out the default destination address +- of a "connected" datagram socket. *Note Sending Datagrams::. +- +- The corresponding namespace designator symbol `PF_UNSPEC' exists +- for completeness, but there is no reason to use it in a program. +- +- `sys/socket.h' defines symbols starting with `AF_' for many +-different kinds of networks, most or all of which are not actually +-implemented. We will document those that really work as we receive +-information about how to use them. +- +- +-File: libc.info, Node: Setting Address, Next: Reading Address, Prev: Address Formats, Up: Socket Addresses +- +-Setting the Address of a Socket +-------------------------------- +- +- Use the `bind' function to assign an address to a socket. The +-prototype for `bind' is in the header file `sys/socket.h'. For +-examples of use, see *Note Local Socket Example::, or see *Note Inet +-Example::. +- +- - Function: int bind (int SOCKET, struct sockaddr *ADDR, socklen_t +- LENGTH) +- The `bind' function assigns an address to the socket SOCKET. The +- ADDR and LENGTH arguments specify the address; the detailed format +- of the address depends on the namespace. The first part of the +- address is always the format designator, which specifies a +- namespace, and says that the address is in the format of that +- namespace. +- +- The return value is `0' on success and `-1' on failure. The +- following `errno' error conditions are defined for this function: +- +- `EBADF' +- The SOCKET argument is not a valid file descriptor. +- +- `ENOTSOCK' +- The descriptor SOCKET is not a socket. +- +- `EADDRNOTAVAIL' +- The specified address is not available on this machine. +- +- `EADDRINUSE' +- Some other socket is already using the specified address. +- +- `EINVAL' +- The socket SOCKET already has an address. +- +- `EACCES' +- You do not have permission to access the requested address. +- (In the Internet domain, only the super-user is allowed to +- specify a port number in the range 0 through +- `IPPORT_RESERVED' minus one; see *Note Ports::.) +- +- Additional conditions may be possible depending on the particular +- namespace of the socket. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-27 glibc-2.3.2-200304020432/manual/libc.info-27 +--- glibc-2.3.2/manual/libc.info-27 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-27 Thu Jan 1 01:00:00 1970 +@@ -1,1225 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Reading Address, Prev: Setting Address, Up: Socket Addresses +- +-Reading the Address of a Socket +-------------------------------- +- +- Use the function `getsockname' to examine the address of an Internet +-socket. The prototype for this function is in the header file +-`sys/socket.h'. +- +- - Function: int getsockname (int SOCKET, struct sockaddr *ADDR, +- socklen_t *LENGTH-PTR) +- The `getsockname' function returns information about the address +- of the socket SOCKET in the locations specified by the ADDR and +- LENGTH-PTR arguments. Note that the LENGTH-PTR is a pointer; you +- should initialize it to be the allocation size of ADDR, and on +- return it contains the actual size of the address data. +- +- The format of the address data depends on the socket namespace. +- The length of the information is usually fixed for a given +- namespace, so normally you can know exactly how much space is +- needed and can provide that much. The usual practice is to +- allocate a place for the value using the proper data type for the +- socket's namespace, then cast its address to `struct sockaddr *' +- to pass it to `getsockname'. +- +- The return value is `0' on success and `-1' on error. The +- following `errno' error conditions are defined for this function: +- +- `EBADF' +- The SOCKET argument is not a valid file descriptor. +- +- `ENOTSOCK' +- The descriptor SOCKET is not a socket. +- +- `ENOBUFS' +- There are not enough internal buffers available for the +- operation. +- +- You can't read the address of a socket in the file namespace. This +-is consistent with the rest of the system; in general, there's no way to +-find a file's name from a descriptor for that file. +- +- +-File: libc.info, Node: Interface Naming, Next: Local Namespace, Prev: Socket Addresses, Up: Sockets +- +-Interface Naming +-================ +- +- Each network interface has a name. This usually consists of a few +-letters that relate to the type of interface, which may be followed by a +-number if there is more than one interface of that type. Examples +-might be `lo' (the loopback interface) and `eth0' (the first Ethernet +-interface). +- +- Although such names are convenient for humans, it would be clumsy to +-have to use them whenever a program needs to refer to an interface. In +-such situations an interface is referred to by its "index", which is an +-arbitrarily-assigned small positive integer. +- +- The following functions, constants and data types are declared in the +-header file `net/if.h'. +- +- - Constant: size_t IFNAMSIZ +- This constant defines the maximum buffer size needed to hold an +- interface name, including its terminating zero byte. +- +- - Function: unsigned int if_nametoindex (const char *ifname) +- This function yields the interface index corresponding to a +- particular name. If no interface exists with the name given, it +- returns 0. +- +- - Function: char * if_indextoname (unsigned int ifindex, char *ifname) +- This function maps an interface index to its corresponding name. +- The returned name is placed in the buffer pointed to by `ifname', +- which must be at least `IFNAMSIZ' bytes in length. If the index +- was invalid, the function's return value is a null pointer, +- otherwise it is `ifname'. +- +- - Data Type: struct if_nameindex +- This data type is used to hold the information about a single +- interface. It has the following members: +- +- `unsigned int if_index;' +- This is the interface index. +- +- `char *if_name' +- This is the null-terminated index name. +- +- +- - Function: struct if_nameindex * if_nameindex (void) +- This function returns an array of `if_nameindex' structures, one +- for every interface that is present. The end of the list is +- indicated by a structure with an interface of 0 and a null name +- pointer. If an error occurs, this function returns a null pointer. +- +- The returned structure must be freed with `if_freenameindex' after +- use. +- +- - Function: void if_freenameindex (struct if_nameindex *ptr) +- This function frees the structure returned by an earlier call to +- `if_nameindex'. +- +- +-File: libc.info, Node: Local Namespace, Next: Internet Namespace, Prev: Interface Naming, Up: Sockets +- +-The Local Namespace +-=================== +- +- This section describes the details of the local namespace, whose +-symbolic name (required when you create a socket) is `PF_LOCAL'. The +-local namespace is also known as "Unix domain sockets". Another name +-is file namespace since socket addresses are normally implemented as +-file names. +- +-* Menu: +- +-* Concepts: Local Namespace Concepts. What you need to understand. +-* Details: Local Namespace Details. Address format, symbolic names, etc. +-* Example: Local Socket Example. Example of creating a socket. +- +- +-File: libc.info, Node: Local Namespace Concepts, Next: Local Namespace Details, Up: Local Namespace +- +-Local Namespace Concepts +------------------------- +- +- In the local namespace socket addresses are file names. You can +-specify any file name you want as the address of the socket, but you +-must have write permission on the directory containing it. It's common +-to put these files in the `/tmp' directory. +- +- One peculiarity of the local namespace is that the name is only used +-when opening the connection; once open the address is not meaningful and +-may not exist. +- +- Another peculiarity is that you cannot connect to such a socket from +-another machine-not even if the other machine shares the file system +-which contains the name of the socket. You can see the socket in a +-directory listing, but connecting to it never succeeds. Some programs +-take advantage of this, such as by asking the client to send its own +-process ID, and using the process IDs to distinguish between clients. +-However, we recommend you not use this method in protocols you design, +-as we might someday permit connections from other machines that mount +-the same file systems. Instead, send each new client an identifying +-number if you want it to have one. +- +- After you close a socket in the local namespace, you should delete +-the file name from the file system. Use `unlink' or `remove' to do +-this; see *Note Deleting Files::. +- +- The local namespace supports just one protocol for any communication +-style; it is protocol number `0'. +- +- +-File: libc.info, Node: Local Namespace Details, Next: Local Socket Example, Prev: Local Namespace Concepts, Up: Local Namespace +- +-Details of Local Namespace +--------------------------- +- +- To create a socket in the local namespace, use the constant +-`PF_LOCAL' as the NAMESPACE argument to `socket' or `socketpair'. This +-constant is defined in `sys/socket.h'. +- +- - Macro: int PF_LOCAL +- This designates the local namespace, in which socket addresses are +- local names, and its associated family of protocols. `PF_Local' +- is the macro used by Posix.1g. +- +- - Macro: int PF_UNIX +- This is a synonym for `PF_LOCAL', for compatibility's sake. +- +- - Macro: int PF_FILE +- This is a synonym for `PF_LOCAL', for compatibility's sake. +- +- The structure for specifying socket names in the local namespace is +-defined in the header file `sys/un.h': +- +- - Data Type: struct sockaddr_un +- This structure is used to specify local namespace socket +- addresses. It has the following members: +- +- `short int sun_family' +- This identifies the address family or format of the socket +- address. You should store the value `AF_LOCAL' to designate +- the local namespace. *Note Socket Addresses::. +- +- `char sun_path[108]' +- This is the file name to use. +- +- *Incomplete:* Why is 108 a magic number? RMS suggests making +- this a zero-length array and tweaking the following example +- to use `alloca' to allocate an appropriate amount of storage +- based on the length of the filename. +- +- You should compute the LENGTH parameter for a socket address in the +-local namespace as the sum of the size of the `sun_family' component +-and the string length (_not_ the allocation size!) of the file name +-string. This can be done using the macro `SUN_LEN': +- +- - Macro: int SUN_LEN (_struct sockaddr_un *_ PTR) +- The macro computes the length of socket address in the local +- namespace. +- +- +-File: libc.info, Node: Local Socket Example, Prev: Local Namespace Details, Up: Local Namespace +- +-Example of Local-Namespace Sockets +----------------------------------- +- +- Here is an example showing how to create and name a socket in the +-local namespace. +- +- #include +- #include +- #include +- #include +- #include +- #include +- #include +- +- int +- make_named_socket (const char *filename) +- { +- struct sockaddr_un name; +- int sock; +- size_t size; +- +- /* Create the socket. */ +- sock = socket (PF_LOCAL, SOCK_DGRAM, 0); +- if (sock < 0) +- { +- perror ("socket"); +- exit (EXIT_FAILURE); +- } +- +- /* Bind a name to the socket. */ +- name.sun_family = AF_LOCAL; +- strncpy (name.sun_path, filename, sizeof (name.sun_path)); +- name.sun_path[sizeof (name.sun_path) - 1] = '\0'; +- +- /* The size of the address is +- the offset of the start of the filename, +- plus its length, +- plus one for the terminating null byte. +- Alternatively you can just do: +- size = SUN_LEN (&name); +- */ +- size = (offsetof (struct sockaddr_un, sun_path) +- + strlen (name.sun_path) + 1); +- +- if (bind (sock, (struct sockaddr *) &name, size) < 0) +- { +- perror ("bind"); +- exit (EXIT_FAILURE); +- } +- +- return sock; +- } +- +- +-File: libc.info, Node: Internet Namespace, Next: Misc Namespaces, Prev: Local Namespace, Up: Sockets +- +-The Internet Namespace +-====================== +- +- This section describes the details of the protocols and socket naming +-conventions used in the Internet namespace. +- +- Originally the Internet namespace used only IP version 4 (IPv4). +-With the growing number of hosts on the Internet, a new protocol with a +-larger address space was necessary: IP version 6 (IPv6). IPv6 +-introduces 128-bit addresses (IPv4 has 32-bit addresses) and other +-features, and will eventually replace IPv4. +- +- To create a socket in the IPv4 Internet namespace, use the symbolic +-name `PF_INET' of this namespace as the NAMESPACE argument to `socket' +-or `socketpair'. For IPv6 addresses you need the macro `PF_INET6'. +-These macros are defined in `sys/socket.h'. +- +- - Macro: int PF_INET +- This designates the IPv4 Internet namespace and associated family +- of protocols. +- +- - Macro: int PF_INET6 +- This designates the IPv6 Internet namespace and associated family +- of protocols. +- +- A socket address for the Internet namespace includes the following +-components: +- +- * The address of the machine you want to connect to. Internet +- addresses can be specified in several ways; these are discussed in +- *Note Internet Address Formats::, *Note Host Addresses:: and *Note +- Host Names::. +- +- * A port number for that machine. *Note Ports::. +- +- You must ensure that the address and port number are represented in a +-canonical format called "network byte order". *Note Byte Order::, for +-information about this. +- +-* Menu: +- +-* Internet Address Formats:: How socket addresses are specified in the +- Internet namespace. +-* Host Addresses:: All about host addresses of Internet host. +-* Protocols Database:: Referring to protocols by name. +-* Ports:: Internet port numbers. +-* Services Database:: Ports may have symbolic names. +-* Byte Order:: Different hosts may use different byte +- ordering conventions; you need to +- canonicalize host address and port number. +-* Inet Example:: Putting it all together. +- +- +-File: libc.info, Node: Internet Address Formats, Next: Host Addresses, Up: Internet Namespace +- +-Internet Socket Address Formats +-------------------------------- +- +- In the Internet namespace, for both IPv4 (`AF_INET') and IPv6 +-(`AF_INET6'), a socket address consists of a host address and a port on +-that host. In addition, the protocol you choose serves effectively as +-a part of the address because local port numbers are meaningful only +-within a particular protocol. +- +- The data types for representing socket addresses in the Internet +-namespace are defined in the header file `netinet/in.h'. +- +- - Data Type: struct sockaddr_in +- This is the data type used to represent socket addresses in the +- Internet namespace. It has the following members: +- +- `sa_family_t sin_family' +- This identifies the address family or format of the socket +- address. You should store the value `AF_INET' in this member. +- *Note Socket Addresses::. +- +- `struct in_addr sin_addr' +- This is the Internet address of the host machine. *Note Host +- Addresses::, and *Note Host Names::, for how to get a value +- to store here. +- +- `unsigned short int sin_port' +- This is the port number. *Note Ports::. +- +- When you call `bind' or `getsockname', you should specify `sizeof +-(struct sockaddr_in)' as the LENGTH parameter if you are using an IPv4 +-Internet namespace socket address. +- +- - Data Type: struct sockaddr_in6 +- This is the data type used to represent socket addresses in the +- IPv6 namespace. It has the following members: +- +- `sa_family_t sin6_family' +- This identifies the address family or format of the socket +- address. You should store the value of `AF_INET6' in this +- member. *Note Socket Addresses::. +- +- `struct in6_addr sin6_addr' +- This is the IPv6 address of the host machine. *Note Host +- Addresses::, and *Note Host Names::, for how to get a value +- to store here. +- +- `uint32_t sin6_flowinfo' +- This is a currently unimplemented field. +- +- `uint16_t sin6_port' +- This is the port number. *Note Ports::. +- +- +- +-File: libc.info, Node: Host Addresses, Next: Protocols Database, Prev: Internet Address Formats, Up: Internet Namespace +- +-Host Addresses +--------------- +- +- Each computer on the Internet has one or more "Internet addresses", +-numbers which identify that computer among all those on the Internet. +-Users typically write IPv4 numeric host addresses as sequences of four +-numbers, separated by periods, as in `128.52.46.32', and IPv6 numeric +-host addresses as sequences of up to eight numbers separated by colons, +-as in `5f03:1200:836f:c100::1'. +- +- Each computer also has one or more "host names", which are strings +-of words separated by periods, as in `mescaline.gnu.org'. +- +- Programs that let the user specify a host typically accept both +-numeric addresses and host names. To open a connection a program needs +-a numeric address, and so must convert a host name to the numeric +-address it stands for. +- +-* Menu: +- +-* Abstract Host Addresses:: What a host number consists of. +-* Data type: Host Address Data Type. Data type for a host number. +-* Functions: Host Address Functions. Functions to operate on them. +-* Names: Host Names. Translating host names to host numbers. +- +- +-File: libc.info, Node: Abstract Host Addresses, Next: Host Address Data Type, Up: Host Addresses +- +-Internet Host Addresses +-....................... +- +- Each computer on the Internet has one or more Internet addresses, +-numbers which identify that computer among all those on the Internet. +- +- An IPv4 Internet host address is a number containing four bytes of +-data. Historically these are divided into two parts, a "network +-number" and a "local network address number" within that network. In +-the mid-1990s classless addresses were introduced which changed this +-behavior. Since some functions implicitly expect the old definitions, +-we first describe the class-based network and will then describe +-classless addresses. IPv6 uses only classless addresses and therefore +-the following paragraphs don't apply. +- +- The class-based IPv4 network number consists of the first one, two or +-three bytes; the rest of the bytes are the local address. +- +- IPv4 network numbers are registered with the Network Information +-Center (NIC), and are divided into three classes--A, B and C. The local +-network address numbers of individual machines are registered with the +-administrator of the particular network. +- +- Class A networks have single-byte numbers in the range 0 to 127. +-There are only a small number of Class A networks, but they can each +-support a very large number of hosts. Medium-sized Class B networks +-have two-byte network numbers, with the first byte in the range 128 to +-191. Class C networks are the smallest; they have three-byte network +-numbers, with the first byte in the range 192-255. Thus, the first 1, +-2, or 3 bytes of an Internet address specify a network. The remaining +-bytes of the Internet address specify the address within that network. +- +- The Class A network 0 is reserved for broadcast to all networks. In +-addition, the host number 0 within each network is reserved for +-broadcast to all hosts in that network. These uses are obsolete now +-but for compatibility reasons you shouldn't use network 0 and host +-number 0. +- +- The Class A network 127 is reserved for loopback; you can always use +-the Internet address `127.0.0.1' to refer to the host machine. +- +- Since a single machine can be a member of multiple networks, it can +-have multiple Internet host addresses. However, there is never +-supposed to be more than one machine with the same host address. +- +- There are four forms of the "standard numbers-and-dots notation" for +-Internet addresses: +- +-`A.B.C.D' +- This specifies all four bytes of the address individually and is +- the commonly used representation. +- +-`A.B.C' +- The last part of the address, C, is interpreted as a 2-byte +- quantity. This is useful for specifying host addresses in a Class +- B network with network address number `A.B'. +- +-`A.B' +- The last part of the address, B, is interpreted as a 3-byte +- quantity. This is useful for specifying host addresses in a Class +- A network with network address number A. +- +-`A' +- If only one part is given, this corresponds directly to the host +- address number. +- +- Within each part of the address, the usual C conventions for +-specifying the radix apply. In other words, a leading `0x' or `0X' +-implies hexadecimal radix; a leading `0' implies octal; and otherwise +-decimal radix is assumed. +- +-Classless Addresses +-................... +- +- IPv4 addresses (and IPv6 addresses also) are now considered +-classless; the distinction between classes A, B and C can be ignored. +-Instead an IPv4 host address consists of a 32-bit address and a 32-bit +-mask. The mask contains set bits for the network part and cleared bits +-for the host part. The network part is contiguous from the left, with +-the remaining bits representing the host. As a consequence, the +-netmask can simply be specified as the number of set bits. Classes A, +-B and C are just special cases of this general rule. For example, +-class A addresses have a netmask of `255.0.0.0' or a prefix length of 8. +- +- Classless IPv4 network addresses are written in numbers-and-dots +-notation with the prefix length appended and a slash as separator. For +-example the class A network 10 is written as `10.0.0.0/8'. +- +-IPv6 Addresses +-.............. +- +- IPv6 addresses contain 128 bits (IPv4 has 32 bits) of data. A host +-address is usually written as eight 16-bit hexadecimal numbers that are +-separated by colons. Two colons are used to abbreviate strings of +-consecutive zeros. For example, the IPv6 loopback address +-`0:0:0:0:0:0:0:1' can just be written as `::1'. +- +- +-File: libc.info, Node: Host Address Data Type, Next: Host Address Functions, Prev: Abstract Host Addresses, Up: Host Addresses +- +-Host Address Data Type +-...................... +- +- IPv4 Internet host addresses are represented in some contexts as +-integers (type `uint32_t'). In other contexts, the integer is packaged +-inside a structure of type `struct in_addr'. It would be better if the +-usage were made consistent, but it is not hard to extract the integer +-from the structure or put the integer into a structure. +- +- You will find older code that uses `unsigned long int' for IPv4 +-Internet host addresses instead of `uint32_t' or `struct in_addr'. +-Historically `unsigned long int' was a 32-bit number but with 64-bit +-machines this has changed. Using `unsigned long int' might break the +-code if it is used on machines where this type doesn't have 32 bits. +-`uint32_t' is specified by Unix98 and guaranteed to have 32 bits. +- +- IPv6 Internet host addresses have 128 bits and are packaged inside a +-structure of type `struct in6_addr'. +- +- The following basic definitions for Internet addresses are declared +-in the header file `netinet/in.h': +- +- - Data Type: struct in_addr +- This data type is used in certain contexts to contain an IPv4 +- Internet host address. It has just one field, named `s_addr', +- which records the host address number as an `uint32_t'. +- +- - Macro: uint32_t INADDR_LOOPBACK +- You can use this constant to stand for "the address of this +- machine," instead of finding its actual address. It is the IPv4 +- Internet address `127.0.0.1', which is usually called `localhost'. +- This special constant saves you the trouble of looking up the +- address of your own machine. Also, the system usually implements +- `INADDR_LOOPBACK' specially, avoiding any network traffic for the +- case of one machine talking to itself. +- +- - Macro: uint32_t INADDR_ANY +- You can use this constant to stand for "any incoming address" when +- binding to an address. *Note Setting Address::. This is the usual +- address to give in the `sin_addr' member of `struct sockaddr_in' +- when you want to accept Internet connections. +- +- - Macro: uint32_t INADDR_BROADCAST +- This constant is the address you use to send a broadcast message. +- +- - Macro: uint32_t INADDR_NONE +- This constant is returned by some functions to indicate an error. +- +- - Data Type: struct in6_addr +- This data type is used to store an IPv6 address. It stores 128 +- bits of data, which can be accessed (via a union) in a variety of +- ways. +- +- - Constant: struct in6_addr in6addr_loopback +- This constant is the IPv6 address `::1', the loopback address. See +- above for a description of what this means. The macro +- `IN6ADDR_LOOPBACK_INIT' is provided to allow you to initialize your +- own variables to this value. +- +- - Constant: struct in6_addr in6addr_any +- This constant is the IPv6 address `::', the unspecified address. +- See above for a description of what this means. The macro +- `IN6ADDR_ANY_INIT' is provided to allow you to initialize your own +- variables to this value. +- +- +-File: libc.info, Node: Host Address Functions, Next: Host Names, Prev: Host Address Data Type, Up: Host Addresses +- +-Host Address Functions +-...................... +- +-These additional functions for manipulating Internet addresses are +-declared in the header file `arpa/inet.h'. They represent Internet +-addresses in network byte order, and network numbers and +-local-address-within-network numbers in host byte order. *Note Byte +-Order::, for an explanation of network and host byte order. +- +- - Function: int inet_aton (const char *NAME, struct in_addr *ADDR) +- This function converts the IPv4 Internet host address NAME from +- the standard numbers-and-dots notation into binary data and stores +- it in the `struct in_addr' that ADDR points to. `inet_aton' +- returns nonzero if the address is valid, zero if not. +- +- - Function: uint32_t inet_addr (const char *NAME) +- This function converts the IPv4 Internet host address NAME from the +- standard numbers-and-dots notation into binary data. If the input +- is not valid, `inet_addr' returns `INADDR_NONE'. This is an +- obsolete interface to `inet_aton', described immediately above. It +- is obsolete because `INADDR_NONE' is a valid address +- (255.255.255.255), and `inet_aton' provides a cleaner way to +- indicate error return. +- +- - Function: uint32_t inet_network (const char *NAME) +- This function extracts the network number from the address NAME, +- given in the standard numbers-and-dots notation. The returned +- address is in host order. If the input is not valid, +- `inet_network' returns `-1'. +- +- The function works only with traditional IPv4 class A, B and C +- network types. It doesn't work with classless addresses and +- shouldn't be used anymore. +- +- - Function: char * inet_ntoa (struct in_addr ADDR) +- This function converts the IPv4 Internet host address ADDR to a +- string in the standard numbers-and-dots notation. The return +- value is a pointer into a statically-allocated buffer. Subsequent +- calls will overwrite the same buffer, so you should copy the +- string if you need to save it. +- +- In multi-threaded programs each thread has an own +- statically-allocated buffer. But still subsequent calls of +- `inet_ntoa' in the same thread will overwrite the result of the +- last call. +- +- Instead of `inet_ntoa' the newer function `inet_ntop' which is +- described below should be used since it handles both IPv4 and IPv6 +- addresses. +- +- - Function: struct in_addr inet_makeaddr (uint32_t NET, uint32_t LOCAL) +- This function makes an IPv4 Internet host address by combining the +- network number NET with the local-address-within-network number +- LOCAL. +- +- - Function: uint32_t inet_lnaof (struct in_addr ADDR) +- This function returns the local-address-within-network part of the +- Internet host address ADDR. +- +- The function works only with traditional IPv4 class A, B and C +- network types. It doesn't work with classless addresses and +- shouldn't be used anymore. +- +- - Function: uint32_t inet_netof (struct in_addr ADDR) +- This function returns the network number part of the Internet host +- address ADDR. +- +- The function works only with traditional IPv4 class A, B and C +- network types. It doesn't work with classless addresses and +- shouldn't be used anymore. +- +- - Function: int inet_pton (int AF, const char *CP, void *BUF) +- This function converts an Internet address (either IPv4 or IPv6) +- from presentation (textual) to network (binary) format. AF should +- be either `AF_INET' or `AF_INET6', as appropriate for the type of +- address being converted. CP is a pointer to the input string, and +- BUF is a pointer to a buffer for the result. It is the caller's +- responsibility to make sure the buffer is large enough. +- +- - Function: const char * inet_ntop (int AF, const void *CP, char *BUF, +- size_t LEN) +- This function converts an Internet address (either IPv4 or IPv6) +- from network (binary) to presentation (textual) form. AF should be +- either `AF_INET' or `AF_INET6', as appropriate. CP is a pointer +- to the address to be converted. BUF should be a pointer to a +- buffer to hold the result, and LEN is the length of this buffer. +- The return value from the function will be this buffer address. +- +- +-File: libc.info, Node: Host Names, Prev: Host Address Functions, Up: Host Addresses +- +-Host Names +-.......... +- +- Besides the standard numbers-and-dots notation for Internet +-addresses, you can also refer to a host by a symbolic name. The +-advantage of a symbolic name is that it is usually easier to remember. +-For example, the machine with Internet address `158.121.106.19' is also +-known as `alpha.gnu.org'; and other machines in the `gnu.org' domain +-can refer to it simply as `alpha'. +- +- Internally, the system uses a database to keep track of the mapping +-between host names and host numbers. This database is usually either +-the file `/etc/hosts' or an equivalent provided by a name server. The +-functions and other symbols for accessing this database are declared in +-`netdb.h'. They are BSD features, defined unconditionally if you +-include `netdb.h'. +- +- - Data Type: struct hostent +- This data type is used to represent an entry in the hosts +- database. It has the following members: +- +- `char *h_name' +- This is the "official" name of the host. +- +- `char **h_aliases' +- These are alternative names for the host, represented as a +- null-terminated vector of strings. +- +- `int h_addrtype' +- This is the host address type; in practice, its value is +- always either `AF_INET' or `AF_INET6', with the latter being +- used for IPv6 hosts. In principle other kinds of addresses +- could be represented in the database as well as Internet +- addresses; if this were done, you might find a value in this +- field other than `AF_INET' or `AF_INET6'. *Note Socket +- Addresses::. +- +- `int h_length' +- This is the length, in bytes, of each address. +- +- `char **h_addr_list' +- This is the vector of addresses for the host. (Recall that +- the host might be connected to multiple networks and have +- different addresses on each one.) The vector is terminated +- by a null pointer. +- +- `char *h_addr' +- This is a synonym for `h_addr_list[0]'; in other words, it is +- the first host address. +- +- As far as the host database is concerned, each address is just a +-block of memory `h_length' bytes long. But in other contexts there is +-an implicit assumption that you can convert IPv4 addresses to a `struct +-in_addr' or an `uint32_t'. Host addresses in a `struct hostent' +-structure are always given in network byte order; see *Note Byte +-Order::. +- +- You can use `gethostbyname', `gethostbyname2' or `gethostbyaddr' to +-search the hosts database for information about a particular host. The +-information is returned in a statically-allocated structure; you must +-copy the information if you need to save it across calls. You can also +-use `getaddrinfo' and `getnameinfo' to obtain this information. +- +- - Function: struct hostent * gethostbyname (const char *NAME) +- The `gethostbyname' function returns information about the host +- named NAME. If the lookup fails, it returns a null pointer. +- +- - Function: struct hostent * gethostbyname2 (const char *NAME, int AF) +- The `gethostbyname2' function is like `gethostbyname', but allows +- the caller to specify the desired address family (e.g. `AF_INET' +- or `AF_INET6') of the result. +- +- - Function: struct hostent * gethostbyaddr (const char *ADDR, size_t +- LENGTH, int FORMAT) +- The `gethostbyaddr' function returns information about the host +- with Internet address ADDR. The parameter ADDR is not really a +- pointer to char - it can be a pointer to an IPv4 or an IPv6 +- address. The LENGTH argument is the size (in bytes) of the address +- at ADDR. FORMAT specifies the address format; for an IPv4 +- Internet address, specify a value of `AF_INET'; for an IPv6 +- Internet address, use `AF_INET6'. +- +- If the lookup fails, `gethostbyaddr' returns a null pointer. +- +- If the name lookup by `gethostbyname' or `gethostbyaddr' fails, you +-can find out the reason by looking at the value of the variable +-`h_errno'. (It would be cleaner design for these functions to set +-`errno', but use of `h_errno' is compatible with other systems.) +- +- Here are the error codes that you may find in `h_errno': +- +-`HOST_NOT_FOUND' +- No such host is known in the database. +- +-`TRY_AGAIN' +- This condition happens when the name server could not be +- contacted. If you try again later, you may succeed then. +- +-`NO_RECOVERY' +- A non-recoverable error occurred. +- +-`NO_ADDRESS' +- The host database contains an entry for the name, but it doesn't +- have an associated Internet address. +- +- The lookup functions above all have one in common: they are not +-reentrant and therefore unusable in multi-threaded applications. +-Therefore provides the GNU C library a new set of functions which can be +-used in this context. +- +- - Function: int gethostbyname_r (const char *restrict NAME, struct +- hostent *restrict RESULT_BUF, char *restrict BUF, size_t +- BUFLEN, struct hostent **restrict RESULT, int *restrict +- H_ERRNOP) +- The `gethostbyname_r' function returns information about the host +- named NAME. The caller must pass a pointer to an object of type +- `struct hostent' in the RESULT_BUF parameter. In addition the +- function may need extra buffer space and the caller must pass an +- pointer and the size of the buffer in the BUF and BUFLEN +- parameters. +- +- A pointer to the buffer, in which the result is stored, is +- available in `*RESULT' after the function call successfully +- returned. If an error occurs or if no entry is found, the pointer +- `*RESULT' is a null pointer. Success is signalled by a zero +- return value. If the function failed the return value is an error +- number. In addition to the errors defined for `gethostbyname' it +- can also be `ERANGE'. In this case the call should be repeated +- with a larger buffer. Additional error information is not stored +- in the global variable `h_errno' but instead in the object pointed +- to by H_ERRNOP. +- +- Here's a small example: +- struct hostent * +- gethostname (char *host) +- { +- struct hostent hostbuf, *hp; +- size_t hstbuflen; +- char *tmphstbuf; +- int res; +- int herr; +- +- hstbuflen = 1024; +- /* Allocate buffer, remember to free it to avoid memory leakage. */ +- tmphstbuf = malloc (hstbuflen); +- +- while ((res = gethostbyname_r (host, &hostbuf, tmphstbuf, hstbuflen, +- &hp, &herr)) == ERANGE) +- { +- /* Enlarge the buffer. */ +- hstbuflen *= 2; +- tmphstbuf = realloc (tmphstbuf, hstbuflen); +- } +- /* Check for errors. */ +- if (res || hp == NULL) +- return NULL; +- return hp; +- } +- +- - Function: int gethostbyname2_r (const char *NAME, int AF, struct +- hostent *restrict RESULT_BUF, char *restrict BUF, size_t +- BUFLEN, struct hostent **restrict RESULT, int *restrict +- H_ERRNOP) +- The `gethostbyname2_r' function is like `gethostbyname_r', but +- allows the caller to specify the desired address family (e.g. +- `AF_INET' or `AF_INET6') for the result. +- +- - Function: int gethostbyaddr_r (const char *ADDR, size_t LENGTH, int +- FORMAT, struct hostent *restrict RESULT_BUF, char *restrict +- BUF, size_t BUFLEN, struct hostent **restrict RESULT, int +- *restrict H_ERRNOP) +- The `gethostbyaddr_r' function returns information about the host +- with Internet address ADDR. The parameter ADDR is not really a +- pointer to char - it can be a pointer to an IPv4 or an IPv6 +- address. The LENGTH argument is the size (in bytes) of the address +- at ADDR. FORMAT specifies the address format; for an IPv4 +- Internet address, specify a value of `AF_INET'; for an IPv6 +- Internet address, use `AF_INET6'. +- +- Similar to the `gethostbyname_r' function, the caller must provide +- buffers for the result and memory used internally. In case of +- success the function returns zero. Otherwise the value is an +- error number where `ERANGE' has the special meaning that the +- caller-provided buffer is too small. +- +- You can also scan the entire hosts database one entry at a time using +-`sethostent', `gethostent' and `endhostent'. Be careful when using +-these functions because they are not reentrant. +- +- - Function: void sethostent (int STAYOPEN) +- This function opens the hosts database to begin scanning it. You +- can then call `gethostent' to read the entries. +- +- If the STAYOPEN argument is nonzero, this sets a flag so that +- subsequent calls to `gethostbyname' or `gethostbyaddr' will not +- close the database (as they usually would). This makes for more +- efficiency if you call those functions several times, by avoiding +- reopening the database for each call. +- +- - Function: struct hostent * gethostent (void) +- This function returns the next entry in the hosts database. It +- returns a null pointer if there are no more entries. +- +- - Function: void endhostent (void) +- This function closes the hosts database. +- +- +-File: libc.info, Node: Ports, Next: Services Database, Prev: Protocols Database, Up: Internet Namespace +- +-Internet Ports +--------------- +- +- A socket address in the Internet namespace consists of a machine's +-Internet address plus a "port number" which distinguishes the sockets +-on a given machine (for a given protocol). Port numbers range from 0 +-to 65,535. +- +- Port numbers less than `IPPORT_RESERVED' are reserved for standard +-servers, such as `finger' and `telnet'. There is a database that keeps +-track of these, and you can use the `getservbyname' function to map a +-service name onto a port number; see *Note Services Database::. +- +- If you write a server that is not one of the standard ones defined in +-the database, you must choose a port number for it. Use a number +-greater than `IPPORT_USERRESERVED'; such numbers are reserved for +-servers and won't ever be generated automatically by the system. +-Avoiding conflicts with servers being run by other users is up to you. +- +- When you use a socket without specifying its address, the system +-generates a port number for it. This number is between +-`IPPORT_RESERVED' and `IPPORT_USERRESERVED'. +- +- On the Internet, it is actually legitimate to have two different +-sockets with the same port number, as long as they never both try to +-communicate with the same socket address (host address plus port +-number). You shouldn't duplicate a port number except in special +-circumstances where a higher-level protocol requires it. Normally, the +-system won't let you do it; `bind' normally insists on distinct port +-numbers. To reuse a port number, you must set the socket option +-`SO_REUSEADDR'. *Note Socket-Level Options::. +- +- These macros are defined in the header file `netinet/in.h'. +- +- - Macro: int IPPORT_RESERVED +- Port numbers less than `IPPORT_RESERVED' are reserved for +- superuser use. +- +- - Macro: int IPPORT_USERRESERVED +- Port numbers greater than or equal to `IPPORT_USERRESERVED' are +- reserved for explicit use; they will never be allocated +- automatically. +- +- +-File: libc.info, Node: Services Database, Next: Byte Order, Prev: Ports, Up: Internet Namespace +- +-The Services Database +---------------------- +- +- The database that keeps track of "well-known" services is usually +-either the file `/etc/services' or an equivalent from a name server. +-You can use these utilities, declared in `netdb.h', to access the +-services database. +- +- - Data Type: struct servent +- This data type holds information about entries from the services +- database. It has the following members: +- +- `char *s_name' +- This is the "official" name of the service. +- +- `char **s_aliases' +- These are alternate names for the service, represented as an +- array of strings. A null pointer terminates the array. +- +- `int s_port' +- This is the port number for the service. Port numbers are +- given in network byte order; see *Note Byte Order::. +- +- `char *s_proto' +- This is the name of the protocol to use with this service. +- *Note Protocols Database::. +- +- To get information about a particular service, use the +-`getservbyname' or `getservbyport' functions. The information is +-returned in a statically-allocated structure; you must copy the +-information if you need to save it across calls. +- +- - Function: struct servent * getservbyname (const char *NAME, const +- char *PROTO) +- The `getservbyname' function returns information about the service +- named NAME using protocol PROTO. If it can't find such a service, +- it returns a null pointer. +- +- This function is useful for servers as well as for clients; servers +- use it to determine which port they should listen on (*note +- Listening::). +- +- - Function: struct servent * getservbyport (int PORT, const char +- *PROTO) +- The `getservbyport' function returns information about the service +- at port PORT using protocol PROTO. If it can't find such a +- service, it returns a null pointer. +- +-You can also scan the services database using `setservent', +-`getservent' and `endservent'. Be careful when using these functions +-because they are not reentrant. +- +- - Function: void setservent (int STAYOPEN) +- This function opens the services database to begin scanning it. +- +- If the STAYOPEN argument is nonzero, this sets a flag so that +- subsequent calls to `getservbyname' or `getservbyport' will not +- close the database (as they usually would). This makes for more +- efficiency if you call those functions several times, by avoiding +- reopening the database for each call. +- +- - Function: struct servent * getservent (void) +- This function returns the next entry in the services database. If +- there are no more entries, it returns a null pointer. +- +- - Function: void endservent (void) +- This function closes the services database. +- +- +-File: libc.info, Node: Byte Order, Next: Inet Example, Prev: Services Database, Up: Internet Namespace +- +-Byte Order Conversion +---------------------- +- +- Different kinds of computers use different conventions for the +-ordering of bytes within a word. Some computers put the most +-significant byte within a word first (this is called "big-endian" +-order), and others put it last ("little-endian" order). +- +- So that machines with different byte order conventions can +-communicate, the Internet protocols specify a canonical byte order +-convention for data transmitted over the network. This is known as +-"network byte order". +- +- When establishing an Internet socket connection, you must make sure +-that the data in the `sin_port' and `sin_addr' members of the +-`sockaddr_in' structure are represented in network byte order. If you +-are encoding integer data in the messages sent through the socket, you +-should convert this to network byte order too. If you don't do this, +-your program may fail when running on or talking to other kinds of +-machines. +- +- If you use `getservbyname' and `gethostbyname' or `inet_addr' to get +-the port number and host address, the values are already in network +-byte order, and you can copy them directly into the `sockaddr_in' +-structure. +- +- Otherwise, you have to convert the values explicitly. Use `htons' +-and `ntohs' to convert values for the `sin_port' member. Use `htonl' +-and `ntohl' to convert IPv4 addresses for the `sin_addr' member. +-(Remember, `struct in_addr' is equivalent to `uint32_t'.) These +-functions are declared in `netinet/in.h'. +- +- - Function: uint16_t htons (uint16_t HOSTSHORT) +- This function converts the `uint16_t' integer HOSTSHORT from host +- byte order to network byte order. +- +- - Function: uint16_t ntohs (uint16_t NETSHORT) +- This function converts the `uint16_t' integer NETSHORT from +- network byte order to host byte order. +- +- - Function: uint32_t htonl (uint32_t HOSTLONG) +- This function converts the `uint32_t' integer HOSTLONG from host +- byte order to network byte order. +- +- This is used for IPv4 Internet addresses. +- +- - Function: uint32_t ntohl (uint32_t NETLONG) +- This function converts the `uint32_t' integer NETLONG from network +- byte order to host byte order. +- +- This is used for IPv4 Internet addresses. +- +- +-File: libc.info, Node: Protocols Database, Next: Ports, Prev: Host Addresses, Up: Internet Namespace +- +-Protocols Database +------------------- +- +- The communications protocol used with a socket controls low-level +-details of how data are exchanged. For example, the protocol implements +-things like checksums to detect errors in transmissions, and routing +-instructions for messages. Normal user programs have little reason to +-mess with these details directly. +- +- The default communications protocol for the Internet namespace +-depends on the communication style. For stream communication, the +-default is TCP ("transmission control protocol"). For datagram +-communication, the default is UDP ("user datagram protocol"). For +-reliable datagram communication, the default is RDP ("reliable datagram +-protocol"). You should nearly always use the default. +- +- Internet protocols are generally specified by a name instead of a +-number. The network protocols that a host knows about are stored in a +-database. This is usually either derived from the file +-`/etc/protocols', or it may be an equivalent provided by a name server. +-You look up the protocol number associated with a named protocol in +-the database using the `getprotobyname' function. +- +- Here are detailed descriptions of the utilities for accessing the +-protocols database. These are declared in `netdb.h'. +- +- - Data Type: struct protoent +- This data type is used to represent entries in the network +- protocols database. It has the following members: +- +- `char *p_name' +- This is the official name of the protocol. +- +- `char **p_aliases' +- These are alternate names for the protocol, specified as an +- array of strings. The last element of the array is a null +- pointer. +- +- `int p_proto' +- This is the protocol number (in host byte order); use this +- member as the PROTOCOL argument to `socket'. +- +- You can use `getprotobyname' and `getprotobynumber' to search the +-protocols database for a specific protocol. The information is +-returned in a statically-allocated structure; you must copy the +-information if you need to save it across calls. +- +- - Function: struct protoent * getprotobyname (const char *NAME) +- The `getprotobyname' function returns information about the +- network protocol named NAME. If there is no such protocol, it +- returns a null pointer. +- +- - Function: struct protoent * getprotobynumber (int PROTOCOL) +- The `getprotobynumber' function returns information about the +- network protocol with number PROTOCOL. If there is no such +- protocol, it returns a null pointer. +- +- You can also scan the whole protocols database one protocol at a +-time by using `setprotoent', `getprotoent' and `endprotoent'. Be +-careful when using these functions because they are not reentrant. +- +- - Function: void setprotoent (int STAYOPEN) +- This function opens the protocols database to begin scanning it. +- +- If the STAYOPEN argument is nonzero, this sets a flag so that +- subsequent calls to `getprotobyname' or `getprotobynumber' will +- not close the database (as they usually would). This makes for +- more efficiency if you call those functions several times, by +- avoiding reopening the database for each call. +- +- - Function: struct protoent * getprotoent (void) +- This function returns the next entry in the protocols database. It +- returns a null pointer if there are no more entries. +- +- - Function: void endprotoent (void) +- This function closes the protocols database. +- +- +-File: libc.info, Node: Inet Example, Prev: Byte Order, Up: Internet Namespace +- +-Internet Socket Example +------------------------ +- +- Here is an example showing how to create and name a socket in the +-Internet namespace. The newly created socket exists on the machine that +-the program is running on. Rather than finding and using the machine's +-Internet address, this example specifies `INADDR_ANY' as the host +-address; the system replaces that with the machine's actual address. +- +- #include +- #include +- #include +- #include +- +- int +- make_socket (uint16_t port) +- { +- int sock; +- struct sockaddr_in name; +- +- /* Create the socket. */ +- sock = socket (PF_INET, SOCK_STREAM, 0); +- if (sock < 0) +- { +- perror ("socket"); +- exit (EXIT_FAILURE); +- } +- +- /* Give the socket a name. */ +- name.sin_family = AF_INET; +- name.sin_port = htons (port); +- name.sin_addr.s_addr = htonl (INADDR_ANY); +- if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0) +- { +- perror ("bind"); +- exit (EXIT_FAILURE); +- } +- +- return sock; +- } +- +- Here is another example, showing how you can fill in a `sockaddr_in' +-structure, given a host name string and a port number: +- +- #include +- #include +- #include +- #include +- #include +- +- void +- init_sockaddr (struct sockaddr_in *name, +- const char *hostname, +- uint16_t port) +- { +- struct hostent *hostinfo; +- +- name->sin_family = AF_INET; +- name->sin_port = htons (port); +- hostinfo = gethostbyname (hostname); +- if (hostinfo == NULL) +- { +- fprintf (stderr, "Unknown host %s.\n", hostname); +- exit (EXIT_FAILURE); +- } +- name->sin_addr = *(struct in_addr *) hostinfo->h_addr; +- } +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-28 glibc-2.3.2-200304020432/manual/libc.info-28 +--- glibc-2.3.2/manual/libc.info-28 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-28 Thu Jan 1 01:00:00 1970 +@@ -1,1370 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Misc Namespaces, Next: Open/Close Sockets, Prev: Internet Namespace, Up: Sockets +- +-Other Namespaces +-================ +- +- Certain other namespaces and associated protocol families are +-supported but not documented yet because they are not often used. +-`PF_NS' refers to the Xerox Network Software protocols. `PF_ISO' stands +-for Open Systems Interconnect. `PF_CCITT' refers to protocols from +-CCITT. `socket.h' defines these symbols and others naming protocols +-not actually implemented. +- +- `PF_IMPLINK' is used for communicating between hosts and Internet +-Message Processors. For information on this and `PF_ROUTE', an +-occasionally-used local area routing protocol, see the GNU Hurd Manual +-(to appear in the future). +- +- +-File: libc.info, Node: Open/Close Sockets, Next: Connections, Prev: Misc Namespaces, Up: Sockets +- +-Opening and Closing Sockets +-=========================== +- +- This section describes the actual library functions for opening and +-closing sockets. The same functions work for all namespaces and +-connection styles. +- +-* Menu: +- +-* Creating a Socket:: How to open a socket. +-* Closing a Socket:: How to close a socket. +-* Socket Pairs:: These are created like pipes. +- +- +-File: libc.info, Node: Creating a Socket, Next: Closing a Socket, Up: Open/Close Sockets +- +-Creating a Socket +------------------ +- +- The primitive for creating a socket is the `socket' function, +-declared in `sys/socket.h'. +- +- - Function: int socket (int NAMESPACE, int STYLE, int PROTOCOL) +- This function creates a socket and specifies communication style +- STYLE, which should be one of the socket styles listed in *Note +- Communication Styles::. The NAMESPACE argument specifies the +- namespace; it must be `PF_LOCAL' (*note Local Namespace::) or +- `PF_INET' (*note Internet Namespace::). PROTOCOL designates the +- specific protocol (*note Socket Concepts::); zero is usually right +- for PROTOCOL. +- +- The return value from `socket' is the file descriptor for the new +- socket, or `-1' in case of error. The following `errno' error +- conditions are defined for this function: +- +- `EPROTONOSUPPORT' +- The PROTOCOL or STYLE is not supported by the NAMESPACE +- specified. +- +- `EMFILE' +- The process already has too many file descriptors open. +- +- `ENFILE' +- The system already has too many file descriptors open. +- +- `EACCES' +- The process does not have the privilege to create a socket of +- the specified STYLE or PROTOCOL. +- +- `ENOBUFS' +- The system ran out of internal buffer space. +- +- The file descriptor returned by the `socket' function supports both +- read and write operations. However, like pipes, sockets do not +- support file positioning operations. +- +- For examples of how to call the `socket' function, see *Note Local +-Socket Example::, or *Note Inet Example::. +- +- +-File: libc.info, Node: Closing a Socket, Next: Socket Pairs, Prev: Creating a Socket, Up: Open/Close Sockets +- +-Closing a Socket +----------------- +- +- When you have finished using a socket, you can simply close its file +-descriptor with `close'; see *Note Opening and Closing Files::. If +-there is still data waiting to be transmitted over the connection, +-normally `close' tries to complete this transmission. You can control +-this behavior using the `SO_LINGER' socket option to specify a timeout +-period; see *Note Socket Options::. +- +- You can also shut down only reception or transmission on a +-connection by calling `shutdown', which is declared in `sys/socket.h'. +- +- - Function: int shutdown (int SOCKET, int HOW) +- The `shutdown' function shuts down the connection of socket +- SOCKET. The argument HOW specifies what action to perform: +- +- `0' +- Stop receiving data for this socket. If further data arrives, +- reject it. +- +- `1' +- Stop trying to transmit data from this socket. Discard any +- data waiting to be sent. Stop looking for acknowledgement of +- data already sent; don't retransmit it if it is lost. +- +- `2' +- Stop both reception and transmission. +- +- The return value is `0' on success and `-1' on failure. The +- following `errno' error conditions are defined for this function: +- +- `EBADF' +- SOCKET is not a valid file descriptor. +- +- `ENOTSOCK' +- SOCKET is not a socket. +- +- `ENOTCONN' +- SOCKET is not connected. +- +- +-File: libc.info, Node: Socket Pairs, Prev: Closing a Socket, Up: Open/Close Sockets +- +-Socket Pairs +------------- +- +- A "socket pair" consists of a pair of connected (but unnamed) +-sockets. It is very similar to a pipe and is used in much the same +-way. Socket pairs are created with the `socketpair' function, declared +-in `sys/socket.h'. A socket pair is much like a pipe; the main +-difference is that the socket pair is bidirectional, whereas the pipe +-has one input-only end and one output-only end (*note Pipes and +-FIFOs::). +- +- - Function: int socketpair (int NAMESPACE, int STYLE, int PROTOCOL, +- int FILEDES[2]) +- This function creates a socket pair, returning the file +- descriptors in `FILEDES[0]' and `FILEDES[1]'. The socket pair is +- a full-duplex communications channel, so that both reading and +- writing may be performed at either end. +- +- The NAMESPACE, STYLE and PROTOCOL arguments are interpreted as for +- the `socket' function. STYLE should be one of the communication +- styles listed in *Note Communication Styles::. The NAMESPACE +- argument specifies the namespace, which must be `AF_LOCAL' (*note +- Local Namespace::); PROTOCOL specifies the communications +- protocol, but zero is the only meaningful value. +- +- If STYLE specifies a connectionless communication style, then the +- two sockets you get are not _connected_, strictly speaking, but +- each of them knows the other as the default destination address, +- so they can send packets to each other. +- +- The `socketpair' function returns `0' on success and `-1' on +- failure. The following `errno' error conditions are defined for +- this function: +- +- `EMFILE' +- The process has too many file descriptors open. +- +- `EAFNOSUPPORT' +- The specified namespace is not supported. +- +- `EPROTONOSUPPORT' +- The specified protocol is not supported. +- +- `EOPNOTSUPP' +- The specified protocol does not support the creation of +- socket pairs. +- +- +-File: libc.info, Node: Connections, Next: Datagrams, Prev: Open/Close Sockets, Up: Sockets +- +-Using Sockets with Connections +-============================== +- +- The most common communication styles involve making a connection to a +-particular other socket, and then exchanging data with that socket over +-and over. Making a connection is asymmetric; one side (the "client") +-acts to request a connection, while the other side (the "server") makes +-a socket and waits for the connection request. +- +-* Menu: +- +-* Connecting:: What the client program must do. +-* Listening:: How a server program waits for requests. +-* Accepting Connections:: What the server does when it gets a request. +-* Who is Connected:: Getting the address of the +- other side of a connection. +-* Transferring Data:: How to send and receive data. +-* Byte Stream Example:: An example program: a client for communicating +- over a byte stream socket in the Internet namespace. +-* Server Example:: A corresponding server program. +-* Out-of-Band Data:: This is an advanced feature. +- +- +-File: libc.info, Node: Connecting, Next: Listening, Up: Connections +- +-Making a Connection +-------------------- +- +- In making a connection, the client makes a connection while the +-server waits for and accepts the connection. Here we discuss what the +-client program must do with the `connect' function, which is declared in +-`sys/socket.h'. +- +- - Function: int connect (int SOCKET, struct sockaddr *ADDR, socklen_t +- LENGTH) +- The `connect' function initiates a connection from the socket with +- file descriptor SOCKET to the socket whose address is specified by +- the ADDR and LENGTH arguments. (This socket is typically on +- another machine, and it must be already set up as a server.) +- *Note Socket Addresses::, for information about how these +- arguments are interpreted. +- +- Normally, `connect' waits until the server responds to the request +- before it returns. You can set nonblocking mode on the socket +- SOCKET to make `connect' return immediately without waiting for +- the response. *Note File Status Flags::, for information about +- nonblocking mode. +- +- The normal return value from `connect' is `0'. If an error +- occurs, `connect' returns `-1'. The following `errno' error +- conditions are defined for this function: +- +- `EBADF' +- The socket SOCKET is not a valid file descriptor. +- +- `ENOTSOCK' +- File descriptor SOCKET is not a socket. +- +- `EADDRNOTAVAIL' +- The specified address is not available on the remote machine. +- +- `EAFNOSUPPORT' +- The namespace of the ADDR is not supported by this socket. +- +- `EISCONN' +- The socket SOCKET is already connected. +- +- `ETIMEDOUT' +- The attempt to establish the connection timed out. +- +- `ECONNREFUSED' +- The server has actively refused to establish the connection. +- +- `ENETUNREACH' +- The network of the given ADDR isn't reachable from this host. +- +- `EADDRINUSE' +- The socket address of the given ADDR is already in use. +- +- `EINPROGRESS' +- The socket SOCKET is non-blocking and the connection could +- not be established immediately. You can determine when the +- connection is completely established with `select'; *note +- Waiting for I/O::. Another `connect' call on the same +- socket, before the connection is completely established, will +- fail with `EALREADY'. +- +- `EALREADY' +- The socket SOCKET is non-blocking and already has a pending +- connection in progress (see `EINPROGRESS' above). +- +- This function is defined as a cancellation point in multi-threaded +- programs, so one has to be prepared for this and make sure that +- allocated resources (like memory, files descriptors, semaphores or +- whatever) are freed even if the thread is canceled. +- +- +-File: libc.info, Node: Listening, Next: Accepting Connections, Prev: Connecting, Up: Connections +- +-Listening for Connections +-------------------------- +- +- Now let us consider what the server process must do to accept +-connections on a socket. First it must use the `listen' function to +-enable connection requests on the socket, and then accept each incoming +-connection with a call to `accept' (*note Accepting Connections::). +-Once connection requests are enabled on a server socket, the `select' +-function reports when the socket has a connection ready to be accepted +-(*note Waiting for I/O::). +- +- The `listen' function is not allowed for sockets using +-connectionless communication styles. +- +- You can write a network server that does not even start running +-until a connection to it is requested. *Note Inetd Servers::. +- +- In the Internet namespace, there are no special protection mechanisms +-for controlling access to a port; any process on any machine can make a +-connection to your server. If you want to restrict access to your +-server, make it examine the addresses associated with connection +-requests or implement some other handshaking or identification protocol. +- +- In the local namespace, the ordinary file protection bits control +-who has access to connect to the socket. +- +- - Function: int listen (int SOCKET, unsigned int N) +- The `listen' function enables the socket SOCKET to accept +- connections, thus making it a server socket. +- +- The argument N specifies the length of the queue for pending +- connections. When the queue fills, new clients attempting to +- connect fail with `ECONNREFUSED' until the server calls `accept' to +- accept a connection from the queue. +- +- The `listen' function returns `0' on success and `-1' on failure. +- The following `errno' error conditions are defined for this +- function: +- +- `EBADF' +- The argument SOCKET is not a valid file descriptor. +- +- `ENOTSOCK' +- The argument SOCKET is not a socket. +- +- `EOPNOTSUPP' +- The socket SOCKET does not support this operation. +- +- +-File: libc.info, Node: Accepting Connections, Next: Who is Connected, Prev: Listening, Up: Connections +- +-Accepting Connections +---------------------- +- +- When a server receives a connection request, it can complete the +-connection by accepting the request. Use the function `accept' to do +-this. +- +- A socket that has been established as a server can accept connection +-requests from multiple clients. The server's original socket _does not +-become part of the connection_; instead, `accept' makes a new socket +-which participates in the connection. `accept' returns the descriptor +-for this socket. The server's original socket remains available for +-listening for further connection requests. +- +- The number of pending connection requests on a server socket is +-finite. If connection requests arrive from clients faster than the +-server can act upon them, the queue can fill up and additional requests +-are refused with an `ECONNREFUSED' error. You can specify the maximum +-length of this queue as an argument to the `listen' function, although +-the system may also impose its own internal limit on the length of this +-queue. +- +- - Function: int accept (int SOCKET, struct sockaddr *ADDR, socklen_t +- *LENGTH_PTR) +- This function is used to accept a connection request on the server +- socket SOCKET. +- +- The `accept' function waits if there are no connections pending, +- unless the socket SOCKET has nonblocking mode set. (You can use +- `select' to wait for a pending connection, with a nonblocking +- socket.) *Note File Status Flags::, for information about +- nonblocking mode. +- +- The ADDR and LENGTH-PTR arguments are used to return information +- about the name of the client socket that initiated the connection. +- *Note Socket Addresses::, for information about the format of the +- information. +- +- Accepting a connection does not make SOCKET part of the +- connection. Instead, it creates a new socket which becomes +- connected. The normal return value of `accept' is the file +- descriptor for the new socket. +- +- After `accept', the original socket SOCKET remains open and +- unconnected, and continues listening until you close it. You can +- accept further connections with SOCKET by calling `accept' again. +- +- If an error occurs, `accept' returns `-1'. The following `errno' +- error conditions are defined for this function: +- +- `EBADF' +- The SOCKET argument is not a valid file descriptor. +- +- `ENOTSOCK' +- The descriptor SOCKET argument is not a socket. +- +- `EOPNOTSUPP' +- The descriptor SOCKET does not support this operation. +- +- `EWOULDBLOCK' +- SOCKET has nonblocking mode set, and there are no pending +- connections immediately available. +- +- This function is defined as a cancellation point in multi-threaded +- programs, so one has to be prepared for this and make sure that +- allocated resources (like memory, files descriptors, semaphores or +- whatever) are freed even if the thread is canceled. +- +- The `accept' function is not allowed for sockets using +-connectionless communication styles. +- +- +-File: libc.info, Node: Who is Connected, Next: Transferring Data, Prev: Accepting Connections, Up: Connections +- +-Who is Connected to Me? +------------------------ +- +- - Function: int getpeername (int SOCKET, struct sockaddr *ADDR, +- socklen_t *LENGTH-PTR) +- The `getpeername' function returns the address of the socket that +- SOCKET is connected to; it stores the address in the memory space +- specified by ADDR and LENGTH-PTR. It stores the length of the +- address in `*LENGTH-PTR'. +- +- *Note Socket Addresses::, for information about the format of the +- address. In some operating systems, `getpeername' works only for +- sockets in the Internet domain. +- +- The return value is `0' on success and `-1' on error. The +- following `errno' error conditions are defined for this function: +- +- `EBADF' +- The argument SOCKET is not a valid file descriptor. +- +- `ENOTSOCK' +- The descriptor SOCKET is not a socket. +- +- `ENOTCONN' +- The socket SOCKET is not connected. +- +- `ENOBUFS' +- There are not enough internal buffers available. +- +- +-File: libc.info, Node: Transferring Data, Next: Byte Stream Example, Prev: Who is Connected, Up: Connections +- +-Transferring Data +------------------ +- +- Once a socket has been connected to a peer, you can use the ordinary +-`read' and `write' operations (*note I/O Primitives::) to transfer +-data. A socket is a two-way communications channel, so read and write +-operations can be performed at either end. +- +- There are also some I/O modes that are specific to socket operations. +-In order to specify these modes, you must use the `recv' and `send' +-functions instead of the more generic `read' and `write' functions. +-The `recv' and `send' functions take an additional argument which you +-can use to specify various flags to control special I/O modes. For +-example, you can specify the `MSG_OOB' flag to read or write +-out-of-band data, the `MSG_PEEK' flag to peek at input, or the +-`MSG_DONTROUTE' flag to control inclusion of routing information on +-output. +- +-* Menu: +- +-* Sending Data:: Sending data with `send'. +-* Receiving Data:: Reading data with `recv'. +-* Socket Data Options:: Using `send' and `recv'. +- +- +-File: libc.info, Node: Sending Data, Next: Receiving Data, Up: Transferring Data +- +-Sending Data +-............ +- +- The `send' function is declared in the header file `sys/socket.h'. +-If your FLAGS argument is zero, you can just as well use `write' +-instead of `send'; see *Note I/O Primitives::. If the socket was +-connected but the connection has broken, you get a `SIGPIPE' signal for +-any use of `send' or `write' (*note Miscellaneous Signals::). +- +- - Function: int send (int SOCKET, void *BUFFER, size_t SIZE, int FLAGS) +- The `send' function is like `write', but with the additional flags +- FLAGS. The possible values of FLAGS are described in *Note Socket +- Data Options::. +- +- This function returns the number of bytes transmitted, or `-1' on +- failure. If the socket is nonblocking, then `send' (like `write') +- can return after sending just part of the data. *Note File Status +- Flags::, for information about nonblocking mode. +- +- Note, however, that a successful return value merely indicates that +- the message has been sent without error, not necessarily that it +- has been received without error. +- +- The following `errno' error conditions are defined for this +- function: +- +- `EBADF' +- The SOCKET argument is not a valid file descriptor. +- +- `EINTR' +- The operation was interrupted by a signal before any data was +- sent. *Note Interrupted Primitives::. +- +- `ENOTSOCK' +- The descriptor SOCKET is not a socket. +- +- `EMSGSIZE' +- The socket type requires that the message be sent atomically, +- but the message is too large for this to be possible. +- +- `EWOULDBLOCK' +- Nonblocking mode has been set on the socket, and the write +- operation would block. (Normally `send' blocks until the +- operation can be completed.) +- +- `ENOBUFS' +- There is not enough internal buffer space available. +- +- `ENOTCONN' +- You never connected this socket. +- +- `EPIPE' +- This socket was connected but the connection is now broken. +- In this case, `send' generates a `SIGPIPE' signal first; if +- that signal is ignored or blocked, or if its handler returns, +- then `send' fails with `EPIPE'. +- +- This function is defined as a cancellation point in multi-threaded +- programs, so one has to be prepared for this and make sure that +- allocated resources (like memory, files descriptors, semaphores or +- whatever) are freed even if the thread is canceled. +- +- +-File: libc.info, Node: Receiving Data, Next: Socket Data Options, Prev: Sending Data, Up: Transferring Data +- +-Receiving Data +-.............. +- +- The `recv' function is declared in the header file `sys/socket.h'. +-If your FLAGS argument is zero, you can just as well use `read' instead +-of `recv'; see *Note I/O Primitives::. +- +- - Function: int recv (int SOCKET, void *BUFFER, size_t SIZE, int FLAGS) +- The `recv' function is like `read', but with the additional flags +- FLAGS. The possible values of FLAGS are described in *Note Socket +- Data Options::. +- +- If nonblocking mode is set for SOCKET, and no data are available to +- be read, `recv' fails immediately rather than waiting. *Note File +- Status Flags::, for information about nonblocking mode. +- +- This function returns the number of bytes received, or `-1' on +- failure. The following `errno' error conditions are defined for +- this function: +- +- `EBADF' +- The SOCKET argument is not a valid file descriptor. +- +- `ENOTSOCK' +- The descriptor SOCKET is not a socket. +- +- `EWOULDBLOCK' +- Nonblocking mode has been set on the socket, and the read +- operation would block. (Normally, `recv' blocks until there +- is input available to be read.) +- +- `EINTR' +- The operation was interrupted by a signal before any data was +- read. *Note Interrupted Primitives::. +- +- `ENOTCONN' +- You never connected this socket. +- +- This function is defined as a cancellation point in multi-threaded +- programs, so one has to be prepared for this and make sure that +- allocated resources (like memory, files descriptors, semaphores or +- whatever) are freed even if the thread is canceled. +- +- +-File: libc.info, Node: Socket Data Options, Prev: Receiving Data, Up: Transferring Data +- +-Socket Data Options +-................... +- +- The FLAGS argument to `send' and `recv' is a bit mask. You can +-bitwise-OR the values of the following macros together to obtain a +-value for this argument. All are defined in the header file +-`sys/socket.h'. +- +- - Macro: int MSG_OOB +- Send or receive out-of-band data. *Note Out-of-Band Data::. +- +- - Macro: int MSG_PEEK +- Look at the data but don't remove it from the input queue. This is +- only meaningful with input functions such as `recv', not with +- `send'. +- +- - Macro: int MSG_DONTROUTE +- Don't include routing information in the message. This is only +- meaningful with output operations, and is usually only of interest +- for diagnostic or routing programs. We don't try to explain it +- here. +- +- +-File: libc.info, Node: Byte Stream Example, Next: Server Example, Prev: Transferring Data, Up: Connections +- +-Byte Stream Socket Example +--------------------------- +- +- Here is an example client program that makes a connection for a byte +-stream socket in the Internet namespace. It doesn't do anything +-particularly interesting once it has connected to the server; it just +-sends a text string to the server and exits. +- +- This program uses `init_sockaddr' to set up the socket address; see +-*Note Inet Example::. +- +- #include +- #include +- #include +- #include +- #include +- #include +- #include +- #include +- +- #define PORT 5555 +- #define MESSAGE "Yow!!! Are we having fun yet?!?" +- #define SERVERHOST "mescaline.gnu.org" +- +- void +- write_to_server (int filedes) +- { +- int nbytes; +- +- nbytes = write (filedes, MESSAGE, strlen (MESSAGE) + 1); +- if (nbytes < 0) +- { +- perror ("write"); +- exit (EXIT_FAILURE); +- } +- } +- +- +- int +- main (void) +- { +- extern void init_sockaddr (struct sockaddr_in *name, +- const char *hostname, +- uint16_t port); +- int sock; +- struct sockaddr_in servername; +- +- /* Create the socket. */ +- sock = socket (PF_INET, SOCK_STREAM, 0); +- if (sock < 0) +- { +- perror ("socket (client)"); +- exit (EXIT_FAILURE); +- } +- +- /* Connect to the server. */ +- init_sockaddr (&servername, SERVERHOST, PORT); +- if (0 > connect (sock, +- (struct sockaddr *) &servername, +- sizeof (servername))) +- { +- perror ("connect (client)"); +- exit (EXIT_FAILURE); +- } +- +- /* Send data to the server. */ +- write_to_server (sock); +- close (sock); +- exit (EXIT_SUCCESS); +- } +- +- +-File: libc.info, Node: Server Example, Next: Out-of-Band Data, Prev: Byte Stream Example, Up: Connections +- +-Byte Stream Connection Server Example +-------------------------------------- +- +- The server end is much more complicated. Since we want to allow +-multiple clients to be connected to the server at the same time, it +-would be incorrect to wait for input from a single client by simply +-calling `read' or `recv'. Instead, the right thing to do is to use +-`select' (*note Waiting for I/O::) to wait for input on all of the open +-sockets. This also allows the server to deal with additional +-connection requests. +- +- This particular server doesn't do anything interesting once it has +-gotten a message from a client. It does close the socket for that +-client when it detects an end-of-file condition (resulting from the +-client shutting down its end of the connection). +- +- This program uses `make_socket' to set up the socket address; see +-*Note Inet Example::. +- +- #include +- #include +- #include +- #include +- #include +- #include +- #include +- #include +- +- #define PORT 5555 +- #define MAXMSG 512 +- +- int +- read_from_client (int filedes) +- { +- char buffer[MAXMSG]; +- int nbytes; +- +- nbytes = read (filedes, buffer, MAXMSG); +- if (nbytes < 0) +- { +- /* Read error. */ +- perror ("read"); +- exit (EXIT_FAILURE); +- } +- else if (nbytes == 0) +- /* End-of-file. */ +- return -1; +- else +- { +- /* Data read. */ +- fprintf (stderr, "Server: got message: `%s'\n", buffer); +- return 0; +- } +- } +- +- int +- main (void) +- { +- extern int make_socket (uint16_t port); +- int sock; +- fd_set active_fd_set, read_fd_set; +- int i; +- struct sockaddr_in clientname; +- size_t size; +- +- /* Create the socket and set it up to accept connections. */ +- sock = make_socket (PORT); +- if (listen (sock, 1) < 0) +- { +- perror ("listen"); +- exit (EXIT_FAILURE); +- } +- +- /* Initialize the set of active sockets. */ +- FD_ZERO (&active_fd_set); +- FD_SET (sock, &active_fd_set); +- +- while (1) +- { +- /* Block until input arrives on one or more active sockets. */ +- read_fd_set = active_fd_set; +- if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0) +- { +- perror ("select"); +- exit (EXIT_FAILURE); +- } +- +- /* Service all the sockets with input pending. */ +- for (i = 0; i < FD_SETSIZE; ++i) +- if (FD_ISSET (i, &read_fd_set)) +- { +- if (i == sock) +- { +- /* Connection request on original socket. */ +- int new; +- size = sizeof (clientname); +- new = accept (sock, +- (struct sockaddr *) &clientname, +- &size); +- if (new < 0) +- { +- perror ("accept"); +- exit (EXIT_FAILURE); +- } +- fprintf (stderr, +- "Server: connect from host %s, port %hd.\n", +- inet_ntoa (clientname.sin_addr), +- ntohs (clientname.sin_port)); +- FD_SET (new, &active_fd_set); +- } +- else +- { +- /* Data arriving on an already-connected socket. */ +- if (read_from_client (i) < 0) +- { +- close (i); +- FD_CLR (i, &active_fd_set); +- } +- } +- } +- } +- } +- +- +-File: libc.info, Node: Out-of-Band Data, Prev: Server Example, Up: Connections +- +-Out-of-Band Data +----------------- +- +- Streams with connections permit "out-of-band" data that is delivered +-with higher priority than ordinary data. Typically the reason for +-sending out-of-band data is to send notice of an exceptional condition. +-To send out-of-band data use `send', specifying the flag `MSG_OOB' +-(*note Sending Data::). +- +- Out-of-band data are received with higher priority because the +-receiving process need not read it in sequence; to read the next +-available out-of-band data, use `recv' with the `MSG_OOB' flag (*note +-Receiving Data::). Ordinary read operations do not read out-of-band +-data; they read only ordinary data. +- +- When a socket finds that out-of-band data are on their way, it sends +-a `SIGURG' signal to the owner process or process group of the socket. +-You can specify the owner using the `F_SETOWN' command to the `fcntl' +-function; see *Note Interrupt Input::. You must also establish a +-handler for this signal, as described in *Note Signal Handling::, in +-order to take appropriate action such as reading the out-of-band data. +- +- Alternatively, you can test for pending out-of-band data, or wait +-until there is out-of-band data, using the `select' function; it can +-wait for an exceptional condition on the socket. *Note Waiting for +-I/O::, for more information about `select'. +- +- Notification of out-of-band data (whether with `SIGURG' or with +-`select') indicates that out-of-band data are on the way; the data may +-not actually arrive until later. If you try to read the out-of-band +-data before it arrives, `recv' fails with an `EWOULDBLOCK' error. +- +- Sending out-of-band data automatically places a "mark" in the stream +-of ordinary data, showing where in the sequence the out-of-band data +-"would have been". This is useful when the meaning of out-of-band data +-is "cancel everything sent so far". Here is how you can test, in the +-receiving process, whether any ordinary data was sent before the mark: +- +- success = ioctl (socket, SIOCATMARK, &atmark); +- +- The `integer' variable ATMARK is set to a nonzero value if the +-socket's read pointer has reached the "mark". +- +- Here's a function to discard any ordinary data preceding the +-out-of-band mark: +- +- int +- discard_until_mark (int socket) +- { +- while (1) +- { +- /* This is not an arbitrary limit; any size will do. */ +- char buffer[1024]; +- int atmark, success; +- +- /* If we have reached the mark, return. */ +- success = ioctl (socket, SIOCATMARK, &atmark); +- if (success < 0) +- perror ("ioctl"); +- if (result) +- return; +- +- /* Otherwise, read a bunch of ordinary data and discard it. +- This is guaranteed not to read past the mark +- if it starts before the mark. */ +- success = read (socket, buffer, sizeof buffer); +- if (success < 0) +- perror ("read"); +- } +- } +- +- If you don't want to discard the ordinary data preceding the mark, +-you may need to read some of it anyway, to make room in internal system +-buffers for the out-of-band data. If you try to read out-of-band data +-and get an `EWOULDBLOCK' error, try reading some ordinary data (saving +-it so that you can use it when you want it) and see if that makes room. +-Here is an example: +- +- struct buffer +- { +- char *buf; +- int size; +- struct buffer *next; +- }; +- +- /* Read the out-of-band data from SOCKET and return it +- as a `struct buffer', which records the address of the data +- and its size. +- +- It may be necessary to read some ordinary data +- in order to make room for the out-of-band data. +- If so, the ordinary data are saved as a chain of buffers +- found in the `next' field of the value. */ +- +- struct buffer * +- read_oob (int socket) +- { +- struct buffer *tail = 0; +- struct buffer *list = 0; +- +- while (1) +- { +- /* This is an arbitrary limit. +- Does anyone know how to do this without a limit? */ +- #define BUF_SZ 1024 +- char *buf = (char *) xmalloc (BUF_SZ); +- int success; +- int atmark; +- +- /* Try again to read the out-of-band data. */ +- success = recv (socket, buf, BUF_SZ, MSG_OOB); +- if (success >= 0) +- { +- /* We got it, so return it. */ +- struct buffer *link +- = (struct buffer *) xmalloc (sizeof (struct buffer)); +- link->buf = buf; +- link->size = success; +- link->next = list; +- return link; +- } +- +- /* If we fail, see if we are at the mark. */ +- success = ioctl (socket, SIOCATMARK, &atmark); +- if (success < 0) +- perror ("ioctl"); +- if (atmark) +- { +- /* At the mark; skipping past more ordinary data cannot help. +- So just wait a while. */ +- sleep (1); +- continue; +- } +- +- /* Otherwise, read a bunch of ordinary data and save it. +- This is guaranteed not to read past the mark +- if it starts before the mark. */ +- success = read (socket, buf, BUF_SZ); +- if (success < 0) +- perror ("read"); +- +- /* Save this data in the buffer list. */ +- { +- struct buffer *link +- = (struct buffer *) xmalloc (sizeof (struct buffer)); +- link->buf = buf; +- link->size = success; +- +- /* Add the new link to the end of the list. */ +- if (tail) +- tail->next = link; +- else +- list = link; +- tail = link; +- } +- } +- } +- +- +-File: libc.info, Node: Datagrams, Next: Inetd, Prev: Connections, Up: Sockets +- +-Datagram Socket Operations +-========================== +- +- This section describes how to use communication styles that don't use +-connections (styles `SOCK_DGRAM' and `SOCK_RDM'). Using these styles, +-you group data into packets and each packet is an independent +-communication. You specify the destination for each packet +-individually. +- +- Datagram packets are like letters: you send each one independently +-with its own destination address, and they may arrive in the wrong +-order or not at all. +- +- The `listen' and `accept' functions are not allowed for sockets +-using connectionless communication styles. +- +-* Menu: +- +-* Sending Datagrams:: Sending packets on a datagram socket. +-* Receiving Datagrams:: Receiving packets on a datagram socket. +-* Datagram Example:: An example program: packets sent over a +- datagram socket in the local namespace. +-* Example Receiver:: Another program, that receives those packets. +- +- +-File: libc.info, Node: Sending Datagrams, Next: Receiving Datagrams, Up: Datagrams +- +-Sending Datagrams +------------------ +- +- The normal way of sending data on a datagram socket is by using the +-`sendto' function, declared in `sys/socket.h'. +- +- You can call `connect' on a datagram socket, but this only specifies +-a default destination for further data transmission on the socket. +-When a socket has a default destination you can use `send' (*note +-Sending Data::) or even `write' (*note I/O Primitives::) to send a +-packet there. You can cancel the default destination by calling +-`connect' using an address format of `AF_UNSPEC' in the ADDR argument. +-*Note Connecting::, for more information about the `connect' function. +- +- - Function: int sendto (int SOCKET, void *BUFFER. size_t SIZE, int +- FLAGS, struct sockaddr *ADDR, socklen_t LENGTH) +- The `sendto' function transmits the data in the BUFFER through the +- socket SOCKET to the destination address specified by the ADDR and +- LENGTH arguments. The SIZE argument specifies the number of bytes +- to be transmitted. +- +- The FLAGS are interpreted the same way as for `send'; see *Note +- Socket Data Options::. +- +- The return value and error conditions are also the same as for +- `send', but you cannot rely on the system to detect errors and +- report them; the most common error is that the packet is lost or +- there is no-one at the specified address to receive it, and the +- operating system on your machine usually does not know this. +- +- It is also possible for one call to `sendto' to report an error +- owing to a problem related to a previous call. +- +- This function is defined as a cancellation point in multi-threaded +- programs, so one has to be prepared for this and make sure that +- allocated resources (like memory, files descriptors, semaphores or +- whatever) are freed even if the thread is canceled. +- +- +-File: libc.info, Node: Receiving Datagrams, Next: Datagram Example, Prev: Sending Datagrams, Up: Datagrams +- +-Receiving Datagrams +-------------------- +- +- The `recvfrom' function reads a packet from a datagram socket and +-also tells you where it was sent from. This function is declared in +-`sys/socket.h'. +- +- - Function: int recvfrom (int SOCKET, void *BUFFER, size_t SIZE, int +- FLAGS, struct sockaddr *ADDR, socklen_t *LENGTH-PTR) +- The `recvfrom' function reads one packet from the socket SOCKET +- into the buffer BUFFER. The SIZE argument specifies the maximum +- number of bytes to be read. +- +- If the packet is longer than SIZE bytes, then you get the first +- SIZE bytes of the packet and the rest of the packet is lost. +- There's no way to read the rest of the packet. Thus, when you use +- a packet protocol, you must always know how long a packet to +- expect. +- +- The ADDR and LENGTH-PTR arguments are used to return the address +- where the packet came from. *Note Socket Addresses::. For a +- socket in the local domain the address information won't be +- meaningful, since you can't read the address of such a socket +- (*note Local Namespace::). You can specify a null pointer as the +- ADDR argument if you are not interested in this information. +- +- The FLAGS are interpreted the same way as for `recv' (*note Socket +- Data Options::). The return value and error conditions are also +- the same as for `recv'. +- +- This function is defined as a cancellation point in multi-threaded +- programs, so one has to be prepared for this and make sure that +- allocated resources (like memory, files descriptors, semaphores or +- whatever) are freed even if the thread is canceled. +- +- You can use plain `recv' (*note Receiving Data::) instead of +-`recvfrom' if you don't need to find out who sent the packet (either +-because you know where it should come from or because you treat all +-possible senders alike). Even `read' can be used if you don't want to +-specify FLAGS (*note I/O Primitives::). +- +- +-File: libc.info, Node: Datagram Example, Next: Example Receiver, Prev: Receiving Datagrams, Up: Datagrams +- +-Datagram Socket Example +------------------------ +- +- Here is a set of example programs that send messages over a datagram +-stream in the local namespace. Both the client and server programs use +-the `make_named_socket' function that was presented in *Note Local +-Socket Example::, to create and name their sockets. +- +- First, here is the server program. It sits in a loop waiting for +-messages to arrive, bouncing each message back to the sender. +-Obviously this isn't a particularly useful program, but it does show +-the general ideas involved. +- +- #include +- #include +- #include +- #include +- #include +- +- #define SERVER "/tmp/serversocket" +- #define MAXMSG 512 +- +- int +- main (void) +- { +- int sock; +- char message[MAXMSG]; +- struct sockaddr_un name; +- size_t size; +- int nbytes; +- +- /* Remove the filename first, it's ok if the call fails */ +- unlink (SERVER); +- +- /* Make the socket, then loop endlessly. */ +- sock = make_named_socket (SERVER); +- while (1) +- { +- /* Wait for a datagram. */ +- size = sizeof (name); +- nbytes = recvfrom (sock, message, MAXMSG, 0, +- (struct sockaddr *) & name, &size); +- if (nbytes < 0) +- { +- perror ("recfrom (server)"); +- exit (EXIT_FAILURE); +- } +- +- /* Give a diagnostic message. */ +- fprintf (stderr, "Server: got message: %s\n", message); +- +- /* Bounce the message back to the sender. */ +- nbytes = sendto (sock, message, nbytes, 0, +- (struct sockaddr *) & name, size); +- if (nbytes < 0) +- { +- perror ("sendto (server)"); +- exit (EXIT_FAILURE); +- } +- } +- } +- +- +-File: libc.info, Node: Example Receiver, Prev: Datagram Example, Up: Datagrams +- +-Example of Reading Datagrams +----------------------------- +- +- Here is the client program corresponding to the server above. +- +- It sends a datagram to the server and then waits for a reply. Notice +-that the socket for the client (as well as for the server) in this +-example has to be given a name. This is so that the server can direct +-a message back to the client. Since the socket has no associated +-connection state, the only way the server can do this is by referencing +-the name of the client. +- +- #include +- #include +- #include +- #include +- #include +- #include +- +- #define SERVER "/tmp/serversocket" +- #define CLIENT "/tmp/mysocket" +- #define MAXMSG 512 +- #define MESSAGE "Yow!!! Are we having fun yet?!?" +- +- int +- main (void) +- { +- extern int make_named_socket (const char *name); +- int sock; +- char message[MAXMSG]; +- struct sockaddr_un name; +- size_t size; +- int nbytes; +- +- /* Make the socket. */ +- sock = make_named_socket (CLIENT); +- +- /* Initialize the server socket address. */ +- name.sun_family = AF_LOCAL; +- strcpy (name.sun_path, SERVER); +- size = strlen (name.sun_path) + sizeof (name.sun_family); +- +- /* Send the datagram. */ +- nbytes = sendto (sock, MESSAGE, strlen (MESSAGE) + 1, 0, +- (struct sockaddr *) & name, size); +- if (nbytes < 0) +- { +- perror ("sendto (client)"); +- exit (EXIT_FAILURE); +- } +- +- /* Wait for a reply. */ +- nbytes = recvfrom (sock, message, MAXMSG, 0, NULL, 0); +- if (nbytes < 0) +- { +- perror ("recfrom (client)"); +- exit (EXIT_FAILURE); +- } +- +- /* Print a diagnostic message. */ +- fprintf (stderr, "Client: got message: %s\n", message); +- +- /* Clean up. */ +- remove (CLIENT); +- close (sock); +- } +- +- Keep in mind that datagram socket communications are unreliable. In +-this example, the client program waits indefinitely if the message +-never reaches the server or if the server's response never comes back. +-It's up to the user running the program to kill and restart it if +-desired. A more automatic solution could be to use `select' (*note +-Waiting for I/O::) to establish a timeout period for the reply, and in +-case of timeout either re-send the message or shut down the socket and +-exit. +- +- +-File: libc.info, Node: Inetd, Next: Socket Options, Prev: Datagrams, Up: Sockets +- +-The `inetd' Daemon +-================== +- +- We've explained above how to write a server program that does its own +-listening. Such a server must already be running in order for anyone +-to connect to it. +- +- Another way to provide a service on an Internet port is to let the +-daemon program `inetd' do the listening. `inetd' is a program that +-runs all the time and waits (using `select') for messages on a +-specified set of ports. When it receives a message, it accepts the +-connection (if the socket style calls for connections) and then forks a +-child process to run the corresponding server program. You specify the +-ports and their programs in the file `/etc/inetd.conf'. +- +-* Menu: +- +-* Inetd Servers:: +-* Configuring Inetd:: +- +- +-File: libc.info, Node: Inetd Servers, Next: Configuring Inetd, Up: Inetd +- +-`inetd' Servers +---------------- +- +- Writing a server program to be run by `inetd' is very simple. Each +-time someone requests a connection to the appropriate port, a new server +-process starts. The connection already exists at this time; the socket +-is available as the standard input descriptor and as the standard +-output descriptor (descriptors 0 and 1) in the server process. Thus +-the server program can begin reading and writing data right away. +-Often the program needs only the ordinary I/O facilities; in fact, a +-general-purpose filter program that knows nothing about sockets can +-work as a byte stream server run by `inetd'. +- +- You can also use `inetd' for servers that use connectionless +-communication styles. For these servers, `inetd' does not try to accept +-a connection since no connection is possible. It just starts the +-server program, which can read the incoming datagram packet from +-descriptor 0. The server program can handle one request and then exit, +-or you can choose to write it to keep reading more requests until no +-more arrive, and then exit. You must specify which of these two +-techniques the server uses when you configure `inetd'. +- +- +-File: libc.info, Node: Configuring Inetd, Prev: Inetd Servers, Up: Inetd +- +-Configuring `inetd' +-------------------- +- +- The file `/etc/inetd.conf' tells `inetd' which ports to listen to +-and what server programs to run for them. Normally each entry in the +-file is one line, but you can split it onto multiple lines provided all +-but the first line of the entry start with whitespace. Lines that +-start with `#' are comments. +- +- Here are two standard entries in `/etc/inetd.conf': +- +- ftp stream tcp nowait root /libexec/ftpd ftpd +- talk dgram udp wait root /libexec/talkd talkd +- +- An entry has this format: +- +- SERVICE STYLE PROTOCOL WAIT USERNAME PROGRAM ARGUMENTS +- +- The SERVICE field says which service this program provides. It +-should be the name of a service defined in `/etc/services'. `inetd' +-uses SERVICE to decide which port to listen on for this entry. +- +- The fields STYLE and PROTOCOL specify the communication style and +-the protocol to use for the listening socket. The style should be the +-name of a communication style, converted to lower case and with `SOCK_' +-deleted--for example, `stream' or `dgram'. PROTOCOL should be one of +-the protocols listed in `/etc/protocols'. The typical protocol names +-are `tcp' for byte stream connections and `udp' for unreliable +-datagrams. +- +- The WAIT field should be either `wait' or `nowait'. Use `wait' if +-STYLE is a connectionless style and the server, once started, handles +-multiple requests as they come in. Use `nowait' if `inetd' should +-start a new process for each message or request that comes in. If +-STYLE uses connections, then WAIT *must* be `nowait'. +- +- USER is the user name that the server should run as. `inetd' runs +-as root, so it can set the user ID of its children arbitrarily. It's +-best to avoid using `root' for USER if you can; but some servers, such +-as Telnet and FTP, read a username and password themselves. These +-servers need to be root initially so they can log in as commanded by +-the data coming over the network. +- +- PROGRAM together with ARGUMENTS specifies the command to run to +-start the server. PROGRAM should be an absolute file name specifying +-the executable file to run. ARGUMENTS consists of any number of +-whitespace-separated words, which become the command-line arguments of +-PROGRAM. The first word in ARGUMENTS is argument zero, which should by +-convention be the program name itself (sans directories). +- +- If you edit `/etc/inetd.conf', you can tell `inetd' to reread the +-file and obey its new contents by sending the `inetd' process the +-`SIGHUP' signal. You'll have to use `ps' to determine the process ID +-of the `inetd' process as it is not fixed. +- +- +-File: libc.info, Node: Socket Options, Next: Networks Database, Prev: Inetd, Up: Sockets +- +-Socket Options +-============== +- +- This section describes how to read or set various options that modify +-the behavior of sockets and their underlying communications protocols. +- +- When you are manipulating a socket option, you must specify which +-"level" the option pertains to. This describes whether the option +-applies to the socket interface, or to a lower-level communications +-protocol interface. +- +-* Menu: +- +-* Socket Option Functions:: The basic functions for setting and getting +- socket options. +-* Socket-Level Options:: Details of the options at the socket level. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-29 glibc-2.3.2-200304020432/manual/libc.info-29 +--- glibc-2.3.2/manual/libc.info-29 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-29 Thu Jan 1 01:00:00 1970 +@@ -1,1174 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Socket Option Functions, Next: Socket-Level Options, Up: Socket Options +- +-Socket Option Functions +------------------------ +- +- Here are the functions for examining and modifying socket options. +-They are declared in `sys/socket.h'. +- +- - Function: int getsockopt (int SOCKET, int LEVEL, int OPTNAME, void +- *OPTVAL, socklen_t *OPTLEN-PTR) +- The `getsockopt' function gets information about the value of +- option OPTNAME at level LEVEL for socket SOCKET. +- +- The option value is stored in a buffer that OPTVAL points to. +- Before the call, you should supply in `*OPTLEN-PTR' the size of +- this buffer; on return, it contains the number of bytes of +- information actually stored in the buffer. +- +- Most options interpret the OPTVAL buffer as a single `int' value. +- +- The actual return value of `getsockopt' is `0' on success and `-1' +- on failure. The following `errno' error conditions are defined: +- +- `EBADF' +- The SOCKET argument is not a valid file descriptor. +- +- `ENOTSOCK' +- The descriptor SOCKET is not a socket. +- +- `ENOPROTOOPT' +- The OPTNAME doesn't make sense for the given LEVEL. +- +- - Function: int setsockopt (int SOCKET, int LEVEL, int OPTNAME, void +- *OPTVAL, socklen_t OPTLEN) +- This function is used to set the socket option OPTNAME at level +- LEVEL for socket SOCKET. The value of the option is passed in the +- buffer OPTVAL of size OPTLEN. +- +- The return value and error codes for `setsockopt' are the same as +- for `getsockopt'. +- +- +- +-File: libc.info, Node: Socket-Level Options, Prev: Socket Option Functions, Up: Socket Options +- +-Socket-Level Options +--------------------- +- +- - Constant: int SOL_SOCKET +- Use this constant as the LEVEL argument to `getsockopt' or +- `setsockopt' to manipulate the socket-level options described in +- this section. +- +-Here is a table of socket-level option names; all are defined in the +-header file `sys/socket.h'. +- +-`SO_DEBUG' +- This option toggles recording of debugging information in the +- underlying protocol modules. The value has type `int'; a nonzero +- value means "yes". +- +-`SO_REUSEADDR' +- This option controls whether `bind' (*note Setting Address::) +- should permit reuse of local addresses for this socket. If you +- enable this option, you can actually have two sockets with the +- same Internet port number; but the system won't allow you to use +- the two identically-named sockets in a way that would confuse the +- Internet. The reason for this option is that some higher-level +- Internet protocols, including FTP, require you to keep reusing the +- same port number. +- +- The value has type `int'; a nonzero value means "yes". +- +-`SO_KEEPALIVE' +- This option controls whether the underlying protocol should +- periodically transmit messages on a connected socket. If the peer +- fails to respond to these messages, the connection is considered +- broken. The value has type `int'; a nonzero value means "yes". +- +-`SO_DONTROUTE' +- This option controls whether outgoing messages bypass the normal +- message routing facilities. If set, messages are sent directly to +- the network interface instead. The value has type `int'; a nonzero +- value means "yes". +- +-`SO_LINGER' +- This option specifies what should happen when the socket of a type +- that promises reliable delivery still has untransmitted messages +- when it is closed; see *Note Closing a Socket::. The value has +- type `struct linger'. +- +- - Data Type: struct linger +- This structure type has the following members: +- +- `int l_onoff' +- This field is interpreted as a boolean. If nonzero, +- `close' blocks until the data are transmitted or the +- timeout period has expired. +- +- `int l_linger' +- This specifies the timeout period, in seconds. +- +-`SO_BROADCAST' +- This option controls whether datagrams may be broadcast from the +- socket. The value has type `int'; a nonzero value means "yes". +- +-`SO_OOBINLINE' +- If this option is set, out-of-band data received on the socket is +- placed in the normal input queue. This permits it to be read using +- `read' or `recv' without specifying the `MSG_OOB' flag. *Note +- Out-of-Band Data::. The value has type `int'; a nonzero value +- means "yes". +- +-`SO_SNDBUF' +- This option gets or sets the size of the output buffer. The value +- is a `size_t', which is the size in bytes. +- +-`SO_RCVBUF' +- This option gets or sets the size of the input buffer. The value +- is a `size_t', which is the size in bytes. +- +-`SO_STYLE' +-`SO_TYPE' +- This option can be used with `getsockopt' only. It is used to get +- the socket's communication style. `SO_TYPE' is the historical +- name, and `SO_STYLE' is the preferred name in GNU. The value has +- type `int' and its value designates a communication style; see +- *Note Communication Styles::. +- +-`SO_ERROR' +- This option can be used with `getsockopt' only. It is used to +- reset the error status of the socket. The value is an `int', +- which represents the previous error status. +- +- +-File: libc.info, Node: Networks Database, Prev: Socket Options, Up: Sockets +- +-Networks Database +-================= +- +- Many systems come with a database that records a list of networks +-known to the system developer. This is usually kept either in the file +-`/etc/networks' or in an equivalent from a name server. This data base +-is useful for routing programs such as `route', but it is not useful +-for programs that simply communicate over the network. We provide +-functions to access this database, which are declared in `netdb.h'. +- +- - Data Type: struct netent +- This data type is used to represent information about entries in +- the networks database. It has the following members: +- +- `char *n_name' +- This is the "official" name of the network. +- +- `char **n_aliases' +- These are alternative names for the network, represented as a +- vector of strings. A null pointer terminates the array. +- +- `int n_addrtype' +- This is the type of the network number; this is always equal +- to `AF_INET' for Internet networks. +- +- `unsigned long int n_net' +- This is the network number. Network numbers are returned in +- host byte order; see *Note Byte Order::. +- +- Use the `getnetbyname' or `getnetbyaddr' functions to search the +-networks database for information about a specific network. The +-information is returned in a statically-allocated structure; you must +-copy the information if you need to save it. +- +- - Function: struct netent * getnetbyname (const char *NAME) +- The `getnetbyname' function returns information about the network +- named NAME. It returns a null pointer if there is no such network. +- +- - Function: struct netent * getnetbyaddr (unsigned long int NET, int +- TYPE) +- The `getnetbyaddr' function returns information about the network +- of type TYPE with number NET. You should specify a value of +- `AF_INET' for the TYPE argument for Internet networks. +- +- `getnetbyaddr' returns a null pointer if there is no such network. +- +- You can also scan the networks database using `setnetent', +-`getnetent' and `endnetent'. Be careful when using these functions +-because they are not reentrant. +- +- - Function: void setnetent (int STAYOPEN) +- This function opens and rewinds the networks database. +- +- If the STAYOPEN argument is nonzero, this sets a flag so that +- subsequent calls to `getnetbyname' or `getnetbyaddr' will not +- close the database (as they usually would). This makes for more +- efficiency if you call those functions several times, by avoiding +- reopening the database for each call. +- +- - Function: struct netent * getnetent (void) +- This function returns the next entry in the networks database. It +- returns a null pointer if there are no more entries. +- +- - Function: void endnetent (void) +- This function closes the networks database. +- +- +-File: libc.info, Node: Low-Level Terminal Interface, Next: Syslog, Prev: Sockets, Up: Top +- +-Low-Level Terminal Interface +-**************************** +- +- This chapter describes functions that are specific to terminal +-devices. You can use these functions to do things like turn off input +-echoing; set serial line characteristics such as line speed and flow +-control; and change which characters are used for end-of-file, +-command-line editing, sending signals, and similar control functions. +- +- Most of the functions in this chapter operate on file descriptors. +-*Note Low-Level I/O::, for more information about what a file +-descriptor is and how to open a file descriptor for a terminal device. +- +-* Menu: +- +-* Is It a Terminal:: How to determine if a file is a terminal +- device, and what its name is. +-* I/O Queues:: About flow control and typeahead. +-* Canonical or Not:: Two basic styles of input processing. +-* Terminal Modes:: How to examine and modify flags controlling +- details of terminal I/O: echoing, +- signals, editing. Posix. +-* BSD Terminal Modes:: BSD compatible terminal mode setting +-* Line Control:: Sending break sequences, clearing +- terminal buffers ... +-* Noncanon Example:: How to read single characters without echo. +-* Pseudo-Terminals:: How to open a pseudo-terminal. +- +- +-File: libc.info, Node: Is It a Terminal, Next: I/O Queues, Up: Low-Level Terminal Interface +- +-Identifying Terminals +-===================== +- +- The functions described in this chapter only work on files that +-correspond to terminal devices. You can find out whether a file +-descriptor is associated with a terminal by using the `isatty' function. +- +- Prototypes for the functions in this section are declared in the +-header file `unistd.h'. +- +- - Function: int isatty (int FILEDES) +- This function returns `1' if FILEDES is a file descriptor +- associated with an open terminal device, and 0 otherwise. +- +- If a file descriptor is associated with a terminal, you can get its +-associated file name using the `ttyname' function. See also the +-`ctermid' function, described in *Note Identifying the Terminal::. +- +- - Function: char * ttyname (int FILEDES) +- If the file descriptor FILEDES is associated with a terminal +- device, the `ttyname' function returns a pointer to a +- statically-allocated, null-terminated string containing the file +- name of the terminal file. The value is a null pointer if the +- file descriptor isn't associated with a terminal, or the file name +- cannot be determined. +- +- - Function: int ttyname_r (int FILEDES, char *BUF, size_t LEN) +- The `ttyname_r' function is similar to the `ttyname' function +- except that it places its result into the user-specified buffer +- starting at BUF with length LEN. +- +- The normal return value from `ttyname_r' is 0. Otherwise an error +- number is returned to indicate the error. The following `errno' +- error conditions are defined for this function: +- +- `EBADF' +- The FILEDES argument is not a valid file descriptor. +- +- `ENOTTY' +- The FILEDES is not associated with a terminal. +- +- `ERANGE' +- The buffer length LEN is too small to store the string to be +- returned. +- +- +-File: libc.info, Node: I/O Queues, Next: Canonical or Not, Prev: Is It a Terminal, Up: Low-Level Terminal Interface +- +-I/O Queues +-========== +- +- Many of the remaining functions in this section refer to the input +-and output queues of a terminal device. These queues implement a form +-of buffering _within the kernel_ independent of the buffering +-implemented by I/O streams (*note I/O on Streams::). +- +- The "terminal input queue" is also sometimes referred to as its +-"typeahead buffer". It holds the characters that have been received +-from the terminal but not yet read by any process. +- +- The size of the input queue is described by the `MAX_INPUT' and +-`_POSIX_MAX_INPUT' parameters; see *Note Limits for Files::. You are +-guaranteed a queue size of at least `MAX_INPUT', but the queue might be +-larger, and might even dynamically change size. If input flow control +-is enabled by setting the `IXOFF' input mode bit (*note Input Modes::), +-the terminal driver transmits STOP and START characters to the terminal +-when necessary to prevent the queue from overflowing. Otherwise, input +-may be lost if it comes in too fast from the terminal. In canonical +-mode, all input stays in the queue until a newline character is +-received, so the terminal input queue can fill up when you type a very +-long line. *Note Canonical or Not::. +- +- The "terminal output queue" is like the input queue, but for output; +-it contains characters that have been written by processes, but not yet +-transmitted to the terminal. If output flow control is enabled by +-setting the `IXON' input mode bit (*note Input Modes::), the terminal +-driver obeys START and STOP characters sent by the terminal to stop and +-restart transmission of output. +- +- "Clearing" the terminal input queue means discarding any characters +-that have been received but not yet read. Similarly, clearing the +-terminal output queue means discarding any characters that have been +-written but not yet transmitted. +- +- +-File: libc.info, Node: Canonical or Not, Next: Terminal Modes, Prev: I/O Queues, Up: Low-Level Terminal Interface +- +-Two Styles of Input: Canonical or Not +-===================================== +- +- POSIX systems support two basic modes of input: canonical and +-noncanonical. +- +- In "canonical input processing" mode, terminal input is processed in +-lines terminated by newline (`'\n''), EOF, or EOL characters. No input +-can be read until an entire line has been typed by the user, and the +-`read' function (*note I/O Primitives::) returns at most a single line +-of input, no matter how many bytes are requested. +- +- In canonical input mode, the operating system provides input editing +-facilities: some characters are interpreted specially to perform editing +-operations within the current line of text, such as ERASE and KILL. +-*Note Editing Characters::. +- +- The constants `_POSIX_MAX_CANON' and `MAX_CANON' parameterize the +-maximum number of bytes which may appear in a single line of canonical +-input. *Note Limits for Files::. You are guaranteed a maximum line +-length of at least `MAX_CANON' bytes, but the maximum might be larger, +-and might even dynamically change size. +- +- In "noncanonical input processing" mode, characters are not grouped +-into lines, and ERASE and KILL processing is not performed. The +-granularity with which bytes are read in noncanonical input mode is +-controlled by the MIN and TIME settings. *Note Noncanonical Input::. +- +- Most programs use canonical input mode, because this gives the user a +-way to edit input line by line. The usual reason to use noncanonical +-mode is when the program accepts single-character commands or provides +-its own editing facilities. +- +- The choice of canonical or noncanonical input is controlled by the +-`ICANON' flag in the `c_lflag' member of `struct termios'. *Note Local +-Modes::. +- +- +-File: libc.info, Node: Terminal Modes, Next: BSD Terminal Modes, Prev: Canonical or Not, Up: Low-Level Terminal Interface +- +-Terminal Modes +-============== +- +- This section describes the various terminal attributes that control +-how input and output are done. The functions, data structures, and +-symbolic constants are all declared in the header file `termios.h'. +- +- Don't confuse terminal attributes with file attributes. A device +-special file which is associated with a terminal has file attributes as +-described in *Note File Attributes::. These are unrelated to the +-attributes of the terminal device itself, which are discussed in this +-section. +- +-* Menu: +- +-* Mode Data Types:: The data type `struct termios' and +- related types. +-* Mode Functions:: Functions to read and set the terminal +- attributes. +-* Setting Modes:: The right way to set terminal attributes +- reliably. +-* Input Modes:: Flags controlling low-level input handling. +-* Output Modes:: Flags controlling low-level output handling. +-* Control Modes:: Flags controlling serial port behavior. +-* Local Modes:: Flags controlling high-level input handling. +-* Line Speed:: How to read and set the terminal line speed. +-* Special Characters:: Characters that have special effects, +- and how to change them. +-* Noncanonical Input:: Controlling how long to wait for input. +- +- +-File: libc.info, Node: Mode Data Types, Next: Mode Functions, Up: Terminal Modes +- +-Terminal Mode Data Types +------------------------- +- +- The entire collection of attributes of a terminal is stored in a +-structure of type `struct termios'. This structure is used with the +-functions `tcgetattr' and `tcsetattr' to read and set the attributes. +- +- - Data Type: struct termios +- Structure that records all the I/O attributes of a terminal. The +- structure includes at least the following members: +- +- `tcflag_t c_iflag' +- A bit mask specifying flags for input modes; see *Note Input +- Modes::. +- +- `tcflag_t c_oflag' +- A bit mask specifying flags for output modes; see *Note +- Output Modes::. +- +- `tcflag_t c_cflag' +- A bit mask specifying flags for control modes; see *Note +- Control Modes::. +- +- `tcflag_t c_lflag' +- A bit mask specifying flags for local modes; see *Note Local +- Modes::. +- +- `cc_t c_cc[NCCS]' +- An array specifying which characters are associated with +- various control functions; see *Note Special Characters::. +- +- The `struct termios' structure also contains members which encode +- input and output transmission speeds, but the representation is +- not specified. *Note Line Speed::, for how to examine and store +- the speed values. +- +- The following sections describe the details of the members of the +-`struct termios' structure. +- +- - Data Type: tcflag_t +- This is an unsigned integer type used to represent the various bit +- masks for terminal flags. +- +- - Data Type: cc_t +- This is an unsigned integer type used to represent characters +- associated with various terminal control functions. +- +- - Macro: int NCCS +- The value of this macro is the number of elements in the `c_cc' +- array. +- +- +-File: libc.info, Node: Mode Functions, Next: Setting Modes, Prev: Mode Data Types, Up: Terminal Modes +- +-Terminal Mode Functions +------------------------ +- +- - Function: int tcgetattr (int FILEDES, struct termios *TERMIOS-P) +- This function is used to examine the attributes of the terminal +- device with file descriptor FILEDES. The attributes are returned +- in the structure that TERMIOS-P points to. +- +- If successful, `tcgetattr' returns 0. A return value of -1 +- indicates an error. The following `errno' error conditions are +- defined for this function: +- +- `EBADF' +- The FILEDES argument is not a valid file descriptor. +- +- `ENOTTY' +- The FILEDES is not associated with a terminal. +- +- - Function: int tcsetattr (int FILEDES, int WHEN, const struct termios +- *TERMIOS-P) +- This function sets the attributes of the terminal device with file +- descriptor FILEDES. The new attributes are taken from the +- structure that TERMIOS-P points to. +- +- The WHEN argument specifies how to deal with input and output +- already queued. It can be one of the following values: +- +- `TCSANOW' +- Make the change immediately. +- +- `TCSADRAIN' +- Make the change after waiting until all queued output has +- been written. You should usually use this option when +- changing parameters that affect output. +- +- `TCSAFLUSH' +- This is like `TCSADRAIN', but also discards any queued input. +- +- `TCSASOFT' +- This is a flag bit that you can add to any of the above +- alternatives. Its meaning is to inhibit alteration of the +- state of the terminal hardware. It is a BSD extension; it is +- only supported on BSD systems and the GNU system. +- +- Using `TCSASOFT' is exactly the same as setting the `CIGNORE' +- bit in the `c_cflag' member of the structure TERMIOS-P points +- to. *Note Control Modes::, for a description of `CIGNORE'. +- +- If this function is called from a background process on its +- controlling terminal, normally all processes in the process group +- are sent a `SIGTTOU' signal, in the same way as if the process +- were trying to write to the terminal. The exception is if the +- calling process itself is ignoring or blocking `SIGTTOU' signals, +- in which case the operation is performed and no signal is sent. +- *Note Job Control::. +- +- If successful, `tcsetattr' returns 0. A return value of -1 +- indicates an error. The following `errno' error conditions are +- defined for this function: +- +- `EBADF' +- The FILEDES argument is not a valid file descriptor. +- +- `ENOTTY' +- The FILEDES is not associated with a terminal. +- +- `EINVAL' +- Either the value of the `when' argument is not valid, or +- there is something wrong with the data in the TERMIOS-P +- argument. +- +- Although `tcgetattr' and `tcsetattr' specify the terminal device +-with a file descriptor, the attributes are those of the terminal device +-itself and not of the file descriptor. This means that the effects of +-changing terminal attributes are persistent; if another process opens +-the terminal file later on, it will see the changed attributes even +-though it doesn't have anything to do with the open file descriptor you +-originally specified in changing the attributes. +- +- Similarly, if a single process has multiple or duplicated file +-descriptors for the same terminal device, changing the terminal +-attributes affects input and output to all of these file descriptors. +-This means, for example, that you can't open one file descriptor or +-stream to read from a terminal in the normal line-buffered, echoed +-mode; and simultaneously have another file descriptor for the same +-terminal that you use to read from it in single-character, non-echoed +-mode. Instead, you have to explicitly switch the terminal back and +-forth between the two modes. +- +- +-File: libc.info, Node: Setting Modes, Next: Input Modes, Prev: Mode Functions, Up: Terminal Modes +- +-Setting Terminal Modes Properly +-------------------------------- +- +- When you set terminal modes, you should call `tcgetattr' first to +-get the current modes of the particular terminal device, modify only +-those modes that you are really interested in, and store the result with +-`tcsetattr'. +- +- It's a bad idea to simply initialize a `struct termios' structure to +-a chosen set of attributes and pass it directly to `tcsetattr'. Your +-program may be run years from now, on systems that support members not +-documented in this manual. The way to avoid setting these members to +-unreasonable values is to avoid changing them. +- +- What's more, different terminal devices may require different mode +-settings in order to function properly. So you should avoid blindly +-copying attributes from one terminal device to another. +- +- When a member contains a collection of independent flags, as the +-`c_iflag', `c_oflag' and `c_cflag' members do, even setting the entire +-member is a bad idea, because particular operating systems have their +-own flags. Instead, you should start with the current value of the +-member and alter only the flags whose values matter in your program, +-leaving any other flags unchanged. +- +- Here is an example of how to set one flag (`ISTRIP') in the `struct +-termios' structure while properly preserving all the other data in the +-structure: +- +- int +- set_istrip (int desc, int value) +- { +- struct termios settings; +- int result; +- +- result = tcgetattr (desc, &settings); +- if (result < 0) +- { +- perror ("error in tcgetattr"); +- return 0; +- } +- settings.c_iflag &= ~ISTRIP; +- if (value) +- settings.c_iflag |= ISTRIP; +- result = tcsetattr (desc, TCSANOW, &settings); +- if (result < 0) +- { +- perror ("error in tcsetattr"); +- return 0; +- } +- return 1; +- } +- +- +-File: libc.info, Node: Input Modes, Next: Output Modes, Prev: Setting Modes, Up: Terminal Modes +- +-Input Modes +------------ +- +- This section describes the terminal attribute flags that control +-fairly low-level aspects of input processing: handling of parity errors, +-break signals, flow control, and and characters. +- +- All of these flags are bits in the `c_iflag' member of the `struct +-termios' structure. The member is an integer, and you change flags +-using the operators `&', `|' and `^'. Don't try to specify the entire +-value for `c_iflag'--instead, change only specific flags and leave the +-rest untouched (*note Setting Modes::). +- +- - Macro: tcflag_t INPCK +- If this bit is set, input parity checking is enabled. If it is +- not set, no checking at all is done for parity errors on input; the +- characters are simply passed through to the application. +- +- Parity checking on input processing is independent of whether +- parity detection and generation on the underlying terminal +- hardware is enabled; see *Note Control Modes::. For example, you +- could clear the `INPCK' input mode flag and set the `PARENB' +- control mode flag to ignore parity errors on input, but still +- generate parity on output. +- +- If this bit is set, what happens when a parity error is detected +- depends on whether the `IGNPAR' or `PARMRK' bits are set. If +- neither of these bits are set, a byte with a parity error is +- passed to the application as a `'\0'' character. +- +- - Macro: tcflag_t IGNPAR +- If this bit is set, any byte with a framing or parity error is +- ignored. This is only useful if `INPCK' is also set. +- +- - Macro: tcflag_t PARMRK +- If this bit is set, input bytes with parity or framing errors are +- marked when passed to the program. This bit is meaningful only +- when `INPCK' is set and `IGNPAR' is not set. +- +- The way erroneous bytes are marked is with two preceding bytes, +- `377' and `0'. Thus, the program actually reads three bytes for +- one erroneous byte received from the terminal. +- +- If a valid byte has the value `0377', and `ISTRIP' (see below) is +- not set, the program might confuse it with the prefix that marks a +- parity error. So a valid byte `0377' is passed to the program as +- two bytes, `0377' `0377', in this case. +- +- - Macro: tcflag_t ISTRIP +- If this bit is set, valid input bytes are stripped to seven bits; +- otherwise, all eight bits are available for programs to read. +- +- - Macro: tcflag_t IGNBRK +- If this bit is set, break conditions are ignored. +- +- A "break condition" is defined in the context of asynchronous +- serial data transmission as a series of zero-value bits longer +- than a single byte. +- +- - Macro: tcflag_t BRKINT +- If this bit is set and `IGNBRK' is not set, a break condition +- clears the terminal input and output queues and raises a `SIGINT' +- signal for the foreground process group associated with the +- terminal. +- +- If neither `BRKINT' nor `IGNBRK' are set, a break condition is +- passed to the application as a single `'\0'' character if `PARMRK' +- is not set, or otherwise as a three-character sequence `'\377'', +- `'\0'', `'\0''. +- +- - Macro: tcflag_t IGNCR +- If this bit is set, carriage return characters (`'\r'') are +- discarded on input. Discarding carriage return may be useful on +- terminals that send both carriage return and linefeed when you +- type the key. +- +- - Macro: tcflag_t ICRNL +- If this bit is set and `IGNCR' is not set, carriage return +- characters (`'\r'') received as input are passed to the +- application as newline characters (`'\n''). +- +- - Macro: tcflag_t INLCR +- If this bit is set, newline characters (`'\n'') received as input +- are passed to the application as carriage return characters +- (`'\r''). +- +- - Macro: tcflag_t IXOFF +- If this bit is set, start/stop control on input is enabled. In +- other words, the computer sends STOP and START characters as +- necessary to prevent input from coming in faster than programs are +- reading it. The idea is that the actual terminal hardware that is +- generating the input data responds to a STOP character by +- suspending transmission, and to a START character by resuming +- transmission. *Note Start/Stop Characters::. +- +- - Macro: tcflag_t IXON +- If this bit is set, start/stop control on output is enabled. In +- other words, if the computer receives a STOP character, it +- suspends output until a START character is received. In this +- case, the STOP and START characters are never passed to the +- application program. If this bit is not set, then START and STOP +- can be read as ordinary characters. *Note Start/Stop Characters::. +- +- - Macro: tcflag_t IXANY +- If this bit is set, any input character restarts output when +- output has been suspended with the STOP character. Otherwise, +- only the START character restarts output. +- +- This is a BSD extension; it exists only on BSD systems and the GNU +- system. +- +- - Macro: tcflag_t IMAXBEL +- If this bit is set, then filling up the terminal input buffer +- sends a BEL character (code `007') to the terminal to ring the +- bell. +- +- This is a BSD extension. +- +- +-File: libc.info, Node: Output Modes, Next: Control Modes, Prev: Input Modes, Up: Terminal Modes +- +-Output Modes +------------- +- +- This section describes the terminal flags and fields that control how +-output characters are translated and padded for display. All of these +-are contained in the `c_oflag' member of the `struct termios' structure. +- +- The `c_oflag' member itself is an integer, and you change the flags +-and fields using the operators `&', `|', and `^'. Don't try to specify +-the entire value for `c_oflag'--instead, change only specific flags and +-leave the rest untouched (*note Setting Modes::). +- +- - Macro: tcflag_t OPOST +- If this bit is set, output data is processed in some unspecified +- way so that it is displayed appropriately on the terminal device. +- This typically includes mapping newline characters (`'\n'') onto +- carriage return and linefeed pairs. +- +- If this bit isn't set, the characters are transmitted as-is. +- +- The following three bits are BSD features, and they exist only BSD +-systems and the GNU system. They are effective only if `OPOST' is set. +- +- - Macro: tcflag_t ONLCR +- If this bit is set, convert the newline character on output into a +- pair of characters, carriage return followed by linefeed. +- +- - Macro: tcflag_t OXTABS +- If this bit is set, convert tab characters on output into the +- appropriate number of spaces to emulate a tab stop every eight +- columns. +- +- - Macro: tcflag_t ONOEOT +- If this bit is set, discard `C-d' characters (code `004') on +- output. These characters cause many dial-up terminals to +- disconnect. +- +- +-File: libc.info, Node: Control Modes, Next: Local Modes, Prev: Output Modes, Up: Terminal Modes +- +-Control Modes +-------------- +- +- This section describes the terminal flags and fields that control +-parameters usually associated with asynchronous serial data +-transmission. These flags may not make sense for other kinds of +-terminal ports (such as a network connection pseudo-terminal). All of +-these are contained in the `c_cflag' member of the `struct termios' +-structure. +- +- The `c_cflag' member itself is an integer, and you change the flags +-and fields using the operators `&', `|', and `^'. Don't try to specify +-the entire value for `c_cflag'--instead, change only specific flags and +-leave the rest untouched (*note Setting Modes::). +- +- - Macro: tcflag_t CLOCAL +- If this bit is set, it indicates that the terminal is connected +- "locally" and that the modem status lines (such as carrier detect) +- should be ignored. +- +- On many systems if this bit is not set and you call `open' without +- the `O_NONBLOCK' flag set, `open' blocks until a modem connection +- is established. +- +- If this bit is not set and a modem disconnect is detected, a +- `SIGHUP' signal is sent to the controlling process group for the +- terminal (if it has one). Normally, this causes the process to +- exit; see *Note Signal Handling::. Reading from the terminal +- after a disconnect causes an end-of-file condition, and writing +- causes an `EIO' error to be returned. The terminal device must be +- closed and reopened to clear the condition. +- +- - Macro: tcflag_t HUPCL +- If this bit is set, a modem disconnect is generated when all +- processes that have the terminal device open have either closed +- the file or exited. +- +- - Macro: tcflag_t CREAD +- If this bit is set, input can be read from the terminal. +- Otherwise, input is discarded when it arrives. +- +- - Macro: tcflag_t CSTOPB +- If this bit is set, two stop bits are used. Otherwise, only one +- stop bit is used. +- +- - Macro: tcflag_t PARENB +- If this bit is set, generation and detection of a parity bit are +- enabled. *Note Input Modes::, for information on how input parity +- errors are handled. +- +- If this bit is not set, no parity bit is added to output +- characters, and input characters are not checked for correct +- parity. +- +- - Macro: tcflag_t PARODD +- This bit is only useful if `PARENB' is set. If `PARODD' is set, +- odd parity is used, otherwise even parity is used. +- +- The control mode flags also includes a field for the number of bits +-per character. You can use the `CSIZE' macro as a mask to extract the +-value, like this: `settings.c_cflag & CSIZE'. +- +- - Macro: tcflag_t CSIZE +- This is a mask for the number of bits per character. +- +- - Macro: tcflag_t CS5 +- This specifies five bits per byte. +- +- - Macro: tcflag_t CS6 +- This specifies six bits per byte. +- +- - Macro: tcflag_t CS7 +- This specifies seven bits per byte. +- +- - Macro: tcflag_t CS8 +- This specifies eight bits per byte. +- +- The following four bits are BSD extensions; this exist only on BSD +-systems and the GNU system. +- +- - Macro: tcflag_t CCTS_OFLOW +- If this bit is set, enable flow control of output based on the CTS +- wire (RS232 protocol). +- +- - Macro: tcflag_t CRTS_IFLOW +- If this bit is set, enable flow control of input based on the RTS +- wire (RS232 protocol). +- +- - Macro: tcflag_t MDMBUF +- If this bit is set, enable carrier-based flow control of output. +- +- - Macro: tcflag_t CIGNORE +- If this bit is set, it says to ignore the control modes and line +- speed values entirely. This is only meaningful in a call to +- `tcsetattr'. +- +- The `c_cflag' member and the line speed values returned by +- `cfgetispeed' and `cfgetospeed' will be unaffected by the call. +- `CIGNORE' is useful if you want to set all the software modes in +- the other members, but leave the hardware details in `c_cflag' +- unchanged. (This is how the `TCSASOFT' flag to `tcsettattr' +- works.) +- +- This bit is never set in the structure filled in by `tcgetattr'. +- +- +-File: libc.info, Node: Local Modes, Next: Line Speed, Prev: Control Modes, Up: Terminal Modes +- +-Local Modes +------------ +- +- This section describes the flags for the `c_lflag' member of the +-`struct termios' structure. These flags generally control higher-level +-aspects of input processing than the input modes flags described in +-*Note Input Modes::, such as echoing, signals, and the choice of +-canonical or noncanonical input. +- +- The `c_lflag' member itself is an integer, and you change the flags +-and fields using the operators `&', `|', and `^'. Don't try to specify +-the entire value for `c_lflag'--instead, change only specific flags and +-leave the rest untouched (*note Setting Modes::). +- +- - Macro: tcflag_t ICANON +- This bit, if set, enables canonical input processing mode. +- Otherwise, input is processed in noncanonical mode. *Note +- Canonical or Not::. +- +- - Macro: tcflag_t ECHO +- If this bit is set, echoing of input characters back to the +- terminal is enabled. +- +- - Macro: tcflag_t ECHOE +- If this bit is set, echoing indicates erasure of input with the +- ERASE character by erasing the last character in the current line +- from the screen. Otherwise, the character erased is re-echoed to +- show what has happened (suitable for a printing terminal). +- +- This bit only controls the display behavior; the `ICANON' bit by +- itself controls actual recognition of the ERASE character and +- erasure of input, without which `ECHOE' is simply irrelevant. +- +- - Macro: tcflag_t ECHOPRT +- This bit is like `ECHOE', enables display of the ERASE character in +- a way that is geared to a hardcopy terminal. When you type the +- ERASE character, a `\' character is printed followed by the first +- character erased. Typing the ERASE character again just prints +- the next character erased. Then, the next time you type a normal +- character, a `/' character is printed before the character echoes. +- +- This is a BSD extension, and exists only in BSD systems and the +- GNU system. +- +- - Macro: tcflag_t ECHOK +- This bit enables special display of the KILL character by moving +- to a new line after echoing the KILL character normally. The +- behavior of `ECHOKE' (below) is nicer to look at. +- +- If this bit is not set, the KILL character echoes just as it would +- if it were not the KILL character. Then it is up to the user to +- remember that the KILL character has erased the preceding input; +- there is no indication of this on the screen. +- +- This bit only controls the display behavior; the `ICANON' bit by +- itself controls actual recognition of the KILL character and +- erasure of input, without which `ECHOK' is simply irrelevant. +- +- - Macro: tcflag_t ECHOKE +- This bit is similar to `ECHOK'. It enables special display of the +- KILL character by erasing on the screen the entire line that has +- been killed. This is a BSD extension, and exists only in BSD +- systems and the GNU system. +- +- - Macro: tcflag_t ECHONL +- If this bit is set and the `ICANON' bit is also set, then the +- newline (`'\n'') character is echoed even if the `ECHO' bit is not +- set. +- +- - Macro: tcflag_t ECHOCTL +- If this bit is set and the `ECHO' bit is also set, echo control +- characters with `^' followed by the corresponding text character. +- Thus, control-A echoes as `^A'. This is usually the preferred mode +- for interactive input, because echoing a control character back to +- the terminal could have some undesired effect on the terminal. +- +- This is a BSD extension, and exists only in BSD systems and the +- GNU system. +- +- - Macro: tcflag_t ISIG +- This bit controls whether the INTR, QUIT, and SUSP characters are +- recognized. The functions associated with these characters are +- performed if and only if this bit is set. Being in canonical or +- noncanonical input mode has no affect on the interpretation of +- these characters. +- +- You should use caution when disabling recognition of these +- characters. Programs that cannot be interrupted interactively are +- very user-unfriendly. If you clear this bit, your program should +- provide some alternate interface that allows the user to +- interactively send the signals associated with these characters, +- or to escape from the program. +- +- *Note Signal Characters::. +- +- - Macro: tcflag_t IEXTEN +- POSIX.1 gives `IEXTEN' implementation-defined meaning, so you +- cannot rely on this interpretation on all systems. +- +- On BSD systems and the GNU system, it enables the LNEXT and +- DISCARD characters. *Note Other Special::. +- +- - Macro: tcflag_t NOFLSH +- Normally, the INTR, QUIT, and SUSP characters cause input and +- output queues for the terminal to be cleared. If this bit is set, +- the queues are not cleared. +- +- - Macro: tcflag_t TOSTOP +- If this bit is set and the system supports job control, then +- `SIGTTOU' signals are generated by background processes that +- attempt to write to the terminal. *Note Access to the Terminal::. +- +- The following bits are BSD extensions; they exist only in BSD systems +-and the GNU system. +- +- - Macro: tcflag_t ALTWERASE +- This bit determines how far the WERASE character should erase. The +- WERASE character erases back to the beginning of a word; the +- question is, where do words begin? +- +- If this bit is clear, then the beginning of a word is a +- nonwhitespace character following a whitespace character. If the +- bit is set, then the beginning of a word is an alphanumeric +- character or underscore following a character which is none of +- those. +- +- *Note Editing Characters::, for more information about the WERASE +- character. +- +- - Macro: tcflag_t FLUSHO +- This is the bit that toggles when the user types the DISCARD +- character. While this bit is set, all output is discarded. *Note +- Other Special::. +- +- - Macro: tcflag_t NOKERNINFO +- Setting this bit disables handling of the STATUS character. *Note +- Other Special::. +- +- - Macro: tcflag_t PENDIN +- If this bit is set, it indicates that there is a line of input that +- needs to be reprinted. Typing the REPRINT character sets this +- bit; the bit remains set until reprinting is finished. *Note +- Editing Characters::. +- +- +-File: libc.info, Node: Line Speed, Next: Special Characters, Prev: Local Modes, Up: Terminal Modes +- +-Line Speed +----------- +- +- The terminal line speed tells the computer how fast to read and write +-data on the terminal. +- +- If the terminal is connected to a real serial line, the terminal +-speed you specify actually controls the line--if it doesn't match the +-terminal's own idea of the speed, communication does not work. Real +-serial ports accept only certain standard speeds. Also, particular +-hardware may not support even all the standard speeds. Specifying a +-speed of zero hangs up a dialup connection and turns off modem control +-signals. +- +- If the terminal is not a real serial line (for example, if it is a +-network connection), then the line speed won't really affect data +-transmission speed, but some programs will use it to determine the +-amount of padding needed. It's best to specify a line speed value that +-matches the actual speed of the actual terminal, but you can safely +-experiment with different values to vary the amount of padding. +- +- There are actually two line speeds for each terminal, one for input +-and one for output. You can set them independently, but most often +-terminals use the same speed for both directions. +- +- The speed values are stored in the `struct termios' structure, but +-don't try to access them in the `struct termios' structure directly. +-Instead, you should use the following functions to read and store them: +- +- - Function: speed_t cfgetospeed (const struct termios *TERMIOS-P) +- This function returns the output line speed stored in the structure +- `*TERMIOS-P'. +- +- - Function: speed_t cfgetispeed (const struct termios *TERMIOS-P) +- This function returns the input line speed stored in the structure +- `*TERMIOS-P'. +- +- - Function: int cfsetospeed (struct termios *TERMIOS-P, speed_t SPEED) +- This function stores SPEED in `*TERMIOS-P' as the output speed. +- The normal return value is 0; a value of -1 indicates an error. +- If SPEED is not a speed, `cfsetospeed' returns -1. +- +- - Function: int cfsetispeed (struct termios *TERMIOS-P, speed_t SPEED) +- This function stores SPEED in `*TERMIOS-P' as the input speed. +- The normal return value is 0; a value of -1 indicates an error. +- If SPEED is not a speed, `cfsetospeed' returns -1. +- +- - Function: int cfsetspeed (struct termios *TERMIOS-P, speed_t SPEED) +- This function stores SPEED in `*TERMIOS-P' as both the input and +- output speeds. The normal return value is 0; a value of -1 +- indicates an error. If SPEED is not a speed, `cfsetspeed' returns +- -1. This function is an extension in 4.4 BSD. +- +- - Data Type: speed_t +- The `speed_t' type is an unsigned integer data type used to +- represent line speeds. +- +- The functions `cfsetospeed' and `cfsetispeed' report errors only for +-speed values that the system simply cannot handle. If you specify a +-speed value that is basically acceptable, then those functions will +-succeed. But they do not check that a particular hardware device can +-actually support the specified speeds--in fact, they don't know which +-device you plan to set the speed for. If you use `tcsetattr' to set +-the speed of a particular device to a value that it cannot handle, +-`tcsetattr' returns -1. +- +- *Portability note:* In the GNU library, the functions above accept +-speeds measured in bits per second as input, and return speed values +-measured in bits per second. Other libraries require speeds to be +-indicated by special codes. For POSIX.1 portability, you must use one +-of the following symbols to represent the speed; their precise numeric +-values are system-dependent, but each name has a fixed meaning: `B110' +-stands for 110 bps, `B300' for 300 bps, and so on. There is no +-portable way to represent any speed but these, but these are the only +-speeds that typical serial lines can support. +- +- B0 B50 B75 B110 B134 B150 B200 +- B300 B600 B1200 B1800 B2400 B4800 +- B9600 B19200 B38400 B57600 B115200 +- B230400 B460800 +- +- BSD defines two additional speed symbols as aliases: `EXTA' is an +-alias for `B19200' and `EXTB' is an alias for `B38400'. These aliases +-are obsolete. +- +- +-File: libc.info, Node: Special Characters, Next: Noncanonical Input, Prev: Line Speed, Up: Terminal Modes +- +-Special Characters +------------------- +- +- In canonical input, the terminal driver recognizes a number of +-special characters which perform various control functions. These +-include the ERASE character (usually ) for editing input, and +-other editing characters. The INTR character (normally `C-c') for +-sending a `SIGINT' signal, and other signal-raising characters, may be +-available in either canonical or noncanonical input mode. All these +-characters are described in this section. +- +- The particular characters used are specified in the `c_cc' member of +-the `struct termios' structure. This member is an array; each element +-specifies the character for a particular role. Each element has a +-symbolic constant that stands for the index of that element--for +-example, `VINTR' is the index of the element that specifies the INTR +-character, so storing `'='' in `TERMIOS.c_cc[VINTR]' specifies `=' as +-the INTR character. +- +- On some systems, you can disable a particular special character +-function by specifying the value `_POSIX_VDISABLE' for that role. This +-value is unequal to any possible character code. *Note Options for +-Files::, for more information about how to tell whether the operating +-system you are using supports `_POSIX_VDISABLE'. +- +-* Menu: +- +-* Editing Characters:: Special characters that terminate lines and +- delete text, and other editing functions. +-* Signal Characters:: Special characters that send or raise signals +- to or for certain classes of processes. +-* Start/Stop Characters:: Special characters that suspend or resume +- suspended output. +-* Other Special:: Other special characters for BSD systems: +- they can discard output, and print status. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-3 glibc-2.3.2-200304020432/manual/libc.info-3 +--- glibc-2.3.2/manual/libc.info-3 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-3 Thu Jan 1 01:00:00 1970 +@@ -1,1280 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Error Codes, Next: Error Messages, Prev: Checking for Errors, Up: Error Reporting +- +-Error Codes +-=========== +- +- The error code macros are defined in the header file `errno.h'. All +-of them expand into integer constant values. Some of these error codes +-can't occur on the GNU system, but they can occur using the GNU library +-on other systems. +- +- - Macro: int EPERM +- Operation not permitted; only the owner of the file (or other +- resource) or processes with special privileges can perform the +- operation. +- +- - Macro: int ENOENT +- No such file or directory. This is a "file doesn't exist" error +- for ordinary files that are referenced in contexts where they are +- expected to already exist. +- +- - Macro: int ESRCH +- No process matches the specified process ID. +- +- - Macro: int EINTR +- Interrupted function call; an asynchronous signal occurred and +- prevented completion of the call. When this happens, you should +- try the call again. +- +- You can choose to have functions resume after a signal that is +- handled, rather than failing with `EINTR'; see *Note Interrupted +- Primitives::. +- +- - Macro: int EIO +- Input/output error; usually used for physical read or write errors. +- +- - Macro: int ENXIO +- No such device or address. The system tried to use the device +- represented by a file you specified, and it couldn't find the +- device. This can mean that the device file was installed +- incorrectly, or that the physical device is missing or not +- correctly attached to the computer. +- +- - Macro: int E2BIG +- Argument list too long; used when the arguments passed to a new +- program being executed with one of the `exec' functions (*note +- Executing a File::) occupy too much memory space. This condition +- never arises in the GNU system. +- +- - Macro: int ENOEXEC +- Invalid executable file format. This condition is detected by the +- `exec' functions; see *Note Executing a File::. +- +- - Macro: int EBADF +- Bad file descriptor; for example, I/O on a descriptor that has been +- closed or reading from a descriptor open only for writing (or vice +- versa). +- +- - Macro: int ECHILD +- There are no child processes. This error happens on operations +- that are supposed to manipulate child processes, when there aren't +- any processes to manipulate. +- +- - Macro: int EDEADLK +- Deadlock avoided; allocating a system resource would have resulted +- in a deadlock situation. The system does not guarantee that it +- will notice all such situations. This error means you got lucky +- and the system noticed; it might just hang. *Note File Locks::, +- for an example. +- +- - Macro: int ENOMEM +- No memory available. The system cannot allocate more virtual +- memory because its capacity is full. +- +- - Macro: int EACCES +- Permission denied; the file permissions do not allow the attempted +- operation. +- +- - Macro: int EFAULT +- Bad address; an invalid pointer was detected. In the GNU system, +- this error never happens; you get a signal instead. +- +- - Macro: int ENOTBLK +- A file that isn't a block special file was given in a situation +- that requires one. For example, trying to mount an ordinary file +- as a file system in Unix gives this error. +- +- - Macro: int EBUSY +- Resource busy; a system resource that can't be shared is already +- in use. For example, if you try to delete a file that is the root +- of a currently mounted filesystem, you get this error. +- +- - Macro: int EEXIST +- File exists; an existing file was specified in a context where it +- only makes sense to specify a new file. +- +- - Macro: int EXDEV +- An attempt to make an improper link across file systems was +- detected. This happens not only when you use `link' (*note Hard +- Links::) but also when you rename a file with `rename' (*note +- Renaming Files::). +- +- - Macro: int ENODEV +- The wrong type of device was given to a function that expects a +- particular sort of device. +- +- - Macro: int ENOTDIR +- A file that isn't a directory was specified when a directory is +- required. +- +- - Macro: int EISDIR +- File is a directory; you cannot open a directory for writing, or +- create or remove hard links to it. +- +- - Macro: int EINVAL +- Invalid argument. This is used to indicate various kinds of +- problems with passing the wrong argument to a library function. +- +- - Macro: int EMFILE +- The current process has too many files open and can't open any +- more. Duplicate descriptors do count toward this limit. +- +- In BSD and GNU, the number of open files is controlled by a +- resource limit that can usually be increased. If you get this +- error, you might want to increase the `RLIMIT_NOFILE' limit or +- make it unlimited; *note Limits on Resources::. +- +- - Macro: int ENFILE +- There are too many distinct file openings in the entire system. +- Note that any number of linked channels count as just one file +- opening; see *Note Linked Channels::. This error never occurs in +- the GNU system. +- +- - Macro: int ENOTTY +- Inappropriate I/O control operation, such as trying to set terminal +- modes on an ordinary file. +- +- - Macro: int ETXTBSY +- An attempt to execute a file that is currently open for writing, or +- write to a file that is currently being executed. Often using a +- debugger to run a program is considered having it open for writing +- and will cause this error. (The name stands for "text file +- busy".) This is not an error in the GNU system; the text is +- copied as necessary. +- +- - Macro: int EFBIG +- File too big; the size of a file would be larger than allowed by +- the system. +- +- - Macro: int ENOSPC +- No space left on device; write operation on a file failed because +- the disk is full. +- +- - Macro: int ESPIPE +- Invalid seek operation (such as on a pipe). +- +- - Macro: int EROFS +- An attempt was made to modify something on a read-only file system. +- +- - Macro: int EMLINK +- Too many links; the link count of a single file would become too +- large. `rename' can cause this error if the file being renamed +- already has as many links as it can take (*note Renaming Files::). +- +- - Macro: int EPIPE +- Broken pipe; there is no process reading from the other end of a +- pipe. Every library function that returns this error code also +- generates a `SIGPIPE' signal; this signal terminates the program +- if not handled or blocked. Thus, your program will never actually +- see `EPIPE' unless it has handled or blocked `SIGPIPE'. +- +- - Macro: int EDOM +- Domain error; used by mathematical functions when an argument +- value does not fall into the domain over which the function is +- defined. +- +- - Macro: int ERANGE +- Range error; used by mathematical functions when the result value +- is not representable because of overflow or underflow. +- +- - Macro: int EAGAIN +- Resource temporarily unavailable; the call might work if you try +- again later. The macro `EWOULDBLOCK' is another name for `EAGAIN'; +- they are always the same in the GNU C library. +- +- This error can happen in a few different situations: +- +- * An operation that would block was attempted on an object that +- has non-blocking mode selected. Trying the same operation +- again will block until some external condition makes it +- possible to read, write, or connect (whatever the operation). +- You can use `select' to find out when the operation will be +- possible; *note Waiting for I/O::. +- +- *Portability Note:* In many older Unix systems, this condition +- was indicated by `EWOULDBLOCK', which was a distinct error +- code different from `EAGAIN'. To make your program portable, +- you should check for both codes and treat them the same. +- +- * A temporary resource shortage made an operation impossible. +- `fork' can return this error. It indicates that the shortage +- is expected to pass, so your program can try the call again +- later and it may succeed. It is probably a good idea to +- delay for a few seconds before trying it again, to allow time +- for other processes to release scarce resources. Such +- shortages are usually fairly serious and affect the whole +- system, so usually an interactive program should report the +- error to the user and return to its command loop. +- +- - Macro: int EWOULDBLOCK +- In the GNU C library, this is another name for `EAGAIN' (above). +- The values are always the same, on every operating system. +- +- C libraries in many older Unix systems have `EWOULDBLOCK' as a +- separate error code. +- +- - Macro: int EINPROGRESS +- An operation that cannot complete immediately was initiated on an +- object that has non-blocking mode selected. Some functions that +- must always block (such as `connect'; *note Connecting::) never +- return `EAGAIN'. Instead, they return `EINPROGRESS' to indicate +- that the operation has begun and will take some time. Attempts to +- manipulate the object before the call completes return `EALREADY'. +- You can use the `select' function to find out when the pending +- operation has completed; *note Waiting for I/O::. +- +- - Macro: int EALREADY +- An operation is already in progress on an object that has +- non-blocking mode selected. +- +- - Macro: int ENOTSOCK +- A file that isn't a socket was specified when a socket is required. +- +- - Macro: int EMSGSIZE +- The size of a message sent on a socket was larger than the +- supported maximum size. +- +- - Macro: int EPROTOTYPE +- The socket type does not support the requested communications +- protocol. +- +- - Macro: int ENOPROTOOPT +- You specified a socket option that doesn't make sense for the +- particular protocol being used by the socket. *Note Socket +- Options::. +- +- - Macro: int EPROTONOSUPPORT +- The socket domain does not support the requested communications +- protocol (perhaps because the requested protocol is completely +- invalid). *Note Creating a Socket::. +- +- - Macro: int ESOCKTNOSUPPORT +- The socket type is not supported. +- +- - Macro: int EOPNOTSUPP +- The operation you requested is not supported. Some socket +- functions don't make sense for all types of sockets, and others +- may not be implemented for all communications protocols. In the +- GNU system, this error can happen for many calls when the object +- does not support the particular operation; it is a generic +- indication that the server knows nothing to do for that call. +- +- - Macro: int EPFNOSUPPORT +- The socket communications protocol family you requested is not +- supported. +- +- - Macro: int EAFNOSUPPORT +- The address family specified for a socket is not supported; it is +- inconsistent with the protocol being used on the socket. *Note +- Sockets::. +- +- - Macro: int EADDRINUSE +- The requested socket address is already in use. *Note Socket +- Addresses::. +- +- - Macro: int EADDRNOTAVAIL +- The requested socket address is not available; for example, you +- tried to give a socket a name that doesn't match the local host +- name. *Note Socket Addresses::. +- +- - Macro: int ENETDOWN +- A socket operation failed because the network was down. +- +- - Macro: int ENETUNREACH +- A socket operation failed because the subnet containing the remote +- host was unreachable. +- +- - Macro: int ENETRESET +- A network connection was reset because the remote host crashed. +- +- - Macro: int ECONNABORTED +- A network connection was aborted locally. +- +- - Macro: int ECONNRESET +- A network connection was closed for reasons outside the control of +- the local host, such as by the remote machine rebooting or an +- unrecoverable protocol violation. +- +- - Macro: int ENOBUFS +- The kernel's buffers for I/O operations are all in use. In GNU, +- this error is always synonymous with `ENOMEM'; you may get one or +- the other from network operations. +- +- - Macro: int EISCONN +- You tried to connect a socket that is already connected. *Note +- Connecting::. +- +- - Macro: int ENOTCONN +- The socket is not connected to anything. You get this error when +- you try to transmit data over a socket, without first specifying a +- destination for the data. For a connectionless socket (for +- datagram protocols, such as UDP), you get `EDESTADDRREQ' instead. +- +- - Macro: int EDESTADDRREQ +- No default destination address was set for the socket. You get +- this error when you try to transmit data over a connectionless +- socket, without first specifying a destination for the data with +- `connect'. +- +- - Macro: int ESHUTDOWN +- The socket has already been shut down. +- +- - Macro: int ETOOMANYREFS +- ??? +- +- - Macro: int ETIMEDOUT +- A socket operation with a specified timeout received no response +- during the timeout period. +- +- - Macro: int ECONNREFUSED +- A remote host refused to allow the network connection (typically +- because it is not running the requested service). +- +- - Macro: int ELOOP +- Too many levels of symbolic links were encountered in looking up a +- file name. This often indicates a cycle of symbolic links. +- +- - Macro: int ENAMETOOLONG +- Filename too long (longer than `PATH_MAX'; *note Limits for +- Files::) or host name too long (in `gethostname' or `sethostname'; +- *note Host Identification::). +- +- - Macro: int EHOSTDOWN +- The remote host for a requested network connection is down. +- +- - Macro: int EHOSTUNREACH +- The remote host for a requested network connection is not +- reachable. +- +- - Macro: int ENOTEMPTY +- Directory not empty, where an empty directory was expected. +- Typically, this error occurs when you are trying to delete a +- directory. +- +- - Macro: int EPROCLIM +- This means that the per-user limit on new process would be +- exceeded by an attempted `fork'. *Note Limits on Resources::, for +- details on the `RLIMIT_NPROC' limit. +- +- - Macro: int EUSERS +- The file quota system is confused because there are too many users. +- +- - Macro: int EDQUOT +- The user's disk quota was exceeded. +- +- - Macro: int ESTALE +- Stale NFS file handle. This indicates an internal confusion in +- the NFS system which is due to file system rearrangements on the +- server host. Repairing this condition usually requires unmounting +- and remounting the NFS file system on the local host. +- +- - Macro: int EREMOTE +- An attempt was made to NFS-mount a remote file system with a file +- name that already specifies an NFS-mounted file. (This is an +- error on some operating systems, but we expect it to work properly +- on the GNU system, making this error code impossible.) +- +- - Macro: int EBADRPC +- ??? +- +- - Macro: int ERPCMISMATCH +- ??? +- +- - Macro: int EPROGUNAVAIL +- ??? +- +- - Macro: int EPROGMISMATCH +- ??? +- +- - Macro: int EPROCUNAVAIL +- ??? +- +- - Macro: int ENOLCK +- No locks available. This is used by the file locking facilities; +- see *Note File Locks::. This error is never generated by the GNU +- system, but it can result from an operation to an NFS server +- running another operating system. +- +- - Macro: int EFTYPE +- Inappropriate file type or format. The file was the wrong type +- for the operation, or a data file had the wrong format. +- +- On some systems `chmod' returns this error if you try to set the +- sticky bit on a non-directory file; *note Setting Permissions::. +- +- - Macro: int EAUTH +- ??? +- +- - Macro: int ENEEDAUTH +- ??? +- +- - Macro: int ENOSYS +- Function not implemented. This indicates that the function called +- is not implemented at all, either in the C library itself or in the +- operating system. When you get this error, you can be sure that +- this particular function will always fail with `ENOSYS' unless you +- install a new version of the C library or the operating system. +- +- - Macro: int ENOTSUP +- Not supported. A function returns this error when certain +- parameter values are valid, but the functionality they request is +- not available. This can mean that the function does not implement +- a particular command or option value or flag bit at all. For +- functions that operate on some object given in a parameter, such +- as a file descriptor or a port, it might instead mean that only +- _that specific object_ (file descriptor, port, etc.) is unable to +- support the other parameters given; different file descriptors +- might support different ranges of parameter values. +- +- If the entire function is not available at all in the +- implementation, it returns `ENOSYS' instead. +- +- - Macro: int EILSEQ +- While decoding a multibyte character the function came along an +- invalid or an incomplete sequence of bytes or the given wide +- character is invalid. +- +- - Macro: int EBACKGROUND +- In the GNU system, servers supporting the `term' protocol return +- this error for certain operations when the caller is not in the +- foreground process group of the terminal. Users do not usually +- see this error because functions such as `read' and `write' +- translate it into a `SIGTTIN' or `SIGTTOU' signal. *Note Job +- Control::, for information on process groups and these signals. +- +- - Macro: int EDIED +- In the GNU system, opening a file returns this error when the file +- is translated by a program and the translator program dies while +- starting up, before it has connected to the file. +- +- - Macro: int ED +- The experienced user will know what is wrong. +- +- - Macro: int EGREGIOUS +- You did *what*? +- +- - Macro: int EIEIO +- Go home and have a glass of warm, dairy-fresh milk. +- +- - Macro: int EGRATUITOUS +- This error code has no purpose. +- +- - Macro: int EBADMSG +- +- - Macro: int EIDRM +- +- - Macro: int EMULTIHOP +- +- - Macro: int ENODATA +- +- - Macro: int ENOLINK +- +- - Macro: int ENOMSG +- +- - Macro: int ENOSR +- +- - Macro: int ENOSTR +- +- - Macro: int EOVERFLOW +- +- - Macro: int EPROTO +- +- - Macro: int ETIME +- +- - Macro: int ECANCELED +- Operation canceled; an asynchronous operation was canceled before +- it completed. *Note Asynchronous I/O::. When you call +- `aio_cancel', the normal result is for the operations affected to +- complete with this error; *note Cancel AIO Operations::. +- +- _The following error codes are defined by the Linux/i386 kernel. +-They are not yet documented._ +- +- - Macro: int ERESTART +- +- - Macro: int ECHRNG +- +- - Macro: int EL2NSYNC +- +- - Macro: int EL3HLT +- +- - Macro: int EL3RST +- +- - Macro: int ELNRNG +- +- - Macro: int EUNATCH +- +- - Macro: int ENOCSI +- +- - Macro: int EL2HLT +- +- - Macro: int EBADE +- +- - Macro: int EBADR +- +- - Macro: int EXFULL +- +- - Macro: int ENOANO +- +- - Macro: int EBADRQC +- +- - Macro: int EBADSLT +- +- - Macro: int EDEADLOCK +- +- - Macro: int EBFONT +- +- - Macro: int ENONET +- +- - Macro: int ENOPKG +- +- - Macro: int EADV +- +- - Macro: int ESRMNT +- +- - Macro: int ECOMM +- +- - Macro: int EDOTDOT +- +- - Macro: int ENOTUNIQ +- +- - Macro: int EBADFD +- +- - Macro: int EREMCHG +- +- - Macro: int ELIBACC +- +- - Macro: int ELIBBAD +- +- - Macro: int ELIBSCN +- +- - Macro: int ELIBMAX +- +- - Macro: int ELIBEXEC +- +- - Macro: int ESTRPIPE +- +- - Macro: int EUCLEAN +- +- - Macro: int ENOTNAM +- +- - Macro: int ENAVAIL +- +- - Macro: int EISNAM +- +- - Macro: int EREMOTEIO +- +- - Macro: int ENOMEDIUM +- +- - Macro: int EMEDIUMTYPE +- +- +-File: libc.info, Node: Error Messages, Prev: Error Codes, Up: Error Reporting +- +-Error Messages +-============== +- +- The library has functions and variables designed to make it easy for +-your program to report informative error messages in the customary +-format about the failure of a library call. The functions `strerror' +-and `perror' give you the standard error message for a given error +-code; the variable `program_invocation_short_name' gives you convenient +-access to the name of the program that encountered the error. +- +- - Function: char * strerror (int ERRNUM) +- The `strerror' function maps the error code (*note Checking for +- Errors::) specified by the ERRNUM argument to a descriptive error +- message string. The return value is a pointer to this string. +- +- The value ERRNUM normally comes from the variable `errno'. +- +- You should not modify the string returned by `strerror'. Also, if +- you make subsequent calls to `strerror', the string might be +- overwritten. (But it's guaranteed that no library function ever +- calls `strerror' behind your back.) +- +- The function `strerror' is declared in `string.h'. +- +- - Function: char * strerror_r (int ERRNUM, char *BUF, size_t N) +- The `strerror_r' function works like `strerror' but instead of +- returning the error message in a statically allocated buffer +- shared by all threads in the process, it returns a private copy +- for the thread. This might be either some permanent global data or +- a message string in the user supplied buffer starting at BUF with +- the length of N bytes. +- +- At most N characters are written (including the NUL byte) so it is +- up to the user to select the buffer large enough. +- +- This function should always be used in multi-threaded programs +- since there is no way to guarantee the string returned by +- `strerror' really belongs to the last call of the current thread. +- +- This function `strerror_r' is a GNU extension and it is declared in +- `string.h'. +- +- - Function: void perror (const char *MESSAGE) +- This function prints an error message to the stream `stderr'; see +- *Note Standard Streams::. The orientation of `stderr' is not +- changed. +- +- If you call `perror' with a MESSAGE that is either a null pointer +- or an empty string, `perror' just prints the error message +- corresponding to `errno', adding a trailing newline. +- +- If you supply a non-null MESSAGE argument, then `perror' prefixes +- its output with this string. It adds a colon and a space +- character to separate the MESSAGE from the error string +- corresponding to `errno'. +- +- The function `perror' is declared in `stdio.h'. +- +- `strerror' and `perror' produce the exact same message for any given +-error code; the precise text varies from system to system. On the GNU +-system, the messages are fairly short; there are no multi-line messages +-or embedded newlines. Each error message begins with a capital letter +-and does not include any terminating punctuation. +- +- *Compatibility Note:* The `strerror' function was introduced in +-ISO C89. Many older C systems do not support this function yet. +- +- Many programs that don't read input from the terminal are designed to +-exit if any system call fails. By convention, the error message from +-such a program should start with the program's name, sans directories. +-You can find that name in the variable `program_invocation_short_name'; +-the full file name is stored the variable `program_invocation_name'. +- +- - Variable: char * program_invocation_name +- This variable's value is the name that was used to invoke the +- program running in the current process. It is the same as +- `argv[0]'. Note that this is not necessarily a useful file name; +- often it contains no directory names. *Note Program Arguments::. +- +- - Variable: char * program_invocation_short_name +- This variable's value is the name that was used to invoke the +- program running in the current process, with directory names +- removed. (That is to say, it is the same as +- `program_invocation_name' minus everything up to the last slash, +- if any.) +- +- The library initialization code sets up both of these variables +-before calling `main'. +- +- *Portability Note:* These two variables are GNU extensions. If you +-want your program to work with non-GNU libraries, you must save the +-value of `argv[0]' in `main', and then strip off the directory names +-yourself. We added these extensions to make it possible to write +-self-contained error-reporting subroutines that require no explicit +-cooperation from `main'. +- +- Here is an example showing how to handle failure to open a file +-correctly. The function `open_sesame' tries to open the named file for +-reading and returns a stream if successful. The `fopen' library +-function returns a null pointer if it couldn't open the file for some +-reason. In that situation, `open_sesame' constructs an appropriate +-error message using the `strerror' function, and terminates the +-program. If we were going to make some other library calls before +-passing the error code to `strerror', we'd have to save it in a local +-variable instead, because those other library functions might overwrite +-`errno' in the meantime. +- +- #include +- #include +- #include +- #include +- +- FILE * +- open_sesame (char *name) +- { +- FILE *stream; +- +- errno = 0; +- stream = fopen (name, "r"); +- if (stream == NULL) +- { +- fprintf (stderr, "%s: Couldn't open file %s; %s\n", +- program_invocation_short_name, name, strerror (errno)); +- exit (EXIT_FAILURE); +- } +- else +- return stream; +- } +- +- Using `perror' has the advantage that the function is portable and +-available on all systems implementing ISO C. But often the text +-`perror' generates is not what is wanted and there is no way to extend +-or change what `perror' does. The GNU coding standard, for instance, +-requires error messages to be preceded by the program name and programs +-which read some input files should should provide information about the +-input file name and the line number in case an error is encountered +-while reading the file. For these occasions there are two functions +-available which are widely used throughout the GNU project. These +-functions are declared in `error.h'. +- +- - Function: void error (int STATUS, int ERRNUM, const char *FORMAT, +- ...) +- The `error' function can be used to report general problems during +- program execution. The FORMAT argument is a format string just +- like those given to the `printf' family of functions. The +- arguments required for the format can follow the FORMAT parameter. +- Just like `perror', `error' also can report an error code in +- textual form. But unlike `perror' the error value is explicitly +- passed to the function in the 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 `errno' might have a different value. +- +- The `error' prints first the program name. If the application +- defined a global variable `error_print_progname' and points it to a +- function this function will be called to print the program name. +- Otherwise the string from the global variable `program_name' is +- used. The program name is followed by a colon and a space which +- in turn is followed by the output produced by the format string. +- If the ERRNUM parameter is non-zero the format string output is +- followed by a colon and a space, followed by the error message for +- the error code ERRNUM. In any case is the output terminated with +- a newline. +- +- The output is directed to the `stderr' stream. If the `stderr' +- wasn't oriented before the call it will be narrow-oriented +- afterwards. +- +- The function will return unless the STATUS parameter has a +- non-zero value. In this case the function will call `exit' with +- the STATUS value for its parameter and therefore never return. If +- `error' returns the global variable `error_message_count' is +- incremented by one to keep track of the number of errors reported. +- +- - Function: void error_at_line (int STATUS, int ERRNUM, const char +- *FNAME, unsigned int LINENO, const char *FORMAT, ...) +- The `error_at_line' function is very similar to the `error' +- function. The only difference are the additional parameters FNAME +- and LINENO. The handling of the other parameters is identical to +- that of `error' except that between the program name and the string +- generated by the format string additional text is inserted. +- +- Directly following the program name a colon, followed by the file +- name pointer to by FNAME, another colon, and a value of LINENO is +- printed. +- +- This additional output of course is meant to be used to locate an +- error in an input file (like a programming language source code +- file etc). +- +- If the global variable `error_one_per_line' is set to a non-zero +- value `error_at_line' will avoid printing consecutive messages for +- the same file anem line. Repetition which are not directly +- following each other are not caught. +- +- Just like `error' this function only returned if STATUS is zero. +- Otherwise `exit' is called with the non-zero value. If `error' +- returns the global variable `error_message_count' is incremented +- by one to keep track of the number of errors reported. +- +- As mentioned above the `error' and `error_at_line' functions can be +-customized by defining a variable named `error_print_progname'. +- +- - Variable: void (* error_print_progname ) (void) +- If the `error_print_progname' variable is defined to a non-zero +- value the function pointed to is called by `error' or +- `error_at_line'. It is expected to print the program name or do +- something similarly useful. +- +- The function is expected to be print to the `stderr' stream and +- must be able to handle whatever orientation the stream has. +- +- The variable is global and shared by all threads. +- +- - Variable: unsigned int error_message_count +- The `error_message_count' variable is incremented whenever one of +- the functions `error' or `error_at_line' returns. The variable is +- global and shared by all threads. +- +- - Variable: int error_one_per_line +- The `error_one_per_line' variable influences only `error_at_line'. +- Normally the `error_at_line' function creates output for every +- invocation. If `error_one_per_line' is set to a non-zero value +- `error_at_line' keeps track of the last file name and line number +- for which an error was reported and avoid directly following +- messages for the same file and line. This variable is global and +- shared by all threads. +- +-A program which read some input file and reports errors in it could look +-like this: +- +- { +- char *line = NULL; +- size_t len = 0; +- unsigned int lineno = 0; +- +- error_message_count = 0; +- while (! feof_unlocked (fp)) +- { +- ssize_t n = getline (&line, &len, fp); +- if (n <= 0) +- /* End of file or error. */ +- break; +- ++lineno; +- +- /* Process the line. */ +- ... +- +- if (Detect error in line) +- error_at_line (0, errval, filename, lineno, +- "some error text %s", some_variable); +- } +- +- if (error_message_count != 0) +- error (EXIT_FAILURE, 0, "%u errors found", error_message_count); +- } +- +- `error' and `error_at_line' are clearly the functions of choice and +-enable the programmer to write applications which follow the GNU coding +-standard. The GNU libc additionally contains functions which are used +-in BSD for the same purpose. These functions are declared in `err.h'. +-It is generally advised to not use these functions. They are included +-only for compatibility. +- +- - Function: void warn (const char *FORMAT, ...) +- The `warn' function is roughly equivalent to a call like +- error (0, errno, format, the parameters) +- +- except that the global variables `error' respects and modifies are +- not used. +- +- - Function: void vwarn (const char *FORMAT, va_list) +- The `vwarn' function is just like `warn' except that the +- parameters for the handling of the format string FORMAT are passed +- in as an value of type `va_list'. +- +- - Function: void warnx (const char *FORMAT, ...) +- The `warnx' function is roughly equivalent to a call like +- error (0, 0, format, the parameters) +- +- except that the global variables `error' respects and modifies are +- not used. The difference to `warn' is that no error number string +- is printed. +- +- - Function: void vwarnx (const char *FORMAT, va_list) +- The `vwarnx' function is just like `warnx' except that the +- parameters for the handling of the format string FORMAT are passed +- in as an value of type `va_list'. +- +- - Function: void err (int STATUS, const char *FORMAT, ...) +- The `err' function is roughly equivalent to a call like +- error (status, errno, format, the parameters) +- +- except that the global variables `error' respects and modifies are +- not used and that the program is exited even if STATUS is zero. +- +- - Function: void verr (int STATUS, const char *FORMAT, va_list) +- The `verr' function is just like `err' except that the parameters +- for the handling of the format string FORMAT are passed in as an +- value of type `va_list'. +- +- - Function: void errx (int STATUS, const char *FORMAT, ...) +- The `errx' function is roughly equivalent to a call like +- error (status, 0, format, the parameters) +- +- except that the global variables `error' respects and modifies are +- not used and that the program is exited even if STATUS is zero. +- The difference to `err' is that no error number string is printed. +- +- - Function: void verrx (int STATUS, const char *FORMAT, va_list) +- The `verrx' function is just like `errx' except that the +- parameters for the handling of the format string FORMAT are passed +- in as an value of type `va_list'. +- +- +-File: libc.info, Node: Memory, Next: Character Handling, Prev: Error Reporting, Up: Top +- +-Virtual Memory Allocation And Paging +-************************************ +- +- This chapter describes how processes manage and use memory in a +-system that uses the GNU C library. +- +- The GNU C Library has several functions for dynamically allocating +-virtual memory in various ways. They vary in generality and in +-efficiency. The library also provides functions for controlling paging +-and allocation of real memory. +- +-* Menu: +- +-* Memory Concepts:: An introduction to concepts and terminology. +-* Memory Allocation:: Allocating storage for your program data +-* Locking Pages:: Preventing page faults +-* Resizing the Data Segment:: `brk', `sbrk' +- +- Memory mapped I/O is not discussed in this chapter. *Note +-Memory-mapped I/O::. +- +- +-File: libc.info, Node: Memory Concepts, Next: Memory Allocation, Up: Memory +- +-Process Memory Concepts +-======================= +- +- 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 +-store data. +- +- The virtual memory is divided into pages (4 kilobytes is typical). +-Backing each page of virtual memory is a page of real memory (called a +-"frame") or some secondary storage, usually disk space. The disk space +-might be swap space or just some ordinary disk file. Actually, a page +-of all zeroes sometimes has nothing at all backing it - there's just a +-flag saying it is all zeroes. +- +- The same frame of real memory or backing store can back multiple +-virtual pages belonging to multiple processes. This is normally the +-case, for example, with virtual memory occupied by GNU C library code. +-The same real memory frame containing the `printf' function backs a +-virtual memory page in each of the existing processes that has a +-`printf' call in its program. +- +- In order for a program to access any part of a virtual page, the page +-must at that moment be backed by ("connected to") a real frame. But +-because there is usually a lot more virtual memory than real memory, the +-pages must move back and forth between real memory and backing store +-regularly, coming into real memory when a process needs to access them +-and then retreating to backing store when not needed anymore. This +-movement is called "paging". +- +- When a program attempts to access a page which is not at that moment +-backed by real memory, this is known as a "page fault". When a page +-fault occurs, the kernel suspends the process, places the page into a +-real page frame (this is called "paging in" or "faulting in"), then +-resumes the process so that from the process' point of view, the page +-was in real memory all along. In fact, to the process, all pages always +-seem to be in real memory. Except for one thing: the elapsed execution +-time of an instruction that would normally be a few nanoseconds is +-suddenly much, much, longer (because the kernel normally has to do I/O +-to complete the page-in). For programs sensitive to that, the functions +-described in *Note Locking Pages:: can control it. +- +- Within each virtual address space, a process has to keep track of +-what is at which addresses, and that process is called memory +-allocation. Allocation usually brings to mind meting out scarce +-resources, but in the case of virtual memory, that's not a major goal, +-because there is generally much more of it than anyone needs. Memory +-allocation within a process is mainly just a matter of making sure that +-the same byte of memory isn't used to store two different things. +- +- Processes allocate memory in two major ways: by exec and +-programmatically. Actually, forking is a third way, but it's not very +-interesting. *Note Creating a Process::. +- +- Exec is the operation of creating a virtual address space for a +-process, loading its basic program into it, and executing the program. +-It is done by the "exec" family of functions (e.g. `execl'). The +-operation takes a program file (an executable), it allocates space to +-load all the data in the executable, loads it, and transfers control to +-it. That data is most notably the instructions of the program (the +-"text"), but also literals and constants in the program and even some +-variables: C variables with the static storage class (*note Memory +-Allocation and C::). +- +- Once that program begins to execute, it uses programmatic allocation +-to gain additional memory. In a C program with the GNU C library, there +-are two kinds of programmatic allocation: automatic and dynamic. *Note +-Memory Allocation and C::. +- +- Memory-mapped I/O is another form of dynamic virtual memory +-allocation. Mapping memory to a file means declaring that the contents +-of certain range of a process' addresses shall be identical to the +-contents of a specified regular file. The system makes the virtual +-memory initially contain the contents of the file, and if you modify +-the memory, the system writes the same modification to the file. Note +-that due to the magic of virtual memory and page faults, there is no +-reason for the system to do I/O to read the file, or allocate real +-memory for its contents, until the program accesses the virtual memory. +-*Note Memory-mapped I/O::. +- +- Just as it programmatically allocates memory, the program can +-programmatically deallocate ("free") it. You can't free the memory +-that was allocated by exec. When the program exits or execs, you might +-say that all its memory gets freed, but since in both cases the address +-space ceases to exist, the point is really moot. *Note Program +-Termination::. +- +- A process' virtual address space is divided into segments. A +-segment is a contiguous range of virtual addresses. Three important +-segments are: +- +- * The "text segment" contains a program's instructions and literals +- and static constants. It is allocated by exec and stays the same +- size for the life of the virtual address space. +- +- * The "data segment" is working storage for the program. It can be +- preallocated and preloaded by exec and the process can extend or +- shrink it by calling functions as described in *Note Resizing the +- Data Segment::. Its lower end is fixed. +- +- * The "stack segment" contains a program stack. It grows as the +- stack grows, but doesn't shrink when the stack shrinks. +- +- +- +-File: libc.info, Node: Memory Allocation, Next: Locking Pages, Prev: Memory Concepts, Up: Memory +- +-Allocating Storage For Program Data +-=================================== +- +- This section covers how ordinary programs manage storage for their +-data, including the famous `malloc' function and some fancier facilities +-special the GNU C library and GNU Compiler. +- +-* Menu: +- +-* Memory Allocation and C:: How to get different kinds of allocation in C. +-* Unconstrained Allocation:: The `malloc' facility allows fully general +- dynamic allocation. +-* Allocation Debugging:: Finding memory leaks and not freed memory. +-* Obstacks:: Obstacks are less general than malloc +- but more efficient and convenient. +-* Variable Size Automatic:: Allocation of variable-sized blocks +- of automatic storage that are freed when the +- calling function returns. +- +- +-File: libc.info, Node: Memory Allocation and C, Next: Unconstrained Allocation, Up: Memory Allocation +- +-Memory Allocation in C Programs +-------------------------------- +- +- The C language supports two kinds of memory allocation through the +-variables in C programs: +- +- * "Static allocation" is what happens when you declare a static or +- global variable. Each static or global variable defines one block +- of space, of a fixed size. The space is allocated once, when your +- program is started (part of the exec operation), and is never +- freed. +- +- * "Automatic allocation" happens when you declare an automatic +- variable, such as a function argument or a local variable. The +- space for an automatic variable is allocated when the compound +- statement containing the declaration is entered, and is freed when +- that compound statement is exited. +- +- In GNU C, the size of the automatic storage can be an expression +- that varies. In other C implementations, it must be a constant. +- +- A third important kind of memory allocation, "dynamic allocation", +-is not supported by C variables but is available via GNU C library +-functions. +- +-Dynamic Memory Allocation +-......................... +- +- "Dynamic memory allocation" is a technique in which programs +-determine as they are running where to store some information. You need +-dynamic allocation when the amount of memory you need, or how long you +-continue to need it, depends on factors that are not known before the +-program runs. +- +- For example, you may need a block to store a line read from an input +-file; since there is no limit to how long a line can be, you must +-allocate the memory dynamically and make it dynamically larger as you +-read more of the line. +- +- Or, you may need a block for each record or each definition in the +-input data; since you can't know in advance how many there will be, you +-must allocate a new block for each record or definition as you read it. +- +- When you use dynamic allocation, the allocation of a block of memory +-is an action that the program requests explicitly. You call a function +-or macro when you want to allocate space, and specify the size with an +-argument. If you want to free the space, you do so by calling another +-function or macro. You can do these things whenever you want, as often +-as you want. +- +- Dynamic allocation is not supported by C variables; there is no +-storage class "dynamic", and there can never be a C variable whose +-value is stored in dynamically allocated space. The only way to get +-dynamically allocated memory is via a system call (which is generally +-via a GNU C library function call), and the only way to refer to +-dynamically allocated space is through a pointer. Because it is less +-convenient, and because the actual process of dynamic allocation +-requires more computation time, programmers generally use dynamic +-allocation only when neither static nor automatic allocation will serve. +- +- For example, if you want to allocate dynamically some space to hold a +-`struct foobar', you cannot declare a variable of type `struct foobar' +-whose contents are the dynamically allocated space. But you can +-declare a variable of pointer type `struct foobar *' and assign it the +-address of the space. Then you can use the operators `*' and `->' on +-this pointer variable to refer to the contents of the space: +- +- { +- struct foobar *ptr +- = (struct foobar *) malloc (sizeof (struct foobar)); +- ptr->name = x; +- ptr->next = current_foobar; +- current_foobar = ptr; +- } +- +- +-File: libc.info, Node: Unconstrained Allocation, Next: Allocation Debugging, Prev: Memory Allocation and C, Up: Memory Allocation +- +-Unconstrained Allocation +------------------------- +- +- The most general dynamic allocation facility is `malloc'. It allows +-you to allocate blocks of memory of any size at any time, make them +-bigger or smaller at any time, and free the blocks individually at any +-time (or never). +- +-* Menu: +- +-* Basic Allocation:: Simple use of `malloc'. +-* Malloc Examples:: Examples of `malloc'. `xmalloc'. +-* Freeing after Malloc:: Use `free' to free a block you +- got with `malloc'. +-* Changing Block Size:: Use `realloc' to make a block +- bigger or smaller. +-* Allocating Cleared Space:: Use `calloc' to allocate a +- block and clear it. +-* Efficiency and Malloc:: Efficiency considerations in use of +- these functions. +-* Aligned Memory Blocks:: Allocating specially aligned memory. +-* Malloc Tunable Parameters:: Use `mallopt' to adjust allocation +- parameters. +-* Heap Consistency Checking:: Automatic checking for errors. +-* Hooks for Malloc:: You can use these hooks for debugging +- programs that use `malloc'. +-* Statistics of Malloc:: Getting information about how much +- memory your program is using. +-* Summary of Malloc:: Summary of `malloc' and related functions. +- +- +-File: libc.info, Node: Basic Allocation, Next: Malloc Examples, Up: Unconstrained Allocation +- +-Basic Memory Allocation +-....................... +- +- To allocate a block of memory, call `malloc'. The prototype for +-this function is in `stdlib.h'. +- +- - Function: void * malloc (size_t SIZE) +- This function returns a pointer to a newly allocated block SIZE +- bytes long, or a null pointer if the block could not be allocated. +- +- The contents of the block are undefined; you must initialize it +-yourself (or use `calloc' instead; *note Allocating Cleared Space::). +-Normally you would cast the value as a pointer to the kind of object +-that you want to store in the block. Here we show an example of doing +-so, and of initializing the space with zeros using the library function +-`memset' (*note Copying and Concatenation::): +- +- struct foo *ptr; +- ... +- ptr = (struct foo *) malloc (sizeof (struct foo)); +- if (ptr == 0) abort (); +- memset (ptr, 0, sizeof (struct foo)); +- +- You can store the result of `malloc' into any pointer variable +-without a cast, because ISO C automatically converts the type `void *' +-to another type of pointer when necessary. But the cast is necessary +-in contexts other than assignment operators or if you might want your +-code to run in traditional C. +- +- Remember that when allocating space for a string, the argument to +-`malloc' must be one plus the length of the string. This is because a +-string is terminated with a null character that doesn't count in the +-"length" of the string but does need space. For example: +- +- char *ptr; +- ... +- ptr = (char *) malloc (length + 1); +- +-*Note Representation of Strings::, for more information about this. +- +- +-File: libc.info, Node: Malloc Examples, Next: Freeing after Malloc, Prev: Basic Allocation, Up: Unconstrained Allocation +- +-Examples of `malloc' +-.................... +- +- If no more space is available, `malloc' returns a null pointer. You +-should check the value of _every_ call to `malloc'. It is useful to +-write a subroutine that calls `malloc' and reports an error if the +-value is a null pointer, returning only if the value is nonzero. This +-function is conventionally called `xmalloc'. Here it is: +- +- void * +- xmalloc (size_t size) +- { +- register void *value = malloc (size); +- if (value == 0) +- fatal ("virtual memory exhausted"); +- return value; +- } +- +- Here is a real example of using `malloc' (by way of `xmalloc'). The +-function `savestring' will copy a sequence of characters into a newly +-allocated null-terminated string: +- +- char * +- savestring (const char *ptr, size_t len) +- { +- register char *value = (char *) xmalloc (len + 1); +- value[len] = '\0'; +- return (char *) memcpy (value, ptr, len); +- } +- +- The block that `malloc' gives you is guaranteed to be aligned so +-that it can hold any type of data. In the GNU system, the address is +-always a multiple of eight on most systems, and a multiple of 16 on +-64-bit systems. Only rarely is any higher boundary (such as a page +-boundary) necessary; for those cases, use `memalign', `posix_memalign' +-or `valloc' (*note Aligned Memory Blocks::). +- +- Note that the memory located after the end of the block is likely to +-be in use for something else; perhaps a block already allocated by +-another call to `malloc'. If you attempt to treat the block as longer +-than you asked for it to be, you are liable to destroy the data that +-`malloc' uses to keep track of its blocks, or you may destroy the +-contents of another block. If you have already allocated a block and +-discover you want it to be bigger, use `realloc' (*note Changing Block +-Size::). +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-30 glibc-2.3.2-200304020432/manual/libc.info-30 +--- glibc-2.3.2/manual/libc.info-30 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-30 Thu Jan 1 01:00:00 1970 +@@ -1,1306 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Editing Characters, Next: Signal Characters, Up: Special Characters +- +-Characters for Input Editing +-............................ +- +- These special characters are active only in canonical input mode. +-*Note Canonical or Not::. +- +- - Macro: int VEOF +- This is the subscript for the EOF character in the special control +- character array. `TERMIOS.c_cc[VEOF]' holds the character itself. +- +- The EOF character is recognized only in canonical input mode. It +- acts as a line terminator in the same way as a newline character, +- but if the EOF character is typed at the beginning of a line it +- causes `read' to return a byte count of zero, indicating +- end-of-file. The EOF character itself is discarded. +- +- Usually, the EOF character is `C-d'. +- +- - Macro: int VEOL +- This is the subscript for the EOL character in the special control +- character array. `TERMIOS.c_cc[VEOL]' holds the character itself. +- +- The EOL character is recognized only in canonical input mode. It +- acts as a line terminator, just like a newline character. The EOL +- character is not discarded; it is read as the last character in +- the input line. +- +- You don't need to use the EOL character to make end a line. +- Just set the ICRNL flag. In fact, this is the default state of +- affairs. +- +- - Macro: int VEOL2 +- This is the subscript for the EOL2 character in the special control +- character array. `TERMIOS.c_cc[VEOL2]' holds the character itself. +- +- The EOL2 character works just like the EOL character (see above), +- but it can be a different character. Thus, you can specify two +- characters to terminate an input line, by setting EOL to one of +- them and EOL2 to the other. +- +- The EOL2 character is a BSD extension; it exists only on BSD +- systems and the GNU system. +- +- - Macro: int VERASE +- This is the subscript for the ERASE character in the special +- control character array. `TERMIOS.c_cc[VERASE]' holds the +- character itself. +- +- The ERASE character is recognized only in canonical input mode. +- When the user types the erase character, the previous character +- typed is discarded. (If the terminal generates multibyte +- character sequences, this may cause more than one byte of input to +- be discarded.) This cannot be used to erase past the beginning of +- the current line of text. The ERASE character itself is discarded. +- +- Usually, the ERASE character is . +- +- - Macro: int VWERASE +- This is the subscript for the WERASE character in the special +- control character array. `TERMIOS.c_cc[VWERASE]' holds the +- character itself. +- +- The WERASE character is recognized only in canonical mode. It +- erases an entire word of prior input, and any whitespace after it; +- whitespace characters before the word are not erased. +- +- The definition of a "word" depends on the setting of the +- `ALTWERASE' mode; *note Local Modes::. +- +- If the `ALTWERASE' mode is not set, a word is defined as a sequence +- of any characters except space or tab. +- +- If the `ALTWERASE' mode is set, a word is defined as a sequence of +- characters containing only letters, numbers, and underscores, +- optionally followed by one character that is not a letter, number, +- or underscore. +- +- The WERASE character is usually `C-w'. +- +- This is a BSD extension. +- +- - Macro: int VKILL +- This is the subscript for the KILL character in the special control +- character array. `TERMIOS.c_cc[VKILL]' holds the character itself. +- +- The KILL character is recognized only in canonical input mode. +- When the user types the kill character, the entire contents of the +- current line of input are discarded. The kill character itself is +- discarded too. +- +- The KILL character is usually `C-u'. +- +- - Macro: int VREPRINT +- This is the subscript for the REPRINT character in the special +- control character array. `TERMIOS.c_cc[VREPRINT]' holds the +- character itself. +- +- The REPRINT character is recognized only in canonical mode. It +- reprints the current input line. If some asynchronous output has +- come while you are typing, this lets you see the line you are +- typing clearly again. +- +- The REPRINT character is usually `C-r'. +- +- This is a BSD extension. +- +- +-File: libc.info, Node: Signal Characters, Next: Start/Stop Characters, Prev: Editing Characters, Up: Special Characters +- +-Characters that Cause Signals +-............................. +- +- These special characters may be active in either canonical or +-noncanonical input mode, but only when the `ISIG' flag is set (*note +-Local Modes::). +- +- - Macro: int VINTR +- This is the subscript for the INTR character in the special control +- character array. `TERMIOS.c_cc[VINTR]' holds the character itself. +- +- The INTR (interrupt) character raises a `SIGINT' signal for all +- processes in the foreground job associated with the terminal. The +- INTR character itself is then discarded. *Note Signal Handling::, +- for more information about signals. +- +- Typically, the INTR character is `C-c'. +- +- - Macro: int VQUIT +- This is the subscript for the QUIT character in the special control +- character array. `TERMIOS.c_cc[VQUIT]' holds the character itself. +- +- The QUIT character raises a `SIGQUIT' signal for all processes in +- the foreground job associated with the terminal. The QUIT +- character itself is then discarded. *Note Signal Handling::, for +- more information about signals. +- +- Typically, the QUIT character is `C-\'. +- +- - Macro: int VSUSP +- This is the subscript for the SUSP character in the special control +- character array. `TERMIOS.c_cc[VSUSP]' holds the character itself. +- +- The SUSP (suspend) character is recognized only if the +- implementation supports job control (*note Job Control::). It +- causes a `SIGTSTP' signal to be sent to all processes in the +- foreground job associated with the terminal. The SUSP character +- itself is then discarded. *Note Signal Handling::, for more +- information about signals. +- +- Typically, the SUSP character is `C-z'. +- +- Few applications disable the normal interpretation of the SUSP +-character. If your program does this, it should provide some other +-mechanism for the user to stop the job. When the user invokes this +-mechanism, the program should send a `SIGTSTP' signal to the process +-group of the process, not just to the process itself. *Note Signaling +-Another Process::. +- +- - Macro: int VDSUSP +- This is the subscript for the DSUSP character in the special +- control character array. `TERMIOS.c_cc[VDSUSP]' holds the +- character itself. +- +- The DSUSP (suspend) character is recognized only if the +- implementation supports job control (*note Job Control::). It +- sends a `SIGTSTP' signal, like the SUSP character, but not right +- away--only when the program tries to read it as input. Not all +- systems with job control support DSUSP; only BSD-compatible +- systems (including the GNU system). +- +- *Note Signal Handling::, for more information about signals. +- +- Typically, the DSUSP character is `C-y'. +- +- +-File: libc.info, Node: Start/Stop Characters, Next: Other Special, Prev: Signal Characters, Up: Special Characters +- +-Special Characters for Flow Control +-................................... +- +- These special characters may be active in either canonical or +-noncanonical input mode, but their use is controlled by the flags +-`IXON' and `IXOFF' (*note Input Modes::). +- +- - Macro: int VSTART +- This is the subscript for the START character in the special +- control character array. `TERMIOS.c_cc[VSTART]' holds the +- character itself. +- +- The START character is used to support the `IXON' and `IXOFF' +- input modes. If `IXON' is set, receiving a START character resumes +- suspended output; the START character itself is discarded. If +- `IXANY' is set, receiving any character at all resumes suspended +- output; the resuming character is not discarded unless it is the +- START character. `IXOFF' is set, the system may also transmit +- START characters to the terminal. +- +- The usual value for the START character is `C-q'. You may not be +- able to change this value--the hardware may insist on using `C-q' +- regardless of what you specify. +- +- - Macro: int VSTOP +- This is the subscript for the STOP character in the special control +- character array. `TERMIOS.c_cc[VSTOP]' holds the character itself. +- +- The STOP character is used to support the `IXON' and `IXOFF' input +- modes. If `IXON' is set, receiving a STOP character causes output +- to be suspended; the STOP character itself is discarded. If +- `IXOFF' is set, the system may also transmit STOP characters to the +- terminal, to prevent the input queue from overflowing. +- +- The usual value for the STOP character is `C-s'. You may not be +- able to change this value--the hardware may insist on using `C-s' +- regardless of what you specify. +- +- +-File: libc.info, Node: Other Special, Prev: Start/Stop Characters, Up: Special Characters +- +-Other Special Characters +-........................ +- +- These special characters exist only in BSD systems and the GNU +-system. +- +- - Macro: int VLNEXT +- This is the subscript for the LNEXT character in the special +- control character array. `TERMIOS.c_cc[VLNEXT]' holds the +- character itself. +- +- The LNEXT character is recognized only when `IEXTEN' is set, but in +- both canonical and noncanonical mode. It disables any special +- significance of the next character the user types. Even if the +- character would normally perform some editing function or generate +- a signal, it is read as a plain character. This is the analogue +- of the `C-q' command in Emacs. "LNEXT" stands for "literal next." +- +- The LNEXT character is usually `C-v'. +- +- - Macro: int VDISCARD +- This is the subscript for the DISCARD character in the special +- control character array. `TERMIOS.c_cc[VDISCARD]' holds the +- character itself. +- +- The DISCARD character is recognized only when `IEXTEN' is set, but +- in both canonical and noncanonical mode. Its effect is to toggle +- the discard-output flag. When this flag is set, all program +- output is discarded. Setting the flag also discards all output +- currently in the output buffer. Typing any other character resets +- the flag. +- +- - Macro: int VSTATUS +- This is the subscript for the STATUS character in the special +- control character array. `TERMIOS.c_cc[VSTATUS]' holds the +- character itself. +- +- The STATUS character's effect is to print out a status message +- about how the current process is running. +- +- The STATUS character is recognized only in canonical mode, and +- only if `NOKERNINFO' is not set. +- +- +-File: libc.info, Node: Noncanonical Input, Prev: Special Characters, Up: Terminal Modes +- +-Noncanonical Input +------------------- +- +- In noncanonical input mode, the special editing characters such as +-ERASE and KILL are ignored. The system facilities for the user to edit +-input are disabled in noncanonical mode, so that all input characters +-(unless they are special for signal or flow-control purposes) are passed +-to the application program exactly as typed. It is up to the +-application program to give the user ways to edit the input, if +-appropriate. +- +- Noncanonical mode offers special parameters called MIN and TIME for +-controlling whether and how long to wait for input to be available. You +-can even use them to avoid ever waiting--to return immediately with +-whatever input is available, or with no input. +- +- The MIN and TIME are stored in elements of the `c_cc' array, which +-is a member of the `struct termios' structure. Each element of this +-array has a particular role, and each element has a symbolic constant +-that stands for the index of that element. `VMIN' and `VMAX' are the +-names for the indices in the array of the MIN and TIME slots. +- +- - Macro: int VMIN +- This is the subscript for the MIN slot in the `c_cc' array. Thus, +- `TERMIOS.c_cc[VMIN]' is the value itself. +- +- The MIN slot is only meaningful in noncanonical input mode; it +- specifies the minimum number of bytes that must be available in the +- input queue in order for `read' to return. +- +- - Macro: int VTIME +- This is the subscript for the TIME slot in the `c_cc' array. Thus, +- `TERMIOS.c_cc[VTIME]' is the value itself. +- +- The TIME slot is only meaningful in noncanonical input mode; it +- specifies how long to wait for input before returning, in units of +- 0.1 seconds. +- +- The MIN and TIME values interact to determine the criterion for when +-`read' should return; their precise meanings depend on which of them +-are nonzero. There are four possible cases: +- +- * Both TIME and MIN are nonzero. +- +- In this case, TIME specifies how long to wait after each input +- character to see if more input arrives. After the first character +- received, `read' keeps waiting until either MIN bytes have arrived +- in all, or TIME elapses with no further input. +- +- `read' always blocks until the first character arrives, even if +- TIME elapses first. `read' can return more than MIN characters if +- more than MIN happen to be in the queue. +- +- * Both MIN and TIME are zero. +- +- In this case, `read' always returns immediately with as many +- characters as are available in the queue, up to the number +- requested. If no input is immediately available, `read' returns a +- value of zero. +- +- * MIN is zero but TIME has a nonzero value. +- +- In this case, `read' waits for time TIME for input to become +- available; the availability of a single byte is enough to satisfy +- the read request and cause `read' to return. When it returns, it +- returns as many characters as are available, up to the number +- requested. If no input is available before the timer expires, +- `read' returns a value of zero. +- +- * TIME is zero but MIN has a nonzero value. +- +- In this case, `read' waits until at least MIN bytes are available +- in the queue. At that time, `read' returns as many characters as +- are available, up to the number requested. `read' can return more +- than MIN characters if more than MIN happen to be in the queue. +- +- What happens if MIN is 50 and you ask to read just 10 bytes? +-Normally, `read' waits until there are 50 bytes in the buffer (or, more +-generally, the wait condition described above is satisfied), and then +-reads 10 of them, leaving the other 40 buffered in the operating system +-for a subsequent call to `read'. +- +- *Portability note:* On some systems, the MIN and TIME slots are +-actually the same as the EOF and EOL slots. This causes no serious +-problem because the MIN and TIME slots are used only in noncanonical +-input and the EOF and EOL slots are used only in canonical input, but it +-isn't very clean. The GNU library allocates separate slots for these +-uses. +- +- - Function: void cfmakeraw (struct termios *TERMIOS-P) +- This function provides an easy way to set up `*TERMIOS-P' for what +- has traditionally been called "raw mode" in BSD. This uses +- noncanonical input, and turns off most processing to give an +- unmodified channel to the terminal. +- +- It does exactly this: +- TERMIOS-P->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP +- |INLCR|IGNCR|ICRNL|IXON); +- TERMIOS-P->c_oflag &= ~OPOST; +- TERMIOS-P->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); +- TERMIOS-P->c_cflag &= ~(CSIZE|PARENB); +- TERMIOS-P->c_cflag |= CS8; +- +- +-File: libc.info, Node: BSD Terminal Modes, Next: Line Control, Prev: Terminal Modes, Up: Low-Level Terminal Interface +- +-BSD Terminal Modes +-================== +- +- The usual way to get and set terminal modes is with the functions +-described in *Note Terminal Modes::. However, on some systems you can +-use the BSD-derived functions in this section to do some of the same +-thing. On many systems, these functions do not exist. Even with the +-GNU C library, the functions simply fail with `errno' = `ENOSYS' with +-many kernels, including Linux. +- +- The symbols used in this section are declared in `sgtty.h'. +- +- - Data Type: struct sgttyb +- This structure is an input or output parameter list for `gtty' and +- `stty'. +- +- `char sg_ispeed' +- Line speed for input +- +- `char sg_ospeed' +- Line speed for output +- +- `char sg_erase' +- Erase character +- +- `char sg_kill' +- Kill character +- +- `int sg_flags' +- Various flags +- +- - Function: int gtty (int FILEDES, struct sgttyb *ATTRIBUTES) +- This function gets the attributes of a terminal. +- +- `gtty' sets *ATTRIBUTES to describe the terminal attributes of the +- terminal which is open with file descriptor FILEDES. +- +- - Function: int stty (int FILEDES, struct sgttyb * attributes) +- This function sets the attributes of a terminal. +- +- `stty' sets the terminal attributes of the terminal which is open +- with file descriptor FILEDES to those described by *FILEDES. +- +- +-File: libc.info, Node: Line Control, Next: Noncanon Example, Prev: BSD Terminal Modes, Up: Low-Level Terminal Interface +- +-Line Control Functions +-====================== +- +- These functions perform miscellaneous control actions on terminal +-devices. As regards terminal access, they are treated like doing +-output: if any of these functions is used by a background process on its +-controlling terminal, normally all processes in the process group are +-sent a `SIGTTOU' signal. The exception is if the calling process +-itself is ignoring or blocking `SIGTTOU' signals, in which case the +-operation is performed and no signal is sent. *Note Job Control::. +- +- - Function: int tcsendbreak (int FILEDES, int DURATION) +- This function generates a break condition by transmitting a stream +- of zero bits on the terminal associated with the file descriptor +- FILEDES. The duration of the break is controlled by the DURATION +- argument. If zero, the duration is between 0.25 and 0.5 seconds. +- The meaning of a nonzero value depends on the operating system. +- +- This function does nothing if the terminal is not an asynchronous +- serial data port. +- +- The return value is normally zero. In the event of an error, a +- value of -1 is returned. The following `errno' error conditions +- are defined for this function: +- +- `EBADF' +- The FILEDES is not a valid file descriptor. +- +- `ENOTTY' +- The FILEDES is not associated with a terminal device. +- +- - Function: int tcdrain (int FILEDES) +- The `tcdrain' function waits until all queued output to the +- terminal FILEDES has been transmitted. +- +- This function is a cancellation point in multi-threaded programs. +- This is a problem if the thread allocates some resources (like +- memory, file descriptors, semaphores or whatever) at the time +- `tcdrain' is called. If the thread gets canceled these resources +- stay allocated until the program ends. To avoid this calls to +- `tcdrain' should be protected using cancellation handlers. +- +- The return value is normally zero. In the event of an error, a +- value of -1 is returned. The following `errno' error conditions +- are defined for this function: +- +- `EBADF' +- The FILEDES is not a valid file descriptor. +- +- `ENOTTY' +- The FILEDES is not associated with a terminal device. +- +- `EINTR' +- The operation was interrupted by delivery of a signal. *Note +- Interrupted Primitives::. +- +- - Function: int tcflush (int FILEDES, int QUEUE) +- The `tcflush' function is used to clear the input and/or output +- queues associated with the terminal file FILEDES. The QUEUE +- argument specifies which queue(s) to clear, and can be one of the +- following values: +- +- `TCIFLUSH' +- Clear any input data received, but not yet read. +- +- `TCOFLUSH' +- Clear any output data written, but not yet transmitted. +- +- `TCIOFLUSH' +- Clear both queued input and output. +- +- The return value is normally zero. In the event of an error, a +- value of -1 is returned. The following `errno' error conditions +- are defined for this function: +- +- `EBADF' +- The FILEDES is not a valid file descriptor. +- +- `ENOTTY' +- The FILEDES is not associated with a terminal device. +- +- `EINVAL' +- A bad value was supplied as the QUEUE argument. +- +- It is unfortunate that this function is named `tcflush', because +- the term "flush" is normally used for quite another +- operation--waiting until all output is transmitted--and using it +- for discarding input or output would be confusing. Unfortunately, +- the name `tcflush' comes from POSIX and we cannot change it. +- +- - Function: int tcflow (int FILEDES, int ACTION) +- The `tcflow' function is used to perform operations relating to +- XON/XOFF flow control on the terminal file specified by FILEDES. +- +- The ACTION argument specifies what operation to perform, and can +- be one of the following values: +- +- `TCOOFF' +- Suspend transmission of output. +- +- `TCOON' +- Restart transmission of output. +- +- `TCIOFF' +- Transmit a STOP character. +- +- `TCION' +- Transmit a START character. +- +- For more information about the STOP and START characters, see +- *Note Special Characters::. +- +- The return value is normally zero. In the event of an error, a +- value of -1 is returned. The following `errno' error conditions +- are defined for this function: +- +- `EBADF' +- The FILEDES is not a valid file descriptor. +- +- `ENOTTY' +- The FILEDES is not associated with a terminal device. +- +- `EINVAL' +- A bad value was supplied as the ACTION argument. +- +- +-File: libc.info, Node: Noncanon Example, Next: Pseudo-Terminals, Prev: Line Control, Up: Low-Level Terminal Interface +- +-Noncanonical Mode Example +-========================= +- +- Here is an example program that shows how you can set up a terminal +-device to read single characters in noncanonical input mode, without +-echo. +- +- #include +- #include +- #include +- #include +- +- /* Use this variable to remember original terminal attributes. */ +- +- struct termios saved_attributes; +- +- void +- reset_input_mode (void) +- { +- tcsetattr (STDIN_FILENO, TCSANOW, &saved_attributes); +- } +- +- void +- set_input_mode (void) +- { +- struct termios tattr; +- char *name; +- +- /* Make sure stdin is a terminal. */ +- if (!isatty (STDIN_FILENO)) +- { +- fprintf (stderr, "Not a terminal.\n"); +- exit (EXIT_FAILURE); +- } +- +- /* Save the terminal attributes so we can restore them later. */ +- tcgetattr (STDIN_FILENO, &saved_attributes); +- atexit (reset_input_mode); +- +- /* Set the funny terminal modes. */ +- tcgetattr (STDIN_FILENO, &tattr); +- tattr.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */ +- tattr.c_cc[VMIN] = 1; +- tattr.c_cc[VTIME] = 0; +- tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr); +- } +- +- int +- main (void) +- { +- char c; +- +- set_input_mode (); +- +- while (1) +- { +- read (STDIN_FILENO, &c, 1); +- if (c == '\004') /* `C-d' */ +- break; +- else +- putchar (c); +- } +- +- return EXIT_SUCCESS; +- } +- +- This program is careful to restore the original terminal modes before +-exiting or terminating with a signal. It uses the `atexit' function +-(*note Cleanups on Exit::) to make sure this is done by `exit'. +- +- The shell is supposed to take care of resetting the terminal modes +-when a process is stopped or continued; see *Note Job Control::. But +-some existing shells do not actually do this, so you may wish to +-establish handlers for job control signals that reset terminal modes. +-The above example does so. +- +- +-File: libc.info, Node: Pseudo-Terminals, Prev: Noncanon Example, Up: Low-Level Terminal Interface +- +-Pseudo-Terminals +-================ +- +- A "pseudo-terminal" is a special interprocess communication channel +-that acts like a terminal. One end of the channel is called the +-"master" side or "master pseudo-terminal device", the other side is +-called the "slave" side. Data written to the master side is received +-by the slave side as if it was the result of a user typing at an +-ordinary terminal, and data written to the slave side is sent to the +-master side as if it was written on an ordinary terminal. +- +- Pseudo terminals are the way programs like `xterm' and `emacs' +-implement their terminal emulation functionality. +- +-* Menu: +- +-* Allocation:: Allocating a pseudo terminal. +-* Pseudo-Terminal Pairs:: How to open both sides of a +- pseudo-terminal in a single operation. +- +- +-File: libc.info, Node: Allocation, Next: Pseudo-Terminal Pairs, Up: Pseudo-Terminals +- +-Allocating Pseudo-Terminals +---------------------------- +- +- This subsection describes functions for allocating a pseudo-terminal, +-and for making this pseudo-terminal available for actual use. These +-functions are declared in the header file `stdlib.h'. +- +- - Function: int getpt (void) +- The `getpt' function returns a new file descriptor for the next +- available master pseudo-terminal. The normal return value from +- `getpt' is a non-negative integer file descriptor. In the case of +- an error, a value of -1 is returned instead. The following +- `errno' conditions are defined for this function: +- +- `ENOENT' +- There are no free master pseudo-terminals available. +- +- This function is a GNU extension. +- +- - Function: int grantpt (int FILEDES) +- The `grantpt' function changes the ownership and access permission +- of the slave pseudo-terminal device corresponding to the master +- pseudo-terminal device associated with the file descriptor +- FILEDES. The owner is set from the real user ID of the calling +- process (*note Process Persona::), and the group is set to a +- special group (typically "tty") or from the real group ID of the +- calling process. The access permission is set such that the file +- is both readable and writable by the owner and only writable by +- the group. +- +- On some systems this function is implemented by invoking a special +- `setuid' root program (*note How Change Persona::). As a +- consequence, installing a signal handler for the `SIGCHLD' signal +- (*note Job Control Signals::) may interfere with a call to +- `grantpt'. +- +- The normal return value from `grantpt' is 0; a value of -1 is +- returned in case of failure. The following `errno' error +- conditions are defined for this function: +- +- `EBADF' +- The FILEDES argument is not a valid file descriptor. +- +- `EINVAL' +- The FILEDES argument is not associated with a master +- pseudo-terminal device. +- +- `EACCES' +- The slave pseudo-terminal device corresponding to the master +- associated with FILEDES could not be accessed. +- +- +- - Function: int unlockpt (int FILEDES) +- The `unlockpt' function unlocks the slave pseudo-terminal device +- corresponding to the master pseudo-terminal device associated with +- the file descriptor FILEDES. On many systems, the slave can only +- be opened after unlocking, so portable applications should always +- call `unlockpt' before trying to open the slave. +- +- The normal return value from `unlockpt' is 0; a value of -1 is +- returned in case of failure. The following `errno' error +- conditions are defined for this function: +- +- `EBADF' +- The FILEDES argument is not a valid file descriptor. +- +- `EINVAL' +- The FILEDES argument is not associated with a master +- pseudo-terminal device. +- +- - Function: char * ptsname (int FILEDES) +- If the file descriptor FILEDES is associated with a master +- pseudo-terminal device, the `ptsname' function returns a pointer +- to a statically-allocated, null-terminated string containing the +- file name of the associated slave pseudo-terminal file. This +- string might be overwritten by subsequent calls to `ptsname'. +- +- - Function: int ptsname_r (int FILEDES, char *BUF, size_t LEN) +- The `ptsname_r' function is similar to the `ptsname' function +- except that it places its result into the user-specified buffer +- starting at BUF with length LEN. +- +- This function is a GNU extension. +- +- *Portability Note:* On System V derived systems, the file returned +-by the `ptsname' and `ptsname_r' functions may be STREAMS-based, and +-therefore require additional processing after opening before it +-actually behaves as a pseudo terminal. +- +- Typical usage of these functions is illustrated by the following +-example: +- int +- open_pty_pair (int *amaster, int *aslave) +- { +- int master, slave; +- char *name; +- +- master = getpt (); +- if (master < 0) +- return 0; +- +- if (grantpt (master) < 0 || unlockpt (master) < 0) +- goto close_master; +- name = ptsname (master); +- if (name == NULL) +- goto close_master; +- +- slave = open (name, O_RDWR); +- if (slave == -1) +- goto close_master; +- +- if (isastream (slave)) +- { +- if (ioctl (slave, I_PUSH, "ptem") < 0 +- || ioctl (slave, I_PUSH, "ldterm") < 0) +- goto close_slave; +- } +- +- *amaster = master; +- *aslave = slave; +- return 1; +- +- close_slave: +- close (slave); +- +- close_master: +- close (master); +- return 0; +- } +- +- +-File: libc.info, Node: Pseudo-Terminal Pairs, Prev: Allocation, Up: Pseudo-Terminals +- +-Opening a Pseudo-Terminal Pair +------------------------------- +- +- These functions, derived from BSD, are available in the separate +-`libutil' library, and declared in `pty.h'. +- +- - Function: int openpty (int *AMASTER, int *ASLAVE, char *NAME, struct +- termios *TERMP, struct winsize *WINP) +- This function allocates and opens a pseudo-terminal pair, +- returning the file descriptor for the master in *AMASTER, and the +- file descriptor for the slave in *ASLAVE. If the argument NAME is +- not a null pointer, the file name of the slave pseudo-terminal +- device is stored in `*name'. If TERMP is not a null pointer, the +- terminal attributes of the slave are set to the ones specified in +- the structure that TERMP points to (*note Terminal Modes::). +- Likewise, if the WINP is not a null pointer, the screen size of +- the slave is set to the values specified in the structure that +- WINP points to. +- +- The normal return value from `openpty' is 0; a value of -1 is +- returned in case of failure. The following `errno' conditions are +- defined for this function: +- +- `ENOENT' +- There are no free pseudo-terminal pairs available. +- +- *Warning:* Using the `openpty' function with NAME not set to +- `NULL' is *very dangerous* because it provides no protection +- against overflowing the string NAME. You should use the `ttyname' +- function on the file descriptor returned in *SLAVE to find out the +- file name of the slave pseudo-terminal device instead. +- +- - Function: int forkpty (int *AMASTER, char *NAME, struct termios +- *TERMP, struct winsize *WINP) +- This function is similar to the `openpty' function, but in +- addition, forks a new process (*note Creating a Process::) and +- makes the newly opened slave pseudo-terminal device the +- controlling terminal (*note Controlling Terminal::) for the child +- process. +- +- If the operation is successful, there are then both parent and +- child processes and both see `forkpty' return, but with different +- values: it returns a value of 0 in the child process and returns +- the child's process ID in the parent process. +- +- If the allocation of a pseudo-terminal pair or the process creation +- failed, `forkpty' returns a value of -1 in the parent process. +- +- *Warning:* The `forkpty' function has the same problems with +- respect to the NAME argument as `openpty'. +- +- +-File: libc.info, Node: Syslog, Next: Mathematics, Prev: Low-Level Terminal Interface, Up: Top +- +-Syslog +-****** +- +- This chapter describes facilities for issuing and logging messages of +-system administration interest. This chapter has nothing to do with +-programs issuing messages to their own users or keeping private logs +-(One would typically do that with the facilities described in *Note I/O +-on Streams::). +- +- Most systems have a facility called "Syslog" that allows programs to +-submit messages of interest to system administrators and can be +-configured to pass these messages on in various ways, such as printing +-on the console, mailing to a particular person, or recording in a log +-file for future reference. +- +- A program uses the facilities in this chapter to submit such +-messages. +- +-* Menu: +- +-* Overview of Syslog:: Overview of a system's Syslog facility +-* Submitting Syslog Messages:: Functions to submit messages to Syslog +- +- +-File: libc.info, Node: Overview of Syslog, Next: Submitting Syslog Messages, Up: Syslog +- +-Overview of Syslog +-================== +- +- System administrators have to deal with lots of different kinds of +-messages from a plethora of subsystems within each system, and usually +-lots of systems as well. For example, an FTP server might report every +-connection it gets. The kernel might report hardware failures on a disk +-drive. A DNS server might report usage statistics at regular intervals. +- +- Some of these messages need to be brought to a system administrator's +-attention immediately. And it may not be just any system administrator +-- there may be a particular system administrator who deals with a +-particular kind of message. Other messages just need to be recorded for +-future reference if there is a problem. Still others may need to have +-information extracted from them by an automated process that generates +-monthly reports. +- +- To deal with these messages, most Unix systems have a facility called +-"Syslog." It is generally based on a daemon called "Syslogd" Syslogd +-listens for messages on a Unix domain socket named `/dev/log'. Based +-on classification information in the messages and its configuration +-file (usually `/etc/syslog.conf'), Syslogd routes them in various ways. +-Some of the popular routings are: +- +- * Write to the system console +- +- * Mail to a specific user +- +- * Write to a log file +- +- * Pass to another daemon +- +- * Discard +- +- Syslogd can also handle messages from other systems. It listens on +-the `syslog' UDP port as well as the local socket for messages. +- +- Syslog can handle messages from the kernel itself. But the kernel +-doesn't write to `/dev/log'; rather, another daemon (sometimes called +-"Klogd") extracts messages from the kernel and passes them on to Syslog +-as any other process would (and it properly identifies them as messages +-from the kernel). +- +- Syslog can even handle messages that the kernel issued before +-Syslogd or Klogd was running. A Linux kernel, for example, stores +-startup messages in a kernel message ring and they are normally still +-there when Klogd later starts up. Assuming Syslogd is running by the +-time Klogd starts, Klogd then passes everything in the message ring to +-it. +- +- In order to classify messages for disposition, Syslog requires any +-process that submits a message to it to provide two pieces of +-classification information with it: +- +-facility +- This identifies who submitted the message. There are a small +- number of facilities defined. The kernel, the mail subsystem, and +- an FTP server are examples of recognized facilities. For the +- complete list, *Note syslog; vsyslog::. Keep in mind that these +- are essentially arbitrary classifications. "Mail subsystem" +- doesn't have any more meaning than the system administrator gives +- to it. +- +-priority +- This tells how important the content of the message is. Examples +- of defined priority values are: debug, informational, warning, +- critical. For the complete list, *Note syslog; vsyslog::. Except +- for the fact that the priorities have a defined order, the meaning +- of each of these priorities is entirely determined by the system +- administrator. +- +- A "facility/priority" is a number that indicates both the facility +-and the priority. +- +- *Warning:* This terminology is not universal. Some people use +-"level" to refer to the priority and "priority" to refer to the +-combination of facility and priority. A Linux kernel has a concept of a +-message "level," which corresponds both to a Syslog priority and to a +-Syslog facility/priority (It can be both because the facility code for +-the kernel is zero, and that makes priority and facility/priority the +-same value). +- +- The GNU C library provides functions to submit messages to Syslog. +-They do it by writing to the `/dev/log' socket. *Note Submitting +-Syslog Messages::. +- +- The GNU C library functions only work to submit messages to the +-Syslog facility on the same system. To submit a message to the Syslog +-facility on another system, use the socket I/O functions to write a UDP +-datagram to the `syslog' UDP port on that system. *Note Sockets::. +- +- +-File: libc.info, Node: Submitting Syslog Messages, Prev: Overview of Syslog, Up: Syslog +- +-Submitting Syslog Messages +-========================== +- +- The GNU C library provides functions to submit messages to the Syslog +-facility: +- +-* Menu: +- +-* openlog:: Open connection to Syslog +-* syslog; vsyslog:: Submit message to Syslog +-* closelog:: Close connection to Syslog +-* setlogmask:: Cause certain messages to be ignored +-* Syslog Example:: Example of all of the above +- +- These functions only work to submit messages to the Syslog facility +-on the same system. To submit a message to the Syslog facility on +-another system, use the socket I/O functions to write a UDP datagram to +-the `syslog' UDP port on that system. *Note Sockets::. +- +- +-File: libc.info, Node: openlog, Next: syslog; vsyslog, Up: Submitting Syslog Messages +- +-openlog +-------- +- +- The symbols referred to in this section are declared in the file +-`syslog.h'. +- +- - Function: void openlog (const char *IDENT, int OPTION, int FACILITY) +- `openlog' opens or reopens a connection to Syslog in preparation +- for submitting messages. +- +- IDENT is an arbitrary identification string which future `syslog' +- invocations will prefix to each message. This is intended to +- identify the source of the message, and people conventionally set +- it to the name of the program that will submit the messages. +- +- If IDENT is NULL, or if `openlog' is not called, the default +- identification string used in Syslog messages will be the program +- name, taken from argv[0]. +- +- Please note that the string pointer IDENT will be retained +- internally by the Syslog routines. You must not free the memory +- that IDENT points to. It is also dangerous to pass a reference to +- an automatic variable since leaving the scope would mean ending the +- lifetime of the variable. If you want to change the IDENT string, +- you must call `openlog' again; overwriting the string pointed to by +- IDENT is not thread-safe. +- +- You can cause the Syslog routines to drop the reference to IDENT +- and go back to the default string (the program name taken from +- argv[0]), by calling `closelog': *Note closelog::. +- +- In particular, if you are writing code for a shared library that +- might get loaded and then unloaded (e.g. a PAM module), and you +- use `openlog', you must call `closelog' before any point where +- your library might get unloaded, as in this example: +- +- #include +- +- void +- shared_library_function (void) +- { +- openlog ("mylibrary", option, priority); +- +- syslog (LOG_INFO, "shared library has been invoked"); +- +- closelog (); +- } +- +- Without the call to `closelog', future invocations of `syslog' by +- the program using the shared library may crash, if the library gets +- unloaded and the memory containing the string `"mylibrary"' becomes +- unmapped. This is a limitation of the BSD syslog interface. +- +- `openlog' may or may not open the `/dev/log' socket, depending on +- OPTION. If it does, it tries to open it and connect it as a +- stream socket. If that doesn't work, it tries to open it and +- connect it as a datagram socket. The socket has the "Close on +- Exec" attribute, so the kernel will close it if the process +- performs an exec. +- +- You don't have to use `openlog'. If you call `syslog' without +- having called `openlog', `syslog' just opens the connection +- implicitly and uses defaults for the information in IDENT and +- OPTIONS. +- +- OPTIONS is a bit string, with the bits as defined by the following +- single bit masks: +- +- `LOG_PERROR' +- If on, `openlog' sets up the connection so that any `syslog' +- on this connection writes its message to the calling process' +- Standard Error stream in addition to submitting it to Syslog. +- If off, `syslog' does not write the message to Standard +- Error. +- +- `LOG_CONS' +- If on, `openlog' sets up the connection so that a `syslog' on +- this connection that fails to submit a message to Syslog +- writes the message instead to system console. If off, +- `syslog' does not write to the system console (but of course +- Syslog may write messages it receives to the console). +- +- `LOG_PID' +- When on, `openlog' sets up the connection so that a `syslog' +- on this connection inserts the calling process' Process ID +- (PID) into the message. When off, `openlog' does not insert +- the PID. +- +- `LOG_NDELAY' +- When on, `openlog' opens and connects the `/dev/log' socket. +- When off, a future `syslog' call must open and connect the +- socket. +- +- *Portability note:* In early systems, the sense of this bit +- was exactly the opposite. +- +- `LOG_ODELAY' +- This bit does nothing. It exists for backward compatibility. +- +- If any other bit in OPTIONS is on, the result is undefined. +- +- FACILITY is the default facility code for this connection. A +- `syslog' on this connection that specifies default facility causes +- this facility to be associated with the message. See `syslog' for +- possible values. A value of zero means the default default, which +- is `LOG_USER'. +- +- If a Syslog connection is already open when you call `openlog', +- `openlog' "reopens" the connection. Reopening is like opening +- except that if you specify zero for the default facility code, the +- default facility code simply remains unchanged and if you specify +- LOG_NDELAY and the socket is already open and connected, `openlog' +- just leaves it that way. +- +- +- +-File: libc.info, Node: syslog; vsyslog, Next: closelog, Prev: openlog, Up: Submitting Syslog Messages +- +-syslog, vsyslog +---------------- +- +- The symbols referred to in this section are declared in the file +-`syslog.h'. +- +- - Function: void syslog (int FACILITY_PRIORITY, char *FORMAT, ...) +- `syslog' submits a message to the Syslog facility. It does this by +- writing to the Unix domain socket `/dev/log'. +- +- `syslog' submits the message with the facility and priority +- indicated by FACILITY_PRIORITY. The macro `LOG_MAKEPRI' generates +- a facility/priority from a facility and a priority, as in the +- following example: +- +- LOG_MAKEPRI(LOG_USER, LOG_WARNING) +- +- The possible values for the facility code are (macros): +- +- `LOG_USER' +- A miscellaneous user process +- +- `LOG_MAIL' +- Mail +- +- `LOG_DAEMON' +- A miscellaneous system daemon +- +- `LOG_AUTH' +- Security (authorization) +- +- `LOG_SYSLOG' +- Syslog +- +- `LOG_LPR' +- Central printer +- +- `LOG_NEWS' +- Network news (e.g. Usenet) +- +- `LOG_UUCP' +- UUCP +- +- `LOG_CRON' +- Cron and At +- +- `LOG_AUTHPRIV' +- Private security (authorization) +- +- `LOG_FTP' +- Ftp server +- +- `LOG_LOCAL0' +- Locally defined +- +- `LOG_LOCAL1' +- Locally defined +- +- `LOG_LOCAL2' +- Locally defined +- +- `LOG_LOCAL3' +- Locally defined +- +- `LOG_LOCAL4' +- Locally defined +- +- `LOG_LOCAL5' +- Locally defined +- +- `LOG_LOCAL6' +- Locally defined +- +- `LOG_LOCAL7' +- Locally defined +- +- Results are undefined if the facility code is anything else. +- +- *note:* `syslog' recognizes one other facility code: that of the +- kernel. But you can't specify that facility code with these +- functions. If you try, it looks the same to `syslog' as if you are +- requesting the default facility. But you wouldn't want to anyway, +- because any program that uses the GNU C library is not the kernel. +- +- You can use just a priority code as FACILITY_PRIORITY. In that +- case, `syslog' assumes the default facility established when the +- Syslog connection was opened. *Note Syslog Example::. +- +- The possible values for the priority code are (macros): +- +- `LOG_EMERG' +- The message says the system is unusable. +- +- `LOG_ALERT' +- Action on the message must be taken immediately. +- +- `LOG_CRIT' +- The message states a critical condition. +- +- `LOG_ERR' +- The message describes an error. +- +- `LOG_WARNING' +- The message is a warning. +- +- `LOG_NOTICE' +- The message describes a normal but important event. +- +- `LOG_INFO' +- The message is purely informational. +- +- `LOG_DEBUG' +- 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. it did not call `openlog'), `syslog' implicitly opens the +- connection the same as `openlog' would, with the following defaults +- for information that would otherwise be included in an `openlog' +- call: The default identification string is the program name. The +- default default facility is `LOG_USER'. The default for all the +- connection options in OPTIONS is as if those bits were off. +- `syslog' leaves the Syslog connection open. +- +- If the `dev/log' socket is not open and connected, `syslog' opens +- and connects it, the same as `openlog' with the `LOG_NDELAY' +- option would. +- +- `syslog' leaves `/dev/log' open and connected unless its attempt +- to send the message failed, in which case `syslog' closes it (with +- the hope that a future implicit open will restore the Syslog +- connection to a usable state). +- +- Example: +- +- +- #include +- syslog (LOG_MAKEPRI(LOG_LOCAL1, LOG_ERROR), +- "Unable to make network connection to %s. Error=%m", host); +- +- +- - Function: void vsyslog (int FACILITY_PRIORITY, char *FORMAT, va_list +- arglist) +- This is functionally identical to `syslog', with the BSD style +- variable length argument. +- +- +- +-File: libc.info, Node: closelog, Next: setlogmask, Prev: syslog; vsyslog, Up: Submitting Syslog Messages +- +-closelog +--------- +- +- The symbols referred to in this section are declared in the file +-`syslog.h'. +- +- - Function: void closelog (void) +- `closelog' closes the current Syslog connection, if there is one. +- This includes closing the `dev/log' socket, if it is open. +- `closelog' also sets the identification string for Syslog messages +- back to the default, if `openlog' was called with a non-NULL +- argument to IDENT. The default identification string is the +- program name taken from argv[0]. +- +- If you are writing shared library code that uses `openlog' to +- generate custom syslog output, you should use `closelog' to drop +- the GNU C library's internal reference to the IDENT pointer when +- you are done. Please read the section on `openlog' for more +- information: *Note openlog::. +- +- `closelog' does not flush any buffers. You do not have to call +- `closelog' before re-opening a Syslog connection with `initlog'. +- Syslog connections are automatically closed on exec or exit. +- +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-31 glibc-2.3.2-200304020432/manual/libc.info-31 +--- glibc-2.3.2/manual/libc.info-31 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-31 Thu Jan 1 01:00:00 1970 +@@ -1,799 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: setlogmask, Next: Syslog Example, Prev: closelog, Up: Submitting Syslog Messages +- +-setlogmask +----------- +- +- The symbols referred to in this section are declared in the file +-`syslog.h'. +- +- - Function: int setlogmask (int MASK) +- `setlogmask' sets a mask (the "logmask") that determines which +- future `syslog' calls shall be ignored. If a program has not +- called `setlogmask', `syslog' doesn't ignore any calls. You can +- use `setlogmask' to specify that messages of particular priorities +- shall be ignored in the future. +- +- A `setlogmask' call overrides any previous `setlogmask' call. +- +- Note that the logmask exists entirely independently of opening and +- closing of Syslog connections. +- +- Setting the logmask has a similar effect to, but is not the same +- as, configuring Syslog. The Syslog configuration may cause Syslog +- to discard certain messages it receives, but the logmask causes +- certain messages never to get submitted to Syslog in the first +- place. +- +- MASK is a bit string with one bit corresponding to each of the +- possible message priorities. If the bit is on, `syslog' handles +- messages of that priority normally. If it is off, `syslog' +- discards messages of that priority. Use the message priority +- macros described in *Note syslog; vsyslog:: and the `LOG_MASK' to +- construct an appropriate MASK value, as in this example: +- +- LOG_MASK(LOG_EMERG) | LOG_MASK(LOG_ERROR) +- +- or +- +- ~(LOG_MASK(LOG_INFO)) +- +- There is also a `LOG_UPTO' macro, which generates a mask with the +- bits on for a certain priority and all priorities above it: +- +- LOG_UPTO(LOG_ERROR) +- +- The unfortunate naming of the macro is due to the fact that +- internally, higher numbers are used for lower message priorities. +- +- +- +-File: libc.info, Node: Syslog Example, Prev: setlogmask, Up: Submitting Syslog Messages +- +-Syslog Example +--------------- +- +- Here is an example of `openlog', `syslog', and `closelog': +- +- This example sets the logmask so that debug and informational +-messages get discarded without ever reaching Syslog. So the second +-`syslog' in the example does nothing. +- +- #include +- +- setlogmask (LOG_UPTO (LOG_NOTICE)); +- +- openlog ("exampleprog", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1); +- +- syslog (LOG_NOTICE, "Program started by User %d", getuid ()); +- syslog (LOG_INFO, "A tree falls in a forest"); +- +- closelog (); +- +- +-File: libc.info, Node: Mathematics, Next: Arithmetic, Prev: Syslog, Up: Top +- +-Mathematics +-*********** +- +- This chapter contains information about functions for performing +-mathematical computations, such as trigonometric functions. Most of +-these functions have prototypes declared in the header file `math.h'. +-The complex-valued functions are defined in `complex.h'. +- +- All mathematical functions which take a floating-point argument have +-three variants, one each for `double', `float', and `long double' +-arguments. The `double' versions are mostly defined in ISO C89. The +-`float' and `long double' versions are from the numeric extensions to C +-included in ISO C99. +- +- Which of the three versions of a function should be used depends on +-the situation. For most calculations, the `float' functions are the +-fastest. On the other hand, the `long double' functions have the +-highest precision. `double' is somewhere in between. It is usually +-wise to pick the narrowest type that can accommodate your data. Not +-all machines have a distinct `long double' type; it may be the same as +-`double'. +- +-* Menu: +- +-* Mathematical Constants:: Precise numeric values for often-used +- constants. +-* Trig Functions:: Sine, cosine, tangent, and friends. +-* Inverse Trig Functions:: Arcsine, arccosine, etc. +-* Exponents and Logarithms:: Also pow and sqrt. +-* Hyperbolic Functions:: sinh, cosh, tanh, etc. +-* Special Functions:: Bessel, gamma, erf. +-* Errors in Math Functions:: Known Maximum Errors in Math Functions. +-* Pseudo-Random Numbers:: Functions for generating pseudo-random +- numbers. +-* FP Function Optimizations:: Fast code or small code. +- +- +-File: libc.info, Node: Mathematical Constants, Next: Trig Functions, Up: Mathematics +- +-Predefined Mathematical Constants +-================================= +- +- The header `math.h' defines several useful mathematical constants. +-All values are defined as preprocessor macros starting with `M_'. The +-values provided are: +- +-`M_E' +- The base of natural logarithms. +- +-`M_LOG2E' +- The logarithm to base `2' of `M_E'. +- +-`M_LOG10E' +- The logarithm to base `10' of `M_E'. +- +-`M_LN2' +- The natural logarithm of `2'. +- +-`M_LN10' +- The natural logarithm of `10'. +- +-`M_PI' +- Pi, the ratio of a circle's circumference to its diameter. +- +-`M_PI_2' +- Pi divided by two. +- +-`M_PI_4' +- Pi divided by four. +- +-`M_1_PI' +- The reciprocal of pi (1/pi) +- +-`M_2_PI' +- Two times the reciprocal of pi. +- +-`M_2_SQRTPI' +- Two times the reciprocal of the square root of pi. +- +-`M_SQRT2' +- The square root of two. +- +-`M_SQRT1_2' +- The reciprocal of the square root of two (also the square root of +- 1/2). +- +- These constants come from the Unix98 standard and were also +-available in 4.4BSD; therefore they are only defined if `_BSD_SOURCE' or +-`_XOPEN_SOURCE=500', or a more general feature select macro, is +-defined. The default set of features includes these constants. *Note +-Feature Test Macros::. +- +- All values are of type `double'. As an extension, the GNU C library +-also defines these constants with type `long double'. The `long +-double' macros have a lowercase `l' appended to their names: `M_El', +-`M_PIl', and so forth. These are only available if `_GNU_SOURCE' is +-defined. +- +- _Note:_ Some programs use a constant named `PI' which has the same +-value as `M_PI'. This constant is not standard; it may have appeared +-in some old AT&T headers, and is mentioned in Stroustrup's book on C++. +-It infringes on the user's name space, so the GNU C library does not +-define it. Fixing programs written to expect it is simple: replace +-`PI' with `M_PI' throughout, or put `-DPI=M_PI' on the compiler command +-line. +- +- +-File: libc.info, Node: Trig Functions, Next: Inverse Trig Functions, Prev: Mathematical Constants, Up: Mathematics +- +-Trigonometric Functions +-======================= +- +- These are the familiar `sin', `cos', and `tan' functions. The +-arguments to all of these functions are in units of radians; recall +-that pi radians equals 180 degrees. +- +- The math library normally defines `M_PI' to a `double' approximation +-of pi. If strict ISO and/or POSIX compliance are requested this +-constant is not defined, but you can easily define it yourself: +- +- #define M_PI 3.14159265358979323846264338327 +- +-You can also compute the value of pi with the expression `acos (-1.0)'. +- +- - Function: double sin (double X) +- - Function: float sinf (float X) +- - Function: long double sinl (long double X) +- These functions return the sine of X, where X is given in radians. +- The return value is in the range `-1' to `1'. +- +- - Function: double cos (double X) +- - Function: float cosf (float X) +- - Function: long double cosl (long double X) +- These functions return the cosine of X, where X is given in +- radians. The return value is in the range `-1' to `1'. +- +- - Function: double tan (double X) +- - Function: float tanf (float X) +- - Function: long double tanl (long double X) +- These functions return the tangent of X, where X is given in +- radians. +- +- Mathematically, the tangent function has singularities at odd +- multiples of pi/2. If the argument X is too close to one of these +- singularities, `tan' will signal overflow. +- +- In many applications where `sin' and `cos' are used, the sine and +-cosine of the same angle are needed at the same time. It is more +-efficient to compute them simultaneously, so the library provides a +-function to do that. +- +- - Function: void sincos (double X, double *SINX, double *COSX) +- - Function: void sincosf (float X, float *SINX, float *COSX) +- - Function: void sincosl (long double X, long double *SINX, long +- double *COSX) +- These functions return the sine of X in `*SINX' and the cosine of +- X in `*COS', where X is given in radians. Both values, `*SINX' +- and `*COSX', are in the range of `-1' to `1'. +- +- This function is a GNU extension. Portable programs should be +- prepared to cope with its absence. +- +- ISO C99 defines variants of the trig functions which work on complex +-numbers. The GNU C library provides these functions, but they are only +-useful if your compiler supports the new complex types defined by the +-standard. (As of this writing GCC supports complex numbers, but there +-are bugs in the implementation.) +- +- - Function: complex double csin (complex double Z) +- - Function: complex float csinf (complex float Z) +- - Function: complex long double csinl (complex long double Z) +- These functions return the complex sine of Z. The mathematical +- definition of the complex sine is +- +- sin (z) = 1/(2*i) * (exp (z*i) - exp (-z*i)). +- +- - Function: complex double ccos (complex double Z) +- - Function: complex float ccosf (complex float Z) +- - Function: complex long double ccosl (complex long double Z) +- These functions return the complex cosine of Z. The mathematical +- definition of the complex cosine is +- +- cos (z) = 1/2 * (exp (z*i) + exp (-z*i)) +- +- - Function: complex double ctan (complex double Z) +- - Function: complex float ctanf (complex float Z) +- - Function: complex long double ctanl (complex long double Z) +- These functions return the complex tangent of Z. The mathematical +- definition of the complex tangent is +- +- tan (z) = -i * (exp (z*i) - exp (-z*i)) / (exp (z*i) + exp (-z*i)) +- +- The complex tangent has poles at pi/2 + 2n, where n is an integer. +- `ctan' may signal overflow if Z is too close to a pole. +- +- +-File: libc.info, Node: Inverse Trig Functions, Next: Exponents and Logarithms, Prev: Trig Functions, Up: Mathematics +- +-Inverse Trigonometric Functions +-=============================== +- +- These are the usual arc sine, arc cosine and arc tangent functions, +-which are the inverses of the sine, cosine and tangent functions +-respectively. +- +- - Function: double asin (double X) +- - Function: float asinf (float X) +- - Function: long double asinl (long double X) +- These functions compute the arc sine of X--that is, the value whose +- sine is X. The value is in units of radians. Mathematically, +- there are infinitely many such values; the one actually returned +- is the one between `-pi/2' and `pi/2' (inclusive). +- +- The arc sine function is defined mathematically only over the +- domain `-1' to `1'. If X is outside the domain, `asin' signals a +- domain error. +- +- - Function: double acos (double X) +- - Function: float acosf (float X) +- - Function: long double acosl (long double X) +- These functions compute the arc cosine of X--that is, the value +- whose cosine is X. The value is in units of radians. +- Mathematically, there are infinitely many such values; the one +- actually returned is the one between `0' and `pi' (inclusive). +- +- The arc cosine function is defined mathematically only over the +- domain `-1' to `1'. If X is outside the domain, `acos' signals a +- domain error. +- +- - Function: double atan (double X) +- - Function: float atanf (float X) +- - Function: long double atanl (long double X) +- These functions compute the arc tangent of X--that is, the value +- whose tangent is X. The value is in units of radians. +- Mathematically, there are infinitely many such values; the one +- actually returned is the one between `-pi/2' and `pi/2' +- (inclusive). +- +- - Function: double atan2 (double Y, double X) +- - Function: float atan2f (float Y, float X) +- - Function: long double atan2l (long double Y, long double X) +- This function computes the arc tangent of Y/X, but the signs of +- both arguments are used to determine the quadrant of the result, +- and X is permitted to be zero. The return value is given in +- radians and is in the range `-pi' to `pi', inclusive. +- +- If X and Y are coordinates of a point in the plane, `atan2' +- returns the signed angle between the line from the origin to that +- point and the x-axis. Thus, `atan2' is useful for converting +- Cartesian coordinates to polar coordinates. (To compute the +- radial coordinate, use `hypot'; see *Note Exponents and +- Logarithms::.) +- +- If both X and Y are zero, `atan2' returns zero. +- +- ISO C99 defines complex versions of the inverse trig functions. +- +- - Function: complex double casin (complex double Z) +- - Function: complex float casinf (complex float Z) +- - Function: complex long double casinl (complex long double Z) +- These functions compute the complex arc sine of Z--that is, the +- value whose sine is Z. The value returned is in radians. +- +- Unlike the real-valued functions, `casin' is defined for all +- values of Z. +- +- - Function: complex double cacos (complex double Z) +- - Function: complex float cacosf (complex float Z) +- - Function: complex long double cacosl (complex long double Z) +- These functions compute the complex arc cosine of Z--that is, the +- value whose cosine is Z. The value returned is in radians. +- +- Unlike the real-valued functions, `cacos' is defined for all +- values of Z. +- +- - Function: complex double catan (complex double Z) +- - Function: complex float catanf (complex float Z) +- - Function: complex long double catanl (complex long double Z) +- These functions compute the complex arc tangent of Z--that is, the +- value whose tangent is Z. The value is in units of radians. +- +- +-File: libc.info, Node: Exponents and Logarithms, Next: Hyperbolic Functions, Prev: Inverse Trig Functions, Up: Mathematics +- +-Exponentiation and Logarithms +-============================= +- +- - Function: double exp (double X) +- - Function: float expf (float X) +- - Function: long double expl (long double X) +- These functions compute `e' (the base of natural logarithms) raised +- to the power X. +- +- If the magnitude of the result is too large to be representable, +- `exp' signals overflow. +- +- - Function: double exp2 (double X) +- - Function: float exp2f (float X) +- - Function: long double exp2l (long double X) +- These functions compute `2' raised to the power X. +- Mathematically, `exp2 (x)' is the same as `exp (x * log (2))'. +- +- - Function: double exp10 (double X) +- - Function: float exp10f (float X) +- - Function: long double exp10l (long double X) +- - Function: double pow10 (double X) +- - Function: float pow10f (float X) +- - Function: long double pow10l (long double X) +- These functions compute `10' raised to the power X. +- Mathematically, `exp10 (x)' is the same as `exp (x * log (10))'. +- +- These functions are GNU extensions. The name `exp10' is +- preferred, since it is analogous to `exp' and `exp2'. +- +- - Function: double log (double X) +- - Function: float logf (float X) +- - Function: long double logl (long double X) +- These functions compute the natural logarithm of X. `exp (log +- (X))' equals X, exactly in mathematics and approximately in C. +- +- If X is negative, `log' signals a domain error. If X is zero, it +- returns negative infinity; if X is too close to zero, it may +- signal overflow. +- +- - Function: double log10 (double X) +- - Function: float log10f (float X) +- - Function: long double log10l (long double X) +- These functions return the base-10 logarithm of X. `log10 (X)' +- equals `log (X) / log (10)'. +- +- +- - Function: double log2 (double X) +- - Function: float log2f (float X) +- - Function: long double log2l (long double X) +- These functions return the base-2 logarithm of X. `log2 (X)' +- equals `log (X) / log (2)'. +- +- - Function: double logb (double X) +- - Function: float logbf (float X) +- - Function: long double logbl (long double X) +- These functions extract the exponent of X and return it as a +- floating-point value. If `FLT_RADIX' is two, `logb' is equal to +- `floor (log2 (x))', except it's probably faster. +- +- If X is de-normalized, `logb' returns the exponent X would have if +- it were normalized. If X is infinity (positive or negative), +- `logb' returns oo. If X is zero, `logb' returns oo. It does not +- signal. +- +- - Function: int ilogb (double X) +- - Function: int ilogbf (float X) +- - Function: int ilogbl (long double X) +- These functions are equivalent to the corresponding `logb' +- functions except that they return signed integer values. +- +-Since integers cannot represent infinity and NaN, `ilogb' instead +-returns an integer that can't be the exponent of a normal floating-point +-number. `math.h' defines constants so you can check for this. +- +- - Macro: int FP_ILOGB0 +- `ilogb' returns this value if its argument is `0'. The numeric +- value is either `INT_MIN' or `-INT_MAX'. +- +- This macro is defined in ISO C99. +- +- - Macro: int FP_ILOGBNAN +- `ilogb' returns this value if its argument is `NaN'. The numeric +- value is either `INT_MIN' or `INT_MAX'. +- +- This macro is defined in ISO C99. +- +- These values are system specific. They might even be the same. The +-proper way to test the result of `ilogb' is as follows: +- +- i = ilogb (f); +- if (i == FP_ILOGB0 || i == FP_ILOGBNAN) +- { +- if (isnan (f)) +- { +- /* Handle NaN. */ +- } +- else if (f == 0.0) +- { +- /* Handle 0.0. */ +- } +- else +- { +- /* Some other value with large exponent, +- perhaps +Inf. */ +- } +- } +- +- - Function: double pow (double BASE, double POWER) +- - Function: float powf (float BASE, float POWER) +- - Function: long double powl (long double BASE, long double POWER) +- These are general exponentiation functions, returning BASE raised +- to POWER. +- +- Mathematically, `pow' would return a complex number when BASE is +- negative and POWER is not an integral value. `pow' can't do that, +- so instead it signals a domain error. `pow' may also underflow or +- overflow the destination type. +- +- - Function: double sqrt (double X) +- - Function: float sqrtf (float X) +- - Function: long double sqrtl (long double X) +- These functions return the nonnegative square root of X. +- +- If X is negative, `sqrt' signals a domain error. Mathematically, +- it should return a complex number. +- +- - Function: double cbrt (double X) +- - Function: float cbrtf (float X) +- - Function: long double cbrtl (long double X) +- These functions return the cube root of X. They cannot fail; +- every representable real value has a representable real cube root. +- +- - Function: double hypot (double X, double Y) +- - Function: float hypotf (float X, float Y) +- - Function: long double hypotl (long double X, long double Y) +- These functions return `sqrt (X*X + Y*Y)'. This is the length of +- the hypotenuse of a right triangle with sides of length X and Y, +- or the distance of the point (X, Y) from the origin. Using this +- function instead of the direct formula is wise, since the error is +- much smaller. See also the function `cabs' in *Note Absolute +- Value::. +- +- - Function: double expm1 (double X) +- - Function: float expm1f (float X) +- - Function: long double expm1l (long double X) +- These functions return a value equivalent to `exp (X) - 1'. They +- are computed in a way that is accurate even if X is near zero--a +- case where `exp (X) - 1' would be inaccurate owing to subtraction +- of two numbers that are nearly equal. +- +- - Function: double log1p (double X) +- - Function: float log1pf (float X) +- - Function: long double log1pl (long double X) +- These functions returns a value equivalent to `log (1 + X)'. They +- are computed in a way that is accurate even if X is near zero. +- +- ISO C99 defines complex variants of some of the exponentiation and +-logarithm functions. +- +- - Function: complex double cexp (complex double Z) +- - Function: complex float cexpf (complex float Z) +- - Function: complex long double cexpl (complex long double Z) +- These functions return `e' (the base of natural logarithms) raised +- to the power of Z. Mathematically, this corresponds to the value +- +- exp (z) = exp (creal (z)) * (cos (cimag (z)) + I * sin (cimag (z))) +- +- - Function: complex double clog (complex double Z) +- - Function: complex float clogf (complex float Z) +- - Function: complex long double clogl (complex long double Z) +- These functions return the natural logarithm of Z. +- Mathematically, this corresponds to the value +- +- log (z) = log (cabs (z)) + I * carg (z) +- +- `clog' has a pole at 0, and will signal overflow if Z equals or is +- very close to 0. It is well-defined for all other values of Z. +- +- - Function: complex double clog10 (complex double Z) +- - Function: complex float clog10f (complex float Z) +- - Function: complex long double clog10l (complex long double Z) +- These functions return the base 10 logarithm of the complex value +- Z. Mathematically, this corresponds to the value +- +- log (z) = log10 (cabs (z)) + I * carg (z) +- +- These functions are GNU extensions. +- +- - Function: complex double csqrt (complex double Z) +- - Function: complex float csqrtf (complex float Z) +- - Function: complex long double csqrtl (complex long double Z) +- These functions return the complex square root of the argument Z. +- Unlike the real-valued functions, they are defined for all values +- of Z. +- +- - Function: complex double cpow (complex double BASE, complex double +- POWER) +- - Function: complex float cpowf (complex float BASE, complex float +- POWER) +- - Function: complex long double cpowl (complex long double BASE, +- complex long double POWER) +- These functions return BASE raised to the power of POWER. This is +- equivalent to `cexp (y * clog (x))' +- +- +-File: libc.info, Node: Hyperbolic Functions, Next: Special Functions, Prev: Exponents and Logarithms, Up: Mathematics +- +-Hyperbolic Functions +-==================== +- +- The functions in this section are related to the exponential +-functions; see *Note Exponents and Logarithms::. +- +- - Function: double sinh (double X) +- - Function: float sinhf (float X) +- - Function: long double sinhl (long double X) +- These functions return the hyperbolic sine of X, defined +- mathematically as `(exp (X) - exp (-X)) / 2'. They may signal +- overflow if X is too large. +- +- - Function: double cosh (double X) +- - Function: float coshf (float X) +- - Function: long double coshl (long double X) +- These function return the hyperbolic cosine of X, defined +- mathematically as `(exp (X) + exp (-X)) / 2'. They may signal +- overflow if X is too large. +- +- - Function: double tanh (double X) +- - Function: float tanhf (float X) +- - Function: long double tanhl (long double X) +- These functions return the hyperbolic tangent of X, defined +- mathematically as `sinh (X) / cosh (X)'. They may signal overflow +- if X is too large. +- +- There are counterparts for the hyperbolic functions which take +-complex arguments. +- +- - Function: complex double csinh (complex double Z) +- - Function: complex float csinhf (complex float Z) +- - Function: complex long double csinhl (complex long double Z) +- These functions return the complex hyperbolic sine of Z, defined +- mathematically as `(exp (Z) - exp (-Z)) / 2'. +- +- - Function: complex double ccosh (complex double Z) +- - Function: complex float ccoshf (complex float Z) +- - Function: complex long double ccoshl (complex long double Z) +- These functions return the complex hyperbolic cosine of Z, defined +- mathematically as `(exp (Z) + exp (-Z)) / 2'. +- +- - Function: complex double ctanh (complex double Z) +- - Function: complex float ctanhf (complex float Z) +- - Function: complex long double ctanhl (complex long double Z) +- These functions return the complex hyperbolic tangent of Z, +- defined mathematically as `csinh (Z) / ccosh (Z)'. +- +- - Function: double asinh (double X) +- - Function: float asinhf (float X) +- - Function: long double asinhl (long double X) +- These functions return the inverse hyperbolic sine of X--the value +- whose hyperbolic sine is X. +- +- - Function: double acosh (double X) +- - Function: float acoshf (float X) +- - Function: long double acoshl (long double X) +- These functions return the inverse hyperbolic cosine of X--the +- value whose hyperbolic cosine is X. If X is less than `1', +- `acosh' signals a domain error. +- +- - Function: double atanh (double X) +- - Function: float atanhf (float X) +- - Function: long double atanhl (long double X) +- These functions return the inverse hyperbolic tangent of X--the +- value whose hyperbolic tangent is X. If the absolute value of X +- is greater than `1', `atanh' signals a domain error; if it is +- equal to 1, `atanh' returns infinity. +- +- - Function: complex double casinh (complex double Z) +- - Function: complex float casinhf (complex float Z) +- - Function: complex long double casinhl (complex long double Z) +- These functions return the inverse complex hyperbolic sine of +- Z--the value whose complex hyperbolic sine is Z. +- +- - Function: complex double cacosh (complex double Z) +- - Function: complex float cacoshf (complex float Z) +- - Function: complex long double cacoshl (complex long double Z) +- These functions return the inverse complex hyperbolic cosine of +- Z--the value whose complex hyperbolic cosine is Z. Unlike the +- real-valued functions, there are no restrictions on the value of Z. +- +- - Function: complex double catanh (complex double Z) +- - Function: complex float catanhf (complex float Z) +- - Function: complex long double catanhl (complex long double Z) +- These functions return the inverse complex hyperbolic tangent of +- Z--the value whose complex hyperbolic tangent is Z. Unlike the +- real-valued functions, there are no restrictions on the value of Z. +- +- +-File: libc.info, Node: Special Functions, Next: Errors in Math Functions, Prev: Hyperbolic Functions, Up: Mathematics +- +-Special Functions +-================= +- +- These are some more exotic mathematical functions which are sometimes +-useful. Currently they only have real-valued versions. +- +- - Function: double erf (double X) +- - Function: float erff (float X) +- - Function: long double erfl (long double X) +- `erf' returns the error function of X. The error function is +- defined as +- erf (x) = 2/sqrt(pi) * integral from 0 to x of exp(-t^2) dt +- +- - Function: double erfc (double X) +- - Function: float erfcf (float X) +- - Function: long double erfcl (long double X) +- `erfc' returns `1.0 - erf(X)', but computed in a fashion that +- avoids round-off error when X is large. +- +- - Function: double lgamma (double X) +- - Function: float lgammaf (float X) +- - Function: long double lgammal (long double X) +- `lgamma' returns the natural logarithm of the absolute value of +- the gamma function of X. The gamma function is defined as +- gamma (x) = integral from 0 to oo of t^(x-1) e^-t dt +- +- The sign of the gamma function is stored in the global variable +- SIGNGAM, which is declared in `math.h'. It is `1' if the +- intermediate result was positive or zero, or `-1' if it was +- negative. +- +- To compute the real gamma function you can use the `tgamma' +- function or you can compute the values as follows: +- lgam = lgamma(x); +- gam = signgam*exp(lgam); +- +- The gamma function has singularities at the non-positive integers. +- `lgamma' will raise the zero divide exception if evaluated at a +- singularity. +- +- - Function: double lgamma_r (double X, int *SIGNP) +- - Function: float lgammaf_r (float X, int *SIGNP) +- - Function: long double lgammal_r (long double X, int *SIGNP) +- `lgamma_r' is just like `lgamma', but it stores the sign of the +- intermediate result in the variable pointed to by SIGNP instead of +- in the SIGNGAM global. This means it is reentrant. +- +- - Function: double gamma (double X) +- - Function: float gammaf (float X) +- - Function: long double gammal (long double X) +- These functions exist for compatibility reasons. They are +- equivalent to `lgamma' etc. It is better to use `lgamma' since +- for one the name reflects better the actual computation, moreover +- `lgamma' is standardized in ISO C99 while `gamma' is not. +- +- - Function: double tgamma (double X) +- - Function: float tgammaf (float X) +- - Function: long double tgammal (long double X) +- `tgamma' applies the gamma function to X. The gamma function is +- defined as +- gamma (x) = integral from 0 to oo of t^(x-1) e^-t dt +- +- This function was introduced in ISO C99. +- +- - Function: double j0 (double X) +- - Function: float j0f (float X) +- - Function: long double j0l (long double X) +- `j0' returns the Bessel function of the first kind of order 0 of +- X. It may signal underflow if X is too large. +- +- - Function: double j1 (double X) +- - Function: float j1f (float X) +- - Function: long double j1l (long double X) +- `j1' returns the Bessel function of the first kind of order 1 of +- X. It may signal underflow if X is too large. +- +- - Function: double jn (int n, double X) +- - Function: float jnf (int n, float X) +- - Function: long double jnl (int n, long double X) +- `jn' returns the Bessel function of the first kind of order N of +- X. It may signal underflow if X is too large. +- +- - Function: double y0 (double X) +- - Function: float y0f (float X) +- - Function: long double y0l (long double X) +- `y0' returns the Bessel function of the second kind of order 0 of +- X. It may signal underflow if X is too large. If X is negative, +- `y0' signals a domain error; if it is zero, `y0' signals overflow +- and returns -oo. +- +- - Function: double y1 (double X) +- - Function: float y1f (float X) +- - Function: long double y1l (long double X) +- `y1' returns the Bessel function of the second kind of order 1 of +- X. It may signal underflow if X is too large. If X is negative, +- `y1' signals a domain error; if it is zero, `y1' signals overflow +- and returns -oo. +- +- - Function: double yn (int n, double X) +- - Function: float ynf (int n, float X) +- - Function: long double ynl (int n, long double X) +- `yn' returns the Bessel function of the second kind of order N of +- X. It may signal underflow if X is too large. If X is negative, +- `yn' signals a domain error; if it is zero, `yn' signals overflow +- and returns -oo. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-32 glibc-2.3.2-200304020432/manual/libc.info-32 +--- glibc-2.3.2/manual/libc.info-32 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-32 Thu Jan 1 01:00:00 1970 +@@ -1,865 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Errors in Math Functions, Next: Pseudo-Random Numbers, Prev: Special Functions, Up: Mathematics +- +-Known Maximum Errors in Math Functions +-====================================== +- +- This section lists the known errors of the functions in the math +-library. Errors are measured in "units of the last place". This is a +-measure for the relative error. For a number z with the representation +-d.d...d*2^e (we assume IEEE floating-point numbers with base 2) the ULP +-is represented by +- +- |d.d...d - (z / 2^e)| / 2^(p - 1) +- +-where p is the number of bits in the mantissa of the floating-point +-number representation. Ideally the error for all functions is always +-less than 0.5ulps. Using rounding bits this is also possible and +-normally implemented for the basic operations. To achieve the same for +-the complex math functions requires a lot more work and this has not +-yet been done. +- +- Therefore many of the functions in the math library have errors. The +-table lists the maximum error for each function which is exposed by one +-of the existing tests in the test suite. The table tries to cover as +-much as possible and list the actual maximum error (or at least a +-ballpark figure) but this is often not achieved due to the large search +-space. +- +- The table lists the ULP values for different architectures. +-Different architectures have different results since their hardware +-support for floating-point operations varies and also the existing +-hardware support is different. +- +-Function Alpha ARM Generic ix86 IA64 +-acosf - - - - - +-acos - - - - - +-acosl - - - 1150 - +-acoshf - - - - - +-acosh - - - - - +-acoshl - - - 1 - +-asinf 2 2 - - - +-asin 1 1 - 1 1 +-asinl - - - 1 - +-asinhf - - - - - +-asinh - - - - - +-asinhl - - - 656 14 +-atanf - - - - - +-atan - - - - - +-atanl - - - 549 - +-atanhf - - - - - +-atanh 1 1 - 1 - +-atanhl - - - 1605 - +-atan2f 4 - - - - +-atan2 - - - - - +-atan2l - - - 549 - +-cabsf 1 1 - 1 1 +-cabs 1 1 - 1 1 +-cabsl - - - 560 1 +-cacosf 1 + i 1 1 + i 1 - 1 + i 2 1 + i 2 +-cacos 1 + i 0 1 + i 0 - 1 + i 0 1 + i 0 +-cacosl - - - 151 + i 329 1 + i 1 +-cacoshf 7 + i 3 7 + i 3 - 4 + i 4 7 + i 0 +-cacosh 1 + i 1 1 + i 1 - 1 + i 1 1 + i 1 +-cacoshl - - - 328 + i 151 7 + i 1 +-cargf - - - - - +-carg - - - - - +-cargl - - - - - +-casinf 2 + i 1 2 + i 1 - 2 + i 2 2 + i 2 +-casin 3 + i 0 3 + i 0 - 3 + i 0 3 + i 0 +-casinl - - - 603 + i 329 0 + i 1 +-casinhf 1 + i 6 1 + i 6 - 1 + i 6 1 + i 6 +-casinh 5 + i 3 5 + i 3 - 5 + i 3 5 + i 3 +-casinhl - - - 892 + i 12 5 + i 5 +-catanf 4 + i 1 4 + i 1 - 0 + i 1 0 + i 1 +-catan 0 + i 1 0 + i 1 - 0 + i 1 0 + i 1 +-catanl - - - 251 + i 474 1 + i 0 +-catanhf 1 + i 6 1 + i 6 - 1 + i 0 - +-catanh 4 + i 1 4 + i 1 - 2 + i 0 4 + i 0 +-catanhl - - - 66 + i 447 1 + i 0 +-cbrtf - - - - - +-cbrt 1 1 - 1 1 +-cbrtl - - - 716 - +-ccosf 0 + i 1 0 + i 1 - 1 + i 1 1 + i 1 +-ccos 1 + i 1 1 + i 1 - 1 + i 1 1 + i 1 +-ccosl - - - 5 + i 1901 0 + i 1 +-ccoshf 1 + i 1 1 + i 1 - 1 + i 1 1 + i 1 +-ccosh 1 + i 1 1 + i 1 - 1 + i 1 1 + i 1 +-ccoshl - - - 1467 + i 1183 1 + i 1 +-ceilf - - - - - +-ceil - - - - - +-ceill - - - - - +-cexpf 1 + i 1 1 + i 1 - 1 + i 0 1 + i 1 +-cexp 1 + i 0 1 + i 0 - - 1 + i 0 +-cexpl - - - 940 + i 1067 2 + i 0 +-cimagf - - - - - +-cimag - - - - - +-cimagl - - - - - +-clogf 0 + i 3 0 + i 3 - - - +-clog 0 + i 1 0 + i 1 - - - +-clogl - - - 0 + i 1 - +-clog10f 1 + i 5 1 + i 5 - 1 + i 1 1 + i 1 +-clog10 1 + i 1 1 + i 1 - 2 + i 1 2 + i 1 +-clog10l - - - 1403 + i 186 1 + i 2 +-conjf - - - - - +-conj - - - - - +-conjl - - - - - +-copysignf - - - - - +-copysign - - - - - +-copysignl - - - - - +-cosf 1 1 - 1 1 +-cos 2 2 - 2 2 +-cosl - - - 529 0.5 +-coshf - - - - - +-cosh - - - - - +-coshl - - - 309 2 +-cpowf 4 + i 2 4 + i 2 - 4 + i 2.5333 5 + i 2.5333 +-cpow 1 + i 1.1031 1 + i 1.1031 - 1 + i 1.104 1 + i 1.1031 +-cpowl - - - 2 + i 9 1 + i 4 +-cprojf - - - - - +-cproj - - - - - +-cprojl - - - - - +-crealf - - - - - +-creal - - - - - +-creall - - - - - +-csinf 0 + i 1 0 + i 1 - - - +-csin - - - - - +-csinl - - - 966 + i 168 0 + i 1 +-csinhf 1 + i 1 1 + i 1 - 1 + i 1 1 + i 1 +-csinh 0 + i 1 0 + i 1 - 1 + i 1 1 + i 1 +-csinhl - - - 413 + i 477 2 + i 2 +-csqrtf 1 + i 1 1 + i 1 - - 1 + i 1 +-csqrt 1 + i 0 1 + i 0 - 1 + i 0 1 + i 0 +-csqrtl - - - 237 + i 128 - +-ctanf 1 + i 1 1 + i 1 - 1 + i 1 1 + i 1 +-ctan 1 + i 1 1 + i 1 - 1 + i 1 1 + i 1 +-ctanl - - - 690 + i 367 436 + i 1 +-ctanhf 2 + i 1 2 + i 1 - 1 + i 1 1 + i 1 +-ctanh 2 + i 2 2 + i 2 - 0 + i 1 0 + i 1 +-ctanhl - - - 286 + i 3074 1 + i 24 +-erff - - - - - +-erf - - - - - +-erfl - - - - - +-erfcf 12 12 - 12 12 +-erfc 24 24 - 24 24 +-erfcl - - - 36 12 +-expf - - - - - +-exp - - - - - +-expl - - - 754 - +-exp10f 2 2 - - 2 +-exp10 6 6 - 1 6 +-exp10l - - - 1182 3 +-exp2f - - - - - +-exp2 - - - - - +-exp2l - - - 462 - +-expm1f 1 1 - - - +-expm1 - - - - - +-expm1l - - - 825 1 +-fabsf - - - - - +-fabs - - - - - +-fabsl - - - - - +-fdimf - - - - - +-fdim - - - - - +-fdiml - - - - - +-floorf - - - - - +-floor - - - - - +-floorl - - - - - +-fmaf - - - - - +-fma - - - - - +-fmal - - - - - +-fmaxf - - - - - +-fmax - - - - - +-fmaxl - - - - - +-fminf - - - - - +-fmin - - - - - +-fminl - - - - - +-fmodf 1 1 - 1 1 +-fmod 2 2 - 2 2 +-fmodl - - - 4096 1 +-frexpf - - - - - +-frexp - - - - - +-frexpl - - - - - +-gammaf - - - - - +-gamma - - - 1 - +-gammal - - - 1 1 +-hypotf 1 1 - 1 1 +-hypot 1 1 - 1 1 +-hypotl - - - 560 1 +-ilogbf - - - - - +-ilogb - - - - - +-ilogbl - - - - - +-j0f 2 2 - 1 1 +-j0 2 2 - 2 2 +-j0l - - - 1 2 +-j1f 2 2 - 1 2 +-j1 1 1 - 2 1 +-j1l - - - 2 - +-jnf 4 4 - 2 4 +-jn 6 6 - 5 6 +-jnl - - - 2 2 +-lgammaf 2 2 - 2 2 +-lgamma 1 1 - 1 1 +-lgammal - - - 1 1 +-lrintf - - - - - +-lrint - - - - - +-lrintl - - - - - +-llrintf - - - - - +-llrint - - - - - +-llrintl - - - - - +-logf 1 1 - 1 1 +-log 1 1 - 1 1 +-logl - - - 2341 1 +-log10f 1 1 - 1 1 +-log10 1 1 - 1 1 +-log10l - - - 2033 1 +-log1pf 1 1 - 1 1 +-log1p 1 1 - 1 1 +-log1pl - - - 585 1 +-log2f 1 1 - 1 1 +-log2 1 1 - 1 1 +-log2l - - - 1688 - +-logbf - - - - - +-logb - - - - - +-logbl - - - - - +-lroundf - - - - - +-lround - - - - - +-lroundl - - - - - +-llroundf - - - - - +-llround - - - - - +-llroundl - - - - - +-modff - - - - - +-modf - - - - - +-modfl - - - - - +-nearbyintf - - - - - +-nearbyint - - - - - +-nearbyintl - - - - - +-nextafterf - - - - - +-nextafter - - - - - +-nextafterl - - - - - +-nexttowardf - - - - - +-nexttoward - - - - - +-nexttowardl - - - - - +-powf - - - - - +-pow - - - - - +-powl - - - 725 1 +-remainderf - - - - - +-remainder - - - - - +-remainderl - - - - - +-remquof - - - - - +-remquo - - - - - +-remquol - - - - - +-rintf - - - - - +-rint - - - - - +-rintl - - - - - +-roundf - - - - - +-round - - - - - +-roundl - - - - - +-scalbf - - - - - +-scalb - - - - - +-scalbl - - - - - +-scalbnf - - - - - +-scalbn - - - - - +-scalbnl - - - - - +-scalblnf - - - - - +-scalbln - - - - - +-scalblnl - - - - - +-sinf - - - - - +-sin - - - - - +-sinl - - - 627 1 +-sincosf 1 1 - 1 1 +-sincos 1 1 - 1 1 +-sincosl - - - 627 1 +-sinhf 1 1 - 1 1 +-sinh 1 1 - - - +-sinhl - - - 1029 1 +-sqrtf - - - - - +-sqrt - - - - - +-sqrtl - - - 489 - +-tanf - - - - - +-tan 0.5 0.5 - 0.5 0.5 +-tanl - - - 1401 1 +-tanhf 1 1 - - 1 +-tanh 1 1 - - 1 +-tanhl - - - 521 1 +-tgammaf 1 1 - 1 1 +-tgamma 1 1 - 2 1 +-tgammal - - - 2 1 +-truncf - - - - - +-trunc - - - - - +-truncl - - - - - +-y0f 1 1 - 1 1 +-y0 2 2 - 3 2 +-y0l - - - 2 2 +-y1f 2 2 - 2 2 +-y1 3 3 - 3 3 +-y1l - - - 2 1 +-ynf 2 2 - 3 2 +-yn 3 3 - 6 3 +-ynl - - - 7 7 +- +-Function M68k MIPS PowerPC S/390 SH4 +-acosf - - - - - +-acos - - - - - +-acosl 1 - - - - +-acoshf - - - - - +-acosh - - - - - +-acoshl 1 - - - - +-asinf - 2 2 2 2 +-asin 1 1 1 1 1 +-asinl 1 - - - - +-asinhf - - - - - +-asinh - - - - - +-asinhl 14 - - - - +-atanf - - - - - +-atan - - - - - +-atanl - - - - - +-atanhf - - - - - +-atanh 1 1 1 1 1 +-atanhl - - - - - +-atan2f - 4 4 4 4 +-atan2 - - - - - +-atan2l - - - - - +-cabsf 1 1 1 1 1 +-cabs - 1 1 1 1 +-cabsl 1 - - - - +-cacosf 1 + i 2 1 + i 1 1 + i 1 1 + i 1 1 + i 1 +-cacos 1 + i 0 1 + i 0 1 + i 0 1 + i 0 1 + i 0 +-cacosl 1 + i 1 - - - - +-cacoshf 7 + i 0 7 + i 3 7 + i 3 7 + i 3 7 + i 3 +-cacosh 1 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 1 +-cacoshl 6 + i 2 - - - - +-cargf - - - - - +-carg - - - - - +-cargl - - - - - +-casinf 2 + i 2 2 + i 1 2 + i 1 2 + i 1 2 + i 1 +-casin 3 + i 0 3 + i 0 3 + i 0 3 + i 0 3 + i 0 +-casinl 0 + i 1 - - - - +-casinhf 19 + i 2 1 + i 6 1 + i 6 1 + i 6 1 + i 6 +-casinh 6 + i 13 5 + i 3 5 + i 3 5 + i 3 5 + i 3 +-casinhl 5 + i 6 - - - - +-catanf 0 + i 1 4 + i 1 4 + i 1 4 + i 1 4 + i 1 +-catan 0 + i 1 0 + i 1 0 + i 1 0 + i 1 0 + i 1 +-catanl 1 + i 0 - - - - +-catanhf - 1 + i 6 0 + i 6 1 + i 6 1 + i 6 +-catanh - 4 + i 1 4 + i 1 4 + i 1 4 + i 1 +-catanhl 1 + i 0 - - - - +-cbrtf - - - - - +-cbrt 1 1 1 1 1 +-cbrtl 1 - - - - +-ccosf 1 + i 1 0 + i 1 0 + i 1 0 + i 1 0 + i 1 +-ccos 0 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 1 +-ccosl 0 + i 1 - - - - +-ccoshf 3 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 1 +-ccosh 1 + i 0 1 + i 1 1 + i 1 1 + i 1 1 + i 1 +-ccoshl 1 + i 2 - - - - +-ceilf - - - - - +-ceil - - - - - +-ceill - - - - - +-cexpf 3 + i 2 1 + i 1 1 + i 1 1 + i 1 1 + i 1 +-cexp - 1 + i 0 1 + i 0 1 + i 0 1 + i 0 +-cexpl 2 + i 0 - - - - +-cimagf - - - - - +-cimag - - - - - +-cimagl - - - - - +-clogf - 0 + i 3 0 + i 3 0 + i 3 0 + i 3 +-clog - 0 + i 1 0 + i 1 0 + i 1 0 + i 1 +-clogl - - - - - +-clog10f 1 + i 1 1 + i 5 1 + i 5 1 + i 5 1 + i 5 +-clog10 1 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 1 +-clog10l 1 + i 3 - - - - +-conjf - - - - - +-conj - - - - - +-conjl - - - - - +-copysignf - - - - - +-copysign - - - - - +-copysignl - - - - - +-cosf 1 1 1 1 1 +-cos 2 2 2 2 2 +-cosl 1 - - - - +-coshf - - - - - +-cosh - - - - - +-coshl 2 - - - - +-cpowf 1 + i 6 4 + i 2 4 + i 2 4 + i 2 4 + i 2 +-cpow 1 + i 2 1 + i 1.1031 1 + i 2 1 + i 1.1031 1 + i 1.1031 +-cpowl 5 + i 2 - - - - +-cprojf - - - - - +-cproj - - - - - +-cprojl - - - - - +-crealf - - - - - +-creal - - - - - +-creall - - - - - +-csinf 1 + i 1 0 + i 1 0 + i 1 0 + i 1 0 + i 1 +-csin - - - - - +-csinl - - - - - +-csinhf 1 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 1 +-csinh - 0 + i 1 0 + i 1 0 + i 1 0 + i 1 +-csinhl 1 + i 2 - - - - +-csqrtf 1 + i 0 1 + i 1 1 + i 1 1 + i 1 1 + i 1 +-csqrt - 1 + i 0 1 + i 0 1 + i 0 1 + i 0 +-csqrtl - - - - - +-ctanf 1 + i 0 1 + i 1 1 + i 1 1 + i 1 1 + i 1 +-ctan 1 + i 0 1 + i 1 1 + i 1 1 + i 1 1 + i 1 +-ctanl 439 + i 2 - - - - +-ctanhf 1 + i 0 2 + i 1 2 + i 1 2 + i 1 2 + i 1 +-ctanh 0 + i 1 2 + i 2 2 + i 2 2 + i 2 2 + i 2 +-ctanhl 2 + i 25 - - - - +-erff - - - - - +-erf - - - - - +-erfl - - - - - +-erfcf 11 12 12 12 12 +-erfc 24 24 24 24 24 +-erfcl 12 - - - - +-expf - - - - - +-exp - - - - - +-expl - - - - - +-exp10f - 2 2 2 2 +-exp10 1 6 6 6 6 +-exp10l 1 - - - - +-exp2f - - - - - +-exp2 - - - - - +-exp2l - - - - - +-expm1f - 1 1 1 1 +-expm1 - - - - - +-expm1l 1 - - - - +-fabsf - - - - - +-fabs - - - - - +-fabsl - - - - - +-fdimf - - - - - +-fdim - - - - - +-fdiml - - - - - +-floorf - - - - - +-floor - - - - - +-floorl - - - - - +-fmaf - - - - - +-fma - - - - - +-fmal - - - - - +-fmaxf - - - - - +-fmax - - - - - +-fmaxl - - - - - +-fminf - - - - - +-fmin - - - - - +-fminl - - - - - +-fmodf 1 1 1 1 1 +-fmod 2 2 2 2 2 +-fmodl 1 - - - - +-frexpf - - - - - +-frexp - - - - - +-frexpl - - - - - +-gammaf - - - - - +-gamma - - - - - +-gammal 1 - - - - +-hypotf 1 1 1 1 1 +-hypot - 1 1 1 1 +-hypotl 1 - - - - +-ilogbf - - - - - +-ilogb - - - - - +-ilogbl - - - - - +-j0f 1 2 1 2 2 +-j0 1 2 2 2 2 +-j0l 1 - - - - +-j1f 2 2 2 2 2 +-j1 - 1 1 1 1 +-j1l 2 - - - - +-jnf 11 4 4 4 4 +-jn 4 6 6 6 6 +-jnl 2 - - - - +-lgammaf 2 2 2 2 2 +-lgamma 1 1 1 1 1 +-lgammal 1 - - - - +-lrintf - - - - - +-lrint - - - - - +-lrintl - - - - - +-llrintf - - - - - +-llrint - - - - - +-llrintl - - - - - +-logf 1 1 1 1 1 +-log 1 1 1 1 1 +-logl 2 - - - - +-log10f 1 1 1 1 1 +-log10 1 1 1 1 1 +-log10l 1 - - - - +-log1pf 1 1 1 1 1 +-log1p 1 1 1 1 1 +-log1pl 2 - - - - +-log2f 1 1 1 1 1 +-log2 1 1 1 1 1 +-log2l 1 - - - - +-logbf - - - - - +-logb - - - - - +-logbl - - - - - +-lroundf - - - - - +-lround - - - - - +-lroundl - - - - - +-llroundf - - - - - +-llround - - - - - +-llroundl - - - - - +-modff - - - - - +-modf - - - - - +-modfl - - - - - +-nearbyintf - - - - - +-nearbyint - - - - - +-nearbyintl - - - - - +-nextafterf - - - - - +-nextafter - - - - - +-nextafterl - - - - - +-nexttowardf - - - - - +-nexttoward - - - - - +-nexttowardl - - - - - +-powf - - - - - +-pow - - - - - +-powl 1 - - - - +-remainderf - - - - - +-remainder - - - - - +-remainderl - - - - - +-remquof - - - - - +-remquo - - - - - +-remquol - - - - - +-rintf - - - - - +-rint - - - - - +-rintl - - - - - +-roundf - - - - - +-round - - - - - +-roundl - - - - - +-scalbf - - - - - +-scalb - - - - - +-scalbl - - - - - +-scalbnf - - - - - +-scalbn - - - - - +-scalbnl - - - - - +-scalblnf - - - - - +-scalbln - - - - - +-scalblnl - - - - - +-sinf - - - - - +-sin - - - - - +-sinl 1 - - - - +-sincosf 1 1 1 1 1 +-sincos 1 1 1 1 1 +-sincosl 1 - - - - +-sinhf 1 1 1 1 1 +-sinh - 1 1 1 1 +-sinhl - - - - - +-sqrtf - - - - - +-sqrt - - - - - +-sqrtl - - - - - +-tanf - - - - - +-tan 1 0.5 1 0.5 0.5 +-tanl 1 - - - - +-tanhf - 1 1 1 1 +-tanh - 1 1 1 1 +-tanhl - - - - - +-tgammaf 1 1 1 1 1 +-tgamma 1 1 1 1 1 +-tgammal 1 - - - - +-truncf - - - - - +-trunc - - - - - +-truncl - - - - - +-y0f 2 1 1 1 1 +-y0 2 2 2 2 2 +-y0l 2 - - - - +-y1f 2 2 2 2 2 +-y1 1 3 3 3 3 +-y1l 2 - - - - +-ynf 2 2 2 2 2 +-yn 6 3 3 3 3 +-ynl 7 - - - - +- +-Function Sparc 32-bit Sparc 64-bit x86_64/fpu +-acosf - - - +-acos - - - +-acosl - 1 - +-acoshf - - - +-acosh - - - +-acoshl - - - +-asinf 2 2 - +-asin 1 1 1 +-asinl - - 1 +-asinhf - - - +-asinh - - - +-asinhl - - 15 +-atanf - - - +-atan - - - +-atanl - 1 - +-atanhf - - - +-atanh 1 1 1 +-atanhl - - 1 +-atan2f 4.0000 4 4 +-atan2 - - - +-atan2l - 1 - +-cabsf 1 1 1 +-cabs 1 1 1 +-cabsl - - 1 +-cacosf 1 + i 1 1 + i 1 1 + i 1 +-cacos 1 + i 0 1 + i 0 1 + i 0 +-cacosl - 0 + i 3 1 + i 1 +-cacoshf 7 + i 3 7 + i 3 7 + i 3 +-cacosh 1 + i 1 1 + i 1 1 + i 1 +-cacoshl - 5 + i 1 6 + i 1 +-cargf - - - +-carg - - - +-cargl - - - +-casinf 2 + i 1 2 + i 1 2 + i 1 +-casin 3 + i 0 3 + i 0 3 + i 0 +-casinl - 1 + i 3 0 + i 1 +-casinhf 1 + i 6 1 + i 6 1 + i 6 +-casinh 5 + i 3 5 + i 3 5 + i 3 +-casinhl - 4 + i 2 5 + i 5 +-catanf 4 + i 1 4 + i 1 4 + i 1 +-catan 0 + i 1 0 + i 1 0 + i 1 +-catanl - 0 + i 1 1 + i 0 +-catanhf 1 + i 6 1 + i 6 1 + i 6 +-catanh 4 + i 1 4 + i 1 4 + i 0 +-catanhl - - 1 + i 0 +-cbrtf - - - +-cbrt 1 1 1 +-cbrtl - - 948 +-ccosf 0 + i 1 0 + i 1 0 + i 1 +-ccos 1 + i 1 1 + i 1 1 + i 1 +-ccosl - - 0 + i 1 +-ccoshf 1 + i 1 1 + i 1 1 + i 1 +-ccosh 1 + i 1 1 + i 1 1 + i 1 +-ccoshl - - 1 + i 1 +-ceilf - - - +-ceil - - - +-ceill - - - +-cexpf 1 + i 1 1 + i 1 1 + i 1 +-cexp 1 + i 0 1 + i 0 1 + i 0 +-cexpl - 1 + i 1 2 + i 1 +-cimagf - - - +-cimag - - - +-cimagl - - - +-clogf 0 + i 3 0 + i 3 0 + i 3 +-clog 0 + i 1 0 + i 1 - +-clogl - - - +-clog10f 1 + i 5 1 + i 5 1 + i 5 +-clog10 1 + i 1 1 + i 1 1 + i 1 +-clog10l - - 1 + i 3 +-conjf - - - +-conj - - - +-conjl - - - +-copysignf - - - +-copysign - - - +-copysignl - - - +-cosf 1 1 1 +-cos 2 2 2 +-cosl - 1 0.5 +-coshf - - - +-cosh - - - +-coshl - - 2 +-cpowf 4 + i 2 4 + i 2 4 + i 2 +-cpow 1 + i 1.1031 1 + i 1.1031 1 + i 1.1031 +-cpowl - 3 + i 0.9006 1 + i 2 +-cprojf - - - +-cproj - - - +-cprojl - - - +-crealf - - - +-creal - - - +-creall - - - +-csinf 0 + i 1 0 + i 1 0 + i 1 +-csin - - - +-csinl - - 0 + i 2 +-csinhf 1 + i 1 1 + i 1 1 + i 1 +-csinh 0 + i 1 0 + i 1 0 + i 1 +-csinhl - - 2 + i 2 +-csqrtf 1 + i 1 1 + i 1 1 + i 1 +-csqrt 1 + i 0 1 + i 0 1 + i 0 +-csqrtl - 1 + i 1 - +-ctanf 1 + i 1 1 + i 1 1 + i 1 +-ctan 1 + i 1 1 + i 1 1 + i 1 +-ctanl - - 439 + i 2 +-ctanhf 2 + i 1 2 + i 1 2 + i 1 +-ctanh 2 + i 2 2 + i 2 2 + i 2 +-ctanhl - - 5 + i 25 +-erff - - - +-erf - - - +-erfl - - - +-erfcf 12 12 12 +-erfc 24 24 24 +-erfcl - - 36 +-expf - - - +-exp - - - +-expl - - - +-exp10f 2 2 2 +-exp10 6 6 6 +-exp10l - 1 3 +-exp2f - - - +-exp2 - - - +-exp2l - - - +-expm1f 1 1 1 +-expm1 - 1 1 +-expm1l - - 1 +-fabsf - - - +-fabs - - - +-fabsl - - - +-fdimf - - - +-fdim - - - +-fdiml - - - +-floorf - - - +-floor - - - +-floorl - - - +-fmaf - - - +-fma - - - +-fmal - - - +-fmaxf - - - +-fmax - - - +-fmaxl - - - +-fminf - - - +-fmin - - - +-fminl - - - +-fmodf 1 1 1 +-fmod 2 2 2 +-fmodl - 2 1 +-frexpf - - - +-frexp - - - +-frexpl - - - +-gammaf - - - +-gamma - - - +-gammal - - 1 +-hypotf 1 1 1 +-hypot 1 1 1 +-hypotl - - 1 +-ilogbf - - - +-ilogb - - - +-ilogbl - - - +-j0f 2 2 2 +-j0 2 2 2 +-j0l - - - +-j1f 2 2 2 +-j1 1 1 1 +-j1l - - 2 +-jnf 4 4 4 +-jn 6 6 6 +-jnl - - 2 +-lgammaf 2 2 2 +-lgamma 1 1 1 +-lgammal - - 1 +-lrintf - - - +-lrint - - - +-lrintl - - - +-llrintf - - - +-llrint - - - +-llrintl - - - +-logf 1 1 1 +-log 1 1 1 +-logl - 1 1 +-log10f 1 1 1 +-log10 1 1 1 +-log10l - - 1 +-log1pf 1 1 1 +-log1p 1 1 1 +-log1pl - 1 1 +-log2f 1 1 1 +-log2 1 1 1 +-log2l - - - +-logbf - - - +-logb - - - +-logbl - - - +-lroundf - - - +-lround - - - +-lroundl - - - +-llroundf - - - +-llround - - - +-llroundl - - - +-modff - - - +-modf - - - +-modfl - - - +-nearbyintf - - - +-nearbyint - - - +-nearbyintl - - - +-nextafterf - - - +-nextafter - - - +-nextafterl - - - +-nexttowardf - - - +-nexttoward - - - +-nexttowardl - - - +-powf - - - +-pow - - - +-powl - - - +-remainderf - - - +-remainder - - - +-remainderl - - - +-remquof - - - +-remquo - - - +-remquol - - - +-rintf - - - +-rint - - - +-rintl - - - +-roundf - - - +-round - - - +-roundl - - - +-scalbf - - - +-scalb - - - +-scalbl - - - +-scalbnf - - - +-scalbn - - - +-scalbnl - - - +-scalblnf - - - +-scalbln - - - +-scalblnl - - - +-sinf - - - +-sin - - - +-sinl - - 1 +-sincosf 1 1 1 +-sincos 1 1 1 +-sincosl - 1 1 +-sinhf 1 1 1 +-sinh 1 1 1 +-sinhl - - 1 +-sqrtf - - - +-sqrt - - - +-sqrtl - 1 - +-tanf - - - +-tan 0.5 0.5 0.5 +-tanl - 1 1 +-tanhf 1 1 1 +-tanh 1 1 1 +-tanhl - - 1 +-tgammaf 1 1 1 +-tgamma 1 1 1 +-tgammal - - 2 +-truncf - - - +-trunc - - - +-truncl - - - +-y0f 1 1 1 +-y0 2 2 2 +-y0l - - 2 +-y1f 2 2 2 +-y1 3 3 3 +-y1l - - 2 +-ynf 2 2 2 +-yn 3 3 3 +-ynl - - 7 +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-33 glibc-2.3.2-200304020432/manual/libc.info-33 +--- glibc-2.3.2/manual/libc.info-33 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-33 Thu Jan 1 01:00:00 1970 +@@ -1,1234 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Pseudo-Random Numbers, Next: FP Function Optimizations, Prev: Errors in Math Functions, Up: Mathematics +- +-Pseudo-Random Numbers +-===================== +- +- This section describes the GNU facilities for generating a series of +-pseudo-random numbers. The numbers generated are not truly random; +-typically, they form a sequence that repeats periodically, with a period +-so large that you can ignore it for ordinary purposes. The random +-number generator works by remembering a "seed" value which it uses to +-compute the next random number and also to compute a new seed. +- +- Although the generated numbers look unpredictable within one run of a +-program, the sequence of numbers is _exactly the same_ from one run to +-the next. This is because the initial seed is always the same. This +-is convenient when you are debugging a program, but it is unhelpful if +-you want the program to behave unpredictably. If you want a different +-pseudo-random series each time your program runs, you must specify a +-different seed each time. For ordinary purposes, basing the seed on the +-current time works well. +- +- You can obtain repeatable sequences of numbers on a particular +-machine type by specifying the same initial seed value for the random +-number generator. There is no standard meaning for a particular seed +-value; the same seed, used in different C libraries or on different CPU +-types, will give you different random numbers. +- +- The GNU library supports the standard ISO C random number functions +-plus two other sets derived from BSD and SVID. The BSD and ISO C +-functions provide identical, somewhat limited functionality. If only a +-small number of random bits are required, we recommend you use the +-ISO C interface, `rand' and `srand'. The SVID functions provide a more +-flexible interface, which allows better random number generator +-algorithms, provides more random bits (up to 48) per call, and can +-provide random floating-point numbers. These functions are required by +-the XPG standard and therefore will be present in all modern Unix +-systems. +- +-* Menu: +- +-* ISO Random:: `rand' and friends. +-* BSD Random:: `random' and friends. +-* SVID Random:: `drand48' and friends. +- +- +-File: libc.info, Node: ISO Random, Next: BSD Random, Up: Pseudo-Random Numbers +- +-ISO C Random Number Functions +------------------------------ +- +- This section describes the random number functions that are part of +-the ISO C standard. +- +- To use these facilities, you should include the header file +-`stdlib.h' in your program. +- +- - Macro: int RAND_MAX +- The value of this macro is an integer constant representing the +- largest value the `rand' function can return. In the GNU library, +- it is `2147483647', which is the largest signed integer +- representable in 32 bits. In other libraries, it may be as low as +- `32767'. +- +- - Function: int rand (void) +- The `rand' function returns the next pseudo-random number in the +- series. The value ranges from `0' to `RAND_MAX'. +- +- - Function: void srand (unsigned int SEED) +- This function establishes SEED as the seed for a new series of +- pseudo-random numbers. If you call `rand' before a seed has been +- established with `srand', it uses the value `1' as a default seed. +- +- To produce a different pseudo-random series each time your program +- is run, do `srand (time (0))'. +- +- POSIX.1 extended the C standard functions to support reproducible +-random numbers in multi-threaded programs. However, the extension is +-badly designed and unsuitable for serious work. +- +- - Function: int rand_r (unsigned int *SEED) +- This function returns a random number in the range 0 to `RAND_MAX' +- just as `rand' does. However, all its state is stored in the SEED +- argument. This means the RNG's state can only have as many bits +- as the type `unsigned int' has. This is far too few to provide a +- good RNG. +- +- If your program requires a reentrant RNG, we recommend you use the +- reentrant GNU extensions to the SVID random number generator. The +- POSIX.1 interface should only be used when the GNU extensions are +- not available. +- +- +-File: libc.info, Node: BSD Random, Next: SVID Random, Prev: ISO Random, Up: Pseudo-Random Numbers +- +-BSD Random Number Functions +---------------------------- +- +- This section describes a set of random number generation functions +-that are derived from BSD. There is no advantage to using these +-functions with the GNU C library; we support them for BSD compatibility +-only. +- +- The prototypes for these functions are in `stdlib.h'. +- +- - Function: long int random (void) +- This function returns the next pseudo-random number in the +- sequence. The value returned ranges from `0' to `RAND_MAX'. +- +- *Note:* Temporarily this function was defined to return a +- `int32_t' value to indicate that the return value always contains +- 32 bits even if `long int' is wider. The standard demands it +- differently. Users must always be aware of the 32-bit limitation, +- though. +- +- - Function: void srandom (unsigned int SEED) +- The `srandom' function sets the state of the random number +- generator based on the integer SEED. If you supply a SEED value +- of `1', this will cause `random' to reproduce the default set of +- random numbers. +- +- To produce a different set of pseudo-random numbers each time your +- program runs, do `srandom (time (0))'. +- +- - Function: void * initstate (unsigned int SEED, void *STATE, size_t +- SIZE) +- The `initstate' function is used to initialize the random number +- generator state. The argument STATE is an array of SIZE bytes, +- used to hold the state information. It is initialized based on +- SEED. The size must be between 8 and 256 bytes, and should be a +- power of two. The bigger the STATE array, the better. +- +- The return value is the previous value of the state information +- array. You can use this value later as an argument to `setstate' +- to restore that state. +- +- - Function: void * setstate (void *STATE) +- The `setstate' function restores the random number state +- information STATE. The argument must have been the result of a +- previous call to INITSTATE or SETSTATE. +- +- The return value is the previous value of the state information +- array. You can use this value later as an argument to `setstate' +- to restore that state. +- +- If the function fails the return value is `NULL'. +- +- The four functions described so far in this section all work on a +-state which is shared by all threads. The state is not directly +-accessible to the user and can only be modified by these functions. +-This makes it hard to deal with situations where each thread should +-have its own pseudo-random number generator. +- +- The GNU C library contains four additional functions which contain +-the state as an explicit parameter and therefore make it possible to +-handle thread-local PRNGs. Beside this there are no difference. In +-fact, the four functions already discussed are implemented internally +-using the following interfaces. +- +- The `stdlib.h' header contains a definition of the following type: +- +- - Data Type: struct random_data +- Objects of type `struct random_data' contain the information +- necessary to represent the state of the PRNG. Although a complete +- definition of the type is present the type should be treated as +- opaque. +- +- The functions modifying the state follow exactly the already +-described functions. +- +- - Function: int random_r (struct random_data *restrict BUF, int32_t +- *restrict RESULT) +- The `random_r' function behaves exactly like the `random' function +- except that it uses and modifies the state in the object pointed +- to by the first parameter instead of the global state. +- +- - Function: int srandom_r (unsigned int SEED, struct random_data *BUF) +- The `srandom_r' function behaves exactly like the `srandom' +- function except that it uses and modifies the state in the object +- pointed to by the second parameter instead of the global state. +- +- - Function: int initstate_r (unsigned int SEED, char *restrict +- STATEBUF, size_t STATELEN, struct random_data *restrict BUF) +- The `initstate_r' function behaves exactly like the `initstate' +- function except that it uses and modifies the state in the object +- pointed to by the fourth parameter instead of the global state. +- +- - Function: int setstate_r (char *restrict STATEBUF, struct +- random_data *restrict BUF) +- The `setstate_r' function behaves exactly like the `setstate' +- function except that it uses and modifies the state in the object +- pointed to by the first parameter instead of the global state. +- +- +-File: libc.info, Node: SVID Random, Prev: BSD Random, Up: Pseudo-Random Numbers +- +-SVID Random Number Function +---------------------------- +- +- The C library on SVID systems contains yet another kind of random +-number generator functions. They use a state of 48 bits of data. The +-user can choose among a collection of functions which return the random +-bits in different forms. +- +- Generally there are two kinds of function. The first uses a state of +-the random number generator which is shared among several functions and +-by all threads of the process. The second requires the user to handle +-the state. +- +- All functions have in common that they use the same congruential +-formula with the same constants. The formula is +- +- Y = (a * X + c) mod m +- +-where X is the state of the generator at the beginning and Y the state +-at the end. `a' and `c' are constants determining the way the +-generator works. By default they are +- +- a = 0x5DEECE66D = 25214903917 +- c = 0xb = 11 +- +-but they can also be changed by the user. `m' is of course 2^48 since +-the state consists of a 48-bit array. +- +- The prototypes for these functions are in `stdlib.h'. +- +- - Function: double drand48 (void) +- This function returns a `double' value in the range of `0.0' to +- `1.0' (exclusive). The random bits are determined by the global +- state of the random number generator in the C library. +- +- Since the `double' type according to IEEE 754 has a 52-bit +- mantissa this means 4 bits are not initialized by the random number +- generator. These are (of course) chosen to be the least +- significant bits and they are initialized to `0'. +- +- - Function: double erand48 (unsigned short int XSUBI[3]) +- This function returns a `double' value in the range of `0.0' to +- `1.0' (exclusive), similarly to `drand48'. The argument is an +- array describing the state of the random number generator. +- +- This function can be called subsequently since it updates the +- array to guarantee random numbers. The array should have been +- initialized before initial use to obtain reproducible results. +- +- - Function: long int lrand48 (void) +- The `lrand48' function returns an integer value in the range of +- `0' to `2^31' (exclusive). Even if the size of the `long int' +- type can take more than 32 bits, no higher numbers are returned. +- The random bits are determined by the global state of the random +- number generator in the C library. +- +- - Function: long int nrand48 (unsigned short int XSUBI[3]) +- This function is similar to the `lrand48' function in that it +- returns a number in the range of `0' to `2^31' (exclusive) but the +- state of the random number generator used to produce the random +- bits is determined by the array provided as the parameter to the +- function. +- +- The numbers in the array are updated afterwards so that subsequent +- calls to this function yield different results (as is expected of +- a random number generator). The array should have been +- initialized before the first call to obtain reproducible results. +- +- - Function: long int mrand48 (void) +- The `mrand48' function is similar to `lrand48'. The only +- difference is that the numbers returned are in the range `-2^31' to +- `2^31' (exclusive). +- +- - Function: long int jrand48 (unsigned short int XSUBI[3]) +- The `jrand48' function is similar to `nrand48'. The only +- difference is that the numbers returned are in the range `-2^31' to +- `2^31' (exclusive). For the `xsubi' parameter the same +- requirements are necessary. +- +- The internal state of the random number generator can be initialized +-in several ways. The methods differ in the completeness of the +-information provided. +- +- - Function: void srand48 (long int SEEDVAL) +- The `srand48' function sets the most significant 32 bits of the +- internal state of the random number generator to the least +- significant 32 bits of the SEEDVAL parameter. The lower 16 bits +- are initialized to the value `0x330E'. Even if the `long int' +- type contains more than 32 bits only the lower 32 bits are used. +- +- Owing to this limitation, initialization of the state of this +- function is not very useful. But it makes it easy to use a +- construct like `srand48 (time (0))'. +- +- A side-effect of this function is that the values `a' and `c' from +- the internal state, which are used in the congruential formula, +- are reset to the default values given above. This is of +- importance once the user has called the `lcong48' function (see +- below). +- +- - Function: unsigned short int * seed48 (unsigned short int SEED16V[3]) +- The `seed48' function initializes all 48 bits of the state of the +- internal random number generator from the contents of the parameter +- SEED16V. Here the lower 16 bits of the first element of SEE16V +- initialize the least significant 16 bits of the internal state, +- the lower 16 bits of `SEED16V[1]' initialize the mid-order 16 bits +- of the state and the 16 lower bits of `SEED16V[2]' initialize the +- most significant 16 bits of the state. +- +- Unlike `srand48' this function lets the user initialize all 48 bits +- of the state. +- +- The value returned by `seed48' is a pointer to an array containing +- the values of the internal state before the change. This might be +- useful to restart the random number generator at a certain state. +- Otherwise the value can simply be ignored. +- +- As for `srand48', the values `a' and `c' from the congruential +- formula are reset to the default values. +- +- There is one more function to initialize the random number generator +-which enables you to specify even more information by allowing you to +-change the parameters in the congruential formula. +- +- - Function: void lcong48 (unsigned short int PARAM[7]) +- The `lcong48' function allows the user to change the complete state +- of the random number generator. Unlike `srand48' and `seed48', +- this function also changes the constants in the congruential +- formula. +- +- From the seven elements in the array PARAM the least significant +- 16 bits of the entries `PARAM[0]' to `PARAM[2]' determine the +- initial state, the least significant 16 bits of `PARAM[3]' to +- `PARAM[5]' determine the 48 bit constant `a' and `PARAM[6]' +- determines the 16-bit value `c'. +- +- All the above functions have in common that they use the global +-parameters for the congruential formula. In multi-threaded programs it +-might sometimes be useful to have different parameters in different +-threads. For this reason all the above functions have a counterpart +-which works on a description of the random number generator in the +-user-supplied buffer instead of the global state. +- +- Please note that it is no problem if several threads use the global +-state if all threads use the functions which take a pointer to an array +-containing the state. The random numbers are computed following the +-same loop but if the state in the array is different all threads will +-obtain an individual random number generator. +- +- The user-supplied buffer must be of type `struct drand48_data'. +-This type should be regarded as opaque and not manipulated directly. +- +- - Function: int drand48_r (struct drand48_data *BUFFER, double *RESULT) +- This function is equivalent to the `drand48' function with the +- difference that it does not modify the global random number +- generator parameters but instead the parameters in the buffer +- supplied through the pointer BUFFER. The random number is +- returned in the variable pointed to by RESULT. +- +- The return value of the function indicates whether the call +- succeeded. If the value is less than `0' an error occurred and +- ERRNO is set to indicate the problem. +- +- This function is a GNU extension and should not be used in portable +- programs. +- +- - Function: int erand48_r (unsigned short int XSUBI[3], struct +- drand48_data *BUFFER, double *RESULT) +- The `erand48_r' function works like `erand48', but in addition it +- takes an argument BUFFER which describes the random number +- generator. The state of the random number generator is taken from +- the `xsubi' array, the parameters for the congruential formula +- from the global random number generator data. The random number +- is returned in the variable pointed to by RESULT. +- +- The return value is non-negative if the call succeeded. +- +- This function is a GNU extension and should not be used in portable +- programs. +- +- - Function: int lrand48_r (struct drand48_data *BUFFER, double *RESULT) +- This function is similar to `lrand48', but in addition it takes a +- pointer to a buffer describing the state of the random number +- generator just like `drand48'. +- +- If the return value of the function is non-negative the variable +- pointed to by RESULT contains the result. Otherwise an error +- occurred. +- +- This function is a GNU extension and should not be used in portable +- programs. +- +- - Function: int nrand48_r (unsigned short int XSUBI[3], struct +- drand48_data *BUFFER, long int *RESULT) +- The `nrand48_r' function works like `nrand48' in that it produces +- a random number in the range `0' to `2^31'. But instead of using +- the global parameters for the congruential formula it uses the +- information from the buffer pointed to by BUFFER. The state is +- described by the values in XSUBI. +- +- If the return value is non-negative the variable pointed to by +- RESULT contains the result. +- +- This function is a GNU extension and should not be used in portable +- programs. +- +- - Function: int mrand48_r (struct drand48_data *BUFFER, double *RESULT) +- This function is similar to `mrand48' but like the other reentrant +- functions it uses the random number generator described by the +- value in the buffer pointed to by BUFFER. +- +- If the return value is non-negative the variable pointed to by +- RESULT contains the result. +- +- This function is a GNU extension and should not be used in portable +- programs. +- +- - Function: int jrand48_r (unsigned short int XSUBI[3], struct +- drand48_data *BUFFER, long int *RESULT) +- The `jrand48_r' function is similar to `jrand48'. Like the other +- reentrant functions of this function family it uses the +- congruential formula parameters from the buffer pointed to by +- BUFFER. +- +- If the return value is non-negative the variable pointed to by +- RESULT contains the result. +- +- This function is a GNU extension and should not be used in portable +- programs. +- +- Before any of the above functions are used the buffer of type +-`struct drand48_data' should be initialized. The easiest way to do +-this is to fill the whole buffer with null bytes, e.g. by +- +- memset (buffer, '\0', sizeof (struct drand48_data)); +- +-Using any of the reentrant functions of this family now will +-automatically initialize the random number generator to the default +-values for the state and the parameters of the congruential formula. +- +- The other possibility is to use any of the functions which explicitly +-initialize the buffer. Though it might be obvious how to initialize the +-buffer from looking at the parameter to the function, it is highly +-recommended to use these functions since the result might not always be +-what you expect. +- +- - Function: int srand48_r (long int SEEDVAL, struct drand48_data +- *BUFFER) +- The description of the random number generator represented by the +- information in BUFFER is initialized similarly to what the function +- `srand48' does. The state is initialized from the parameter +- SEEDVAL and the parameters for the congruential formula are +- initialized to their default values. +- +- If the return value is non-negative the function call succeeded. +- +- This function is a GNU extension and should not be used in portable +- programs. +- +- - Function: int seed48_r (unsigned short int SEED16V[3], struct +- drand48_data *BUFFER) +- This function is similar to `srand48_r' but like `seed48' it +- initializes all 48 bits of the state from the parameter SEED16V. +- +- If the return value is non-negative the function call succeeded. +- It does not return a pointer to the previous state of the random +- number generator like the `seed48' function does. If the user +- wants to preserve the state for a later re-run s/he can copy the +- whole buffer pointed to by BUFFER. +- +- This function is a GNU extension and should not be used in portable +- programs. +- +- - Function: int lcong48_r (unsigned short int PARAM[7], struct +- drand48_data *BUFFER) +- This function initializes all aspects of the random number +- generator described in BUFFER with the data in PARAM. Here it is +- especially true that the function does more than just copying the +- contents of PARAM and BUFFER. More work is required and therefore +- it is important to use this function rather than initializing the +- random number generator directly. +- +- If the return value is non-negative the function call succeeded. +- +- This function is a GNU extension and should not be used in portable +- programs. +- +- +-File: libc.info, Node: FP Function Optimizations, Prev: Pseudo-Random Numbers, Up: Mathematics +- +-Is Fast Code or Small Code preferred? +-===================================== +- +- If an application uses many floating point functions it is often the +-case that the cost of the function calls themselves is not negligible. +-Modern processors can often execute the operations themselves very +-fast, but the function call disrupts the instruction pipeline. +- +- For this reason the GNU C Library provides optimizations for many of +-the frequently-used math functions. When GNU CC is used and the user +-activates the optimizer, several new inline functions and macros are +-defined. These new functions and macros have the same names as the +-library functions and so are used instead of the latter. In the case of +-inline functions the compiler will decide whether it is reasonable to +-use them, and this decision is usually correct. +- +- This means that no calls to the library functions may be necessary, +-and can increase the speed of generated code significantly. The +-drawback is that code size will increase, and the increase is not +-always negligible. +- +- There are two kind of inline functions: Those that give the same +-result as the library functions and others that might not set `errno' +-and might have a reduced precision and/or argument range in comparison +-with the library functions. The latter inline functions are only +-available if the flag `-ffast-math' is given to GNU CC. +- +- In cases where the inline functions and macros are not wanted the +-symbol `__NO_MATH_INLINES' should be defined before any system header is +-included. This will ensure that only library functions are used. Of +-course, it can be determined for each file in the project whether +-giving this option is preferable or not. +- +- Not all hardware implements the entire IEEE 754 standard, and even +-if it does there may be a substantial performance penalty for using some +-of its features. For example, enabling traps on some processors forces +-the FPU to run un-pipelined, which can more than double calculation +-time. +- +- +-File: libc.info, Node: Arithmetic, Next: Date and Time, Prev: Mathematics, Up: Top +- +-Arithmetic Functions +-******************** +- +- This chapter contains information about functions for doing basic +-arithmetic operations, such as splitting a float into its integer and +-fractional parts or retrieving the imaginary part of a complex value. +-These functions are declared in the header files `math.h' and +-`complex.h'. +- +-* Menu: +- +-* Integers:: Basic integer types and concepts +-* Integer Division:: Integer division with guaranteed rounding. +-* Floating Point Numbers:: Basic concepts. IEEE 754. +-* Floating Point Classes:: The five kinds of floating-point number. +-* Floating Point Errors:: When something goes wrong in a calculation. +-* Rounding:: Controlling how results are rounded. +-* Control Functions:: Saving and restoring the FPU's state. +-* Arithmetic Functions:: Fundamental operations provided by the library. +-* Complex Numbers:: The types. Writing complex constants. +-* Operations on Complex:: Projection, conjugation, decomposition. +-* Parsing of Numbers:: Converting strings to numbers. +-* System V Number Conversion:: An archaic way to convert numbers to strings. +- +- +-File: libc.info, Node: Integers, Next: Integer Division, Up: Arithmetic +- +-Integers +-======== +- +- The C language defines several integer data types: integer, short +-integer, long integer, and character, all in both signed and unsigned +-varieties. The GNU C compiler extends the language to contain long +-long integers as well. +- +- The C integer types were intended to allow code to be portable among +-machines with different inherent data sizes (word sizes), so each type +-may have different ranges on different machines. The problem with this +-is that a program often needs to be written for a particular range of +-integers, and sometimes must be written for a particular size of +-storage, regardless of what machine the program runs on. +- +- To address this problem, the GNU C library contains C type +-definitions you can use to declare integers that meet your exact needs. +-Because the GNU C library header files are customized to a specific +-machine, your program source code doesn't have to be. +- +- These `typedef's are in `stdint.h'. +- +- If you require that an integer be represented in exactly N bits, use +-one of the following types, with the obvious mapping to bit size and +-signedness: +- +- * int8_t +- +- * int16_t +- +- * int32_t +- +- * int64_t +- +- * uint8_t +- +- * uint16_t +- +- * uint32_t +- +- * uint64_t +- +- If your C compiler and target machine do not allow integers of a +-certain size, the corresponding above type does not exist. +- +- If you don't need a specific storage size, but want the smallest data +-structure with _at least_ N bits, use one of these: +- +- * int_least8_t +- +- * int_least16_t +- +- * int_least32_t +- +- * int_least64_t +- +- * uint_least8_t +- +- * uint_least16_t +- +- * uint_least32_t +- +- * uint_least64_t +- +- If you don't need a specific storage size, but want the data +-structure that allows the fastest access while having at least N bits +-(and among data structures with the same access speed, the smallest +-one), use one of these: +- +- * int_fast8_t +- +- * int_fast16_t +- +- * int_fast32_t +- +- * int_fast64_t +- +- * uint_fast8_t +- +- * uint_fast16_t +- +- * uint_fast32_t +- +- * uint_fast64_t +- +- If you want an integer with the widest range possible on the +-platform on which it is being used, use one of the following. If you +-use these, you should write code that takes into account the variable +-size and range of the integer. +- +- * intmax_t +- +- * uintmax_t +- +- The GNU C library also provides macros that tell you the maximum and +-minimum possible values for each integer data type. The macro names +-follow these examples: `INT32_MAX', `UINT8_MAX', `INT_FAST32_MIN', +-`INT_LEAST64_MIN', `UINTMAX_MAX', `INTMAX_MAX', `INTMAX_MIN'. Note +-that there are no macros for unsigned integer minima. These are always +-zero. +- +- There are similar macros for use with C's built in integer types +-which should come with your C compiler. These are described in *Note +-Data Type Measurements::. +- +- Don't forget you can use the C `sizeof' function with any of these +-data types to get the number of bytes of storage each uses. +- +- +-File: libc.info, Node: Integer Division, Next: Floating Point Numbers, Prev: Integers, Up: Arithmetic +- +-Integer Division +-================ +- +- This section describes functions for performing integer division. +-These functions are redundant when GNU CC is used, because in GNU C the +-`/' operator always rounds towards zero. But in other C +-implementations, `/' may round differently with negative arguments. +-`div' and `ldiv' are useful because they specify how to round the +-quotient: towards zero. The remainder has the same sign as the +-numerator. +- +- These functions are specified to return a result R such that the +-value `R.quot*DENOMINATOR + R.rem' equals NUMERATOR. +- +- To use these facilities, you should include the header file +-`stdlib.h' in your program. +- +- - Data Type: div_t +- This is a structure type used to hold the result returned by the +- `div' function. It has the following members: +- +- `int quot' +- The quotient from the division. +- +- `int rem' +- The remainder from the division. +- +- - Function: div_t div (int NUMERATOR, int DENOMINATOR) +- This function `div' computes the quotient and remainder from the +- division of NUMERATOR by DENOMINATOR, returning the result in a +- structure of type `div_t'. +- +- If the result cannot be represented (as in a division by zero), the +- behavior is undefined. +- +- Here is an example, albeit not a very useful one. +- +- div_t result; +- result = div (20, -6); +- +- Now `result.quot' is `-3' and `result.rem' is `2'. +- +- - Data Type: ldiv_t +- This is a structure type used to hold the result returned by the +- `ldiv' function. It has the following members: +- +- `long int quot' +- The quotient from the division. +- +- `long int rem' +- The remainder from the division. +- +- (This is identical to `div_t' except that the components are of +- type `long int' rather than `int'.) +- +- - Function: ldiv_t ldiv (long int NUMERATOR, long int DENOMINATOR) +- The `ldiv' function is similar to `div', except that the arguments +- are of type `long int' and the result is returned as a structure +- of type `ldiv_t'. +- +- - Data Type: lldiv_t +- This is a structure type used to hold the result returned by the +- `lldiv' function. It has the following members: +- +- `long long int quot' +- The quotient from the division. +- +- `long long int rem' +- The remainder from the division. +- +- (This is identical to `div_t' except that the components are of +- type `long long int' rather than `int'.) +- +- - Function: lldiv_t lldiv (long long int NUMERATOR, long long int +- DENOMINATOR) +- The `lldiv' function is like the `div' function, but the arguments +- are of type `long long int' and the result is returned as a +- structure of type `lldiv_t'. +- +- The `lldiv' function was added in ISO C99. +- +- - Data Type: imaxdiv_t +- This is a structure type used to hold the result returned by the +- `imaxdiv' function. It has the following members: +- +- `intmax_t quot' +- The quotient from the division. +- +- `intmax_t rem' +- The remainder from the division. +- +- (This is identical to `div_t' except that the components are of +- type `intmax_t' rather than `int'.) +- +- See *Note Integers:: for a description of the `intmax_t' type. +- +- +- - Function: imaxdiv_t imaxdiv (intmax_t NUMERATOR, intmax_t +- DENOMINATOR) +- The `imaxdiv' function is like the `div' function, but the +- arguments are of type `intmax_t' and the result is returned as a +- structure of type `imaxdiv_t'. +- +- See *Note Integers:: for a description of the `intmax_t' type. +- +- The `imaxdiv' function was added in ISO C99. +- +- +-File: libc.info, Node: Floating Point Numbers, Next: Floating Point Classes, Prev: Integer Division, Up: Arithmetic +- +-Floating Point Numbers +-====================== +- +- Most computer hardware has support for two different kinds of +-numbers: integers (...-3, -2, -1, 0, 1, 2, 3...) and floating-point +-numbers. Floating-point numbers have three parts: the "mantissa", the +-"exponent", and the "sign bit". The real number represented by a +-floating-point value is given by (s ? -1 : 1) * 2^e * M where s is the +-sign bit, e the exponent, and M the mantissa. *Note Floating Point +-Concepts::, for details. (It is possible to have a different "base" +-for the exponent, but all modern hardware uses 2.) +- +- Floating-point numbers can represent a finite subset of the real +-numbers. While this subset is large enough for most purposes, it is +-important to remember that the only reals that can be represented +-exactly are rational numbers that have a terminating binary expansion +-shorter than the width of the mantissa. Even simple fractions such as +-1/5 can only be approximated by floating point. +- +- Mathematical operations and functions frequently need to produce +-values that are not representable. Often these values can be +-approximated closely enough for practical purposes, but sometimes they +-can't. Historically there was no way to tell when the results of a +-calculation were inaccurate. Modern computers implement the IEEE 754 +-standard for numerical computations, which defines a framework for +-indicating to the program when the results of calculation are not +-trustworthy. This framework consists of a set of "exceptions" that +-indicate why a result could not be represented, and the special values +-"infinity" and "not a number" (NaN). +- +- +-File: libc.info, Node: Floating Point Classes, Next: Floating Point Errors, Prev: Floating Point Numbers, Up: Arithmetic +- +-Floating-Point Number Classification Functions +-============================================== +- +- ISO C99 defines macros that let you determine what sort of +-floating-point number a variable holds. +- +- - Macro: int fpclassify (_float-type_ X) +- This is a generic macro which works on all floating-point types and +- which returns a value of type `int'. The possible values are: +- +- `FP_NAN' +- The floating-point number X is "Not a Number" (*note Infinity +- and NaN::) +- +- `FP_INFINITE' +- The value of X is either plus or minus infinity (*note +- Infinity and NaN::) +- +- `FP_ZERO' +- The value of X is zero. In floating-point formats like +- IEEE 754, where zero can be signed, this value is also +- returned if X is negative zero. +- +- `FP_SUBNORMAL' +- Numbers whose absolute value is too small to be represented +- in the normal format are represented in an alternate, +- "denormalized" format (*note Floating Point Concepts::). +- This format is less precise but can represent values closer +- to zero. `fpclassify' returns this value for values of X in +- this alternate format. +- +- `FP_NORMAL' +- This value is returned for all other values of X. It +- indicates that there is nothing special about the number. +- +- +- `fpclassify' is most useful if more than one property of a number +-must be tested. There are more specific macros which only test one +-property at a time. Generally these macros execute faster than +-`fpclassify', since there is special hardware support for them. You +-should therefore use the specific macros whenever possible. +- +- - Macro: int isfinite (_float-type_ X) +- This macro returns a nonzero value if X is finite: not plus or +- minus infinity, and not NaN. It is equivalent to +- +- (fpclassify (x) != FP_NAN && fpclassify (x) != FP_INFINITE) +- +- `isfinite' is implemented as a macro which accepts any +- floating-point type. +- +- - Macro: int isnormal (_float-type_ X) +- This macro returns a nonzero value if X is finite and normalized. +- It is equivalent to +- +- (fpclassify (x) == FP_NORMAL) +- +- - Macro: int isnan (_float-type_ X) +- This macro returns a nonzero value if X is NaN. It is equivalent +- to +- +- (fpclassify (x) == FP_NAN) +- +- Another set of floating-point classification functions was provided +-by BSD. The GNU C library also supports these functions; however, we +-recommend that you use the ISO C99 macros in new code. Those are +-standard and will be available more widely. Also, since they are +-macros, you do not have to worry about the type of their argument. +- +- - Function: int isinf (double X) +- - Function: int isinff (float X) +- - Function: int isinfl (long double X) +- This function returns `-1' if X represents negative infinity, `1' +- if X represents positive infinity, and `0' otherwise. +- +- - Function: int isnan (double X) +- - Function: int isnanf (float X) +- - Function: int isnanl (long double X) +- This function returns a nonzero value if X is a "not a number" +- value, and zero otherwise. +- +- *Note:* The `isnan' macro defined by ISO C99 overrides the BSD +- function. This is normally not a problem, because the two +- routines behave identically. However, if you really need to get +- the BSD function for some reason, you can write +- +- (isnan) (x) +- +- - Function: int finite (double X) +- - Function: int finitef (float X) +- - Function: int finitel (long double X) +- This function returns a nonzero value if X is finite or a "not a +- number" value, and zero otherwise. +- +- *Portability Note:* The functions listed in this section are BSD +-extensions. +- +- +-File: libc.info, Node: Floating Point Errors, Next: Rounding, Prev: Floating Point Classes, Up: Arithmetic +- +-Errors in Floating-Point Calculations +-===================================== +- +-* Menu: +- +-* FP Exceptions:: IEEE 754 math exceptions and how to detect them. +-* Infinity and NaN:: Special values returned by calculations. +-* Status bit operations:: Checking for exceptions after the fact. +-* Math Error Reporting:: How the math functions report errors. +- +- +-File: libc.info, Node: FP Exceptions, Next: Infinity and NaN, Up: Floating Point Errors +- +-FP Exceptions +-------------- +- +- The IEEE 754 standard defines five "exceptions" that can occur +-during a calculation. Each corresponds to a particular sort of error, +-such as overflow. +- +- When exceptions occur (when exceptions are "raised", in the language +-of the standard), one of two things can happen. By default the +-exception is simply noted in the floating-point "status word", and the +-program continues as if nothing had happened. The operation produces a +-default value, which depends on the exception (see the table below). +-Your program can check the status word to find out which exceptions +-happened. +- +- Alternatively, you can enable "traps" for exceptions. In that case, +-when an exception is raised, your program will receive the `SIGFPE' +-signal. The default action for this signal is to terminate the +-program. *Note Signal Handling::, for how you can change the effect of +-the signal. +- +- In the System V math library, the user-defined function `matherr' is +-called when certain exceptions occur inside math library functions. +-However, the Unix98 standard deprecates this interface. We support it +-for historical compatibility, but recommend that you do not use it in +-new programs. +- +-The exceptions defined in IEEE 754 are: +- +-`Invalid Operation' +- This exception is raised if the given operands are invalid for the +- operation to be performed. Examples are (see IEEE 754, section 7): +- 1. Addition or subtraction: oo - oo. (But oo + oo = oo). +- +- 2. Multiplication: 0 * oo. +- +- 3. Division: 0/0 or oo/oo. +- +- 4. Remainder: x REM y, where y is zero or x is infinite. +- +- 5. Square root if the operand is less then zero. More +- generally, any mathematical function evaluated outside its +- domain produces this exception. +- +- 6. Conversion of a floating-point number to an integer or decimal +- string, when the number cannot be represented in the target +- format (due to overflow, infinity, or NaN). +- +- 7. Conversion of an unrecognizable input string. +- +- 8. Comparison via predicates involving < or >, when one or other +- of the operands is NaN. You can prevent this exception by +- using the unordered comparison functions instead; see *Note +- FP Comparison Functions::. +- +- If the exception does not trap, the result of the operation is NaN. +- +-`Division by Zero' +- This exception is raised when a finite nonzero number is divided +- by zero. If no trap occurs the result is either +oo or -oo, +- depending on the signs of the operands. +- +-`Overflow' +- This exception is raised whenever the result cannot be represented +- as a finite value in the precision format of the destination. If +- no trap occurs the result depends on the sign of the intermediate +- result and the current rounding mode (IEEE 754, section 7.3): +- 1. Round to nearest carries all overflows to oo with the sign of +- the intermediate result. +- +- 2. Round toward 0 carries all overflows to the largest +- representable finite number with the sign of the intermediate +- result. +- +- 3. Round toward -oo carries positive overflows to the largest +- representable finite number and negative overflows to -oo. +- +- 4. Round toward oo carries negative overflows to the most +- negative representable finite number and positive overflows +- to oo. +- +- Whenever the overflow exception is raised, the inexact exception +- is also raised. +- +-`Underflow' +- The underflow exception is raised when an intermediate result is +- too small to be calculated accurately, or if the operation's +- result rounded to the destination precision is too small to be +- normalized. +- +- When no trap is installed for the underflow exception, underflow is +- signaled (via the underflow flag) only when both tininess and loss +- of accuracy have been detected. If no trap handler is installed +- the operation continues with an imprecise small value, or zero if +- the destination precision cannot hold the small exact result. +- +-`Inexact' +- This exception is signalled if a rounded result is not exact (such +- as when calculating the square root of two) or a result overflows +- without an overflow trap. +- +- +-File: libc.info, Node: Infinity and NaN, Next: Status bit operations, Prev: FP Exceptions, Up: Floating Point Errors +- +-Infinity and NaN +----------------- +- +- IEEE 754 floating point numbers can represent positive or negative +-infinity, and "NaN" (not a number). These three values arise from +-calculations whose result is undefined or cannot be represented +-accurately. You can also deliberately set a floating-point variable to +-any of them, which is sometimes useful. Some examples of calculations +-that produce infinity or NaN: +- +- 1/0 = oo +- log (0) = -oo +- sqrt (-1) = NaN +- +- When a calculation produces any of these values, an exception also +-occurs; see *Note FP Exceptions::. +- +- The basic operations and math functions all accept infinity and NaN +-and produce sensible output. Infinities propagate through calculations +-as one would expect: for example, 2 + oo = oo, 4/oo = 0, atan (oo) = +-pi/2. NaN, on the other hand, infects any calculation that involves +-it. Unless the calculation would produce the same result no matter +-what real value replaced NaN, the result is NaN. +- +- In comparison operations, positive infinity is larger than all values +-except itself and NaN, and negative infinity is smaller than all values +-except itself and NaN. NaN is "unordered": it is not equal to, greater +-than, or less than anything, _including itself_. `x == x' is false if +-the value of `x' is NaN. You can use this to test whether a value is +-NaN or not, but the recommended way to test for NaN is with the `isnan' +-function (*note Floating Point Classes::). In addition, `<', `>', +-`<=', and `>=' will raise an exception when applied to NaNs. +- +- `math.h' defines macros that allow you to explicitly set a variable +-to infinity or NaN. +- +- - Macro: float INFINITY +- An expression representing positive infinity. It is equal to the +- value produced by mathematical operations like `1.0 / 0.0'. +- `-INFINITY' represents negative infinity. +- +- You can test whether a floating-point value is infinite by +- comparing it to this macro. However, this is not recommended; you +- should use the `isfinite' macro instead. *Note Floating Point +- Classes::. +- +- This macro was introduced in the ISO C99 standard. +- +- - Macro: float NAN +- An expression representing a value which is "not a number". This +- macro is a GNU extension, available only on machines that support +- the "not a number" value--that is to say, on all machines that +- support IEEE floating point. +- +- You can use `#ifdef NAN' to test whether the machine supports NaN. +- (Of course, you must arrange for GNU extensions to be visible, +- such as by defining `_GNU_SOURCE', and then you must include +- `math.h'.) +- +- IEEE 754 also allows for another unusual value: negative zero. This +-value is produced when you divide a positive number by negative +-infinity, or when a negative result is smaller than the limits of +-representation. Negative zero behaves identically to zero in all +-calculations, unless you explicitly test the sign bit with `signbit' or +-`copysign'. +- +- +-File: libc.info, Node: Status bit operations, Next: Math Error Reporting, Prev: Infinity and NaN, Up: Floating Point Errors +- +-Examining the FPU status word +------------------------------ +- +- ISO C99 defines functions to query and manipulate the floating-point +-status word. You can use these functions to check for untrapped +-exceptions when it's convenient, rather than worrying about them in the +-middle of a calculation. +- +- These constants represent the various IEEE 754 exceptions. Not all +-FPUs report all the different exceptions. Each constant is defined if +-and only if the FPU you are compiling for supports that exception, so +-you can test for FPU support with `#ifdef'. They are defined in +-`fenv.h'. +- +-`FE_INEXACT' +- The inexact exception. +- +-`FE_DIVBYZERO' +- The divide by zero exception. +- +-`FE_UNDERFLOW' +- The underflow exception. +- +-`FE_OVERFLOW' +- The overflow exception. +- +-`FE_INVALID' +- The invalid exception. +- +- The macro `FE_ALL_EXCEPT' is the bitwise OR of all exception macros +-which are supported by the FP implementation. +- +- These functions allow you to clear exception flags, test for +-exceptions, and save and restore the set of exceptions flagged. +- +- - Function: int feclearexcept (int EXCEPTS) +- This function clears all of the supported exception flags +- indicated by EXCEPTS. +- +- The function returns zero in case the operation was successful, a +- non-zero value otherwise. +- +- - Function: int feraiseexcept (int EXCEPTS) +- This function raises the supported exceptions indicated by +- EXCEPTS. If more than one exception bit in EXCEPTS is set the +- order in which the exceptions are raised is undefined except that +- overflow (`FE_OVERFLOW') or underflow (`FE_UNDERFLOW') are raised +- before inexact (`FE_INEXACT'). Whether for overflow or underflow +- the inexact exception is also raised is also implementation +- dependent. +- +- The function returns zero in case the operation was successful, a +- non-zero value otherwise. +- +- - Function: int fetestexcept (int EXCEPTS) +- Test whether the exception flags indicated by the parameter EXCEPT +- are currently set. If any of them are, a nonzero value is returned +- which specifies which exceptions are set. Otherwise the result is +- zero. +- +- To understand these functions, imagine that the status word is an +-integer variable named STATUS. `feclearexcept' is then equivalent to +-`status &= ~excepts' and `fetestexcept' is equivalent to `(status & +-excepts)'. The actual implementation may be very different, of course. +- +- Exception flags are only cleared when the program explicitly +-requests it, by calling `feclearexcept'. If you want to check for +-exceptions from a set of calculations, you should clear all the flags +-first. Here is a simple example of the way to use `fetestexcept': +- +- { +- double f; +- int raised; +- feclearexcept (FE_ALL_EXCEPT); +- f = compute (); +- raised = fetestexcept (FE_OVERFLOW | FE_INVALID); +- if (raised & FE_OVERFLOW) { /* ... */ } +- if (raised & FE_INVALID) { /* ... */ } +- /* ... */ +- } +- +- You cannot explicitly set bits in the status word. You can, however, +-save the entire status word and restore it later. This is done with the +-following functions: +- +- - Function: int fegetexceptflag (fexcept_t *FLAGP, int EXCEPTS) +- This function stores in the variable pointed to by FLAGP an +- implementation-defined value representing the current setting of +- the exception flags indicated by EXCEPTS. +- +- The function returns zero in case the operation was successful, a +- non-zero value otherwise. +- +- - Function: int fesetexceptflag (const fexcept_t *FLAGP, int +- EXCEPTS) This function restores the flags for the exceptions +- indicated by EXCEPTS to the values stored in the variable pointed +- to by FLAGP. +- +- The function returns zero in case the operation was successful, a +- non-zero value otherwise. +- +- Note that the value stored in `fexcept_t' bears no resemblance to +-the bit mask returned by `fetestexcept'. The type may not even be an +-integer. Do not attempt to modify an `fexcept_t' variable. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-34 glibc-2.3.2-200304020432/manual/libc.info-34 +--- glibc-2.3.2/manual/libc.info-34 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-34 Thu Jan 1 01:00:00 1970 +@@ -1,1120 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Math Error Reporting, Prev: Status bit operations, Up: Floating Point Errors +- +-Error Reporting by Mathematical Functions +------------------------------------------ +- +- Many of the math functions are defined only over a subset of the +-real or complex numbers. Even if they are mathematically defined, +-their result may be larger or smaller than the range representable by +-their return type. These are known as "domain errors", "overflows", and +-"underflows", respectively. Math functions do several things when one +-of these errors occurs. In this manual we will refer to the complete +-response as "signalling" a domain error, overflow, or underflow. +- +- When a math function suffers a domain error, it raises the invalid +-exception and returns NaN. It also sets ERRNO to `EDOM'; this is for +-compatibility with old systems that do not support IEEE 754 exception +-handling. Likewise, when overflow occurs, math functions raise the +-overflow exception and return oo or -oo as appropriate. They also set +-ERRNO to `ERANGE'. When underflow occurs, the underflow exception is +-raised, and zero (appropriately signed) is returned. ERRNO may be set +-to `ERANGE', but this is not guaranteed. +- +- Some of the math functions are defined mathematically to result in a +-complex value over parts of their domains. The most familiar example of +-this is taking the square root of a negative number. The complex math +-functions, such as `csqrt', will return the appropriate complex value +-in this case. The real-valued functions, such as `sqrt', will signal a +-domain error. +- +- Some older hardware does not support infinities. On that hardware, +-overflows instead return a particular very large number (usually the +-largest representable number). `math.h' defines macros you can use to +-test for overflow on both old and new hardware. +- +- - Macro: double HUGE_VAL +- - Macro: float HUGE_VALF +- - Macro: long double HUGE_VALL +- An expression representing a particular very large number. On +- machines that use IEEE 754 floating point format, `HUGE_VAL' is +- infinity. On other machines, it's typically the largest positive +- number that can be represented. +- +- Mathematical functions return the appropriately typed version of +- `HUGE_VAL' or `-HUGE_VAL' when the result is too large to be +- represented. +- +- +-File: libc.info, Node: Rounding, Next: Control Functions, Prev: Floating Point Errors, Up: Arithmetic +- +-Rounding Modes +-============== +- +- Floating-point calculations are carried out internally with extra +-precision, and then rounded to fit into the destination type. This +-ensures that results are as precise as the input data. IEEE 754 +-defines four possible rounding modes: +- +-Round to nearest. +- This is the default mode. It should be used unless there is a +- specific need for one of the others. In this mode results are +- rounded to the nearest representable value. If the result is +- midway between two representable values, the even representable is +- chosen. "Even" here means the lowest-order bit is zero. This +- rounding mode prevents statistical bias and guarantees numeric +- stability: round-off errors in a lengthy calculation will remain +- smaller than half of `FLT_EPSILON'. +- +-Round toward plus Infinity. +- All results are rounded to the smallest representable value which +- is greater than the result. +- +-Round toward minus Infinity. +- All results are rounded to the largest representable value which +- is less than the result. +- +-Round toward zero. +- All results are rounded to the largest representable value whose +- magnitude is less than that of the result. In other words, if the +- result is negative it is rounded up; if it is positive, it is +- rounded down. +- +-`fenv.h' defines constants which you can use to refer to the various +-rounding modes. Each one will be defined if and only if the FPU +-supports the corresponding rounding mode. +- +-`FE_TONEAREST' +- Round to nearest. +- +-`FE_UPWARD' +- Round toward +oo. +- +-`FE_DOWNWARD' +- Round toward -oo. +- +-`FE_TOWARDZERO' +- Round toward zero. +- +- Underflow is an unusual case. Normally, IEEE 754 floating point +-numbers are always normalized (*note Floating Point Concepts::). +-Numbers smaller than 2^r (where r is the minimum exponent, +-`FLT_MIN_RADIX-1' for FLOAT) cannot be represented as normalized +-numbers. Rounding all such numbers to zero or 2^r would cause some +-algorithms to fail at 0. Therefore, they are left in denormalized +-form. That produces loss of precision, since some bits of the mantissa +-are stolen to indicate the decimal point. +- +- If a result is too small to be represented as a denormalized number, +-it is rounded to zero. However, the sign of the result is preserved; if +-the calculation was negative, the result is "negative zero". Negative +-zero can also result from some operations on infinity, such as 4/-oo. +-Negative zero behaves identically to zero except when the `copysign' or +-`signbit' functions are used to check the sign bit directly. +- +- At any time one of the above four rounding modes is selected. You +-can find out which one with this function: +- +- - Function: int fegetround (void) +- Returns the currently selected rounding mode, represented by one +- of the values of the defined rounding mode macros. +- +-To change the rounding mode, use this function: +- +- - Function: int fesetround (int ROUND) +- Changes the currently selected rounding mode to ROUND. If ROUND +- does not correspond to one of the supported rounding modes nothing +- is changed. `fesetround' returns zero if it changed the rounding +- mode, a nonzero value if the mode is not supported. +- +- You should avoid changing the rounding mode if possible. It can be +-an expensive operation; also, some hardware requires you to compile your +-program differently for it to work. The resulting code may run slower. +-See your compiler documentation for details. +- +- +-File: libc.info, Node: Control Functions, Next: Arithmetic Functions, Prev: Rounding, Up: Arithmetic +- +-Floating-Point Control Functions +-================================ +- +- IEEE 754 floating-point implementations allow the programmer to +-decide whether traps will occur for each of the exceptions, by setting +-bits in the "control word". In C, traps result in the program +-receiving the `SIGFPE' signal; see *Note Signal Handling::. +- +- *Note:* IEEE 754 says that trap handlers are given details of the +-exceptional situation, and can set the result value. C signals do not +-provide any mechanism to pass this information back and forth. +-Trapping exceptions in C is therefore not very useful. +- +- It is sometimes necessary to save the state of the floating-point +-unit while you perform some calculation. The library provides functions +-which save and restore the exception flags, the set of exceptions that +-generate traps, and the rounding mode. This information is known as the +-"floating-point environment". +- +- The functions to save and restore the floating-point environment all +-use a variable of type `fenv_t' to store information. This type is +-defined in `fenv.h'. Its size and contents are implementation-defined. +-You should not attempt to manipulate a variable of this type directly. +- +- To save the state of the FPU, use one of these functions: +- +- - Function: int fegetenv (fenv_t *ENVP) +- Store the floating-point environment in the variable pointed to by +- ENVP. +- +- The function returns zero in case the operation was successful, a +- non-zero value otherwise. +- +- - Function: int feholdexcept (fenv_t *ENVP) +- Store the current floating-point environment in the object pointed +- to by ENVP. Then clear all exception flags, and set the FPU to +- trap no exceptions. Not all FPUs support trapping no exceptions; +- if `feholdexcept' cannot set this mode, it returns nonzero value. +- If it succeeds, it returns zero. +- +- The functions which restore the floating-point environment can take +-these kinds of arguments: +- +- * Pointers to `fenv_t' objects, which were initialized previously by +- a call to `fegetenv' or `feholdexcept'. +- +- * The special macro `FE_DFL_ENV' which represents the floating-point +- environment as it was available at program start. +- +- * Implementation defined macros with names starting with `FE_' and +- having type `fenv_t *'. +- +- If possible, the GNU C Library defines a macro `FE_NOMASK_ENV' +- which represents an environment where every exception raised +- causes a trap to occur. You can test for this macro using +- `#ifdef'. It is only defined if `_GNU_SOURCE' is defined. +- +- Some platforms might define other predefined environments. +- +-To set the floating-point environment, you can use either of these +-functions: +- +- - Function: int fesetenv (const fenv_t *ENVP) +- Set the floating-point environment to that described by ENVP. +- +- The function returns zero in case the operation was successful, a +- non-zero value otherwise. +- +- - Function: int feupdateenv (const fenv_t *ENVP) +- Like `fesetenv', this function sets the floating-point environment +- to that described by ENVP. However, if any exceptions were +- flagged in the status word before `feupdateenv' was called, they +- remain flagged after the call. In other words, after `feupdateenv' +- is called, the status word is the bitwise OR of the previous +- status word and the one saved in ENVP. +- +- The function returns zero in case the operation was successful, a +- non-zero value otherwise. +- +-To control for individual exceptions if raising them causes a trap to +-occur, you can use the following two functions. +- +- *Portability Note:* These functions are all GNU extensions. +- +- - Function: int feenableexcept (int EXCEPTS) +- This functions enables traps for each of the exceptions as +- indicated by the parameter EXCEPT. The individual excepetions are +- described in *Note Status bit operations::. Only the specified +- exceptions are enabled, the status of the other exceptions is not +- changed. +- +- The function returns the previous enabled exceptions in case the +- operation was successful, `-1' otherwise. +- +- - Function: int fedisableexcept (int EXCEPTS) +- This functions disables traps for each of the exceptions as +- indicated by the parameter EXCEPT. The individual excepetions are +- described in *Note Status bit operations::. Only the specified +- exceptions are disabled, the status of the other exceptions is not +- changed. +- +- The function returns the previous enabled exceptions in case the +- operation was successful, `-1' otherwise. +- +- - Function: int fegetexcept (int EXCEPTS) +- The function returns a bitmask of all currently enabled +- exceptions. It returns `-1' in case of failure. +- +- +-File: libc.info, Node: Arithmetic Functions, Next: Complex Numbers, Prev: Control Functions, Up: Arithmetic +- +-Arithmetic Functions +-==================== +- +- The C library provides functions to do basic operations on +-floating-point numbers. These include absolute value, maximum and +-minimum, normalization, bit twiddling, rounding, and a few others. +- +-* Menu: +- +-* Absolute Value:: Absolute values of integers and floats. +-* Normalization Functions:: Extracting exponents and putting them back. +-* Rounding Functions:: Rounding floats to integers. +-* Remainder Functions:: Remainders on division, precisely defined. +-* FP Bit Twiddling:: Sign bit adjustment. Adding epsilon. +-* FP Comparison Functions:: Comparisons without risk of exceptions. +-* Misc FP Arithmetic:: Max, min, positive difference, multiply-add. +- +- +-File: libc.info, Node: Absolute Value, Next: Normalization Functions, Up: Arithmetic Functions +- +-Absolute Value +--------------- +- +- These functions are provided for obtaining the "absolute value" (or +-"magnitude") of a number. The absolute value of a real number X is X +-if X is positive, -X if X is negative. For a complex number Z, whose +-real part is X and whose imaginary part is Y, the absolute value is +-`sqrt (X*X + Y*Y)'. +- +- Prototypes for `abs', `labs' and `llabs' are in `stdlib.h'; +-`imaxabs' is declared in `inttypes.h'; `fabs', `fabsf' and `fabsl' are +-declared in `math.h'. `cabs', `cabsf' and `cabsl' are declared in +-`complex.h'. +- +- - Function: int abs (int NUMBER) +- - Function: long int labs (long int NUMBER) +- - Function: long long int llabs (long long int NUMBER) +- - Function: intmax_t imaxabs (intmax_t NUMBER) +- These functions return the absolute value of NUMBER. +- +- Most computers use a two's complement integer representation, in +- which the absolute value of `INT_MIN' (the smallest possible `int') +- cannot be represented; thus, `abs (INT_MIN)' is not defined. +- +- `llabs' and `imaxdiv' are new to ISO C99. +- +- See *Note Integers:: for a description of the `intmax_t' type. +- +- +- - Function: double fabs (double NUMBER) +- - Function: float fabsf (float NUMBER) +- - Function: long double fabsl (long double NUMBER) +- This function returns the absolute value of the floating-point +- number NUMBER. +- +- - Function: double cabs (complex double Z) +- - Function: float cabsf (complex float Z) +- - Function: long double cabsl (complex long double Z) +- These functions return the absolute value of the complex number Z +- (*note Complex Numbers::). The absolute value of a complex number +- is: +- +- sqrt (creal (Z) * creal (Z) + cimag (Z) * cimag (Z)) +- +- This function should always be used instead of the direct formula +- because it takes special care to avoid losing precision. It may +- also take advantage of hardware support for this operation. See +- `hypot' in *Note Exponents and Logarithms::. +- +- +-File: libc.info, Node: Normalization Functions, Next: Rounding Functions, Prev: Absolute Value, Up: Arithmetic Functions +- +-Normalization Functions +------------------------ +- +- The functions described in this section are primarily provided as a +-way to efficiently perform certain low-level manipulations on floating +-point numbers that are represented internally using a binary radix; see +-*Note Floating Point Concepts::. These functions are required to have +-equivalent behavior even if the representation does not use a radix of +-2, but of course they are unlikely to be particularly efficient in +-those cases. +- +- All these functions are declared in `math.h'. +- +- - Function: double frexp (double VALUE, int *EXPONENT) +- - Function: float frexpf (float VALUE, int *EXPONENT) +- - Function: long double frexpl (long double VALUE, int *EXPONENT) +- These functions are used to split the number VALUE into a +- normalized fraction and an exponent. +- +- If the argument VALUE is not zero, the return value is VALUE times +- a power of two, and is always in the range 1/2 (inclusive) to 1 +- (exclusive). The corresponding exponent is stored in `*EXPONENT'; +- the return value multiplied by 2 raised to this exponent equals +- the original number VALUE. +- +- For example, `frexp (12.8, &exponent)' returns `0.8' and stores +- `4' in `exponent'. +- +- If VALUE is zero, then the return value is zero and zero is stored +- in `*EXPONENT'. +- +- - Function: double ldexp (double VALUE, int EXPONENT) +- - Function: float ldexpf (float VALUE, int EXPONENT) +- - Function: long double ldexpl (long double VALUE, int EXPONENT) +- These functions return the result of multiplying the floating-point +- number VALUE by 2 raised to the power EXPONENT. (It can be used +- to reassemble floating-point numbers that were taken apart by +- `frexp'.) +- +- For example, `ldexp (0.8, 4)' returns `12.8'. +- +- The following functions, which come from BSD, provide facilities +-equivalent to those of `ldexp' and `frexp'. See also the ISO C +-function `logb' which originally also appeared in BSD. +- +- - Function: double scalb (double VALUE, int EXPONENT) +- - Function: float scalbf (float VALUE, int EXPONENT) +- - Function: long double scalbl (long double VALUE, int EXPONENT) +- The `scalb' function is the BSD name for `ldexp'. +- +- - Function: long long int scalbn (double X, int n) +- - Function: long long int scalbnf (float X, int n) +- - Function: long long int scalbnl (long double X, int n) +- `scalbn' is identical to `scalb', except that the exponent N is an +- `int' instead of a floating-point number. +- +- - Function: long long int scalbln (double X, long int n) +- - Function: long long int scalblnf (float X, long int n) +- - Function: long long int scalblnl (long double X, long int n) +- `scalbln' is identical to `scalb', except that the exponent N is a +- `long int' instead of a floating-point number. +- +- - Function: long long int significand (double X) +- - Function: long long int significandf (float X) +- - Function: long long int significandl (long double X) +- `significand' returns the mantissa of X scaled to the range [1, 2). +- It is equivalent to `scalb (X, (double) -ilogb (X))'. +- +- This function exists mainly for use in certain standardized tests +- of IEEE 754 conformance. +- +- +-File: libc.info, Node: Rounding Functions, Next: Remainder Functions, Prev: Normalization Functions, Up: Arithmetic Functions +- +-Rounding Functions +------------------- +- +- The functions listed here perform operations such as rounding and +-truncation of floating-point values. Some of these functions convert +-floating point numbers to integer values. They are all declared in +-`math.h'. +- +- You can also convert floating-point numbers to integers simply by +-casting them to `int'. This discards the fractional part, effectively +-rounding towards zero. However, this only works if the result can +-actually be represented as an `int'--for very large numbers, this is +-impossible. The functions listed here return the result as a `double' +-instead to get around this problem. +- +- - Function: double ceil (double X) +- - Function: float ceilf (float X) +- - Function: long double ceill (long double X) +- These functions round X upwards to the nearest integer, returning +- that value as a `double'. Thus, `ceil (1.5)' is `2.0'. +- +- - Function: double floor (double X) +- - Function: float floorf (float X) +- - Function: long double floorl (long double X) +- These functions round X downwards to the nearest integer, +- returning that value as a `double'. Thus, `floor (1.5)' is `1.0' +- and `floor (-1.5)' is `-2.0'. +- +- - Function: double trunc (double X) +- - Function: float truncf (float X) +- - Function: long double truncl (long double X) +- The `trunc' functions round X towards zero to the nearest integer +- (returned in floating-point format). Thus, `trunc (1.5)' is `1.0' +- and `trunc (-1.5)' is `-1.0'. +- +- - Function: double rint (double X) +- - Function: float rintf (float X) +- - Function: long double rintl (long double X) +- These functions round X to an integer value according to the +- current rounding mode. *Note Floating Point Parameters::, for +- information about the various rounding modes. The default +- rounding mode is to round to the nearest integer; some machines +- support other modes, but round-to-nearest is always used unless +- you explicitly select another. +- +- If X was not initially an integer, these functions raise the +- inexact exception. +- +- - Function: double nearbyint (double X) +- - Function: float nearbyintf (float X) +- - Function: long double nearbyintl (long double X) +- These functions return the same value as the `rint' functions, but +- do not raise the inexact exception if X is not an integer. +- +- - Function: double round (double X) +- - Function: float roundf (float X) +- - Function: long double roundl (long double X) +- These functions are similar to `rint', but they round halfway +- cases away from zero instead of to the nearest even integer. +- +- - Function: long int lrint (double X) +- - Function: long int lrintf (float X) +- - Function: long int lrintl (long double X) +- These functions are just like `rint', but they return a `long int' +- instead of a floating-point number. +- +- - Function: long long int llrint (double X) +- - Function: long long int llrintf (float X) +- - Function: long long int llrintl (long double X) +- These functions are just like `rint', but they return a `long long +- int' instead of a floating-point number. +- +- - Function: long int lround (double X) +- - Function: long int lroundf (float X) +- - Function: long int lroundl (long double X) +- These functions are just like `round', but they return a `long +- int' instead of a floating-point number. +- +- - Function: long long int llround (double X) +- - Function: long long int llroundf (float X) +- - Function: long long int llroundl (long double X) +- These functions are just like `round', but they return a `long +- long int' instead of a floating-point number. +- +- - Function: double modf (double VALUE, double *INTEGER-PART) +- - Function: float modff (float VALUE, float *INTEGER-PART) +- - Function: long double modfl (long double VALUE, long double +- *INTEGER-PART) +- These functions break the argument VALUE into an integer part and a +- fractional part (between `-1' and `1', exclusive). Their sum +- equals VALUE. Each of the parts has the same sign as VALUE, and +- the integer part is always rounded toward zero. +- +- `modf' stores the integer part in `*INTEGER-PART', and returns the +- fractional part. For example, `modf (2.5, &intpart)' returns +- `0.5' and stores `2.0' into `intpart'. +- +- +-File: libc.info, Node: Remainder Functions, Next: FP Bit Twiddling, Prev: Rounding Functions, Up: Arithmetic Functions +- +-Remainder Functions +-------------------- +- +- The functions in this section compute the remainder on division of +-two floating-point numbers. Each is a little different; pick the one +-that suits your problem. +- +- - Function: double fmod (double NUMERATOR, double DENOMINATOR) +- - Function: float fmodf (float NUMERATOR, float DENOMINATOR) +- - Function: long double fmodl (long double NUMERATOR, long double +- DENOMINATOR) +- These functions compute the remainder from the division of +- NUMERATOR by DENOMINATOR. Specifically, the return value is +- `NUMERATOR - N * DENOMINATOR', where N is the quotient of +- NUMERATOR divided by DENOMINATOR, rounded towards zero to an +- integer. Thus, `fmod (6.5, 2.3)' returns `1.9', which is `6.5' +- minus `4.6'. +- +- The result has the same sign as the NUMERATOR and has magnitude +- less than the magnitude of the DENOMINATOR. +- +- If DENOMINATOR is zero, `fmod' signals a domain error. +- +- - Function: double drem (double NUMERATOR, double DENOMINATOR) +- - Function: float dremf (float NUMERATOR, float DENOMINATOR) +- - Function: long double dreml (long double NUMERATOR, long double +- DENOMINATOR) +- These functions are like `fmod' except that they rounds the +- internal quotient N to the nearest integer instead of towards zero +- to an integer. For example, `drem (6.5, 2.3)' returns `-0.4', +- which is `6.5' minus `6.9'. +- +- The absolute value of the result is less than or equal to half the +- absolute value of the DENOMINATOR. The difference between `fmod +- (NUMERATOR, DENOMINATOR)' and `drem (NUMERATOR, DENOMINATOR)' is +- always either DENOMINATOR, minus DENOMINATOR, or zero. +- +- If DENOMINATOR is zero, `drem' signals a domain error. +- +- - Function: double remainder (double NUMERATOR, double DENOMINATOR) +- - Function: float remainderf (float NUMERATOR, float DENOMINATOR) +- - Function: long double remainderl (long double NUMERATOR, long double +- DENOMINATOR) +- This function is another name for `drem'. +- +- +-File: libc.info, Node: FP Bit Twiddling, Next: FP Comparison Functions, Prev: Remainder Functions, Up: Arithmetic Functions +- +-Setting and modifying single bits of FP values +----------------------------------------------- +- +- There are some operations that are too complicated or expensive to +-perform by hand on floating-point numbers. ISO C99 defines functions +-to do these operations, which mostly involve changing single bits. +- +- - Function: double copysign (double X, double Y) +- - Function: float copysignf (float X, float Y) +- - Function: long double copysignl (long double X, long double Y) +- These functions return X but with the sign of Y. They work even +- if X or Y are NaN or zero. Both of these can carry a sign +- (although not all implementations support it) and this is one of +- the few operations that can tell the difference. +- +- `copysign' never raises an exception. +- +- This function is defined in IEC 559 (and the appendix with +- recommended functions in IEEE 754/IEEE 854). +- +- - Function: int signbit (_float-type_ X) +- `signbit' is a generic macro which can work on all floating-point +- types. It returns a nonzero value if the value of X has its sign +- bit set. +- +- This is not the same as `x < 0.0', because IEEE 754 floating point +- allows zero to be signed. The comparison `-0.0 < 0.0' is false, +- but `signbit (-0.0)' will return a nonzero value. +- +- - Function: double nextafter (double X, double Y) +- - Function: float nextafterf (float X, float Y) +- - Function: long double nextafterl (long double X, long double Y) +- The `nextafter' function returns the next representable neighbor of +- X in the direction towards Y. The size of the step between X and +- the result depends on the type of the result. If X = Y the +- function simply returns Y. If either value is `NaN', `NaN' is +- returned. Otherwise a value corresponding to the value of the +- least significant bit in the mantissa is added or subtracted, +- depending on the direction. `nextafter' will signal overflow or +- underflow if the result goes outside of the range of normalized +- numbers. +- +- This function is defined in IEC 559 (and the appendix with +- recommended functions in IEEE 754/IEEE 854). +- +- - Function: double nexttoward (double X, long double Y) +- - Function: float nexttowardf (float X, long double Y) +- - Function: long double nexttowardl (long double X, long double Y) +- These functions are identical to the corresponding versions of +- `nextafter' except that their second argument is a `long double'. +- +- - Function: double nan (const char *TAGP) +- - Function: float nanf (const char *TAGP) +- - Function: long double nanl (const char *TAGP) +- The `nan' function returns a representation of NaN, provided that +- NaN is supported by the target platform. `nan +- ("N-CHAR-SEQUENCE")' is equivalent to `strtod +- ("NAN(N-CHAR-SEQUENCE)")'. +- +- The argument TAGP is used in an unspecified manner. On IEEE 754 +- systems, there are many representations of NaN, and TAGP selects +- one. On other systems it may do nothing. +- +- +-File: libc.info, Node: FP Comparison Functions, Next: Misc FP Arithmetic, Prev: FP Bit Twiddling, Up: Arithmetic Functions +- +-Floating-Point Comparison Functions +------------------------------------ +- +- The standard C comparison operators provoke exceptions when one or +-other of the operands is NaN. For example, +- +- int v = a < 1.0; +- +-will raise an exception if A is NaN. (This does _not_ happen with `==' +-and `!='; those merely return false and true, respectively, when NaN is +-examined.) Frequently this exception is undesirable. ISO C99 +-therefore defines comparison functions that do not raise exceptions +-when NaN is examined. All of the functions are implemented as macros +-which allow their arguments to be of any floating-point type. The +-macros are guaranteed to evaluate their arguments only once. +- +- - Macro: int isgreater (_real-floating_ X, _real-floating_ Y) +- This macro determines whether the argument X is greater than Y. +- It is equivalent to `(X) > (Y)', but no exception is raised if X +- or Y are NaN. +- +- - Macro: int isgreaterequal (_real-floating_ X, _real-floating_ Y) +- This macro determines whether the argument X is greater than or +- equal to Y. It is equivalent to `(X) >= (Y)', but no exception is +- raised if X or Y are NaN. +- +- - Macro: int isless (_real-floating_ X, _real-floating_ Y) +- This macro determines whether the argument X is less than Y. It +- is equivalent to `(X) < (Y)', but no exception is raised if X or Y +- are NaN. +- +- - Macro: int islessequal (_real-floating_ X, _real-floating_ Y) +- This macro determines whether the argument X is less than or equal +- to Y. It is equivalent to `(X) <= (Y)', but no exception is +- raised if X or Y are NaN. +- +- - Macro: int islessgreater (_real-floating_ X, _real-floating_ Y) +- This macro determines whether the argument X is less or greater +- than Y. It is equivalent to `(X) < (Y) || (X) > (Y)' (although it +- only evaluates X and Y once), but no exception is raised if X or Y +- are NaN. +- +- This macro is not equivalent to `X != Y', because that expression +- is true if X or Y are NaN. +- +- - Macro: int isunordered (_real-floating_ X, _real-floating_ Y) +- This macro determines whether its arguments are unordered. In +- other words, it is true if X or Y are NaN, and false otherwise. +- +- Not all machines provide hardware support for these operations. On +-machines that don't, the macros can be very slow. Therefore, you should +-not use these functions when NaN is not a concern. +- +- *Note:* There are no macros `isequal' or `isunequal'. They are +-unnecessary, because the `==' and `!=' operators do _not_ throw an +-exception if one or both of the operands are NaN. +- +- +-File: libc.info, Node: Misc FP Arithmetic, Prev: FP Comparison Functions, Up: Arithmetic Functions +- +-Miscellaneous FP arithmetic functions +-------------------------------------- +- +- The functions in this section perform miscellaneous but common +-operations that are awkward to express with C operators. On some +-processors these functions can use special machine instructions to +-perform these operations faster than the equivalent C code. +- +- - Function: double fmin (double X, double Y) +- - Function: float fminf (float X, float Y) +- - Function: long double fminl (long double X, long double Y) +- The `fmin' function returns the lesser of the two values X and Y. +- It is similar to the expression +- ((x) < (y) ? (x) : (y)) +- except that X and Y are only evaluated once. +- +- If an argument is NaN, the other argument is returned. If both +- arguments are NaN, NaN is returned. +- +- - Function: double fmax (double X, double Y) +- - Function: float fmaxf (float X, float Y) +- - Function: long double fmaxl (long double X, long double Y) +- The `fmax' function returns the greater of the two values X and Y. +- +- If an argument is NaN, the other argument is returned. If both +- arguments are NaN, NaN is returned. +- +- - Function: double fdim (double X, double Y) +- - Function: float fdimf (float X, float Y) +- - Function: long double fdiml (long double X, long double Y) +- The `fdim' function returns the positive difference between X and +- Y. The positive difference is X - Y if X is greater than Y, and 0 +- otherwise. +- +- If X, Y, or both are NaN, NaN is returned. +- +- - Function: double fma (double X, double Y, double Z) +- - Function: float fmaf (float X, float Y, float Z) +- - Function: long double fmal (long double X, long double Y, long +- double Z) +- The `fma' function performs floating-point multiply-add. This is +- the operation (X * Y) + Z, but the intermediate result is not +- rounded to the destination type. This can sometimes improve the +- precision of a calculation. +- +- This function was introduced because some processors have a special +- instruction to perform multiply-add. The C compiler cannot use it +- directly, because the expression `x*y + z' is defined to round the +- intermediate result. `fma' lets you choose when you want to round +- only once. +- +- On processors which do not implement multiply-add in hardware, +- `fma' can be very slow since it must avoid intermediate rounding. +- `math.h' defines the symbols `FP_FAST_FMA', `FP_FAST_FMAF', and +- `FP_FAST_FMAL' when the corresponding version of `fma' is no +- slower than the expression `x*y + z'. In the GNU C library, this +- always means the operation is implemented in hardware. +- +- +-File: libc.info, Node: Complex Numbers, Next: Operations on Complex, Prev: Arithmetic Functions, Up: Arithmetic +- +-Complex Numbers +-=============== +- +- ISO C99 introduces support for complex numbers in C. This is done +-with a new type qualifier, `complex'. It is a keyword if and only if +-`complex.h' has been included. There are three complex types, +-corresponding to the three real types: `float complex', `double +-complex', and `long double complex'. +- +- To construct complex numbers you need a way to indicate the imaginary +-part of a number. There is no standard notation for an imaginary +-floating point constant. Instead, `complex.h' defines two macros that +-can be used to create complex numbers. +- +- - Macro: const float complex _Complex_I +- This macro is a representation of the complex number "0+1i". +- Multiplying a real floating-point value by `_Complex_I' gives a +- complex number whose value is purely imaginary. You can use this +- to construct complex constants: +- +- 3.0 + 4.0i = `3.0 + 4.0 * _Complex_I' +- +- Note that `_Complex_I * _Complex_I' has the value `-1', but the +- type of that value is `complex'. +- +-`_Complex_I' is a bit of a mouthful. `complex.h' also defines a +-shorter name for the same constant. +- +- - Macro: const float complex I +- This macro has exactly the same value as `_Complex_I'. Most of the +- time it is preferable. However, it causes problems if you want to +- use the identifier `I' for something else. You can safely write +- +- #include +- #undef I +- +- if you need `I' for your own purposes. (In that case we recommend +- you also define some other short name for `_Complex_I', such as +- `J'.) +- +- +- +-File: libc.info, Node: Operations on Complex, Next: Parsing of Numbers, Prev: Complex Numbers, Up: Arithmetic +- +-Projections, Conjugates, and Decomposing of Complex Numbers +-=========================================================== +- +- ISO C99 also defines functions that perform basic operations on +-complex numbers, such as decomposition and conjugation. The prototypes +-for all these functions are in `complex.h'. All functions are +-available in three variants, one for each of the three complex types. +- +- - Function: double creal (complex double Z) +- - Function: float crealf (complex float Z) +- - Function: long double creall (complex long double Z) +- These functions return the real part of the complex number Z. +- +- - Function: double cimag (complex double Z) +- - Function: float cimagf (complex float Z) +- - Function: long double cimagl (complex long double Z) +- These functions return the imaginary part of the complex number Z. +- +- - Function: complex double conj (complex double Z) +- - Function: complex float conjf (complex float Z) +- - Function: complex long double conjl (complex long double Z) +- These functions return the conjugate value of the complex number +- Z. The conjugate of a complex number has the same real part and a +- negated imaginary part. In other words, `conj(a + bi) = a + -bi'. +- +- - Function: double carg (complex double Z) +- - Function: float cargf (complex float Z) +- - Function: long double cargl (complex long double Z) +- These functions return the argument of the complex number Z. The +- argument of a complex number is the angle in the complex plane +- between the positive real axis and a line passing through zero and +- the number. This angle is measured in the usual fashion and +- ranges from 0 to 2pi. +- +- `carg' has a branch cut along the positive real axis. +- +- - Function: complex double cproj (complex double Z) +- - Function: complex float cprojf (complex float Z) +- - Function: complex long double cprojl (complex long double Z) +- These functions return the projection of the complex value Z onto +- the Riemann sphere. Values with a infinite imaginary part are +- projected to positive infinity on the real axis, even if the real +- part is NaN. If the real part is infinite, the result is +- equivalent to +- +- INFINITY + I * copysign (0.0, cimag (z)) +- +- +-File: libc.info, Node: Parsing of Numbers, Next: System V Number Conversion, Prev: Operations on Complex, Up: Arithmetic +- +-Parsing of Numbers +-================== +- +- This section describes functions for "reading" integer and +-floating-point numbers from a string. It may be more convenient in some +-cases to use `sscanf' or one of the related functions; see *Note +-Formatted Input::. But often you can make a program more robust by +-finding the tokens in the string by hand, then converting the numbers +-one by one. +- +-* Menu: +- +-* Parsing of Integers:: Functions for conversion of integer values. +-* Parsing of Floats:: Functions for conversion of floating-point +- values. +- +- +-File: libc.info, Node: Parsing of Integers, Next: Parsing of Floats, Up: Parsing of Numbers +- +-Parsing of Integers +-------------------- +- +- The `str' functions are declared in `stdlib.h' and those beginning +-with `wcs' are declared in `wchar.h'. One might wonder about the use +-of `restrict' in the prototypes of the functions in this section. It +-is seemingly useless but the ISO C standard uses it (for the functions +-defined there) so we have to do it as well. +- +- - Function: long int strtol (const char *restrict STRING, char +- **restrict TAILPTR, int BASE) +- The `strtol' ("string-to-long") function converts the initial part +- of STRING to a signed integer, which is returned as a value of +- type `long int'. +- +- This function attempts to decompose STRING as follows: +- +- * A (possibly empty) sequence of whitespace characters. Which +- characters are whitespace is determined by the `isspace' +- function (*note Classification of Characters::). These are +- discarded. +- +- * An optional plus or minus sign (`+' or `-'). +- +- * A nonempty sequence of digits in the radix specified by BASE. +- +- If BASE is zero, decimal radix is assumed unless the series of +- digits begins with `0' (specifying octal radix), or `0x' or +- `0X' (specifying hexadecimal radix); in other words, the same +- syntax used for integer constants in C. +- +- Otherwise BASE must have a value between `2' and `36'. If +- BASE is `16', the digits may optionally be preceded by `0x' +- or `0X'. If base has no legal value the value returned is +- `0l' and the global variable `errno' is set to `EINVAL'. +- +- * Any remaining characters in the string. If TAILPTR is not a +- null pointer, `strtol' stores a pointer to this tail in +- `*TAILPTR'. +- +- If the string is empty, contains only whitespace, or does not +- contain an initial substring that has the expected syntax for an +- integer in the specified BASE, no conversion is performed. In +- this case, `strtol' returns a value of zero and the value stored in +- `*TAILPTR' is the value of STRING. +- +- In a locale other than the standard `"C"' locale, this function +- may recognize additional implementation-dependent syntax. +- +- If the string has valid syntax for an integer but the value is not +- representable because of overflow, `strtol' returns either +- `LONG_MAX' or `LONG_MIN' (*note Range of Type::), as appropriate +- for the sign of the value. It also sets `errno' to `ERANGE' to +- indicate there was overflow. +- +- You should not check for errors by examining the return value of +- `strtol', because the string might be a valid representation of +- `0l', `LONG_MAX', or `LONG_MIN'. Instead, check whether TAILPTR +- points to what you expect after the number (e.g. `'\0'' if the +- string should end after the number). You also need to clear ERRNO +- before the call and check it afterward, in case there was overflow. +- +- There is an example at the end of this section. +- +- - Function: long int wcstol (const wchar_t *restrict STRING, wchar_t +- **restrict TAILPTR, int BASE) +- The `wcstol' function is equivalent to the `strtol' function in +- nearly all aspects but handles wide character strings. +- +- The `wcstol' function was introduced in Amendment 1 of ISO C90. +- +- - Function: unsigned long int strtoul (const char *retrict STRING, +- char **restrict TAILPTR, int BASE) +- The `strtoul' ("string-to-unsigned-long") function is like +- `strtol' except it converts to an `unsigned long int' value. The +- syntax is the same as described above for `strtol'. The value +- returned on overflow is `ULONG_MAX' (*note Range of Type::). +- +- If STRING depicts a negative number, `strtoul' acts the same as +- STRTOL but casts the result to an unsigned integer. That means +- for example that `strtoul' on `"-1"' returns `ULONG_MAX' and an +- input more negative than `LONG_MIN' returns (`ULONG_MAX' + 1) / 2. +- +- `strtoul' sets ERRNO to `EINVAL' if BASE is out of range, or +- `ERANGE' on overflow. +- +- - Function: unsigned long int wcstoul (const wchar_t *restrict STRING, +- wchar_t **restrict TAILPTR, int BASE) +- The `wcstoul' function is equivalent to the `strtoul' function in +- nearly all aspects but handles wide character strings. +- +- The `wcstoul' function was introduced in Amendment 1 of ISO C90. +- +- - Function: long long int strtoll (const char *restrict STRING, char +- **restrict TAILPTR, int BASE) +- The `strtoll' function is like `strtol' except that it returns a +- `long long int' value, and accepts numbers with a correspondingly +- larger range. +- +- If the string has valid syntax for an integer but the value is not +- representable because of overflow, `strtoll' returns either +- `LONG_LONG_MAX' or `LONG_LONG_MIN' (*note Range of Type::), as +- appropriate for the sign of the value. It also sets `errno' to +- `ERANGE' to indicate there was overflow. +- +- The `strtoll' function was introduced in ISO C99. +- +- - Function: long long int wcstoll (const wchar_t *restrict STRING, +- wchar_t **restrict TAILPTR, int BASE) +- The `wcstoll' function is equivalent to the `strtoll' function in +- nearly all aspects but handles wide character strings. +- +- The `wcstoll' function was introduced in Amendment 1 of ISO C90. +- +- - Function: long long int strtoq (const char *restrict STRING, char +- **restrict TAILPTR, int BASE) +- `strtoq' ("string-to-quad-word") is the BSD name for `strtoll'. +- +- - Function: long long int wcstoq (const wchar_t *restrict STRING, +- wchar_t **restrict TAILPTR, int BASE) +- The `wcstoq' function is equivalent to the `strtoq' function in +- nearly all aspects but handles wide character strings. +- +- The `wcstoq' function is a GNU extension. +- +- - Function: unsigned long long int strtoull (const char *restrict +- STRING, char **restrict TAILPTR, int BASE) +- The `strtoull' function is related to `strtoll' the same way +- `strtoul' is related to `strtol'. +- +- The `strtoull' function was introduced in ISO C99. +- +- - Function: unsigned long long int wcstoull (const wchar_t *restrict +- STRING, wchar_t **restrict TAILPTR, int BASE) +- The `wcstoull' function is equivalent to the `strtoull' function +- in nearly all aspects but handles wide character strings. +- +- The `wcstoull' function was introduced in Amendment 1 of ISO C90. +- +- - Function: unsigned long long int strtouq (const char *restrict +- STRING, char **restrict TAILPTR, int BASE) +- `strtouq' is the BSD name for `strtoull'. +- +- - Function: unsigned long long int wcstouq (const wchar_t *restrict +- STRING, wchar_t **restrict TAILPTR, int BASE) +- The `wcstouq' function is equivalent to the `strtouq' function in +- nearly all aspects but handles wide character strings. +- +- The `wcstoq' function is a GNU extension. +- +- - Function: intmax_t strtoimax (const char *restrict STRING, char +- **restrict TAILPTR, int BASE) +- The `strtoimax' function is like `strtol' except that it returns a +- `intmax_t' value, and accepts numbers of a corresponding range. +- +- If the string has valid syntax for an integer but the value is not +- representable because of overflow, `strtoimax' returns either +- `INTMAX_MAX' or `INTMAX_MIN' (*note Integers::), as appropriate +- for the sign of the value. It also sets `errno' to `ERANGE' to +- indicate there was overflow. +- +- See *Note Integers:: for a description of the `intmax_t' type. The +- `strtoimax' function was introduced in ISO C99. +- +- - Function: intmax_t wcstoimax (const wchar_t *restrict STRING, +- wchar_t **restrict TAILPTR, int BASE) +- The `wcstoimax' function is equivalent to the `strtoimax' function +- in nearly all aspects but handles wide character strings. +- +- The `wcstoimax' function was introduced in ISO C99. +- +- - Function: uintmax_t strtoumax (const char *restrict STRING, char +- **restrict TAILPTR, int BASE) +- The `strtoumax' function is related to `strtoimax' the same way +- that `strtoul' is related to `strtol'. +- +- See *Note Integers:: for a description of the `intmax_t' type. The +- `strtoumax' function was introduced in ISO C99. +- +- - Function: uintmax_t wcstoumax (const wchar_t *restrict STRING, +- wchar_t **restrict TAILPTR, int BASE) +- The `wcstoumax' function is equivalent to the `strtoumax' function +- in nearly all aspects but handles wide character strings. +- +- The `wcstoumax' function was introduced in ISO C99. +- +- - Function: long int atol (const char *STRING) +- This function is similar to the `strtol' function with a BASE +- argument of `10', except that it need not detect overflow errors. +- The `atol' function is provided mostly for compatibility with +- existing code; using `strtol' is more robust. +- +- - Function: int atoi (const char *STRING) +- This function is like `atol', except that it returns an `int'. +- The `atoi' function is also considered obsolete; use `strtol' +- instead. +- +- - Function: long long int atoll (const char *STRING) +- This function is similar to `atol', except it returns a `long long +- int'. +- +- The `atoll' function was introduced in ISO C99. It too is +- obsolete (despite having just been added); use `strtoll' instead. +- +- All the functions mentioned in this section so far do not handle +-alternative representations of characters as described in the locale +-data. Some locales specify thousands separator and the way they have to +-be used which can help to make large numbers more readable. To read +-such numbers one has to use the `scanf' functions with the `'' flag. +- +- Here is a function which parses a string as a sequence of integers +-and returns the sum of them: +- +- int +- sum_ints_from_string (char *string) +- { +- int sum = 0; +- +- while (1) { +- char *tail; +- int next; +- +- /* Skip whitespace by hand, to detect the end. */ +- while (isspace (*string)) string++; +- if (*string == 0) +- break; +- +- /* There is more nonwhitespace, */ +- /* so it ought to be another number. */ +- errno = 0; +- /* Parse it. */ +- next = strtol (string, &tail, 0); +- /* Add it in, if not overflow. */ +- if (errno) +- printf ("Overflow\n"); +- else +- sum += next; +- /* Advance past it. */ +- string = tail; +- } +- +- return sum; +- } +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-35 glibc-2.3.2-200304020432/manual/libc.info-35 +--- glibc-2.3.2/manual/libc.info-35 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-35 Thu Jan 1 01:00:00 1970 +@@ -1,1168 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Parsing of Floats, Prev: Parsing of Integers, Up: Parsing of Numbers +- +-Parsing of Floats +------------------ +- +- The `str' functions are declared in `stdlib.h' and those beginning +-with `wcs' are declared in `wchar.h'. One might wonder about the use +-of `restrict' in the prototypes of the functions in this section. It +-is seemingly useless but the ISO C standard uses it (for the functions +-defined there) so we have to do it as well. +- +- - Function: double strtod (const char *restrict STRING, char +- **restrict TAILPTR) +- The `strtod' ("string-to-double") function converts the initial +- part of STRING to a floating-point number, which is returned as a +- value of type `double'. +- +- This function attempts to decompose STRING as follows: +- +- * A (possibly empty) sequence of whitespace characters. Which +- characters are whitespace is determined by the `isspace' +- function (*note Classification of Characters::). These are +- discarded. +- +- * An optional plus or minus sign (`+' or `-'). +- +- * A floating point number in decimal or hexadecimal format. The +- decimal format is: +- - A nonempty sequence of digits optionally containing a +- decimal-point character--normally `.', but it depends on +- the locale (*note General Numeric::). +- +- - An optional exponent part, consisting of a character `e' +- or `E', an optional sign, and a sequence of digits. +- +- +- The hexadecimal format is as follows: +- - A 0x or 0X followed by a nonempty sequence of +- hexadecimal digits optionally containing a decimal-point +- character--normally `.', but it depends on the locale +- (*note General Numeric::). +- +- - An optional binary-exponent part, consisting of a +- character `p' or `P', an optional sign, and a sequence +- of digits. +- +- +- * Any remaining characters in the string. If TAILPTR is not a +- null pointer, a pointer to this tail of the string is stored +- in `*TAILPTR'. +- +- If the string is empty, contains only whitespace, or does not +- contain an initial substring that has the expected syntax for a +- floating-point number, no conversion is performed. In this case, +- `strtod' returns a value of zero and the value returned in +- `*TAILPTR' is the value of STRING. +- +- In a locale other than the standard `"C"' or `"POSIX"' locales, +- this function may recognize additional locale-dependent syntax. +- +- If the string has valid syntax for a floating-point number but the +- value is outside the range of a `double', `strtod' will signal +- overflow or underflow as described in *Note Math Error Reporting::. +- +- `strtod' recognizes four special input strings. The strings +- `"inf"' and `"infinity"' are converted to oo, or to the largest +- representable value if the floating-point format doesn't support +- infinities. You can prepend a `"+"' or `"-"' to specify the sign. +- Case is ignored when scanning these strings. +- +- The strings `"nan"' and `"nan(CHARS...)"' are converted to NaN. +- Again, case is ignored. If CHARS... are provided, they are used +- in some unspecified fashion to select a particular representation +- of NaN (there can be several). +- +- Since zero is a valid result as well as the value returned on +- error, you should check for errors in the same way as for +- `strtol', by examining ERRNO and TAILPTR. +- +- - Function: float strtof (const char *STRING, char **TAILPTR) +- - Function: long double strtold (const char *STRING, char **TAILPTR) +- These functions are analogous to `strtod', but return `float' and +- `long double' values respectively. They report errors in the same +- way as `strtod'. `strtof' can be substantially faster than +- `strtod', but has less precision; conversely, `strtold' can be +- much slower but has more precision (on systems where `long double' +- is a separate type). +- +- These functions have been GNU extensions and are new to ISO C99. +- +- - Function: double wcstod (const wchar_t *restrict STRING, wchar_t +- **restrict TAILPTR) +- - Function: float wcstof (const wchar_t *STRING, wchar_t **TAILPTR) +- - Function: long double wcstold (const wchar_t *STRING, wchar_t +- **TAILPTR) +- The `wcstod', `wcstof', and `wcstol' functions are equivalent in +- nearly all aspect to the `strtod', `strtof', and `strtold' +- functions but it handles wide character string. +- +- The `wcstod' function was introduced in Amendment 1 of ISO C90. +- The `wcstof' and `wcstold' functions were introduced in ISO C99. +- +- - Function: double atof (const char *STRING) +- This function is similar to the `strtod' function, except that it +- need not detect overflow and underflow errors. The `atof' function +- is provided mostly for compatibility with existing code; using +- `strtod' is more robust. +- +- The GNU C library also provides `_l' versions of these functions, +-which take an additional argument, the locale to use in conversion. +-*Note Parsing of Integers::. +- +- +-File: libc.info, Node: System V Number Conversion, Prev: Parsing of Numbers, Up: Arithmetic +- +-Old-fashioned System V number-to-string functions +-================================================= +- +- The old System V C library provided three functions to convert +-numbers to strings, with unusual and hard-to-use semantics. The GNU C +-library also provides these functions and some natural extensions. +- +- These functions are only available in glibc and on systems descended +-from AT&T Unix. Therefore, unless these functions do precisely what you +-need, it is better to use `sprintf', which is standard. +- +- All these functions are defined in `stdlib.h'. +- +- - Function: char * ecvt (double VALUE, int NDIGIT, int *DECPT, int +- *NEG) +- The function `ecvt' converts the floating-point number VALUE to a +- string with at most NDIGIT decimal digits. The returned string +- contains no decimal point or sign. The first digit of the string +- is non-zero (unless VALUE is actually zero) and the last digit is +- rounded to nearest. `*DECPT' is set to the index in the string of +- the first digit after the decimal point. `*NEG' is set to a +- nonzero value if VALUE is negative, zero otherwise. +- +- If NDIGIT decimal digits would exceed the precision of a `double' +- it is reduced to a system-specific value. +- +- The returned string is statically allocated and overwritten by +- each call to `ecvt'. +- +- If VALUE is zero, it is implementation defined whether `*DECPT' is +- `0' or `1'. +- +- For example: `ecvt (12.3, 5, &d, &n)' returns `"12300"' and sets D +- to `2' and N to `0'. +- +- - Function: char * fcvt (double VALUE, int NDIGIT, int *DECPT, int +- *NEG) +- The function `fcvt' is like `ecvt', but NDIGIT specifies the +- number of digits after the decimal point. If NDIGIT is less than +- zero, VALUE is rounded to the NDIGIT+1'th place to the left of the +- decimal point. For example, if NDIGIT is `-1', VALUE will be +- rounded to the nearest 10. If NDIGIT is negative and larger than +- the number of digits to the left of the decimal point in VALUE, +- VALUE will be rounded to one significant digit. +- +- If NDIGIT decimal digits would exceed the precision of a `double' +- it is reduced to a system-specific value. +- +- The returned string is statically allocated and overwritten by +- each call to `fcvt'. +- +- - Function: char * gcvt (double VALUE, int NDIGIT, char *BUF) +- `gcvt' is functionally equivalent to `sprintf(buf, "%*g", ndigit, +- value'. It is provided only for compatibility's sake. It returns +- BUF. +- +- If NDIGIT decimal digits would exceed the precision of a `double' +- it is reduced to a system-specific value. +- +- As extensions, the GNU C library provides versions of these three +-functions that take `long double' arguments. +- +- - Function: char * qecvt (long double VALUE, int NDIGIT, int *DECPT, +- int *NEG) +- This function is equivalent to `ecvt' except that it takes a `long +- double' for the first parameter and that NDIGIT is restricted by +- the precision of a `long double'. +- +- - Function: char * qfcvt (long double VALUE, int NDIGIT, int *DECPT, +- int *NEG) +- This function is equivalent to `fcvt' except that it takes a `long +- double' for the first parameter and that NDIGIT is restricted by +- the precision of a `long double'. +- +- - Function: char * qgcvt (long double VALUE, int NDIGIT, char *BUF) +- This function is equivalent to `gcvt' except that it takes a `long +- double' for the first parameter and that NDIGIT is restricted by +- the precision of a `long double'. +- +- The `ecvt' and `fcvt' functions, and their `long double' +-equivalents, all return a string located in a static buffer which is +-overwritten by the next call to the function. The GNU C library +-provides another set of extended functions which write the converted +-string into a user-supplied buffer. These have the conventional `_r' +-suffix. +- +- `gcvt_r' is not necessary, because `gcvt' already uses a +-user-supplied buffer. +- +- - Function: char * ecvt_r (double VALUE, int NDIGIT, int *DECPT, int +- *NEG, char *BUF, size_t LEN) +- The `ecvt_r' function is the same as `ecvt', except that it places +- its result into the user-specified buffer pointed to by BUF, with +- length LEN. +- +- This function is a GNU extension. +- +- - Function: char * fcvt_r (double VALUE, int NDIGIT, int *DECPT, int +- *NEG, char *BUF, size_t LEN) +- The `fcvt_r' function is the same as `fcvt', except that it places +- its result into the user-specified buffer pointed to by BUF, with +- length LEN. +- +- This function is a GNU extension. +- +- - Function: char * qecvt_r (long double VALUE, int NDIGIT, int *DECPT, +- int *NEG, char *BUF, size_t LEN) +- The `qecvt_r' function is the same as `qecvt', except that it +- places its result into the user-specified buffer pointed to by +- BUF, with length LEN. +- +- This function is a GNU extension. +- +- - Function: char * qfcvt_r (long double VALUE, int NDIGIT, int *DECPT, +- int *NEG, char *BUF, size_t LEN) +- The `qfcvt_r' function is the same as `qfcvt', except that it +- places its result into the user-specified buffer pointed to by +- BUF, with length LEN. +- +- This function is a GNU extension. +- +- +-File: libc.info, Node: Date and Time, Next: Resource Usage And Limitation, Prev: Arithmetic, Up: Top +- +-Date and Time +-************* +- +- This chapter describes functions for manipulating dates and times, +-including functions for determining what time it is and conversion +-between different time representations. +- +-* Menu: +- +-* Time Basics:: Concepts and definitions. +-* Elapsed Time:: Data types to represent elapsed times +-* Processor And CPU Time:: Time a program has spent executing. +-* Calendar Time:: Manipulation of ``real'' dates and times. +-* Setting an Alarm:: Sending a signal after a specified time. +-* Sleeping:: Waiting for a period of time. +- +- +-File: libc.info, Node: Time Basics, Next: Elapsed Time, Up: Date and Time +- +-Time Basics +-=========== +- +- Discussing time in a technical manual can be difficult because the +-word "time" in English refers to lots of different things. In this +-manual, we use a rigorous terminology to avoid confusion, and the only +-thing we use the simple word "time" for is to talk about the abstract +-concept. +- +- A "calendar time" is a point in the time continuum, for example +-November 4, 1990 at 18:02.5 UTC. Sometimes this is called "absolute +-time". +- +- We don't speak of a "date", because that is inherent in a calendar +-time. +- +- An "interval" is a contiguous part of the time continuum between two +-calendar times, for example the hour between 9:00 and 10:00 on July 4, +-1980. +- +- An "elapsed time" is the length of an interval, for example, 35 +-minutes. People sometimes sloppily use the word "interval" to refer to +-the elapsed time of some interval. +- +- An "amount of time" is a sum of elapsed times, which need not be of +-any specific intervals. For example, the amount of time it takes to +-read a book might be 9 hours, independently of when and in how many +-sittings it is read. +- +- A "period" is the elapsed time of an interval between two events, +-especially when they are part of a sequence of regularly repeating +-events. +- +- "CPU time" is like calendar time, except that it is based on the +-subset of the time continuum when a particular process is actively +-using a CPU. CPU time is, therefore, relative to a process. +- +- "Processor time" is an amount of time that a CPU is in use. In +-fact, it's a basic system resource, since there's a limit to how much +-can exist in any given interval (that limit is the elapsed time of the +-interval times the number of CPUs in the processor). People often call +-this CPU time, but we reserve the latter term in this manual for the +-definition above. +- +- +-File: libc.info, Node: Elapsed Time, Next: Processor And CPU Time, Prev: Time Basics, Up: Date and Time +- +-Elapsed Time +-============ +- +- One way to represent an elapsed time is with a simple arithmetic data +-type, as with the following function to compute the elapsed time between +-two calendar times. This function is declared in `time.h'. +- +- - Function: double difftime (time_t TIME1, time_t TIME0) +- The `difftime' function returns the number of seconds of elapsed +- time between calendar time TIME1 and calendar time TIME0, as a +- value of type `double'. The difference ignores leap seconds +- unless leap second support is enabled. +- +- In the GNU system, you can simply subtract `time_t' values. But on +- other systems, the `time_t' data type might use some other encoding +- where subtraction doesn't work directly. +- +- The GNU C library provides two data types specifically for +-representing an elapsed time. They are used by various GNU C library +-functions, and you can use them for your own purposes too. They're +-exactly the same except that one has a resolution in microseconds, and +-the other, newer one, is in nanoseconds. +- +- - Data Type: struct timeval +- The `struct timeval' structure represents an elapsed time. It is +- declared in `sys/time.h' and has the following members: +- +- `long int tv_sec' +- This represents the number of whole seconds of elapsed time. +- +- `long int tv_usec' +- This is the rest of the elapsed time (a fraction of a second), +- represented as the number of microseconds. It is always less +- than one million. +- +- +- - Data Type: struct timespec +- The `struct timespec' structure represents an elapsed time. It is +- declared in `time.h' and has the following members: +- +- `long int tv_sec' +- This represents the number of whole seconds of elapsed time. +- +- `long int tv_nsec' +- This is the rest of the elapsed time (a fraction of a second), +- represented as the number of nanoseconds. It is always less +- than one billion. +- +- +- It is often necessary to subtract two values of type +-`struct timeval' or `struct timespec'. Here is the best way to do +-this. It works even on some peculiar operating systems where the +-`tv_sec' member has an unsigned type. +- +- /* Subtract the `struct timeval' values X and Y, +- storing the result in RESULT. +- Return 1 if the difference is negative, otherwise 0. */ +- +- int +- timeval_subtract (result, x, y) +- struct timeval *result, *x, *y; +- { +- /* Perform the carry for the later subtraction by updating Y. */ +- if (x->tv_usec < y->tv_usec) { +- int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1; +- y->tv_usec -= 1000000 * nsec; +- y->tv_sec += nsec; +- } +- if (x->tv_usec - y->tv_usec > 1000000) { +- int nsec = (x->tv_usec - y->tv_usec) / 1000000; +- y->tv_usec += 1000000 * nsec; +- y->tv_sec -= nsec; +- } +- +- /* Compute the time remaining to wait. +- `tv_usec' is certainly positive. */ +- result->tv_sec = x->tv_sec - y->tv_sec; +- result->tv_usec = x->tv_usec - y->tv_usec; +- +- /* Return 1 if result is negative. */ +- return x->tv_sec < y->tv_sec; +- } +- +- Common functions that use `struct timeval' are `gettimeofday' and +-`settimeofday'. +- +- There are no GNU C library functions specifically oriented toward +-dealing with elapsed times, but the calendar time, processor time, and +-alarm and sleeping functions have a lot to do with them. +- +- +-File: libc.info, Node: Processor And CPU Time, Next: Calendar Time, Prev: Elapsed Time, Up: Date and Time +- +-Processor And CPU Time +-====================== +- +- If you're trying to optimize your program or measure its efficiency, +-it's very useful to know how much processor time it uses. For that, +-calendar time and elapsed times are useless because a process may spend +-time waiting for I/O or for other processes to use the CPU. However, +-you can get the information with the functions in this section. +- +- CPU time (*note Time Basics::) is represented by the data type +-`clock_t', which is a number of "clock ticks". It gives the 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 examinining the process' CPU time +-before and after the computation. +- +- In the GNU system, `clock_t' is equivalent to `long int' and +-`CLOCKS_PER_SEC' is an integer value. But in other systems, both +-`clock_t' and the macro `CLOCKS_PER_SEC' can be either integer or +-floating-point types. Casting CPU time values to `double', as in the +-example above, makes sure that operations such as arithmetic and +-printing work properly and consistently no matter what the underlying +-representation is. +- +- Note that the clock can wrap around. On a 32bit system with +-`CLOCKS_PER_SEC' set to one million this function will return the same +-value approximately every 72 minutes. +- +- For additional functions to examine a process' use of processor time, +-and to control it, *Note Resource Usage And Limitation::. +- +-* Menu: +- +-* CPU Time:: The `clock' function. +-* Processor Time:: The `times' function. +- +- +-File: libc.info, Node: CPU Time, Next: Processor Time, Up: Processor And CPU Time +- +-CPU Time Inquiry +----------------- +- +- To get a process' CPU time, you can use the `clock' function. This +-facility is declared in the header file `time.h'. +- +- In typical usage, you call the `clock' function at the beginning and +-end of the interval you want to time, subtract the values, and then +-divide by `CLOCKS_PER_SEC' (the number of clock ticks per second) to +-get processor time, like this: +- +- #include +- +- clock_t start, end; +- double cpu_time_used; +- +- start = clock(); +- ... /* Do the work. */ +- end = clock(); +- cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; +- +- Do not use a single CPU time as an amount of time; it doesn't work +-that way. Either do a subtraction as shown above or query processor +-time directly. *Note Processor Time::. +- +- Different computers and operating systems vary wildly in how they +-keep track of CPU time. It's common for the internal processor clock +-to have a resolution somewhere between a hundredth and millionth of a +-second. +- +- - Macro: int CLOCKS_PER_SEC +- The value of this macro is the number of clock ticks per second +- measured by the `clock' function. POSIX requires that this value +- be one million independent of the actual resolution. +- +- - Macro: int CLK_TCK +- This is an obsolete name for `CLOCKS_PER_SEC'. +- +- - Data Type: clock_t +- This is the type of the value returned by the `clock' function. +- Values of type `clock_t' are numbers of clock ticks. +- +- - Function: clock_t clock (void) +- This function returns the calling process' current CPU time. If +- the CPU time is not available or cannot be represented, `clock' +- returns the value `(clock_t)(-1)'. +- +- +-File: libc.info, Node: Processor Time, Prev: CPU Time, Up: Processor And CPU Time +- +-Processor Time Inquiry +----------------------- +- +- The `times' function returns information about a process' +-consumption of processor time in a `struct tms' object, in addition to +-the process' CPU time. *Note Time Basics::. You should include the +-header file `sys/times.h' to use this facility. +- +- - Data Type: struct tms +- The `tms' structure is used to return information about process +- times. It contains at least the following members: +- +- `clock_t tms_utime' +- This is the total processor time the calling process has used +- in executing the instructions of its program. +- +- `clock_t tms_stime' +- This is the processor time the system has used on behalf of +- the calling process. +- +- `clock_t tms_cutime' +- This is the sum of the `tms_utime' values and the `tms_cutime' +- values of all terminated child processes of the calling +- process, whose status has been reported to the parent process +- by `wait' or `waitpid'; see *Note Process Completion::. In +- other words, it represents the total processor time used in +- executing the instructions of all the terminated child +- processes of the calling process, excluding child processes +- which have not yet been reported by `wait' or `waitpid'. +- +- `clock_t tms_cstime' +- This is similar to `tms_cutime', but represents the total +- processor time system has used on behalf of all the +- terminated child processes of the calling process. +- +- All of the times are given in numbers of clock ticks. Unlike CPU +- time, these are the actual amounts of time; not relative to any +- event. *Note Creating a Process::. +- +- - Function: clock_t times (struct tms *BUFFER) +- The `times' function stores the processor time information for the +- calling process in BUFFER. +- +- The return value is the calling process' CPU time (the same value +- you get from `clock()'. `times' returns `(clock_t)(-1)' to +- indicate failure. +- +- *Portability Note:* The `clock' function described in *Note CPU +-Time:: is specified by the ISO C standard. The `times' function is a +-feature of POSIX.1. In the GNU system, the CPU time is defined to be +-equivalent to the sum of the `tms_utime' and `tms_stime' fields +-returned by `times'. +- +- +-File: libc.info, Node: Calendar Time, Next: Setting an Alarm, Prev: Processor And CPU Time, Up: Date and Time +- +-Calendar Time +-============= +- +- This section describes facilities for keeping track of calendar time. +-*Note Time Basics::. +- +- The GNU C library represents calendar time three ways: +- +- * "Simple time" (the `time_t' data type) is a compact +- representation, typically giving the number of seconds of elapsed +- time since some implementation-specific base time. +- +- * There is also a "high-resolution time" representation. Like simple +- time, this represents a calendar time as an elapsed time since a +- base time, but instead of measuring in whole seconds, it uses a +- `struct timeval' data type, which includes fractions of a second. +- Use this time representation instead of simple time when you need +- greater precision. +- +- * "Local time" or "broken-down time" (the `struct tm' data type) +- represents a calendar time as a set of components specifying the +- year, month, and so on in the Gregorian calendar, for a specific +- time zone. This calendar time representation is usually used only +- to communicate with people. +- +-* Menu: +- +-* Simple Calendar Time:: Facilities for manipulating calendar time. +-* High-Resolution Calendar:: A time representation with greater precision. +-* Broken-down Time:: Facilities for manipulating local time. +-* High Accuracy Clock:: Maintaining a high accuracy system clock. +-* Formatting Calendar Time:: Converting times to strings. +-* Parsing Date and Time:: Convert textual time and date information back +- into broken-down time values. +-* TZ Variable:: How users specify the time zone. +-* Time Zone Functions:: Functions to examine or specify the time zone. +-* Time Functions Example:: An example program showing use of some of +- the time functions. +- +- +-File: libc.info, Node: Simple Calendar Time, Next: High-Resolution Calendar, Up: Calendar Time +- +-Simple Calendar Time +--------------------- +- +- This section describes the `time_t' data type for representing +-calendar time as simple time, and the functions which operate on simple +-time objects. These facilities are declared in the header file +-`time.h'. +- +- - Data Type: time_t +- This is the data type used to represent simple time. Sometimes, +- it also represents an elapsed time. When interpreted as a +- calendar time value, it represents the number of seconds elapsed +- since 00:00:00 on January 1, 1970, Coordinated Universal Time. +- (This calendar time is sometimes referred to as the "epoch".) +- POSIX requires that this count not include leap seconds, but on +- some systems this count includes leap seconds if you set `TZ' to +- certain values (*note TZ Variable::). +- +- Note that a simple time has no concept of local time zone. +- Calendar Time T is the same instant in time regardless of where on +- the globe the computer is. +- +- In the GNU C library, `time_t' is equivalent to `long int'. In +- other systems, `time_t' might be either an integer or +- floating-point type. +- +- The function `difftime' tells you the elapsed time between two +-simple calendar times, which is not always as easy to compute as just +-subtracting. *Note Elapsed Time::. +- +- - Function: time_t time (time_t *RESULT) +- The `time' function returns the current calendar time as a value of +- type `time_t'. If the argument RESULT is not a null pointer, the +- calendar time value is also stored in `*RESULT'. If the current +- calendar time is not available, the value `(time_t)(-1)' is +- returned. +- +- - Function: int stime (time_t *NEWTIME) +- `stime' sets the system clock, i.e. it tells the system that the +- current calendar time is NEWTIME, where `newtime' is interpreted +- as described in the above definition of `time_t'. +- +- `settimeofday' is a newer function which sets the system clock to +- better than one second precision. `settimeofday' is generally a +- better choice than `stime'. *Note High-Resolution Calendar::. +- +- Only the superuser can set the system clock. +- +- If the function succeeds, the return value is zero. Otherwise, it +- is `-1' and `errno' is set accordingly: +- +- `EPERM' +- The process is not superuser. +- +- +-File: libc.info, Node: High-Resolution Calendar, Next: Broken-down Time, Prev: Simple Calendar Time, Up: Calendar Time +- +-High-Resolution Calendar +------------------------- +- +- The `time_t' data type used to represent simple times has a +-resolution of only one second. Some applications need more precision. +- +- So, the GNU C library also contains functions which are capable of +-representing calendar times to a higher resolution than one second. The +-functions and the associated data types described in this section are +-declared in `sys/time.h'. +- +- - Data Type: struct timezone +- The `struct timezone' structure is used to hold minimal information +- about the local time zone. It has the following members: +- +- `int tz_minuteswest' +- This is the number of minutes west of UTC. +- +- `int tz_dsttime' +- If nonzero, Daylight Saving Time applies during some part of +- the year. +- +- The `struct timezone' type is obsolete and should never be used. +- Instead, use the facilities described in *Note Time Zone +- Functions::. +- +- - Function: int gettimeofday (struct timeval *TP, struct timezone *TZP) +- The `gettimeofday' function returns the current calendar time as +- the elapsed time since the epoch in the `struct timeval' structure +- indicated by TP. (*note Elapsed Time:: for a description of +- `struct timespec'). Information about the time zone is returned in +- the structure pointed at TZP. If the TZP argument is a null +- pointer, time zone information is ignored. +- +- The return value is `0' on success and `-1' on failure. The +- following `errno' error condition is defined for this function: +- +- `ENOSYS' +- The operating system does not support getting time zone +- information, and TZP is not a null pointer. The GNU +- operating system does not support using `struct timezone' to +- represent time zone information; that is an obsolete feature +- of 4.3 BSD. Instead, use the facilities described in *Note +- Time Zone Functions::. +- +- - Function: int settimeofday (const struct timeval *TP, const struct +- timezone *TZP) +- The `settimeofday' function sets the current calendar time in the +- system clock according to the arguments. As for `gettimeofday', +- the calendar time is represented as the elapsed time since the +- epoch. As for `gettimeofday', time zone information is ignored if +- TZP is a null pointer. +- +- You must be a privileged user in order to use `settimeofday'. +- +- Some kernels automatically set the system clock from some source +- such as a hardware clock when they start up. Others, including +- Linux, place the system clock in an "invalid" state (in which +- attempts to read the clock fail). A call of `stime' removes the +- system clock from an invalid state, and system startup scripts +- typically run a program that calls `stime'. +- +- `settimeofday' causes a sudden jump forwards or backwards, which +- can cause a variety of problems in a system. Use `adjtime' (below) +- to make a smooth transition from one time to another by temporarily +- speeding up or slowing down the clock. +- +- With a Linux kernel, `adjtimex' does the same thing and can also +- make permanent changes to the speed of the system clock so it +- doesn't need to be corrected as often. +- +- The return value is `0' on success and `-1' on failure. The +- following `errno' error conditions are defined for this function: +- +- `EPERM' +- This process cannot set the clock because it is not +- privileged. +- +- `ENOSYS' +- The operating system does not support setting time zone +- information, and TZP is not a null pointer. +- +- - Function: int adjtime (const struct timeval *DELTA, struct timeval +- *OLDDELTA) +- This function speeds up or slows down the system clock in order to +- make a gradual adjustment. This ensures that the calendar time +- reported by the system clock is always monotonically increasing, +- which might not happen if you simply set the clock. +- +- The DELTA argument specifies a relative adjustment to be made to +- the clock time. If negative, the system clock is slowed down for a +- while until it has lost this much elapsed time. If positive, the +- system clock is speeded up for a while. +- +- If the OLDDELTA argument is not a null pointer, the `adjtime' +- function returns information about any previous time adjustment +- that has not yet completed. +- +- This function is typically used to synchronize the clocks of +- computers in a local network. You must be a privileged user to +- use it. +- +- With a Linux kernel, you can use the `adjtimex' function to +- permanently change the clock speed. +- +- The return value is `0' on success and `-1' on failure. The +- following `errno' error condition is defined for this function: +- +- `EPERM' +- You do not have privilege to set the time. +- +- *Portability Note:* The `gettimeofday', `settimeofday', and +-`adjtime' functions are derived from BSD. +- +- Symbols for the following function are declared in `sys/timex.h'. +- +- - Function: int adjtimex (struct timex *TIMEX) +- `adjtimex' is functionally identical to `ntp_adjtime'. *Note High +- Accuracy Clock::. +- +- This function is present only with a Linux kernel. +- +- +- +-File: libc.info, Node: Broken-down Time, Next: High Accuracy Clock, Prev: High-Resolution Calendar, Up: Calendar Time +- +-Broken-down Time +----------------- +- +- Calendar time is represented by the usual GNU C library functions as +-an elapsed time since a fixed base calendar time. This is convenient +-for computation, but has no relation to the way people normally think of +-calendar time. By contrast, "broken-down time" is a binary +-representation of calendar time separated into year, month, day, and so +-on. Broken-down time values are not useful for calculations, but they +-are useful for printing human readable time information. +- +- A broken-down time value is always relative to a choice of time +-zone, and it also indicates which time zone that is. +- +- The symbols in this section are declared in the header file `time.h'. +- +- - Data Type: struct tm +- This is the data type used to represent a broken-down time. The +- structure contains at least the following members, which can +- appear in any order. +- +- `int tm_sec' +- This is the number of full seconds since the top of the +- minute (normally in the range `0' through `59', but the +- actual upper limit is `60', to allow for leap seconds if leap +- second support is available). +- +- `int tm_min' +- This is the number of full minutes since the top of the hour +- (in the range `0' through `59'). +- +- `int tm_hour' +- This is the number of full hours past midnight (in the range +- `0' through `23'). +- +- `int tm_mday' +- This is the ordinal day of the month (in the range `1' +- through `31'). Watch out for this one! As the only ordinal +- number in the structure, it is inconsistent with the rest of +- the structure. +- +- `int tm_mon' +- This is the number of full calendar months since the +- beginning of the year (in the range `0' through `11'). Watch +- out for this one! People usually use ordinal numbers for +- month-of-year (where January = 1). +- +- `int tm_year' +- This is the number of full calendar years since 1900. +- +- `int tm_wday' +- This is the number of full days since Sunday (in the range +- `0' through `6'). +- +- `int tm_yday' +- This is the number of full days since the beginning of the +- year (in the range `0' through `365'). +- +- `int tm_isdst' +- This is a flag that indicates whether Daylight Saving Time is +- (or was, or will be) in effect at the time described. The +- value is positive if Daylight Saving Time is in effect, zero +- if it is not, and negative if the information is not +- available. +- +- `long int tm_gmtoff' +- This field describes the time zone that was used to compute +- this broken-down time value, including any adjustment for +- daylight saving; it is the number of seconds that you must +- add to UTC to get local time. You can also think of this as +- the number of seconds east of UTC. For example, for U.S. +- Eastern Standard Time, the value is `-5*60*60'. The +- `tm_gmtoff' field is derived from BSD and is a GNU library +- extension; it is not visible in a strict ISO C environment. +- +- `const char *tm_zone' +- This field is the name for the time zone that was used to +- compute this broken-down time value. Like `tm_gmtoff', this +- field is a BSD and GNU extension, and is not visible in a +- strict ISO C environment. +- +- - Function: struct tm * localtime (const time_t *TIME) +- The `localtime' function converts the simple time pointed to by +- TIME to broken-down time representation, expressed relative to the +- user's specified time zone. +- +- The return value is a pointer to a static broken-down time +- structure, which might be overwritten by subsequent calls to +- `ctime', `gmtime', or `localtime'. (But no other library function +- overwrites the contents of this object.) +- +- The return value is the null pointer if TIME cannot be represented +- as a broken-down time; typically this is because the year cannot +- fit into an `int'. +- +- Calling `localtime' has one other effect: it sets the variable +- `tzname' with information about the current time zone. *Note Time +- Zone Functions::. +- +- Using the `localtime' function is a big problem in multi-threaded +-programs. The result is returned in a static buffer and this is used in +-all threads. POSIX.1c introduced a variant of this function. +- +- - Function: struct tm * localtime_r (const time_t *TIME, struct tm +- *RESULTP) +- The `localtime_r' function works just like the `localtime' +- function. It takes a pointer to a variable containing a simple +- time and converts it to the broken-down time format. +- +- But the result is not placed in a static buffer. Instead it is +- placed in the object of type `struct tm' to which the parameter +- RESULTP points. +- +- If the conversion is successful the function returns a pointer to +- the object the result was written into, i.e., it returns RESULTP. +- +- - Function: struct tm * gmtime (const time_t *TIME) +- This function is similar to `localtime', except that the +- broken-down time is expressed as Coordinated Universal Time (UTC) +- (formerly called Greenwich Mean Time (GMT)) rather than relative +- to a local time zone. +- +- +- As for the `localtime' function we have the problem that the result +-is placed in a static variable. POSIX.1c also provides a replacement +-for `gmtime'. +- +- - Function: struct tm * gmtime_r (const time_t *TIME, struct tm +- *RESULTP) +- This function is similar to `localtime_r', except that it converts +- just like `gmtime' the given time as Coordinated Universal Time. +- +- If the conversion is successful the function returns a pointer to +- the object the result was written into, i.e., it returns RESULTP. +- +- - Function: time_t mktime (struct tm *BROKENTIME) +- The `mktime' function is used to convert a broken-down time +- structure to a simple time representation. It also "normalizes" +- the contents of the broken-down time structure, by filling in the +- day of week and day of year based on the other date and time +- components. +- +- The `mktime' function ignores the specified contents of the +- `tm_wday' and `tm_yday' members of the broken-down time structure. +- It uses the values of the other components to determine the +- calendar time; it's permissible for these components to have +- unnormalized values outside their normal ranges. The last thing +- that `mktime' does is adjust the components of the BROKENTIME +- structure (including the `tm_wday' and `tm_yday'). +- +- If the specified broken-down time cannot be represented as a +- simple time, `mktime' returns a value of `(time_t)(-1)' and does +- not modify the contents of BROKENTIME. +- +- Calling `mktime' also sets the variable `tzname' with information +- about the current time zone. *Note Time Zone Functions::. +- +- - Function: time_t timelocal (struct tm *BROKENTIME) +- `timelocal' is functionally identical to `mktime', but more +- mnemonically named. Note that it is the inverse of the `localtime' +- function. +- +- *Portability note:* `mktime' is essentially universally +- available. `timelocal' is rather rare. +- +- +- - Function: time_t timegm (struct tm *BROKENTIME) +- `timegm' is functionally identical to `mktime' except it always +- takes the input values to be Coordinated Universal Time (UTC) +- regardless of any local time zone setting. +- +- Note that `timegm' is the inverse of `gmtime'. +- +- *Portability note:* `mktime' is essentially universally +- available. `timegm' is rather rare. For the most portable +- conversion from a UTC broken-down time to a simple time, set the +- `TZ' environment variable to UTC, call `mktime', then set `TZ' +- back. +- +- +- +-File: libc.info, Node: High Accuracy Clock, Next: Formatting Calendar Time, Prev: Broken-down Time, Up: Calendar Time +- +-High Accuracy Clock +-------------------- +- +- The `ntp_gettime' and `ntp_adjtime' functions provide an interface +-to monitor and manipulate the system clock to maintain high accuracy +-time. For example, you can fine tune the speed of the clock or +-synchronize it with another time source. +- +- A typical use of these functions is by a server implementing the +-Network Time Protocol to synchronize the clocks of multiple systems and +-high precision clocks. +- +- These functions are declared in `sys/timex.h'. +- +- - Data Type: struct ntptimeval +- This structure is used for information about the system clock. It +- contains the following members: +- `struct timeval time' +- This is the current calendar time, expressed as the elapsed +- time since the epoch. The `struct timeval' data type is +- described in *Note Elapsed Time::. +- +- `long int maxerror' +- This is the maximum error, measured in microseconds. Unless +- updated via `ntp_adjtime' periodically, this value will reach +- some platform-specific maximum value. +- +- `long int esterror' +- This is the estimated error, measured in microseconds. This +- value can be set by `ntp_adjtime' to indicate the estimated +- offset of the system clock from the true calendar time. +- +- - Function: int ntp_gettime (struct ntptimeval *TPTR) +- The `ntp_gettime' function sets the structure pointed to by TPTR +- to current values. The elements of the structure afterwards +- contain the values the timer implementation in the kernel assumes. +- They might or might not be correct. If they are not a +- `ntp_adjtime' call is necessary. +- +- The return value is `0' on success and other values on failure. +- The following `errno' error conditions are defined for this +- function: +- +- `TIME_ERROR' +- The precision clock model is not properly set up at the +- moment, thus the clock must be considered unsynchronized, and +- the values should be treated with care. +- +- - Data Type: struct timex +- This structure is used to control and monitor the system clock. It +- contains the following members: +- `unsigned int modes' +- This variable controls whether and which values are set. +- Several symbolic constants have to be combined with _binary +- or_ to specify the effective mode. These constants start +- with `MOD_'. +- +- `long int offset' +- This value indicates the current offset of the system clock +- from the true calendar time. The value is given in +- microseconds. If bit `MOD_OFFSET' is set in `modes', the +- offset (and possibly other dependent values) can be set. The +- offset's absolute value must not exceed `MAXPHASE'. +- +- `long int frequency' +- This value indicates the difference in frequency between the +- true calendar time and the system clock. The value is +- expressed as scaled PPM (parts per million, 0.0001%). The +- scaling is `1 << SHIFT_USEC'. The value can be set with bit +- `MOD_FREQUENCY', but the absolute value must not exceed +- `MAXFREQ'. +- +- `long int maxerror' +- This is the maximum error, measured in microseconds. A new +- value can be set using bit `MOD_MAXERROR'. Unless updated via +- `ntp_adjtime' periodically, this value will increase steadily +- and reach some platform-specific maximum value. +- +- `long int esterror' +- This is the estimated error, measured in microseconds. This +- value can be set using bit `MOD_ESTERROR'. +- +- `int status' +- This variable reflects the various states of the clock +- machinery. There are symbolic constants for the significant +- bits, starting with `STA_'. Some of these flags can be +- updated using the `MOD_STATUS' bit. +- +- `long int constant' +- This value represents the bandwidth or stiffness of the PLL +- (phase locked loop) implemented in the kernel. The value can +- be changed using bit `MOD_TIMECONST'. +- +- `long int precision' +- This value represents the accuracy or the maximum error when +- reading the system clock. The value is expressed in +- microseconds. +- +- `long int tolerance' +- This value represents the maximum frequency error of the +- system clock in scaled PPM. This value is used to increase +- the `maxerror' every second. +- +- `struct timeval time' +- The current calendar time. +- +- `long int tick' +- The elapsed time between clock ticks in microseconds. A +- clock tick is a periodic timer interrupt on which the system +- clock is based. +- +- `long int ppsfreq' +- This is the first of a few optional variables that are +- present only if the system clock can use a PPS (pulse per +- second) signal to discipline the system clock. The value is +- expressed in scaled PPM and it denotes the difference in +- frequency between the system clock and the PPS signal. +- +- `long int jitter' +- This value expresses a median filtered average of the PPS +- signal's dispersion in microseconds. +- +- `int shift' +- This value is a binary exponent for the duration of the PPS +- calibration interval, ranging from `PPS_SHIFT' to +- `PPS_SHIFTMAX'. +- +- `long int stabil' +- This value represents the median filtered dispersion of the +- PPS frequency in scaled PPM. +- +- `long int jitcnt' +- This counter represents the number of pulses where the jitter +- exceeded the allowed maximum `MAXTIME'. +- +- `long int calcnt' +- This counter reflects the number of successful calibration +- intervals. +- +- `long int errcnt' +- This counter represents the number of calibration errors +- (caused by large offsets or jitter). +- +- `long int stbcnt' +- This counter denotes the number of of calibrations where the +- stability exceeded the threshold. +- +- - Function: int ntp_adjtime (struct timex *TPTR) +- The `ntp_adjtime' function sets the structure specified by TPTR to +- current values. +- +- In addition, `ntp_adjtime' updates some settings to match what you +- pass to it in *TPTR. Use the `modes' element of *TPTR to select +- what settings to update. You can set `offset', `freq', +- `maxerror', `esterror', `status', `constant', and `tick'. +- +- `modes' = zero means set nothing. +- +- Only the superuser can update settings. +- +- The return value is `0' on success and other values on failure. +- The following `errno' error conditions are defined for this +- function: +- +- `TIME_ERROR' +- The high accuracy clock model is not properly set up at the +- moment, thus the clock must be considered unsynchronized, and +- the values should be treated with care. Another reason could +- be that the specified new values are not allowed. +- +- `EPERM' +- The process specified a settings update, but is not superuser. +- +- For more details see RFC1305 (Network Time Protocol, Version 3) and +- related documents. +- +- *Portability note:* Early versions of the GNU C library did not +- have this function but did have the synonymous `adjtimex'. +- +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-36 glibc-2.3.2-200304020432/manual/libc.info-36 +--- glibc-2.3.2/manual/libc.info-36 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-36 Thu Jan 1 01:00:00 1970 +@@ -1,1261 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Formatting Calendar Time, Next: Parsing Date and Time, Prev: High Accuracy Clock, Up: Calendar Time +- +-Formatting Calendar Time +------------------------- +- +- The functions described in this section format calendar time values +-as strings. These functions are declared in the header file `time.h'. +- +- - Function: char * asctime (const struct tm *BROKENTIME) +- The `asctime' function converts the broken-down time value that +- BROKENTIME points to into a string in a standard format: +- +- "Tue May 21 13:46:22 1991\n" +- +- The abbreviations for the days of week are: `Sun', `Mon', `Tue', +- `Wed', `Thu', `Fri', and `Sat'. +- +- The abbreviations for the months are: `Jan', `Feb', `Mar', `Apr', +- `May', `Jun', `Jul', `Aug', `Sep', `Oct', `Nov', and `Dec'. +- +- The return value points to a statically allocated string, which +- might be overwritten by subsequent calls to `asctime' or `ctime'. +- (But no other library function overwrites the contents of this +- string.) +- +- - Function: char * asctime_r (const struct tm *BROKENTIME, char +- *BUFFER) +- This function is similar to `asctime' but instead of placing the +- result in a static buffer it writes the string in the buffer +- pointed to by the parameter BUFFER. This buffer should have room +- for at least 26 bytes, including the terminating null. +- +- If no error occurred the function returns a pointer to the string +- the result was written into, i.e., it returns BUFFER. Otherwise +- return `NULL'. +- +- - Function: char * ctime (const time_t *TIME) +- The `ctime' function is similar to `asctime', except that you +- specify the calendar time argument as a `time_t' simple time value +- rather than in broken-down local time format. It is equivalent to +- +- asctime (localtime (TIME)) +- +- `ctime' sets the variable `tzname', because `localtime' does so. +- *Note Time Zone Functions::. +- +- - Function: char * ctime_r (const time_t *TIME, char *BUFFER) +- This function is similar to `ctime', but places the result in the +- string pointed to by BUFFER. It is equivalent to (written using +- gcc extensions, *note Statement Exprs: (gcc)Statement Exprs.): +- +- ({ struct tm tm; asctime_r (localtime_r (time, &tm), buf); }) +- +- If no error occurred the function returns a pointer to the string +- the result was written into, i.e., it returns BUFFER. Otherwise +- return `NULL'. +- +- - Function: size_t strftime (char *S, size_t SIZE, const char +- *TEMPLATE, const struct tm *BROKENTIME) +- This function is similar to the `sprintf' function (*note +- Formatted Input::), but the conversion specifications that can +- appear in the format template TEMPLATE are specialized for +- printing components of the date and time BROKENTIME according to +- the locale currently specified for time conversion (*note +- Locales::). +- +- Ordinary characters appearing in the TEMPLATE are copied to the +- output string S; this can include multibyte character sequences. +- Conversion specifiers are introduced by a `%' character, followed +- by an optional flag which can be one of the following. These flags +- are all GNU extensions. The first three affect only the output of +- numbers: +- +- `_' +- The number is padded with spaces. +- +- `-' +- The number is not padded at all. +- +- `0' +- The number is padded with zeros even if the format specifies +- padding with spaces. +- +- `^' +- The output uses uppercase characters, but only if this is +- possible (*note Case Conversion::). +- +- The default action is to pad the number with zeros to keep it a +- constant width. Numbers that do not have a range indicated below +- are never padded, since there is no natural width for them. +- +- Following the flag an optional specification of the width is +- possible. This is specified in decimal notation. If the natural +- size of the output is of the field has less than the specified +- number of characters, the result is written right adjusted and +- space padded to the given size. +- +- An optional modifier can follow the optional flag and width +- specification. The modifiers, which were first standardized by +- POSIX.2-1992 and by ISO C99, are: +- +- `E' +- Use the locale's alternate representation for date and time. +- This modifier applies to the `%c', `%C', `%x', `%X', `%y' and +- `%Y' format specifiers. In a Japanese locale, for example, +- `%Ex' might yield a date format based on the Japanese +- Emperors' reigns. +- +- `O' +- Use the locale's alternate numeric symbols for numbers. This +- modifier applies only to numeric format specifiers. +- +- If the format supports the modifier but no alternate representation +- is available, it is ignored. +- +- The conversion specifier ends with a format specifier taken from +- the following list. The whole `%' sequence is replaced in the +- output string as follows: +- +- `%a' +- The abbreviated weekday name according to the current locale. +- +- `%A' +- The full weekday name according to the current locale. +- +- `%b' +- The abbreviated month name according to the current locale. +- +- `%B' +- The full month name according to the current locale. +- +- `%c' +- The preferred calendar time representation for the current +- locale. +- +- `%C' +- The century of the year. This is equivalent to the greatest +- integer not greater than the year divided by 100. +- +- This format was first standardized by POSIX.2-1992 and by +- ISO C99. +- +- `%d' +- The day of the month as a decimal number (range `01' through +- `31'). +- +- `%D' +- The date using the format `%m/%d/%y'. +- +- This format was first standardized by POSIX.2-1992 and by +- ISO C99. +- +- `%e' +- The day of the month like with `%d', but padded with blank +- (range ` 1' through `31'). +- +- This format was first standardized by POSIX.2-1992 and by +- ISO C99. +- +- `%F' +- The date using the format `%Y-%m-%d'. This is the form +- specified in the ISO 8601 standard and is the preferred form +- for all uses. +- +- This format was first standardized by ISO C99 and by +- POSIX.1-2001. +- +- `%g' +- The year corresponding to the ISO week number, but without +- the century (range `00' through `99'). This has the same +- format and value as `%y', except that if the ISO week number +- (see `%V') belongs to the previous or next year, that year is +- used instead. +- +- This format was first standardized by ISO C99 and by +- POSIX.1-2001. +- +- `%G' +- The year corresponding to the ISO week number. This has the +- same format and value as `%Y', except that if the ISO week +- number (see `%V') belongs to the previous or next year, that +- year is used instead. +- +- This format was first standardized by ISO C99 and by +- POSIX.1-2001 but was previously available as a GNU extension. +- +- `%h' +- The abbreviated month name according to the current locale. +- The action is the same as for `%b'. +- +- This format was first standardized by POSIX.2-1992 and by +- ISO C99. +- +- `%H' +- The hour as a decimal number, using a 24-hour clock (range +- `00' through `23'). +- +- `%I' +- The hour as a decimal number, using a 12-hour clock (range +- `01' through `12'). +- +- `%j' +- The day of the year as a decimal number (range `001' through +- `366'). +- +- `%k' +- The hour as a decimal number, using a 24-hour clock like +- `%H', but padded with blank (range ` 0' through `23'). +- +- This format is a GNU extension. +- +- `%l' +- The hour as a decimal number, using a 12-hour clock like +- `%I', but padded with blank (range ` 1' through `12'). +- +- This format is a GNU extension. +- +- `%m' +- The month as a decimal number (range `01' through `12'). +- +- `%M' +- The minute as a decimal number (range `00' through `59'). +- +- `%n' +- A single `\n' (newline) character. +- +- This format was first standardized by POSIX.2-1992 and by +- ISO C99. +- +- `%p' +- Either `AM' or `PM', according to the given time value; or the +- corresponding strings for the current locale. Noon is +- treated as `PM' and midnight as `AM'. In most locales +- `AM'/`PM' format is not supported, in such cases `"%p"' +- yields an empty string. +- +- `%P' +- Either `am' or `pm', according to the given time value; or the +- corresponding strings for the current locale, printed in +- lowercase characters. Noon is treated as `pm' and midnight +- as `am'. In most locales `AM'/`PM' format is not supported, +- in such cases `"%P"' yields an empty string. +- +- This format is a GNU extension. +- +- `%r' +- The complete calendar time using the AM/PM format of the +- current locale. +- +- This format was first standardized by POSIX.2-1992 and by +- ISO C99. In the POSIX locale, this format is equivalent to +- `%I:%M:%S %p'. +- +- `%R' +- The hour and minute in decimal numbers using the format +- `%H:%M'. +- +- This format was first standardized by ISO C99 and by +- POSIX.1-2001 but was previously available as a GNU extension. +- +- `%s' +- The number of seconds since the epoch, i.e., since 1970-01-01 +- 00:00:00 UTC. Leap seconds are not counted unless leap +- second support is available. +- +- This format is a GNU extension. +- +- `%S' +- The seconds as a decimal number (range `00' through `60'). +- +- `%t' +- A single `\t' (tabulator) character. +- +- This format was first standardized by POSIX.2-1992 and by +- ISO C99. +- +- `%T' +- The time of day using decimal numbers using the format +- `%H:%M:%S'. +- +- This format was first standardized by POSIX.2-1992 and by +- ISO C99. +- +- `%u' +- The day of the week as a decimal number (range `1' through +- `7'), Monday being `1'. +- +- This format was first standardized by POSIX.2-1992 and by +- ISO C99. +- +- `%U' +- The week number of the current year as a decimal number +- (range `00' through `53'), starting with the first Sunday as +- the first day of the first week. Days preceding the first +- Sunday in the year are considered to be in week `00'. +- +- `%V' +- The ISO 8601:1988 week number as a decimal number (range `01' +- through `53'). ISO weeks start with Monday and end with +- Sunday. Week `01' of a year is the first week which has the +- majority of its days in that year; this is equivalent to the +- week containing the year's first Thursday, and it is also +- equivalent to the week containing January 4. Week `01' of a +- year can contain days from the previous year. The week +- before week `01' of a year is the last week (`52' or `53') of +- the previous year even if it contains days from the new year. +- +- This format was first standardized by POSIX.2-1992 and by +- ISO C99. +- +- `%w' +- The day of the week as a decimal number (range `0' through +- `6'), Sunday being `0'. +- +- `%W' +- The week number of the current year as a decimal number +- (range `00' through `53'), starting with the first Monday as +- the first day of the first week. All days preceding the +- first Monday in the year are considered to be in week `00'. +- +- `%x' +- The preferred date representation for the current locale. +- +- `%X' +- The preferred time of day representation for the current +- locale. +- +- `%y' +- The year without a century as a decimal number (range `00' +- through `99'). This is equivalent to the year modulo 100. +- +- `%Y' +- The year as a decimal number, using the Gregorian calendar. +- Years before the year `1' are numbered `0', `-1', and so on. +- +- `%z' +- RFC 822/ISO 8601:1988 style numeric time zone (e.g., `-0600' +- or `+0100'), or nothing if no time zone is determinable. +- +- This format was first standardized by ISO C99 and by +- POSIX.1-2001 but was previously available as a GNU extension. +- +- In the POSIX locale, a full RFC 822 timestamp is generated by +- the format `"%a, %d %b %Y %H:%M:%S %z"' (or the equivalent +- `"%a, %d %b %Y %T %z"'). +- +- `%Z' +- The time zone abbreviation (empty if the time zone can't be +- determined). +- +- `%%' +- A literal `%' character. +- +- The SIZE parameter can be used to specify the maximum number of +- characters to be stored in the array S, including the terminating +- null character. If the formatted time requires more than SIZE +- characters, `strftime' returns zero and the contents of the array +- S are undefined. Otherwise the return value indicates the number +- of characters placed in the array S, not including the terminating +- null character. +- +- _Warning:_ This convention for the return value which is prescribed +- in ISO C can lead to problems in some situations. For certain +- format strings and certain locales the output really can be the +- empty string and this cannot be discovered by testing the return +- value only. E.g., in most locales the AM/PM time format is not +- supported (most of the world uses the 24 hour time +- representation). In such locales `"%p"' will return the empty +- string, i.e., the return value is zero. To detect situations like +- this something similar to the following code should be used: +- +- buf[0] = '\1'; +- len = strftime (buf, bufsize, format, tp); +- if (len == 0 && buf[0] != '\0') +- { +- /* Something went wrong in the strftime call. */ +- ... +- } +- +- If S is a null pointer, `strftime' does not actually write +- anything, but instead returns the number of characters it would +- have written. +- +- According to POSIX.1 every call to `strftime' implies a call to +- `tzset'. So the contents of the environment variable `TZ' is +- examined before any output is produced. +- +- For an example of `strftime', see *Note Time Functions Example::. +- +- - Function: size_t wcsftime (wchar_t *S, size_t SIZE, const wchar_t +- *TEMPLATE, const struct tm *BROKENTIME) +- The `wcsftime' function is equivalent to the `strftime' function +- with the difference that it operates on wide character strings. +- The buffer where the result is stored, pointed to by S, must be an +- array of wide characters. The parameter SIZE which specifies the +- size of the output buffer gives the number of wide character, not +- the number of bytes. +- +- Also the format string TEMPLATE is a wide character string. Since +- all characters needed to specify the format string are in the basic +- character set it is portably possible to write format strings in +- the C source code using the `L"..."' notation. The parameter +- BROKENTIME has the same meaning as in the `strftime' call. +- +- The `wcsftime' function supports the same flags, modifiers, and +- format specifiers as the `strftime' function. +- +- The return value of `wcsftime' is the number of wide characters +- stored in `s'. When more characters would have to be written than +- can be placed in the buffer S the return value is zero, with the +- same problems indicated in the `strftime' documentation. +- +- +-File: libc.info, Node: Parsing Date and Time, Next: TZ Variable, Prev: Formatting Calendar Time, Up: Calendar Time +- +-Convert textual time and date information back +----------------------------------------------- +- +- The ISO C standard does not specify any functions which can convert +-the output of the `strftime' function back into a binary format. This +-led to a variety of more-or-less successful implementations with +-different interfaces over the years. Then the Unix standard was +-extended by the addition of two functions: `strptime' and `getdate'. +-Both have strange interfaces but at least they are widely available. +- +-* Menu: +- +-* Low-Level Time String Parsing:: Interpret string according to given format. +-* General Time String Parsing:: User-friendly function to parse data and +- time strings. +- +- +-File: libc.info, Node: Low-Level Time String Parsing, Next: General Time String Parsing, Up: Parsing Date and Time +- +-Interpret string according to given format +-.......................................... +- +- 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 `getdate' function, which +-is defined and implemented in terms of calls to `strptime'. +- +- - Function: char * strptime (const char *S, const char *FMT, struct tm +- *TP) +- The `strptime' function parses the input string S according to the +- format string FMT and stores its results in the structure TP. +- +- The input string could be generated by a `strftime' call or +- obtained any other way. It does not need to be in a +- human-recognizable format; e.g. a date passed as `"02:1999:9"' is +- acceptable, even though it is ambiguous without context. As long +- as the format string FMT matches the input string the function +- will succeed. +- +- The user has to make sure, though, that the input can be parsed in +- a unambiguous way. The string `"1999112"' can be parsed using the +- format `"%Y%m%d"' as 1999-1-12, 1999-11-2, or even 19991-1-2. It +- is necessary to add appropriate separators to reliably get results. +- +- The format string consists of the same components as the format +- string of the `strftime' function. The only difference is that +- the flags `_', `-', `0', and `^' are not allowed. Several of the +- distinct formats of `strftime' do the same work in `strptime' +- since differences like case of the input do not matter. For +- reasons of symmetry all formats are supported, though. +- +- The modifiers `E' and `O' are also allowed everywhere the +- `strftime' function allows them. +- +- The formats are: +- +- `%a' +- `%A' +- The weekday name according to the current locale, in +- abbreviated form or the full name. +- +- `%b' +- `%B' +- `%h' +- The month name according to the current locale, in +- abbreviated form or the full name. +- +- `%c' +- The date and time representation for the current locale. +- +- `%Ec' +- Like `%c' but the locale's alternative date and time format +- is used. +- +- `%C' +- The century of the year. +- +- It makes sense to use this format only if the format string +- also contains the `%y' format. +- +- `%EC' +- The locale's representation of the period. +- +- Unlike `%C' it sometimes makes sense to use this format since +- some cultures represent years relative to the beginning of +- eras instead of using the Gregorian years. +- +- `%d' +- +- `%e' +- The day of the month as a decimal number (range `1' through +- `31'). Leading zeroes are permitted but not required. +- +- `%Od' +- `%Oe' +- Same as `%d' but using the locale's alternative numeric +- symbols. +- +- Leading zeroes are permitted but not required. +- +- `%D' +- Equivalent to `%m/%d/%y'. +- +- `%F' +- Equivalent to `%Y-%m-%d', which is the ISO 8601 date format. +- +- This is a GNU extension following an ISO C99 extension to +- `strftime'. +- +- `%g' +- The year corresponding to the ISO week number, but without +- the century (range `00' through `99'). +- +- _Note:_ Currently, this is not fully implemented. The format +- is recognized, input is consumed but no field in TM is set. +- +- This format is a GNU extension following a GNU extension of +- `strftime'. +- +- `%G' +- The year corresponding to the ISO week number. +- +- _Note:_ Currently, this is not fully implemented. The format +- is recognized, input is consumed but no field in TM is set. +- +- This format is a GNU extension following a GNU extension of +- `strftime'. +- +- `%H' +- `%k' +- The hour as a decimal number, using a 24-hour clock (range +- `00' through `23'). +- +- `%k' is a GNU extension following a GNU extension of +- `strftime'. +- +- `%OH' +- Same as `%H' but using the locale's alternative numeric +- symbols. +- +- `%I' +- `%l' +- The hour as a decimal number, using a 12-hour clock (range +- `01' through `12'). +- +- `%l' is a GNU extension following a GNU extension of +- `strftime'. +- +- `%OI' +- Same as `%I' but using the locale's alternative numeric +- symbols. +- +- `%j' +- The day of the year as a decimal number (range `1' through +- `366'). +- +- Leading zeroes are permitted but not required. +- +- `%m' +- The month as a decimal number (range `1' through `12'). +- +- Leading zeroes are permitted but not required. +- +- `%Om' +- Same as `%m' but using the locale's alternative numeric +- symbols. +- +- `%M' +- The minute as a decimal number (range `0' through `59'). +- +- Leading zeroes are permitted but not required. +- +- `%OM' +- Same as `%M' but using the locale's alternative numeric +- symbols. +- +- `%n' +- `%t' +- Matches any white space. +- +- `%p' +- +- `%P' +- The locale-dependent equivalent to `AM' or `PM'. +- +- This format is not useful unless `%I' or `%l' is also used. +- Another complication is that the locale might not define +- these values at all and therefore the conversion fails. +- +- `%P' is a GNU extension following a GNU extension to +- `strftime'. +- +- `%r' +- The complete time using the AM/PM format of the current +- locale. +- +- A complication is that the locale might not define this +- format at all and therefore the conversion fails. +- +- `%R' +- The hour and minute in decimal numbers using the format +- `%H:%M'. +- +- `%R' is a GNU extension following a GNU extension to +- `strftime'. +- +- `%s' +- The number of seconds since the epoch, i.e., since 1970-01-01 +- 00:00:00 UTC. Leap seconds are not counted unless leap +- second support is available. +- +- `%s' is a GNU extension following a GNU extension to +- `strftime'. +- +- `%S' +- The seconds as a decimal number (range `0' through `60'). +- +- Leading zeroes are permitted but not required. +- +- *Note:* The Unix specification says the upper bound on this +- value is `61', a result of a decision to allow double leap +- seconds. You will not see the value `61' because no minute +- has more than one leap second, but the myth persists. +- +- `%OS' +- Same as `%S' but using the locale's alternative numeric +- symbols. +- +- `%T' +- Equivalent to the use of `%H:%M:%S' in this place. +- +- `%u' +- The day of the week as a decimal number (range `1' through +- `7'), Monday being `1'. +- +- Leading zeroes are permitted but not required. +- +- _Note:_ Currently, this is not fully implemented. The format +- is recognized, input is consumed but no field in TM is set. +- +- `%U' +- The week number of the current year as a decimal number +- (range `0' through `53'). +- +- Leading zeroes are permitted but not required. +- +- `%OU' +- Same as `%U' but using the locale's alternative numeric +- symbols. +- +- `%V' +- The ISO 8601:1988 week number as a decimal number (range `1' +- through `53'). +- +- Leading zeroes are permitted but not required. +- +- _Note:_ Currently, this is not fully implemented. The format +- is recognized, input is consumed but no field in TM is set. +- +- `%w' +- The day of the week as a decimal number (range `0' through +- `6'), Sunday being `0'. +- +- Leading zeroes are permitted but not required. +- +- _Note:_ Currently, this is not fully implemented. The format +- is recognized, input is consumed but no field in TM is set. +- +- `%Ow' +- Same as `%w' but using the locale's alternative numeric +- symbols. +- +- `%W' +- The week number of the current year as a decimal number +- (range `0' through `53'). +- +- Leading zeroes are permitted but not required. +- +- _Note:_ Currently, this is not fully implemented. The format +- is recognized, input is consumed but no field in TM is set. +- +- `%OW' +- Same as `%W' but using the locale's alternative numeric +- symbols. +- +- `%x' +- The date using the locale's date format. +- +- `%Ex' +- Like `%x' but the locale's alternative data representation is +- used. +- +- `%X' +- The time using the locale's time format. +- +- `%EX' +- Like `%X' but the locale's alternative time representation is +- used. +- +- `%y' +- The year without a century as a decimal number (range `0' +- through `99'). +- +- Leading zeroes are permitted but not required. +- +- Note that it is questionable to use this format without the +- `%C' format. The `strptime' function does regard input +- values in the range 68 to 99 as the years 1969 to 1999 and +- the values 0 to 68 as the years 2000 to 2068. But maybe this +- heuristic fails for some input data. +- +- Therefore it is best to avoid `%y' completely and use `%Y' +- instead. +- +- `%Ey' +- The offset from `%EC' in the locale's alternative +- representation. +- +- `%Oy' +- The offset of the year (from `%C') using the locale's +- alternative numeric symbols. +- +- `%Y' +- The year as a decimal number, using the Gregorian calendar. +- +- `%EY' +- The full alternative year representation. +- +- `%z' +- The offset from GMT in ISO 8601/RFC822 format. +- +- `%Z' +- The timezone name. +- +- _Note:_ Currently, this is not fully implemented. The format +- is recognized, input is consumed but no field in TM is set. +- +- `%%' +- A literal `%' character. +- +- All other characters in the format string must have a matching +- character in the input string. Exceptions are white spaces in the +- input string which can match zero or more whitespace characters in +- the format string. +- +- *Portability Note:* The XPG standard advises applications to use +- at least one whitespace character (as specified by `isspace') or +- other non-alphanumeric characters between any two conversion +- specifications. The GNU C Library does not have this limitation +- but other libraries might have trouble parsing formats like +- `"%d%m%Y%H%M%S"'. +- +- The `strptime' function processes the input string from right to +- left. Each of the three possible input elements (white space, +- literal, or format) are handled one after the other. If the input +- cannot be matched to the format string the function stops. The +- remainder of the format and input strings are not processed. +- +- The function returns a pointer to the first character it was +- unable to 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 `NULL' byte at +- the end of the string. If an error occurs, i.e. `strptime' fails +- to match all of the format string, the function returns `NULL'. +- +- The specification of the function in the XPG standard is rather +-vague, leaving out a few important pieces of information. Most +-importantly, it does not specify what happens to those elements of TM +-which are not directly initialized by the different formats. The +-implementations on different Unix systems vary here. +- +- The GNU libc implementation does not touch those fields which are not +-directly initialized. Exceptions are the `tm_wday' and `tm_yday' +-elements, which are recomputed if any of the year, month, or date +-elements changed. This has two implications: +- +- * Before calling the `strptime' function for a new input string, you +- should prepare the TM structure you pass. Normally this will mean +- initializing all values are to zero. Alternatively, you can set +- all fields to values like `INT_MAX', allowing you to determine +- which elements were set by the function call. Zero does not work +- here since it is a valid value for many of the fields. +- +- Careful initialization is necessary if you want to find out +- whether a certain field in TM was initialized by the function call. +- +- * You can construct a `struct tm' value with several consecutive +- `strptime' calls. A useful application of this is e.g. the parsing +- of two separate strings, one containing date information and the +- other time information. By parsing one after the other without +- clearing the structure in-between, you can construct a complete +- broken-down time. +- +- The following example shows a function which parses a string which is +-contains the date information in either US style or ISO 8601 form: +- +- const char * +- parse_date (const char *input, struct tm *tm) +- { +- const char *cp; +- +- /* First clear the result structure. */ +- memset (tm, '\0', sizeof (*tm)); +- +- /* Try the ISO format first. */ +- cp = strptime (input, "%F", tm); +- if (cp == NULL) +- { +- /* Does not match. Try the US form. */ +- cp = strptime (input, "%D", tm); +- } +- +- return cp; +- } +- +- +-File: libc.info, Node: General Time String Parsing, Prev: Low-Level Time String Parsing, Up: Parsing Date and Time +- +-A More User-friendly Way to Parse Times and Dates +-................................................. +- +- The Unix standard defines another function for parsing date strings. +-The interface is weird, but if the function happens to suit your +-application it is just fine. It is problematic to use this function in +-multi-threaded programs or libraries, since it returns a pointer to a +-static variable, and uses a global variable and global state (an +-environment variable). +- +- - Variable: getdate_err +- This variable of type `int' contains the error code of the last +- unsuccessful call to `getdate'. Defined values are: +- +- 1 +- The environment variable `DATEMSK' is not defined or null. +- +- 2 +- The template file denoted by the `DATEMSK' environment +- variable cannot be opened. +- +- 3 +- Information about the template file cannot retrieved. +- +- 4 +- The template file is not a regular file. +- +- 5 +- An I/O error occurred while reading the template file. +- +- 6 +- Not enough memory available to execute the function. +- +- 7 +- The template file contains no matching template. +- +- 8 +- The input date is invalid, but would match a template +- otherwise. This includes dates like February 31st, and dates +- which cannot be represented in a `time_t' variable. +- +- - Function: struct tm * getdate (const char *STRING) +- The interface to `getdate' is the simplest possible for a function +- to parse a string and return the value. STRING is the input +- string and the result is returned in a statically-allocated +- variable. +- +- The details about how the string is processed are hidden from the +- user. In fact, they can be outside the control of the program. +- Which formats are recognized is controlled by the file named by +- the environment variable `DATEMSK'. This file should contain +- lines of valid format strings which could be passed to `strptime'. +- +- The `getdate' function reads these format strings one after the +- other and tries to match the input string. The first line which +- completely matches the input string is used. +- +- Elements not initialized through the format string retain the +- values present at the time of the `getdate' function call. +- +- The formats recognized by `getdate' are the same as for +- `strptime'. See above for an explanation. There are only a few +- extensions to the `strptime' behavior: +- +- * If the `%Z' format is given the broken-down time is based on +- the current time of the timezone matched, not of the current +- timezone of the runtime environment. +- +- _Note_: This is not implemented (currently). The problem is +- that timezone names are not unique. If a fixed timezone is +- assumed for a given string (say `EST' meaning US East Coast +- time), then uses for countries other than the USA will fail. +- So far we have found no good solution to this. +- +- * If only the weekday is specified the selected day depends on +- the current date. If the current weekday is greater or equal +- to the `tm_wday' value the current week's day is chosen, +- otherwise the day next week is chosen. +- +- * A similar heuristic is used when only the month is given and +- not the year. If the month is greater than or equal to the +- current month, then the current year is used. Otherwise it +- wraps to next year. The first day of the month is assumed if +- one is not explicitly specified. +- +- * The current hour, minute, and second are used if the +- appropriate value is not set through the format. +- +- * If no date is given tomorrow's date is used if the time is +- smaller than the current time. Otherwise today's date is +- taken. +- +- It should be noted that the format in the template file need not +- only contain format elements. The following is a list of possible +- format strings (taken from the Unix standard): +- +- %m +- %A %B %d, %Y %H:%M:%S +- %A +- %B +- %m/%d/%y %I %p +- %d,%m,%Y %H:%M +- at %A the %dst of %B in %Y +- run job at %I %p,%B %dnd +- %A den %d. %B %Y %H.%M Uhr +- +- As you can see, the template list can contain very specific +- strings like `run job at %I %p,%B %dnd'. Using the above list of +- templates and assuming the current time is Mon Sep 22 12:19:47 EDT +- 1986 we can obtain the following results for the given input. +- +- Input Match Result +- Mon %a Mon Sep 22 12:19:47 EDT 1986 +- Sun %a Sun Sep 28 12:19:47 EDT 1986 +- Fri %a Fri Sep 26 12:19:47 EDT 1986 +- September %B Mon Sep 1 12:19:47 EDT 1986 +- January %B Thu Jan 1 12:19:47 EST 1987 +- December %B Mon Dec 1 12:19:47 EST 1986 +- Sep Mon %b %a Mon Sep 1 12:19:47 EDT 1986 +- Jan Fri %b %a Fri Jan 2 12:19:47 EST 1987 +- Dec Mon %b %a Mon Dec 1 12:19:47 EST 1986 +- Jan Wed 1989 %b %a %Y Wed Jan 4 12:19:47 EST 1989 +- Fri 9 %a %H Fri Sep 26 09:00:00 EDT 1986 +- Feb 10:30 %b %H:%S Sun Feb 1 10:00:30 EST 1987 +- 10:30 %H:%M Tue Sep 23 10:30:00 EDT 1986 +- 13:30 %H:%M Mon Sep 22 13:30:00 EDT 1986 +- +- The return value of the function is a pointer to a static variable +- of type `struct tm', or a null pointer if an error occurred. The +- result is only valid until the next `getdate' call, making this +- function unusable in multi-threaded applications. +- +- The `errno' variable is _not_ changed. Error conditions are +- stored in the global variable `getdate_err'. See the description +- above for a list of the possible error values. +- +- _Warning:_ The `getdate' function should _never_ be used in +- SUID-programs. The reason is obvious: using the `DATEMSK' +- environment variable you can get the function to open any +- arbitrary file and chances are high that with some bogus input +- (such as a binary file) the program will crash. +- +- - Function: int getdate_r (const char *STRING, struct tm *TP) +- The `getdate_r' function is the reentrant counterpart of +- `getdate'. It does not use the global variable `getdate_err' to +- signal an error, but instead returns an error code. The same error +- codes as described in the `getdate_err' documentation above are +- used, with 0 meaning success. +- +- Moreover, `getdate_r' stores the broken-down time in the variable +- of type `struct tm' pointed to by the second argument, rather than +- in a static variable. +- +- This function is not defined in the Unix standard. Nevertheless +- it is available on some other Unix systems as well. +- +- The warning against using `getdate' in SUID-programs applies to +- `getdate_r' as well. +- +- +-File: libc.info, Node: TZ Variable, Next: Time Zone Functions, Prev: Parsing Date and Time, Up: Calendar Time +- +-Specifying the Time Zone with `TZ' +----------------------------------- +- +- In POSIX systems, a user can specify the time zone by means of the +-`TZ' environment variable. For information about how to set +-environment variables, see *Note Environment Variables::. The functions +-for accessing the time zone are declared in `time.h'. +- +- You should not normally need to set `TZ'. If the system is +-configured properly, the default time zone will be correct. You might +-set `TZ' if you are using a computer over a network from a different +-time zone, and would like times reported to you in the time zone local +-to you, rather than what is local to the computer. +- +- In POSIX.1 systems the value of the `TZ' variable can be in one of +-three formats. With the GNU C library, the most common format is the +-last one, which can specify a selection from a large database of time +-zone information for many regions of the world. The first two formats +-are used to describe the time zone information directly, which is both +-more cumbersome and less precise. But the POSIX.1 standard only +-specifies the details of the first two formats, so it is good to be +-familiar with them in case you come across a POSIX.1 system that doesn't +-support a time zone information database. +- +- The first format is used when there is no Daylight Saving Time (or +-summer time) in the local time zone: +- +- STD OFFSET +- +- The STD string specifies the name of the time zone. It must be +-three or more characters long and must not contain a leading colon, +-embedded digits, commas, nor plus and minus signs. There is no space +-character separating the time zone name from the OFFSET, so these +-restrictions are necessary to parse the specification correctly. +- +- The OFFSET specifies the time value you must add to the local time +-to get a Coordinated Universal Time value. It has syntax like +-[`+'|`-']HH[`:'MM[`:'SS]]. This is positive if the local time zone is +-west of the Prime Meridian and negative if it is east. The hour must +-be between `0' and `23', and the minute and seconds between `0' and +-`59'. +- +- For example, here is how we would specify Eastern Standard Time, but +-without any Daylight Saving Time alternative: +- +- EST+5 +- +- The second format is used when there is Daylight Saving Time: +- +- STD OFFSET DST [OFFSET]`,'START[`/'TIME]`,'END[`/'TIME] +- +- The initial STD and OFFSET specify the standard time zone, as +-described above. The DST string and OFFSET specify the name and offset +-for the corresponding Daylight Saving Time zone; if the OFFSET is +-omitted, it defaults to one hour ahead of standard time. +- +- The remainder of the specification describes when Daylight Saving +-Time is in effect. The START field is when Daylight Saving Time goes +-into effect and the END field is when the change is made back to +-standard time. The following formats are recognized for these fields: +- +-`JN' +- This specifies the Julian day, with N between `1' and `365'. +- February 29 is never counted, even in leap years. +- +-`N' +- This specifies the Julian day, with N between `0' and `365'. +- February 29 is counted in leap years. +- +-`MM.W.D' +- This specifies day D of week W of month M. The day D must be +- between `0' (Sunday) and `6'. The week W must be between `1' and +- `5'; week `1' is the first week in which day D occurs, and week +- `5' specifies the _last_ D day in the month. The month M should be +- between `1' and `12'. +- +- The TIME fields specify when, in the local time currently in effect, +-the change to the other time occurs. If omitted, the default is +-`02:00:00'. +- +- For example, here is how you would specify the Eastern time zone in +-the United States, including the appropriate Daylight Saving Time and +-its dates of applicability. The normal offset from UTC is 5 hours; +-since this is west of the prime meridian, the sign is positive. Summer +-time begins on the first Sunday in April at 2:00am, and ends on the +-last Sunday in October at 2:00am. +- +- EST+5EDT,M4.1.0/2,M10.5.0/2 +- +- The schedule of Daylight Saving Time in any particular jurisdiction +-has changed over the years. To be strictly correct, the conversion of +-dates and times in the past should be based on the schedule that was in +-effect then. However, this format has no facilities to let you specify +-how the schedule has changed from year to year. The most you can do is +-specify one particular schedule--usually the present day schedule--and +-this is used to convert any date, no matter when. For precise time zone +-specifications, it is best to use the time zone information database +-(see below). +- +- The third format looks like this: +- +- :CHARACTERS +- +- Each operating system interprets this format differently; in the GNU +-C library, CHARACTERS is the name of a file which describes the time +-zone. +- +- If the `TZ' environment variable does not have a value, the +-operation chooses a time zone by default. In the GNU C library, the +-default time zone is like the specification `TZ=:/etc/localtime' (or +-`TZ=:/usr/local/etc/localtime', depending on how GNU C library was +-configured; *note Installation::). Other C libraries use their own +-rule for choosing the default time zone, so there is little we can say +-about them. +- +- If CHARACTERS begins with a slash, it is an absolute file name; +-otherwise the library looks for the file +-`/share/lib/zoneinfo/CHARACTERS'. The `zoneinfo' directory contains +-data files describing local time zones in many different parts of the +-world. The names represent major cities, with subdirectories for +-geographical areas; for example, `America/New_York', `Europe/London', +-`Asia/Hong_Kong'. These data files are installed by the system +-administrator, who also sets `/etc/localtime' to point to the data file +-for the local time zone. The GNU C library comes with a large database +-of time zone information for most regions of the world, which is +-maintained by a community of volunteers and put in the public domain. +- +- +-File: libc.info, Node: Time Zone Functions, Next: Time Functions Example, Prev: TZ Variable, Up: Calendar Time +- +-Functions and Variables for Time Zones +--------------------------------------- +- +- - Variable: char * tzname [2] +- The array `tzname' contains two strings, which are the standard +- names of the pair of time zones (standard and Daylight Saving) +- that the user has selected. `tzname[0]' is the name of the +- standard time zone (for example, `"EST"'), and `tzname[1]' is the +- name for the time zone when Daylight Saving Time is in use (for +- example, `"EDT"'). These correspond to the STD and DST strings +- (respectively) from the `TZ' environment variable. If Daylight +- Saving Time is never used, `tzname[1]' is the empty string. +- +- The `tzname' array is initialized from the `TZ' environment +- variable whenever `tzset', `ctime', `strftime', `mktime', or +- `localtime' is called. If multiple abbreviations have been used +- (e.g. `"EWT"' and `"EDT"' for U.S. Eastern War Time and Eastern +- Daylight Time), the array contains the most recent abbreviation. +- +- The `tzname' array is required for POSIX.1 compatibility, but in +- GNU programs it is better to use the `tm_zone' member of the +- broken-down time structure, since `tm_zone' reports the correct +- abbreviation even when it is not the latest one. +- +- Though the strings are declared as `char *' the user must refrain +- from modifying these strings. Modifying the strings will almost +- certainly lead to trouble. +- +- +- - Function: void tzset (void) +- The `tzset' function initializes the `tzname' variable from the +- value of the `TZ' environment variable. It is not usually +- necessary for your program to call this function, because it is +- called automatically when you use the other time conversion +- functions that depend on the time zone. +- +- The following variables are defined for compatibility with System V +-Unix. Like `tzname', these variables are set by calling `tzset' or the +-other time conversion functions. +- +- - Variable: long int timezone +- This contains the difference between UTC and the latest local +- standard time, in seconds west of UTC. For example, in the U.S. +- Eastern time zone, the value is `5*60*60'. Unlike the `tm_gmtoff' +- member of the broken-down time structure, this value is not +- adjusted for daylight saving, and its sign is reversed. In GNU +- programs it is better to use `tm_gmtoff', since it contains the +- correct offset even when it is not the latest one. +- +- - Variable: int daylight +- This variable has a nonzero value if Daylight Saving Time rules +- apply. A nonzero value does not necessarily mean that Daylight +- Saving Time is now in effect; it means only that Daylight Saving +- Time is sometimes in effect. +- +- +-File: libc.info, Node: Time Functions Example, Prev: Time Zone Functions, Up: Calendar Time +- +-Time Functions Example +----------------------- +- +- Here is an example program showing the use of some of the calendar +-time functions. +- +- #include +- #include +- +- #define SIZE 256 +- +- int +- main (void) +- { +- char buffer[SIZE]; +- time_t curtime; +- struct tm *loctime; +- +- /* Get the current time. */ +- curtime = time (NULL); +- +- /* Convert it to local time representation. */ +- loctime = localtime (&curtime); +- +- /* Print out the date and time in the standard format. */ +- fputs (asctime (loctime), stdout); +- +- /* Print it out in a nice format. */ +- strftime (buffer, SIZE, "Today is %A, %B %d.\n", loctime); +- fputs (buffer, stdout); +- strftime (buffer, SIZE, "The time is %I:%M %p.\n", loctime); +- fputs (buffer, stdout); +- +- return 0; +- } +- +- It produces output like this: +- +- Wed Jul 31 13:02:36 1991 +- Today is Wednesday, July 31. +- The time is 01:02 PM. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-37 glibc-2.3.2-200304020432/manual/libc.info-37 +--- glibc-2.3.2/manual/libc.info-37 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-37 Thu Jan 1 01:00:00 1970 +@@ -1,1233 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Setting an Alarm, Next: Sleeping, Prev: Calendar Time, Up: Date and Time +- +-Setting an Alarm +-================ +- +- The `alarm' and `setitimer' functions provide a mechanism for a +-process to interrupt itself in the future. They do this by setting a +-timer; when the timer expires, the process receives a signal. +- +- Each process has three independent interval timers available: +- +- * A real-time timer that counts elapsed time. This timer sends a +- `SIGALRM' signal to the process when it expires. +- +- * A virtual timer that counts processor time used by the process. +- This timer sends a `SIGVTALRM' signal to the process when it +- expires. +- +- * A profiling timer that counts both processor time used by the +- process, and processor time spent in system calls on behalf of the +- process. This timer sends a `SIGPROF' signal to the process when +- it expires. +- +- This timer is useful for profiling in interpreters. The interval +- timer mechanism does not have the fine granularity necessary for +- profiling native code. +- +- You can only have one timer of each kind set at any given time. If +-you set a timer that has not yet expired, that timer is simply reset to +-the new value. +- +- You should establish a handler for the appropriate alarm signal using +-`signal' or `sigaction' before issuing a call to `setitimer' or +-`alarm'. Otherwise, an unusual chain of events could cause the timer +-to expire before your program establishes the handler. In this case it +-would be terminated, since termination is the default action for the +-alarm signals. *Note Signal Handling::. +- +- To be able to use the alarm function to interrupt a system call which +-might block otherwise indefinitely it is important to _not_ set the +-`SA_RESTART' flag when registering the signal handler using +-`sigaction'. When not using `sigaction' things get even uglier: the +-`signal' function has to fixed semantics with respect to restarts. The +-BSD semantics for this function is to set the flag. Therefore, if +-`sigaction' for whatever reason cannot be used, it is necessary to use +-`sysv_signal' and not `signal'. +- +- The `setitimer' function is the primary means for setting an alarm. +-This facility is declared in the header file `sys/time.h'. The `alarm' +-function, declared in `unistd.h', provides a somewhat simpler interface +-for setting the real-time timer. +- +- - Data Type: struct itimerval +- This structure is used to specify when a timer should expire. It +- contains the following members: +- `struct timeval it_interval' +- This is the period between successive timer interrupts. If +- zero, the alarm will only be sent once. +- +- `struct timeval it_value' +- This is the period between now and the first timer interrupt. +- If zero, the alarm is disabled. +- +- The `struct timeval' data type is described in *Note Elapsed +- Time::. +- +- - Function: int setitimer (int WHICH, struct itimerval *NEW, struct +- itimerval *OLD) +- The `setitimer' function sets the timer specified by WHICH +- according to NEW. The WHICH argument can have a value of +- `ITIMER_REAL', `ITIMER_VIRTUAL', or `ITIMER_PROF'. +- +- If OLD is not a null pointer, `setitimer' returns information +- about any previous unexpired timer of the same kind in the +- structure it points to. +- +- The return value is `0' on success and `-1' on failure. The +- following `errno' error conditions are defined for this function: +- +- `EINVAL' +- The timer period is too large. +- +- - Function: int getitimer (int WHICH, struct itimerval *OLD) +- The `getitimer' function stores information about the timer +- specified by WHICH in the structure pointed at by OLD. +- +- The return value and error conditions are the same as for +- `setitimer'. +- +-`ITIMER_REAL' +- This constant can be used as the WHICH argument to the `setitimer' +- and `getitimer' functions to specify the real-time timer. +- +-`ITIMER_VIRTUAL' +- This constant can be used as the WHICH argument to the `setitimer' +- and `getitimer' functions to specify the virtual timer. +- +-`ITIMER_PROF' +- This constant can be used as the WHICH argument to the `setitimer' +- and `getitimer' functions to specify the profiling timer. +- +- - Function: unsigned int alarm (unsigned int SECONDS) +- The `alarm' function sets the real-time timer to expire in SECONDS +- seconds. If you want to cancel any existing alarm, you can do +- this by calling `alarm' with a SECONDS argument of zero. +- +- The return value indicates how many seconds remain before the +- previous alarm would have been sent. If there is no previous +- alarm, `alarm' returns zero. +- +- The `alarm' function could be defined in terms of `setitimer' like +-this: +- +- unsigned int +- alarm (unsigned int seconds) +- { +- struct itimerval old, new; +- new.it_interval.tv_usec = 0; +- new.it_interval.tv_sec = 0; +- new.it_value.tv_usec = 0; +- new.it_value.tv_sec = (long int) seconds; +- if (setitimer (ITIMER_REAL, &new, &old) < 0) +- return 0; +- else +- return old.it_value.tv_sec; +- } +- +- There is an example showing the use of the `alarm' function in *Note +-Handler Returns::. +- +- If you simply want your process to wait for a given number of +-seconds, you should use the `sleep' function. *Note Sleeping::. +- +- You shouldn't count on the signal arriving precisely when the timer +-expires. In a multiprocessing environment there is typically some +-amount of delay involved. +- +- *Portability Note:* The `setitimer' and `getitimer' functions are +-derived from BSD Unix, while the `alarm' function is specified by the +-POSIX.1 standard. `setitimer' is more powerful than `alarm', but +-`alarm' is more widely used. +- +- +-File: libc.info, Node: Sleeping, Prev: Setting an Alarm, Up: Date and Time +- +-Sleeping +-======== +- +- The function `sleep' gives a simple way to make the program wait for +-a short interval. If your program doesn't use signals (except to +-terminate), then you can expect `sleep' to wait reliably throughout the +-specified interval. Otherwise, `sleep' can return sooner if a signal +-arrives; if you want to wait for a given interval regardless of +-signals, use `select' (*note Waiting for I/O::) and don't specify any +-descriptors to wait for. +- +- - Function: unsigned int sleep (unsigned int SECONDS) +- The `sleep' function waits for SECONDS or until a signal is +- delivered, whichever happens first. +- +- If `sleep' function returns because the requested interval is over, +- it returns a value of zero. If it returns because of delivery of a +- signal, its return value is the remaining time in the sleep +- interval. +- +- The `sleep' function is declared in `unistd.h'. +- +- Resist the temptation to implement a sleep for a fixed amount of +-time by using the return value of `sleep', when nonzero, to call +-`sleep' again. This will work with a certain amount of accuracy as +-long as signals arrive infrequently. But each signal can cause the +-eventual wakeup time to be off by an additional second or so. Suppose a +-few signals happen to arrive in rapid succession by bad luck--there is +-no limit on how much this could shorten or lengthen the wait. +- +- Instead, compute the calendar time at which the program should stop +-waiting, and keep trying to wait until that calendar time. This won't +-be off by more than a second. With just a little more work, you can use +-`select' and make the waiting period quite accurate. (Of course, heavy +-system load can cause additional unavoidable delays--unless the machine +-is dedicated to one application, there is no way you can avoid this.) +- +- On some systems, `sleep' can do strange things if your program uses +-`SIGALRM' explicitly. Even if `SIGALRM' signals are being ignored or +-blocked when `sleep' is called, `sleep' might return prematurely on +-delivery of a `SIGALRM' signal. If you have established a handler for +-`SIGALRM' signals and a `SIGALRM' signal is delivered while the process +-is sleeping, the action taken might be just to cause `sleep' to return +-instead of invoking your handler. And, if `sleep' is interrupted by +-delivery of a signal whose handler requests an alarm or alters the +-handling of `SIGALRM', this handler and `sleep' will interfere. +- +- On the GNU system, it is safe to use `sleep' and `SIGALRM' in the +-same program, because `sleep' does not work by means of `SIGALRM'. +- +- - Function: int nanosleep (const struct timespec *REQUESTED_TIME, +- struct timespec *REMAINING) +- If resolution to seconds is not enough the `nanosleep' function can +- be used. As the name suggests the sleep interval can be specified +- in nanoseconds. The actual elapsed time of the sleep interval +- might be longer since the system rounds the elapsed time you +- request up to the next integer multiple of the actual resolution +- the system can deliver. +- +- *`requested_time' is the elapsed time of the interval you want to +- sleep. +- +- The function returns as *`remaining' the elapsed time left in the +- interval for which you requested to sleep. If the interval +- completed without getting interrupted by a signal, this is zero. +- +- `struct timespec' is described in *Note Elapsed Time::. +- +- If the function returns because the interval is over the return +- value is zero. If the function returns -1 the global variable +- ERRNO is set to the following values: +- +- `EINTR' +- The call was interrupted because a signal was delivered to +- the thread. If the REMAINING parameter is not the null +- pointer the structure pointed to by REMAINING is updated to +- contain the remaining elapsed time. +- +- `EINVAL' +- The nanosecond value in the REQUESTED_TIME parameter contains +- an illegal value. Either the value is negative or greater +- than or equal to 1000 million. +- +- This function is a cancellation point in multi-threaded programs. +- This is a problem if the thread allocates some resources (like +- memory, file descriptors, semaphores or whatever) at the time +- `nanosleep' is called. If the thread gets canceled these +- resources stay allocated until the program ends. To avoid this +- calls to `nanosleep' should be protected using cancellation +- handlers. +- +- The `nanosleep' function is declared in `time.h'. +- +- +-File: libc.info, Node: Resource Usage And Limitation, Next: Non-Local Exits, Prev: Date and Time, Up: Top +- +-Resource Usage And Limitation +-***************************** +- +- This chapter describes functions for examining how much of various +-kinds of resources (CPU time, memory, etc.) a process has used and +-getting and setting limits on future usage. +- +-* Menu: +- +-* Resource Usage:: Measuring various resources used. +-* Limits on Resources:: Specifying limits on resource usage. +-* Priority:: Reading or setting process run priority. +-* Memory Resources:: Querying memory available resources. +-* Processor Resources:: Learn about the processors available. +- +- +-File: libc.info, Node: Resource Usage, Next: Limits on Resources, Up: Resource Usage And Limitation +- +-Resource Usage +-============== +- +- The function `getrusage' and the data type `struct rusage' are used +-to examine the resource usage of a process. They are declared in +-`sys/resource.h'. +- +- - Function: int getrusage (int PROCESSES, struct rusage *RUSAGE) +- This function reports resource usage totals for processes +- specified by PROCESSES, storing the information in `*RUSAGE'. +- +- In most systems, PROCESSES has only two valid values: +- +- `RUSAGE_SELF' +- Just the current process. +- +- `RUSAGE_CHILDREN' +- All child processes (direct and indirect) that have already +- terminated. +- +- In the GNU system, you can also inquire about a particular child +- process by specifying its process ID. +- +- The return value of `getrusage' is zero for success, and `-1' for +- failure. +- +- `EINVAL' +- The argument PROCESSES is not valid. +- +- One way of getting resource usage for a particular child process is +-with the function `wait4', which returns totals for a child when it +-terminates. *Note BSD Wait Functions::. +- +- - Data Type: struct rusage +- This data type stores various resource usage statistics. It has +- the following members, and possibly others: +- +- `struct timeval ru_utime' +- Time spent executing user instructions. +- +- `struct timeval ru_stime' +- Time spent in operating system code on behalf of PROCESSES. +- +- `long int ru_maxrss' +- The maximum resident set size used, in kilobytes. That is, +- the maximum number of kilobytes of physical memory that +- PROCESSES used simultaneously. +- +- `long int ru_ixrss' +- An integral value expressed in kilobytes times ticks of +- execution, which indicates the amount of memory used by text +- that was shared with other processes. +- +- `long int ru_idrss' +- An integral value expressed the same way, which is the amount +- of unshared memory used for data. +- +- `long int ru_isrss' +- An integral value expressed the same way, which is the amount +- of unshared memory used for stack space. +- +- `long int ru_minflt' +- The number of page faults which were serviced without +- requiring any I/O. +- +- `long int ru_majflt' +- The number of page faults which were serviced by doing I/O. +- +- `long int ru_nswap' +- The number of times PROCESSES was swapped entirely out of +- main memory. +- +- `long int ru_inblock' +- The number of times the file system had to read from the disk +- on behalf of PROCESSES. +- +- `long int ru_oublock' +- The number of times the file system had to write to the disk +- on behalf of PROCESSES. +- +- `long int ru_msgsnd' +- Number of IPC messages sent. +- +- `long int ru_msgrcv' +- Number of IPC messages received. +- +- `long int ru_nsignals' +- Number of signals received. +- +- `long int ru_nvcsw' +- The number of times PROCESSES voluntarily invoked a context +- switch (usually to wait for some service). +- +- `long int ru_nivcsw' +- The number of times an involuntary context switch took place +- (because a time slice expired, or another process of higher +- priority was scheduled). +- +- `vtimes' is a historical function that does some of what `getrusage' +-does. `getrusage' is a better choice. +- +- `vtimes' and its `vtimes' data structure are declared in +-`sys/vtimes.h'. +- +- - Function: int vtimes (struct vtimes CURRENT, struct vtimes CHILD) +- `vtimes' reports resource usage totals for a process. +- +- If CURRENT is non-null, `vtimes' stores resource usage totals for +- the invoking process alone in the structure to which it points. If +- CHILD is non-null, `vtimes' stores resource usage totals for all +- past children (which have terminated) of the invoking process in +- the structure to which it points. +- +- - Data Type: struct vtimes +- This data type contains information about the resource usage +- of a process. Each member corresponds to a member of the +- `struct rusage' data type described above. +- +- `vm_utime' +- User CPU time. Analogous to `ru_utime' in `struct +- rusage' +- +- `vm_stime' +- System CPU time. Analogous to `ru_stime' in `struct +- rusage' +- +- `vm_idsrss' +- Data and stack memory. The sum of the values that would +- be reported as `ru_idrss' and `ru_isrss' in `struct +- rusage' +- +- `vm_ixrss' +- Shared memory. Analogous to `ru_ixrss' in `struct +- rusage' +- +- `vm_maxrss' +- Maximent resident set size. Analogous to `ru_maxrss' in +- `struct rusage' +- +- `vm_majflt' +- Major page faults. Analogous to `ru_majflt' in `struct +- rusage' +- +- `vm_minflt' +- Minor page faults. Analogous to `ru_minflt' in `struct +- rusage' +- +- `vm_nswap' +- Swap count. Analogous to `ru_nswap' in `struct rusage' +- +- `vm_inblk' +- Disk reads. Analogous to `ru_inblk' in `struct rusage' +- +- `vm_oublk' +- Disk writes. Analogous to `ru_oublk' in `struct rusage' +- +- The return value is zero if the function succeeds; `-1' otherwise. +- +- An additional historical function for examining resource usage, +-`vtimes', is supported but not documented here. It is declared in +-`sys/vtimes.h'. +- +- +-File: libc.info, Node: Limits on Resources, Next: Priority, Prev: Resource Usage, Up: Resource Usage And Limitation +- +-Limiting Resource Usage +-======================= +- +- You can specify limits for the resource usage of a process. When the +-process tries to exceed a limit, it may get a signal, or the system call +-by which it tried to do so may fail, depending on the resource. Each +-process initially inherits its limit values from its parent, but it can +-subsequently change them. +- +- There are two per-process limits associated with a resource: +- +-"current limit" +- The current limit is the value the system will not allow usage to +- exceed. It is also called the "soft limit" because the process +- being limited can generally raise the current limit at will. +- +-"maximum limit" +- The maximum limit is the maximum value to which a process is +- allowed to set its current limit. It is also called the "hard +- limit" because there is no way for a process to get around it. A +- process may lower its own maximum limit, but only the superuser +- may increase a maximum limit. +- +- The symbols for use with `getrlimit', `setrlimit', `getrlimit64', +-and `setrlimit64' are defined in `sys/resource.h'. +- +- - Function: int getrlimit (int RESOURCE, struct rlimit *RLP) +- Read the current and maximum limits for the resource RESOURCE and +- store them in `*RLP'. +- +- The return value is `0' on success and `-1' on failure. The only +- possible `errno' error condition is `EFAULT'. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a +- 32-bit system this function is in fact `getrlimit64'. Thus, the +- LFS interface transparently replaces the old interface. +- +- - Function: int getrlimit64 (int RESOURCE, struct rlimit64 *RLP) +- This function is similar to `getrlimit' but its second parameter is +- a pointer to a variable of type `struct rlimit64', which allows it +- to read values which wouldn't fit in the member of a `struct +- rlimit'. +- +- If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a +- 32-bit machine, this function is available under the name +- `getrlimit' and so transparently replaces the old interface. +- +- - Function: int setrlimit (int RESOURCE, const struct rlimit *RLP) +- Store the current and maximum limits for the resource RESOURCE in +- `*RLP'. +- +- The return value is `0' on success and `-1' on failure. The +- following `errno' error condition is possible: +- +- `EPERM' +- * The process tried to raise a current limit beyond the +- maximum limit. +- +- * The process tried to raise a maximum limit, but is not +- superuser. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a +- 32-bit system this function is in fact `setrlimit64'. Thus, the +- LFS interface transparently replaces the old interface. +- +- - Function: int setrlimit64 (int RESOURCE, const struct rlimit64 *RLP) +- This function is similar to `setrlimit' but its second parameter is +- a pointer to a variable of type `struct rlimit64' which allows it +- to set values which wouldn't fit in the member of a `struct +- rlimit'. +- +- If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a +- 32-bit machine this function is available under the name +- `setrlimit' and so transparently replaces the old interface. +- +- - Data Type: struct rlimit +- This structure is used with `getrlimit' to receive limit values, +- and with `setrlimit' to specify limit values for a particular +- process and resource. It has two fields: +- +- `rlim_t rlim_cur' +- The current limit +- +- `rlim_t rlim_max' +- The maximum limit. +- +- For `getrlimit', the structure is an output; it receives the +- current values. For `setrlimit', it specifies the new values. +- +- For the LFS functions a similar type is defined in `sys/resource.h'. +- +- - Data Type: struct rlimit64 +- This structure is analogous to the `rlimit' structure above, but +- its components have wider ranges. It has two fields: +- +- `rlim64_t rlim_cur' +- This is analogous to `rlimit.rlim_cur', but with a different +- type. +- +- `rlim64_t rlim_max' +- This is analogous to `rlimit.rlim_max', but with a different +- type. +- +- +- Here is a list of resources for which you can specify a limit. +-Memory and file sizes are measured in bytes. +- +-`RLIMIT_CPU' +- The maximum amount of CPU time the process can use. If it runs for +- longer than this, it gets a signal: `SIGXCPU'. The value is +- measured in seconds. *Note Operation Error Signals::. +- +-`RLIMIT_FSIZE' +- The maximum size of file the process can create. Trying to write a +- larger file causes a signal: `SIGXFSZ'. *Note Operation Error +- Signals::. +- +-`RLIMIT_DATA' +- The maximum size of data memory for the process. If the process +- tries to allocate data memory beyond this amount, the allocation +- function fails. +- +-`RLIMIT_STACK' +- The maximum stack size for the process. If the process tries to +- extend its stack past this size, it gets a `SIGSEGV' signal. +- *Note Program Error Signals::. +- +-`RLIMIT_CORE' +- The maximum size core file that this process can create. If the +- process terminates and would dump a core file larger than this, +- then no core file is created. So setting this limit to zero +- prevents core files from ever being created. +- +-`RLIMIT_RSS' +- The maximum amount of physical memory that this process should get. +- This parameter is a guide for the system's scheduler and memory +- allocator; the system may give the process more memory when there +- is a surplus. +- +-`RLIMIT_MEMLOCK' +- The maximum amount of memory that can be locked into physical +- memory (so it will never be paged out). +- +-`RLIMIT_NPROC' +- The maximum number of processes that can be created with the same +- user ID. If you have reached the limit for your user ID, `fork' +- will fail with `EAGAIN'. *Note Creating a Process::. +- +-`RLIMIT_NOFILE' +-`RLIMIT_OFILE' +- The maximum number of files that the process can open. If it +- tries to open more files than this, its open attempt fails with +- `errno' `EMFILE'. *Note Error Codes::. Not all systems support +- this limit; GNU does, and 4.4 BSD does. +- +-`RLIMIT_AS' +- The maximum size of total memory that this process should get. If +- the process tries to allocate more memory beyond this amount with, +- for example, `brk', `malloc', `mmap' or `sbrk', the allocation +- function fails. +- +-`RLIM_NLIMITS' +- The number of different resource limits. Any valid RESOURCE +- operand must be less than `RLIM_NLIMITS'. +- +- - Constant: int RLIM_INFINITY +- This constant stands for a value of "infinity" when supplied as +- the limit value in `setrlimit'. +- +- The following are historical functions to do some of what the +-functions above do. The functions above are better choices. +- +- `ulimit' and the command symbols are declared in `ulimit.h'. +- +- - Function: int ulimit (int CMD, ...) +- `ulimit' gets the current limit or sets the current and maximum +- limit for a particular resource for the calling process according +- to the command CMD.a +- +- If you are getting a limit, the command argument is the only +- argument. If you are setting a limit, there is a second argument: +- `long int' LIMIT which is the value to which you are setting the +- limit. +- +- The CMD values and the operations they specify are: +- `GETFSIZE' +- Get the current limit on the size of a file, in units of 512 +- bytes. +- +- `SETFSIZE' +- Set the current and maximum limit on the size of a file to +- LIMIT * 512 bytes. +- +- There are also some other CMD values that may do things on some +- systems, but they are not supported. +- +- Only the superuser may increase a maximum limit. +- +- When you successfully get a limit, the return value of `ulimit' is +- that limit, which is never negative. When you successfully set a +- limit, the return value is zero. When the function fails, the +- return value is `-1' and `errno' is set according to the reason: +- +- `EPERM' +- A process tried to increase a maximum limit, but is not +- superuser. +- +- +- `vlimit' and its resource symbols are declared in `sys/vlimit.h'. +- +- - Function: int vlimit (int RESOURCE, int LIMIT) +- `vlimit' sets the current limit for a resource for a process. +- +- RESOURCE identifies the resource: +- +- `LIM_CPU' +- Maximum CPU time. Same as `RLIMIT_CPU' for `setrlimit'. +- +- `LIM_FSIZE' +- Maximum file size. Same as `RLIMIT_FSIZE' for `setrlimit'. +- +- `LIM_DATA' +- Maximum data memory. Same as `RLIMIT_DATA' for `setrlimit'. +- +- `LIM_STACK' +- Maximum stack size. Same as `RLIMIT_STACK' for `setrlimit'. +- +- `LIM_CORE' +- Maximum core file size. Same as `RLIMIT_COR' for `setrlimit'. +- +- `LIM_MAXRSS' +- Maximum physical memory. Same as `RLIMIT_RSS' for +- `setrlimit'. +- +- The return value is zero for success, and `-1' with `errno' set +- accordingly for failure: +- +- `EPERM' +- The process tried to set its current limit beyond its maximum +- limit. +- +- +- +-File: libc.info, Node: Priority, Next: Memory Resources, Prev: Limits on Resources, Up: Resource Usage And Limitation +- +-Process CPU Priority And Scheduling +-=================================== +- +- When multiple processes simultaneously require CPU time, the system's +-scheduling policy and process CPU priorities determine which processes +-get it. This section describes how that determination is made and GNU +-C library functions to control it. +- +- It is common to refer to CPU scheduling simply as scheduling and a +-process' CPU priority simply as the process' priority, with the CPU +-resource being implied. Bear in mind, though, that CPU time is not the +-only resource a process uses or that processes contend for. In some +-cases, it is not even particularly important. Giving a process a high +-"priority" may have very little effect on how fast a process runs with +-respect to other processes. The priorities discussed in this section +-apply only to CPU time. +- +- CPU scheduling is a complex issue and different systems do it in +-wildly different ways. New ideas continually develop and find their +-way into the intricacies of the various systems' scheduling algorithms. +-This section discusses the general concepts, some specifics of systems +-that commonly use the GNU C library, and some standards. +- +- For simplicity, we talk about CPU contention as if there is only one +-CPU in the system. But all the same principles apply when a processor +-has multiple CPUs, and knowing that the number of processes that can +-run at any one time is equal to the number of CPUs, you can easily +-extrapolate the information. +- +- The functions described in this section are all defined by the +-POSIX.1 and POSIX.1b standards (the `sched...' functions are POSIX.1b). +-However, POSIX does not define any semantics for the values that these +-functions get and set. In this chapter, the semantics are based on the +-Linux kernel's implementation of the POSIX standard. As you will see, +-the Linux implementation is quite the inverse of what the authors of the +-POSIX syntax had in mind. +- +-* Menu: +- +-* Absolute Priority:: The first tier of priority. Posix +-* Realtime Scheduling:: Scheduling among the process nobility +-* Basic Scheduling Functions:: Get/set scheduling policy, priority +-* Traditional Scheduling:: Scheduling among the vulgar masses +- +- +-File: libc.info, Node: Absolute Priority, Next: Realtime Scheduling, Up: Priority +- +-Absolute Priority +------------------ +- +- Every process has an absolute priority, and it is represented by a +-number. The higher the number, the higher the absolute priority. +- +- On systems of the past, and most systems today, all processes have +-absolute priority 0 and this section is irrelevant. In that case, +-*Note Traditional Scheduling::. Absolute priorities were invented to +-accommodate realtime systems, in which it is vital that certain +-processes be able to respond to external events happening in real time, +-which means they cannot wait around while some other process that _wants +-to_, but doesn't _need to_ run occupies the CPU. +- +- 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 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 +-for something like I/O, its absolute priority is irrelevant. +- +- *Note:* The term "runnable" is a synonym for "ready to run." +- +- When two processes are running or ready to run and both have the same +-absolute priority, it's more interesting. In that case, who gets the +-CPU is determined by the scheduling policy. If the processes have +-absolute priority 0, the traditional scheduling policy described in +-*Note Traditional Scheduling:: applies. Otherwise, the policies +-described in *Note Realtime Scheduling:: apply. +- +- You normally give an absolute priority above 0 only to a process that +-can be trusted not to hog the CPU. Such processes are designed to block +-(or terminate) after relatively short CPU runs. +- +- A process begins life with the same absolute priority as its parent +-process. Functions described in *Note Basic Scheduling Functions:: can +-change it. +- +- Only a privileged process can change a process' absolute priority to +-something other than `0'. Only a privileged process or the target +-process' owner can change its absolute priority at all. +- +- POSIX requires absolute priority values used with the realtime +-scheduling policies to be consecutive with a range of at least 32. On +-Linux, they are 1 through 99. The functions `sched_get_priority_max' +-and `sched_set_priority_min' portably tell you what the range is on a +-particular system. +- +-Using Absolute Priority +-....................... +- +- One thing you must keep in mind when designing real time +-applications is that having higher absolute priority than any other +-process doesn't guarantee the process can run continuously. Two things +-that can wreck a good CPU run are interrupts and page faults. +- +- Interrupt handlers live in that limbo between processes. The CPU is +-executing instructions, but they aren't part of any process. An +-interrupt will stop even the highest priority process. So you must +-allow for slight delays and make sure that no device in the system has +-an interrupt handler that could cause too long a delay between +-instructions for your process. +- +- Similarly, a page fault causes what looks like a straightforward +-sequence of instructions to take a long time. The fact that other +-processes get to run while the page faults in is of no consequence, +-because as soon as the I/O is complete, the high priority process will +-kick them out and run again, but the wait for the I/O itself could be a +-problem. To neutralize this threat, use `mlock' or `mlockall'. +- +- There are a few ramifications of the absoluteness of this priority +-on a single-CPU system that you need to keep in mind when you choose to +-set a priority and also when you're working on a program that runs with +-high absolute priority. Consider a process that has higher absolute +-priority than any other process in the system and due to a bug in its +-program, it gets into an infinite loop. It will never cede the CPU. +-You can't run a command to kill it because your command would need to +-get the CPU in order to run. The errant program is in complete +-control. It controls the vertical, it controls the horizontal. +- +- There are two ways to avoid this: 1) keep a shell running somewhere +-with a higher absolute priority. 2) keep a controlling terminal +-attached to the high priority process group. All the priority in the +-world won't stop an interrupt handler from running and delivering a +-signal to the process if you hit Control-C. +- +- Some systems use absolute priority as a means of allocating a fixed +-percentage of CPU time to a process. To do this, a super high priority +-privileged process constantly monitors the process' CPU usage and raises +-its absolute priority when the process isn't getting its entitled share +-and lowers it when the process is exceeding it. +- +- *Note:* The absolute priority is sometimes called the "static +-priority." We don't use that term in this manual because it misses the +-most important feature of the absolute priority: its absoluteness. +- +- +-File: libc.info, Node: Realtime Scheduling, Next: Basic Scheduling Functions, Prev: Absolute Priority, Up: Priority +- +-Realtime Scheduling +-------------------- +- +- Whenever two processes with the same absolute priority are ready to +-run, the kernel has a decision to make, because only one can run at a +-time. If the processes have absolute priority 0, the kernel makes this +-decision as described in *Note Traditional Scheduling::. Otherwise, +-the decision is as described in this section. +- +- If two processes are ready to run but have different absolute +-priorities, the decision is much simpler, and is described in *Note +-Absolute Priority::. +- +- Each process has a scheduling policy. For processes with absolute +-priority other than zero, there are two available: +- +- 1. First Come First Served +- +- 2. Round Robin +- +- The most sensible case is where all the processes with a certain +-absolute priority have the same scheduling policy. We'll discuss that +-first. +- +- In Round Robin, processes share the CPU, each one running for a small +-quantum of time ("time slice") and then yielding to another in a +-circular fashion. Of course, only processes that are ready to run and +-have the same absolute priority are in this circle. +- +- In First Come First Served, the process that has been waiting the +-longest to run gets the CPU, and it keeps it until it voluntarily +-relinquishes the CPU, runs out of things to do (blocks), or gets +-preempted by a higher priority process. +- +- First Come First Served, along with maximal absolute priority and +-careful control of interrupts and page faults, is the one to use when a +-process absolutely, positively has to run at full CPU speed or not at +-all. +- +- Judicious use of `sched_yield' function invocations by processes +-with First Come First Served scheduling policy forms a good compromise +-between Round Robin and First Come First Served. +- +- To understand how scheduling works when processes of different +-scheduling policies occupy the same absolute priority, you have to know +-the nitty gritty details of how processes enter and exit the ready to +-run list: +- +- In both cases, the ready to run list is organized as a true queue, +-where a process gets pushed onto the tail when it becomes ready to run +-and is popped off the head when the scheduler decides to run it. Note +-that ready to run and running are two mutually exclusive states. When +-the scheduler runs a process, that process is no longer ready to run +-and no longer in the ready to run list. When the process stops +-running, it may go back to being ready to run again. +- +- The only difference between a process that is assigned the Round +-Robin scheduling policy and a process that is assigned First Come First +-Serve is that in the former case, the process is automatically booted +-off the CPU after a certain amount of time. When that happens, the +-process goes back to being ready to run, which means it enters the +-queue at the tail. The time quantum we're talking about is small. +-Really small. This is not your father's timesharing. For example, +-with the Linux kernel, the round robin time slice is a thousand times +-shorter than its typical time slice for traditional scheduling. +- +- A process begins life with the same scheduling policy as its parent +-process. Functions described in *Note Basic Scheduling Functions:: can +-change it. +- +- Only a privileged process can set the scheduling policy of a process +-that has absolute priority higher than 0. +- +- +-File: libc.info, Node: Basic Scheduling Functions, Next: Traditional Scheduling, Prev: Realtime Scheduling, Up: Priority +- +-Basic Scheduling Functions +--------------------------- +- +- This section describes functions in the GNU C library for setting the +-absolute priority and scheduling policy of a process. +- +- *Portability Note:* On systems that have the functions in this +-section, the macro _POSIX_PRIORITY_SCHEDULING is defined in +-`'. +- +- For the case that the scheduling policy is traditional scheduling, +-more functions to fine tune the scheduling are in *Note Traditional +-Scheduling::. +- +- Don't try to make too much out of the naming and structure of these +-functions. They don't match the concepts described in this manual +-because the functions are as defined by POSIX.1b, but the implementation +-on systems that use the GNU C library is the inverse of what the POSIX +-structure contemplates. The POSIX scheme assumes that the primary +-scheduling parameter is the scheduling policy and that the priority +-value, if any, is a parameter of the scheduling policy. In the +-implementation, though, the priority value is king and the scheduling +-policy, if anything, only fine tunes the effect of that priority. +- +- The symbols in this section are declared by including file `sched.h'. +- +- - Data Type: struct sched_param +- This structure describes an absolute priority. +- `int sched_priority' +- absolute priority value +- +- - Function: int sched_setscheduler (pid_t PID, int POLICY, const +- struct sched_param *PARAM) +- This function sets both the absolute priority and the scheduling +- policy for a process. +- +- It assigns the absolute priority value given by PARAM and the +- scheduling policy POLICY to the process with Process ID PID, or +- the calling process if PID is zero. If POLICY is negative, +- `sched_setscheduler' keeps the existing scheduling policy. +- +- The following macros represent the valid values for POLICY: +- +- `SCHED_OTHER' +- Traditional Scheduling +- +- `SCHED_FIFO' +- First In First Out +- +- `SCHED_RR' +- Round Robin +- +- On success, the return value is `0'. Otherwise, it is `-1' and +- `ERRNO' is set accordingly. The `errno' values specific to this +- function are: +- +- `EPERM' +- * The calling process does not have `CAP_SYS_NICE' +- permission and POLICY is not `SCHED_OTHER' (or it's +- negative and the existing policy is not `SCHED_OTHER'. +- +- * The calling process does not have `CAP_SYS_NICE' +- permission and its 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 PID. +- +- `ESRCH' +- There is no process with pid PID and PID is not zero. +- +- `EINVAL' +- * POLICY does not identify an existing scheduling policy. +- +- * The absolute priority value identified by *PARAM is +- outside the valid range for the scheduling policy POLICY +- (or the existing scheduling policy if POLICY is +- negative) or PARAM is null. `sched_get_priority_max' +- and `sched_get_priority_min' tell you what the valid +- range is. +- +- * PID is negative. +- +- +- - Function: int sched_getscheduler (pid_t PID) +- This function returns the scheduling policy assigned to the +- process with Process ID (pid) PID, or the calling process if PID +- is zero. +- +- The return value is the scheduling policy. See +- `sched_setscheduler' for the possible values. +- +- If the function fails, the return value is instead `-1' and +- `errno' is set accordingly. +- +- The `errno' values specific to this function are: +- +- `ESRCH' +- There is no process with pid PID and it is not zero. +- +- `EINVAL' +- PID is negative. +- +- Note that this function is not an exact mate to +- `sched_setscheduler' because while that function sets the +- scheduling policy and the absolute priority, this function gets +- only the scheduling policy. To get the absolute priority, use +- `sched_getparam'. +- +- +- - Function: int sched_setparam (pid_t PID, const struct sched_param +- *PARAM) +- This function sets a process' absolute priority. +- +- It is functionally identical to `sched_setscheduler' with POLICY = +- `-1'. +- +- +- - Function: int sched_getparam (pid_t PID, const struct sched_param +- *PARAM) +- This function returns a process' absolute priority. +- +- PID is the Process ID (pid) of the process whose absolute priority +- you want to know. +- +- PARAM is a pointer to a structure in which the function stores the +- absolute priority of the process. +- +- On success, the return value is `0'. Otherwise, it is `-1' and +- `ERRNO' is set accordingly. The `errno' values specific to this +- function are: +- +- `ESRCH' +- There is no process with pid PID and it is not zero. +- +- `EINVAL' +- PID is negative. +- +- +- - Function: int sched_get_priority_min (int *POLICY); +- This function returns the lowest absolute priority value that is +- allowable for a process with scheduling policy POLICY. +- +- On Linux, it is 0 for SCHED_OTHER and 1 for everything else. +- +- On success, the return value is `0'. Otherwise, it is `-1' and +- `ERRNO' is set accordingly. The `errno' values specific to this +- function are: +- +- `EINVAL' +- POLICY does not identify an existing scheduling policy. +- +- +- - Function: int sched_get_priority_max (int *POLICY); +- This function returns the highest absolute priority value that is +- allowable for a process that with scheduling policy POLICY. +- +- On Linux, it is 0 for SCHED_OTHER and 99 for everything else. +- +- On success, the return value is `0'. Otherwise, it is `-1' and +- `ERRNO' is set accordingly. The `errno' values specific to this +- function are: +- +- `EINVAL' +- POLICY does not identify an existing scheduling policy. +- +- +- - Function: int sched_rr_get_interval (pid_t PID, struct timespec +- *INTERVAL) +- This function returns the length of the quantum (time slice) used +- with the Round Robin scheduling policy, if it is used, for the +- process with Process ID PID. +- +- It returns the length of time as INTERVAL. +- +- With a Linux kernel, the round robin time slice is always 150 +- microseconds, and PID need not even be a real pid. +- +- The return value is `0' on success and in the pathological case +- that it fails, the return value is `-1' and `errno' is set +- accordingly. There is nothing specific that can go wrong with this +- function, so there are no specific `errno' values. +- +- +- - Function: int sched_yield (void) +- This function voluntarily gives up the process' claim on the CPU. +- +- Technically, `sched_yield' causes the calling process to be made +- immediately ready to run (as opposed to running, which is what it +- was before). This means that if it has absolute priority higher +- than 0, it gets pushed onto the tail of the queue of processes +- that share its absolute priority and are ready to run, and it will +- run again when its turn next arrives. If its absolute priority is +- 0, it is more complicated, but still has the effect of yielding +- the CPU to other processes. +- +- If there are no other processes that share the calling process' +- absolute priority, this function doesn't have any effect. +- +- To the extent that the containing program is oblivious to what +- other processes in the system are doing and how fast it executes, +- this function appears as a no-op. +- +- The return value is `0' on success and in the pathological case +- that it fails, the return value is `-1' and `errno' is set +- accordingly. There is nothing specific that can go wrong with this +- function, so there are no specific `errno' values. +- +- +- +-File: libc.info, Node: Traditional Scheduling, Prev: Basic Scheduling Functions, Up: Priority +- +-Traditional Scheduling +----------------------- +- +- This section is about the scheduling among processes whose absolute +-priority is 0. When the system hands out the scraps of CPU time that +-are left over after the processes with higher absolute priority have +-taken all they want, the scheduling described herein determines who +-among the great unwashed processes gets them. +- +-* Menu: +- +-* Traditional Scheduling Intro:: +-* Traditional Scheduling Functions:: +- +- +-File: libc.info, Node: Traditional Scheduling Intro, Next: Traditional Scheduling Functions, Up: Traditional Scheduling +- +-Introduction To Traditional Scheduling +-...................................... +- +- Long before there was absolute priority (See *Note Absolute +-Priority::), Unix systems were scheduling the CPU using this system. +-When Posix came in like the Romans and imposed absolute priorities to +-accommodate the needs of realtime processing, it left the indigenous +-Absolute Priority Zero processes to govern themselves by their own +-familiar scheduling policy. +- +- Indeed, absolute priorities higher than zero are not available on +-many systems today and are not typically used when they are, being +-intended mainly for computers that do realtime processing. So this +-section describes the only scheduling many programmers need to be +-concerned about. +- +- But just to be clear about the scope of this scheduling: Any time a +-process with a absolute priority of 0 and a process with an absolute +-priority higher than 0 are ready to run at the same time, the one with +-absolute priority 0 does not run. If it's already running when the +-higher priority ready-to-run process comes into existence, it stops +-immediately. +- +- In addition to its absolute priority of zero, every process has +-another priority, which we will refer to as "dynamic priority" because +-it changes over time. The dynamic priority is meaningless for +-processes with an absolute priority higher than zero. +- +- The dynamic priority sometimes determines who gets the next turn on +-the CPU. Sometimes it determines how long turns last. Sometimes it +-determines whether a process can kick another off the CPU. +- +- In Linux, the value is a combination of these things, but mostly it +-is just determines the length of the time slice. The higher a process' +-dynamic priority, the longer a shot it gets on the CPU when it gets one. +-If it doesn't use up its time slice before giving up the CPU to do +-something like wait for I/O, it is favored for getting the CPU back when +-it's ready for it, to finish out its time slice. Other than that, +-selection of processes for new time slices is basically round robin. +-But the scheduler does throw a bone to the low priority processes: A +-process' dynamic priority rises every time it is snubbed in the +-scheduling process. In Linux, even the fat kid gets to play. +- +- The fluctuation of a process' dynamic priority is regulated by +-another value: The "nice" value. The nice value is an integer, usually +-in the range -20 to 20, and represents an upper limit on a process' +-dynamic priority. The higher the nice number, the lower that limit. +- +- On a typical Linux system, for example, a process with a nice value +-of 20 can get only 10 milliseconds on the CPU at a time, whereas a +-process with a nice value of -20 can achieve a high enough priority to +-get 400 milliseconds. +- +- The idea of the nice value is deferential courtesy. In the +-beginning, in the Unix garden of Eden, all processes shared equally in +-the bounty of the computer system. But not all processes really need +-the same share of CPU time, so the nice value gave a courteous process +-the ability to refuse its equal share of CPU time that others might +-prosper. Hence, the higher a process' nice value, the nicer the +-process is. (Then a snake came along and offered some process a +-negative nice value and the system became the crass resource allocation +-system we know today). +- +- Dynamic priorities tend upward and downward with an objective of +-smoothing out allocation of CPU time and giving quick response time to +-infrequent requests. But they never exceed their nice limits, so on a +-heavily loaded CPU, the nice value effectively determines how fast a +-process runs. +- +- In keeping with the socialistic heritage of Unix process priority, a +-process begins life with the same nice value as its parent process and +-can raise it at will. A process can also raise the nice value of any +-other process owned by the same user (or effective user). But only a +-privileged process can lower its nice value. A privileged process can +-also raise or lower another process' nice value. +- +- GNU C Library functions for getting and setting nice values are +-described in *Note Traditional Scheduling Functions::. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-38 glibc-2.3.2-200304020432/manual/libc.info-38 +--- glibc-2.3.2/manual/libc.info-38 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-38 Thu Jan 1 01:00:00 1970 +@@ -1,1105 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Traditional Scheduling Functions, Prev: Traditional Scheduling Intro, Up: Traditional Scheduling +- +-Functions For Traditional Scheduling +-.................................... +- +- This section describes how you can read and set the nice value of a +-process. All these symbols are declared in `sys/resource.h'. +- +- The function and macro names are defined by POSIX, and refer to +-"priority," but the functions actually have to do with nice values, as +-the terms are used both in the manual and POSIX. +- +- The range of valid nice values depends on the kernel, but typically +-it runs from `-20' to `20'. A lower nice value corresponds to higher +-priority for the process. These constants describe the range of +-priority values: +- +-`PRIO_MIN' +- The lowest valid nice value. +- +-`PRIO_MAX' +- The highest valid nice value. +- +- - Function: int getpriority (int CLASS, int ID) +- Return the nice value of a set of processes; CLASS and ID specify +- which ones (see below). If the processes specified do not all +- have the same nice value, this returns the lowest value that any +- of them has. +- +- On success, the return value is `0'. Otherwise, it is `-1' and +- `ERRNO' is set accordingly. The `errno' values specific to this +- function are: +- +- `ESRCH' +- The combination of CLASS and ID does not match any existing +- process. +- +- `EINVAL' +- The value of CLASS is not valid. +- +- If the return value is `-1', it could indicate failure, or it could +- be the nice value. The only way to make certain is to set `errno = +- 0' before calling `getpriority', then use `errno != 0' afterward +- as the criterion for failure. +- +- - Function: int setpriority (int CLASS, int ID, int NICEVAL) +- Set the nice value of a set of processes to NICEVAL; CLASS and ID +- specify which ones (see below). +- +- The return value is `0' on success, and `-1' on failure. The +- following `errno' error condition are possible for this function: +- +- `ESRCH' +- The combination of CLASS and ID does not match any existing +- process. +- +- `EINVAL' +- The value of CLASS is not valid. +- +- `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 uid does not match the calling +- process' effective uid) and the calling process does not have +- `CAP_SYS_NICE' permission. +- +- `EACCES' +- The call would lower the process' nice value and the process +- does not have `CAP_SYS_NICE' permission. +- +- +- The arguments CLASS and ID together specify a set of processes in +-which you are interested. These are the possible values of CLASS: +- +-`PRIO_PROCESS' +- One particular process. The argument ID is a process ID (pid). +- +-`PRIO_PGRP' +- All the processes in a particular process group. The argument ID +- is a process group ID (pgid). +- +-`PRIO_USER' +- All the processes owned by a particular user (i.e. whose real uid +- indicates the user). The argument ID is a user ID (uid). +- +- If the argument ID is 0, it stands for the calling process, its +-process group, or its owner (real uid), according to CLASS. +- +- - Function: int nice (int INCREMENT) +- Increment the nice value of the calling process by INCREMENT. The +- return value is the new nice value on success, and `-1' on +- failure. In the case of failure, `errno' will be set to the same +- values as for `setpriority'. +- +- Here is an equivalent definition of `nice': +- +- int +- nice (int increment) +- { +- int result, old = getpriority (PRIO_PROCESS, 0); +- result = setpriority (PRIO_PROCESS, 0, old + increment); +- if (result != -1) +- return old + increment; +- else +- return -1; +- } +- +- +-File: libc.info, Node: Memory Resources, Next: Processor Resources, Prev: Priority, Up: Resource Usage And Limitation +- +-Querying memory available resources +-=================================== +- +- The amount of memory available in the system and the way it is +-organized determines oftentimes the way programs can and have to work. +-For functions like `mmap' it is necessary to know about the size of +-individual memory pages and knowing how much memory is available enables +-a program to select appropriate sizes for, say, caches. Before we get +-into these details a few words about memory subsystems in traditional +-Unix systems will be given. +- +-* Menu: +- +-* Memory Subsystem:: Overview about traditional Unix memory handling. +-* Query Memory Parameters:: How to get information about the memory +- subsystem? +- +- +-File: libc.info, Node: Memory Subsystem, Next: Query Memory Parameters, Up: Memory Resources +- +-Overview about traditional Unix memory handling +------------------------------------------------ +- +- Unix systems normally provide processes virtual address spaces. This +-means that the addresses of the memory regions do not have to correspond +-directly to the addresses of the actual physical memory which stores the +-data. An extra level of indirection is introduced which translates +-virtual addresses into physical addresses. This is normally done by the +-hardware of the processor. +- +- Using a virtual address space has several advantage. The most +-important is process isolation. The different processes running on the +-system cannot interfere directly with each other. No process can write +-into the address space of another process (except when shared memory is +-used but then it is wanted and controlled). +- +- Another advantage of virtual memory is that the address space the +-processes see can actually be larger than the physical memory available. +-The physical memory can be extended by storage on an external media +-where the content of currently unused memory regions is stored. The +-address translation can then intercept accesses to these memory regions +-and make memory content available again by loading the data back into +-memory. This concept makes it necessary that programs which have to use +-lots of memory know the difference between available virtual address +-space and available physical memory. If the working set of virtual +-memory of all the processes is larger than the available physical memory +-the system will slow down dramatically due to constant swapping of +-memory content from the memory to the storage media and back. This is +-called "thrashing". +- +- A final aspect of virtual memory which is important and follows from +-what is said in the last paragraph is the granularity of the virtual +-address space handling. When we said that the virtual address handling +-stores memory content externally it cannot do this on a byte-by-byte +-basis. The administrative overhead does not allow this (leaving alone +-the processor hardware). Instead several thousand bytes are handled +-together and form a "page". The size of each page is always a power of +-two byte. The smallest page size in use today is 4096, with 8192, +-16384, and 65536 being other popular sizes. +- +- +-File: libc.info, Node: Query Memory Parameters, Prev: Memory Subsystem, Up: Memory Resources +- +-How to get information about the memory subsystem? +--------------------------------------------------- +- +- The page size of the virtual memory the process sees is essential to +-know in several situations. Some programming interface (e.g., `mmap', +-*note Memory-mapped I/O::) require the user to provide information +-adjusted to the page size. In the case of `mmap' is it necessary to +-provide a length argument which is a multiple of the page size. +-Another place where the knowledge about the page size is useful is in +-memory allocation. If one allocates pieces of memory in larger chunks +-which are then subdivided by the application code it is useful to +-adjust the size of the larger blocks to the page size. If the total +-memory requirement for the block is close (but not larger) to a multiple +-of the page size the kernel's memory handling can work more effectively +-since it only has to allocate memory pages which are fully used. (To do +-this optimization it is necessary to know a bit about the memory +-allocator which will require a bit of memory itself for each block and +-this overhead must not push the total size over the page size multiple. +- +- The page size traditionally was a compile time constant. But recent +-development of processors changed this. Processors now support +-different page sizes and they can possibly even vary among different +-processes on the same system. Therefore the system should be queried at +-runtime about the current page size and no assumptions (except about it +-being a power of two) should be made. +- +- The correct interface to query about the page size is `sysconf' +-(*note Sysconf Definition::) with the parameter `_SC_PAGESIZE'. There +-is a much older interface available, too. +- +- - Function: int getpagesize (void) +- The `getpagesize' function returns the page size of the process. +- This value is fixed for the runtime of the process but can vary in +- different runs of the application. +- +- The function is declared in `unistd.h'. +- +- Widely available on System V derived systems is a method to get +-information about the physical memory the system has. The call +- +- sysconf (_SC_PHYS_PAGES) +- +-returns the total number of pages of physical the system has. This +-does not mean all this memory is available. This information can be +-found using +- +- sysconf (_SC_AVPHYS_PAGES) +- +- These two values help to optimize applications. The value returned +-for `_SC_AVPHYS_PAGES' is the amount of memory the application can use +-without hindering any other process (given that no other process +-increases its memory usage). The value returned for `_SC_PHYS_PAGES' +-is more or less a hard limit for the working set. If all applications +-together constantly use more than that amount of memory the system is +-in trouble. +- +- The GNU C library provides in addition to these already described +-way to get this information two functions. They are declared in the +-file `sys/sysinfo.h'. Programmers should prefer to use the `sysconf' +-method described above. +- +- - Function: long int get_phys_pages (void) +- The `get_phys_pages' function returns the total number of pages of +- physical the system has. To get the amount of memory this number +- has to be multiplied by the page size. +- +- This function is a GNU extension. +- +- - Function: long int get_avphys_pages (void) +- The `get_phys_pages' function returns the number of available +- pages of physical the system has. To get the amount of memory +- this number has to be multiplied by the page size. +- +- This function is a GNU extension. +- +- +-File: libc.info, Node: Processor Resources, Prev: Memory Resources, Up: Resource Usage And Limitation +- +-Learn about the processors available +-==================================== +- +- The use of threads or processes with shared memory allows an +-application to take advantage of all the processing power a system can +-provide. If the task can be parallelized the optimal way to write an +-application is to have at any time as many processes running as there +-are processors. To determine the number of processors available to the +-system one can run +- +- sysconf (_SC_NPROCESSORS_CONF) +- +-which returns the number of processors the operating system configured. +-But it might be possible for the operating system to disable individual +-processors and so the call +- +- sysconf (_SC_NPROCESSORS_ONLN) +- +-returns the number of processors which are currently inline (i.e., +-available). +- +- For these two pieces of information the GNU C library also provides +-functions to get the information directly. The functions are declared +-in `sys/sysinfo.h'. +- +- - Function: int get_nprocs_conf (void) +- The `get_nprocs_conf' function returns the number of processors the +- operating system configured. +- +- This function is a GNU extension. +- +- - Function: int get_nprocs (void) +- The `get_nprocs' function returns the number of available +- processors. +- +- This function is a GNU extension. +- +- Before starting more threads it should be checked whether the +-processors are not already overused. Unix systems calculate something +-called the "load average". This is a number indicating how many +-processes were running. This number is average over different periods +-of times (normally 1, 5, and 15 minutes). +- +- - Function: int getloadavg (double LOADAVG[], int NELEM) +- This function gets the 1, 5 and 15 minute load averages of the +- system. The values are placed in LOADAVG. `getloadavg' will place +- at most NELEM elements into the array but never more than three +- elements. The return value is the number of elements written to +- LOADAVG, or -1 on error. +- +- This function is declared in `stdlib.h'. +- +- +-File: libc.info, Node: Non-Local Exits, Next: Signal Handling, Prev: Resource Usage And Limitation, Up: Top +- +-Non-Local Exits +-*************** +- +- Sometimes when your program detects an unusual situation inside a +-deeply nested set of function calls, you would like to be able to +-immediately return to an outer level of control. This section +-describes how you can do such "non-local exits" using the `setjmp' and +-`longjmp' functions. +- +-* Menu: +- +-* Intro: Non-Local Intro. When and how to use these facilities. +-* Details: Non-Local Details. Functions for non-local exits. +-* Non-Local Exits and Signals:: Portability issues. +-* System V contexts:: Complete context control a la System V. +- +- +-File: libc.info, Node: Non-Local Intro, Next: Non-Local Details, Up: Non-Local Exits +- +-Introduction to Non-Local Exits +-=============================== +- +- As an example of a situation where a non-local exit can be useful, +-suppose you have an interactive program that has a "main loop" that +-prompts for and executes commands. Suppose the "read" command reads +-input from a file, doing some lexical analysis and parsing of the input +-while processing it. If a low-level input error is detected, it would +-be useful to be able to return immediately to the "main loop" instead +-of having to make each of the lexical analysis, parsing, and processing +-phases all have to explicitly deal with error situations initially +-detected by nested calls. +- +- (On the other hand, if each of these phases has to do a substantial +-amount of cleanup when it exits--such as closing files, deallocating +-buffers or other data structures, and the like--then it can be more +-appropriate to do a normal return and have each phase do its own +-cleanup, because a non-local exit would bypass the intervening phases +-and their associated cleanup code entirely. Alternatively, you could +-use a non-local exit but do the cleanup explicitly either before or +-after returning to the "main loop".) +- +- In some ways, a non-local exit is similar to using the `return' +-statement to return from a function. But while `return' abandons only +-a single function call, transferring control back to the point at which +-it was called, a non-local exit can potentially abandon many levels of +-nested function calls. +- +- You identify return points for non-local exits by calling the +-function `setjmp'. This function saves information about the execution +-environment in which the call to `setjmp' appears in an object of type +-`jmp_buf'. Execution of the program continues normally after the call +-to `setjmp', but if an exit is later made to this return point by +-calling `longjmp' with the corresponding `jmp_buf' object, control is +-transferred back to the point where `setjmp' was called. The return +-value from `setjmp' is used to distinguish between an ordinary return +-and a return made by a call to `longjmp', so calls to `setjmp' usually +-appear in an `if' statement. +- +- Here is how the example program described above might be set up: +- +- #include +- #include +- #include +- +- jmp_buf main_loop; +- +- void +- abort_to_main_loop (int status) +- { +- longjmp (main_loop, status); +- } +- +- int +- main (void) +- { +- while (1) +- if (setjmp (main_loop)) +- puts ("Back at main loop...."); +- else +- do_command (); +- } +- +- +- void +- do_command (void) +- { +- char buffer[128]; +- if (fgets (buffer, 128, stdin) == NULL) +- abort_to_main_loop (-1); +- else +- exit (EXIT_SUCCESS); +- } +- +- The function `abort_to_main_loop' causes an immediate transfer of +-control back to the main loop of the program, no matter where it is +-called from. +- +- The flow of control inside the `main' function may appear a little +-mysterious at first, but it is actually a common idiom with `setjmp'. +-A normal call to `setjmp' returns zero, so the "else" clause of the +-conditional is executed. If `abort_to_main_loop' is called somewhere +-within the execution of `do_command', then it actually appears as if +-the _same_ call to `setjmp' in `main' were returning a second time with +-a value of `-1'. +- +- So, the general pattern for using `setjmp' looks something like: +- +- if (setjmp (BUFFER)) +- /* Code to clean up after premature return. */ +- ... +- else +- /* Code to be executed normally after setting up the return point. */ +- ... +- +- +-File: libc.info, Node: Non-Local Details, Next: Non-Local Exits and Signals, Prev: Non-Local Intro, Up: Non-Local Exits +- +-Details of Non-Local Exits +-========================== +- +- Here are the details on the functions and data structures used for +-performing non-local exits. These facilities are declared in +-`setjmp.h'. +- +- - Data Type: jmp_buf +- Objects of type `jmp_buf' hold the state information to be +- restored by a non-local exit. The contents of a `jmp_buf' +- identify a specific place to return to. +- +- - Macro: int setjmp (jmp_buf STATE) +- When called normally, `setjmp' stores information about the +- execution state of the program in STATE and returns zero. If +- `longjmp' is later used to perform a non-local exit to this STATE, +- `setjmp' returns a nonzero value. +- +- - Function: void longjmp (jmp_buf STATE, int VALUE) +- This function restores current execution to the state saved in +- STATE, and continues execution from the call to `setjmp' that +- established that return point. Returning from `setjmp' by means of +- `longjmp' returns the VALUE argument that was passed to `longjmp', +- rather than `0'. (But if VALUE is given as `0', `setjmp' returns +- `1'). +- +- There are a lot of obscure but important restrictions on the use of +-`setjmp' and `longjmp'. Most of these restrictions are present because +-non-local exits require a fair amount of magic on the part of the C +-compiler and can interact with other parts of the language in strange +-ways. +- +- The `setjmp' function is actually a macro without an actual function +-definition, so you shouldn't try to `#undef' it or take its address. +-In addition, calls to `setjmp' are safe in only the following contexts: +- +- * As the test expression of a selection or iteration statement (such +- as `if', `switch', or `while'). +- +- * As one operand of a equality or comparison operator that appears +- as the test expression of a selection or iteration statement. The +- other operand must be an integer constant expression. +- +- * As the operand of a unary `!' operator, that appears as the test +- expression of a selection or iteration statement. +- +- * By itself as an expression statement. +- +- Return points are valid only during the dynamic extent of the +-function that called `setjmp' to establish them. If you `longjmp' to a +-return point that was established in a function that has already +-returned, unpredictable and disastrous things are likely to happen. +- +- You should use a nonzero VALUE argument to `longjmp'. While +-`longjmp' refuses to pass back a zero argument as the return value from +-`setjmp', this is intended as a safety net against accidental misuse +-and is not really good programming style. +- +- When you perform a non-local exit, accessible objects generally +-retain whatever values they had at the time `longjmp' was called. The +-exception is that the values of automatic variables local to the +-function containing the `setjmp' call that have been changed since the +-call to `setjmp' are indeterminate, unless you have declared them +-`volatile'. +- +- +-File: libc.info, Node: Non-Local Exits and Signals, Next: System V contexts, Prev: Non-Local Details, Up: Non-Local Exits +- +-Non-Local Exits and Signals +-=========================== +- +- In BSD Unix systems, `setjmp' and `longjmp' also save and restore +-the set of blocked signals; see *Note Blocking Signals::. However, the +-POSIX.1 standard requires `setjmp' and `longjmp' not to change the set +-of blocked signals, and provides an additional pair of functions +-(`sigsetjmp' and `siglongjmp') to get the BSD behavior. +- +- The behavior of `setjmp' and `longjmp' in the GNU library is +-controlled by feature test macros; see *Note Feature Test Macros::. The +-default in the GNU system is the POSIX.1 behavior rather than the BSD +-behavior. +- +- The facilities in this section are declared in the header file +-`setjmp.h'. +- +- - Data Type: sigjmp_buf +- This is similar to `jmp_buf', except that it can also store state +- information about the set of blocked signals. +- +- - Function: int sigsetjmp (sigjmp_buf STATE, int SAVESIGS) +- This is similar to `setjmp'. If SAVESIGS is nonzero, the set of +- blocked signals is saved in STATE and will be restored if a +- `siglongjmp' is later performed with this STATE. +- +- - Function: void siglongjmp (sigjmp_buf STATE, int VALUE) +- This is similar to `longjmp' except for the type of its STATE +- argument. If the `sigsetjmp' call that set this STATE used a +- nonzero SAVESIGS flag, `siglongjmp' also restores the set of +- blocked signals. +- +- +-File: libc.info, Node: System V contexts, Prev: Non-Local Exits and Signals, Up: Non-Local Exits +- +-Complete Context Control +-======================== +- +- The Unix standard one more set of function to control the execution +-path and these functions are more powerful than those discussed in this +-chapter so far. These function were part of the original System V API +-and by this route were added to the Unix API. Beside on branded Unix +-implementations these interfaces are not widely available. Not all +-platforms and/or architectures the GNU C Library is available on provide +-this interface. Use `configure' to detect the availability. +- +- Similar to the `jmp_buf' and `sigjmp_buf' types used for the +-variables to contain the state of the `longjmp' functions the +-interfaces of interest here have an appropriate type as well. Objects +-of this type are normally much larger since more information is +-contained. The type is also used in a few more places as we will see. +-The types and functions described in this section are all defined and +-declared respectively in the `ucontext.h' header file. +- +- - Data Type: ucontext_t +- The `ucontext_t' type is defined as a structure with as least the +- following elements: +- +- `ucontext_t *uc_link' +- This is a pointer to the next context structure which is used +- if the context described in the current structure returns. +- +- `sigset_t uc_sigmask' +- Set of signals which are blocked when this context is used. +- +- `stack_t uc_stack' +- Stack used for this context. The value need not be (and +- normally is not) the stack pointer. *Note Signal Stack::. +- +- `mcontext_t uc_mcontext' +- This element contains the actual state of the process. The +- `mcontext_t' type is also defined in this header but the +- definition should be treated as opaque. Any use of knowledge +- of the type makes applications less portable. +- +- +- Objects of this type have to be created by the user. The +-initialization and modification happens through one of the following +-functions: +- +- - Function: int getcontext (ucontext_t *UCP) +- The `getcontext' function initializes the variable pointed to by +- UCP with the context of the calling thread. The context contains +- the content of the registers, the signal mask, and the current +- stack. Executing the contents would start at the point where the +- `getcontext' call just returned. +- +- The function returns `0' if successful. Otherwise it returns `-1' +- and sets ERRNO accordingly. +- +- The `getcontext' function is similar to `setjmp' but it does not +-provide an indication of whether the function returns for the first +-time or whether the initialized context was used and the execution is +-resumed at just that point. If this is necessary the user has to take +-determine this herself. This must be done carefully since the context +-contains registers which might contain register variables. This is a +-good situation to define variables with `volatile'. +- +- Once the context variable is initialized it can be used as is or it +-can be modified. The latter is normally done to implement co-routines +-or similar constructs. The `makecontext' function is what has to be +-used to do that. +- +- - Function: void makecontext (ucontext_t *UCP, void (*FUNC) (void), +- int ARGC, ...) +- The UCP parameter passed to the `makecontext' shall be initialized +- by a call to `getcontext'. The context will be modified to in a +- way so that if the context is resumed it will start by calling the +- function `func' which gets ARGC integer arguments passed. The +- integer arguments which are to be passed should follow the ARGC +- parameter in the call to `makecontext'. +- +- Before the call to this function the `uc_stack' and `uc_link' +- element of the UCP structure should be initialized. The +- `uc_stack' element describes the stack which is used for this +- context. No two contexts which are used at the same time should +- use the same memory region for a stack. +- +- The `uc_link' element of the object pointed to by UCP should be a +- pointer to the context to be executed when the function FUNC +- returns or it should be a null pointer. See `setcontext' for more +- information about the exact use. +- +- While allocating the memory for the stack one has to be careful. +-Most modern processors keep track of whether a certain memory region is +-allowed to contain code which is executed or not. Data segments and +-heap memory is normally not tagged to allow this. The result is that +-programs would fail. Examples for such code include the calling +-sequences the GNU C compiler generates for calls to nested functions. +-Safe ways to allocate stacks correctly include using memory on the +-original threads stack or explicitly allocate memory tagged for +-execution using (*note Memory-mapped I/O::). +- +- *Compatibility note*: The current Unix standard is very imprecise +-about the way the stack is allocated. All implementations seem to agree +-that the `uc_stack' element must be used but the values stored in the +-elements of the `stack_t' value are unclear. The GNU C library and +-most other Unix implementations require the `ss_sp' value of the +-`uc_stack' element to point to the base of the memory region allocated +-for the stack and the size of the memory region is stored in `ss_size'. +-There are implements out there which require `ss_sp' to be set to the +-value the stack pointer will have (which can depending on the direction +-the stack grows be different). This difference makes the `makecontext' +-function hard to use and it requires detection of the platform at +-compile time. +- +- - Function: int setcontext (const ucontext_t *UCP) +- The `setcontext' function restores the context described by UCP. +- The context is not modified and can be reused as often as wanted. +- +- If the context was created by `getcontext' execution resumes with +- the registers filled with the same values and the same stack as if +- the `getcontext' call just returned. +- +- If the context was modified with a call to `makecontext' execution +- continues with the function passed to `makecontext' which gets the +- specified parameters passed. If this function returns execution is +- resumed in the context which was referenced by the `uc_link' +- element of the context structure passed to `makecontext' at the +- time of the call. If `uc_link' was a null pointer the application +- terminates in this case. +- +- Since the context contains information about the stack no two +- threads should use the same context at the same time. The result +- in most cases would be disastrous. +- +- The `setcontext' function does not return unless an error occurred +- in which case it returns `-1'. +- +- The `setcontext' function simply replaces the current context with +-the one described by the UCP parameter. This is often useful but there +-are situations where the current context has to be preserved. +- +- - Function: int swapcontext (ucontext_t *restrict OUCP, const +- ucontext_t *restrict UCP) +- The `swapcontext' function is similar to `setcontext' but instead +- of just replacing the current context the latter is first saved in +- the object pointed to by OUCP as if this was a call to +- `getcontext'. The saved context would resume after the call to +- `swapcontext'. +- +- Once the current context is saved the context described in UCP is +- installed and execution continues as described in this context. +- +- If `swapcontext' succeeds the function does not return unless the +- context OUCP is used without prior modification by `makecontext'. +- The return value in this case is `0'. If the function fails it +- returns `-1' and set ERRNO accordingly. +- +-Example for SVID Context Handling +-================================= +- +- The easiest way to use the context handling functions is as a +-replacement for `setjmp' and `longjmp'. The context contains on most +-platforms more information which might lead to less surprises but this +-also means using these functions is more expensive (beside being less +-portable). +- +- int +- random_search (int n, int (*fp) (int, ucontext_t *)) +- { +- volatile int cnt = 0; +- ucontext_t uc; +- +- /* Safe current context. */ +- if (getcontext (&uc) < 0) +- return -1; +- +- /* If we have not tried N times try again. */ +- if (cnt++ < n) +- /* Call the function with a new random number +- and the context. */ +- if (fp (rand (), &uc) != 0) +- /* We found what we were looking for. */ +- return 1; +- +- /* Not found. */ +- return 0; +- } +- +- Using contexts in such a way enables emulating exception handling. +-The search functions passed in the FP parameter could be very large, +-nested, and complex which would make it complicated (or at least would +-require a lot of code) to leave the function with an error value which +-has to be passed down to the caller. By using the context it is +-possible to leave the search function in one step and allow restarting +-the search which also has the nice side effect that it can be +-significantly faster. +- +- Something which is harder to implement with `setjmp' and `longjmp' +-is to switch temporarily to a different execution path and then resume +-where execution was stopped. +- +- #include +- #include +- #include +- #include +- #include +- +- /* Set by the signal handler. */ +- static volatile int expired; +- +- /* The contexts. */ +- static ucontext_t uc[3]; +- +- /* We do only a certain number of switches. */ +- static int switches; +- +- +- /* This is the function doing the work. It is just a +- skeleton, real code has to be filled in. */ +- static void +- f (int n) +- { +- int m = 0; +- while (1) +- { +- /* This is where the work would be done. */ +- if (++m % 100 == 0) +- { +- putchar ('.'); +- fflush (stdout); +- } +- +- /* Regularly the EXPIRE variable must be checked. */ +- if (expired) +- { +- /* We do not want the program to run forever. */ +- if (++switches == 20) +- return; +- +- printf ("\nswitching from %d to %d\n", n, 3 - n); +- expired = 0; +- /* Switch to the other context, saving the current one. */ +- swapcontext (&uc[n], &uc[3 - n]); +- } +- } +- } +- +- /* This is the signal handler which simply set the variable. */ +- void +- handler (int signal) +- { +- expired = 1; +- } +- +- +- int +- main (void) +- { +- struct sigaction sa; +- struct itimerval it; +- char st1[8192]; +- char st2[8192]; +- +- /* Initialize the data structures for the interval timer. */ +- sa.sa_flags = SA_RESTART; +- sigfillset (&sa.sa_mask); +- sa.sa_handler = handler; +- it.it_interval.tv_sec = 0; +- it.it_interval.tv_usec = 1; +- it.it_value = it.it_interval; +- +- /* Install the timer and get the context we can manipulate. */ +- if (sigaction (SIGPROF, &sa, NULL) < 0 +- || setitimer (ITIMER_PROF, &it, NULL) < 0 +- || getcontext (&uc[1]) == -1 +- || getcontext (&uc[2]) == -1) +- abort (); +- +- /* Create a context with a separate stack which causes the +- function `f' to be call with the parameter `1'. +- Note that the `uc_link' points to the main context +- which will cause the program to terminate once the function +- return. */ +- uc[1].uc_link = &uc[0]; +- uc[1].uc_stack.ss_sp = st1; +- uc[1].uc_stack.ss_size = sizeof st1; +- makecontext (&uc[1], (void (*) (void)) f, 1, 1); +- +- /* Similarly, but `2' is passed as the parameter to `f'. */ +- uc[2].uc_link = &uc[0]; +- uc[2].uc_stack.ss_sp = st2; +- uc[2].uc_stack.ss_size = sizeof st2; +- makecontext (&uc[2], (void (*) (void)) f, 1, 2); +- +- /* Start running. */ +- swapcontext (&uc[0], &uc[1]); +- putchar ('\n'); +- +- return 0; +- } +- +- This an example how the context functions can be used to implement +-co-routines or cooperative multi-threading. All that has to be done is +-to call every once in a while `swapcontext' to continue running a +-different context. It is not allowed to do the context switching from +-the signal handler directly since neither `setcontext' nor +-`swapcontext' are functions which can be called from a signal handler. +-But setting a variable in the signal handler and checking it in the +-body of the functions which are executed. Since `swapcontext' is +-saving the current context it is possible to have multiple different +-scheduling points in the code. Execution will always resume where it +-was left. +- +- +-File: libc.info, Node: Signal Handling, Next: Program Basics, Prev: Non-Local Exits, Up: Top +- +-Signal Handling +-*************** +- +- A "signal" is a software interrupt delivered to a process. The +-operating system uses signals to report exceptional situations to an +-executing program. Some signals report errors such as references to +-invalid memory addresses; others report asynchronous events, such as +-disconnection of a phone line. +- +- The GNU C library defines a variety of signal types, each for a +-particular kind of event. Some kinds of events make it inadvisable or +-impossible for the program to proceed as usual, and the corresponding +-signals normally abort the program. Other kinds of signals that report +-harmless events are ignored by default. +- +- If you anticipate an event that causes signals, you can define a +-handler function and tell the operating system to run it when that +-particular type of signal arrives. +- +- Finally, one process can send a signal to another process; this +-allows a parent process to abort a child, or two related processes to +-communicate and synchronize. +- +-* Menu: +- +-* Concepts of Signals:: Introduction to the signal facilities. +-* Standard Signals:: Particular kinds of signals with +- standard names and meanings. +-* Signal Actions:: Specifying what happens when a +- particular signal is delivered. +-* Defining Handlers:: How to write a signal handler function. +-* Interrupted Primitives:: Signal handlers affect use of `open', +- `read', `write' and other functions. +-* Generating Signals:: How to send a signal to a process. +-* Blocking Signals:: Making the system hold signals temporarily. +-* Waiting for a Signal:: Suspending your program until a signal +- arrives. +-* Signal Stack:: Using a Separate Signal Stack. +-* BSD Signal Handling:: Additional functions for backward +- compatibility with BSD. +- +- +-File: libc.info, Node: Concepts of Signals, Next: Standard Signals, Up: Signal Handling +- +-Basic Concepts of Signals +-========================= +- +- This section explains basic concepts of how signals are generated, +-what happens after a signal is delivered, and how programs can handle +-signals. +- +-* Menu: +- +-* Kinds of Signals:: Some examples of what can cause a signal. +-* Signal Generation:: Concepts of why and how signals occur. +-* Delivery of Signal:: Concepts of what a signal does to the +- process. +- +- +-File: libc.info, Node: Kinds of Signals, Next: Signal Generation, Up: Concepts of Signals +- +-Some Kinds of Signals +---------------------- +- +- A signal reports the occurrence of an exceptional event. These are +-some of the events that can cause (or "generate", or "raise") a signal: +- +- * A program error such as dividing by zero or issuing an address +- outside the valid range. +- +- * A user request to interrupt or terminate the program. Most +- environments are set up to let a user suspend the program by +- typing `C-z', or terminate it with `C-c'. Whatever key sequence +- is used, the operating system sends the proper signal to interrupt +- the process. +- +- * The termination of a child process. +- +- * Expiration of a timer or alarm. +- +- * A call to `kill' or `raise' by the same process. +- +- * A call to `kill' from another process. Signals are a limited but +- useful form of interprocess communication. +- +- * An attempt to perform an I/O operation that cannot be done. +- Examples are reading from a pipe that has no writer (*note Pipes +- and FIFOs::), and reading or writing to a terminal in certain +- situations (*note Job Control::). +- +- Each of these kinds of events (excepting explicit calls to `kill' +-and `raise') generates its own particular kind of signal. The various +-kinds of signals are listed and described in detail in *Note Standard +-Signals::. +- +- +-File: libc.info, Node: Signal Generation, Next: Delivery of Signal, Prev: Kinds of Signals, Up: Concepts of Signals +- +-Concepts of Signal Generation +------------------------------ +- +- In general, the events that generate signals fall into three major +-categories: errors, external events, and explicit requests. +- +- An error means that a program has done something invalid and cannot +-continue execution. But not all kinds of errors generate signals--in +-fact, most do not. For example, opening a nonexistent file is an error, +-but it does not raise a signal; instead, `open' returns `-1'. In +-general, errors that are necessarily associated with certain library +-functions are reported by returning a value that indicates an error. +-The errors which raise signals are those which can happen anywhere in +-the program, not just in library calls. These include division by zero +-and invalid memory addresses. +- +- An external event generally has to do with I/O or other processes. +-These include the arrival of input, the expiration of a timer, and the +-termination of a child process. +- +- An explicit request means the use of a library function such as +-`kill' whose purpose is specifically to generate a signal. +- +- Signals may be generated "synchronously" or "asynchronously". A +-synchronous signal pertains to a specific action in the program, and is +-delivered (unless blocked) during that action. Most errors generate +-signals synchronously, and so do explicit requests by a process to +-generate a signal for that same process. On some machines, certain +-kinds of hardware errors (usually floating-point exceptions) are not +-reported completely synchronously, but may arrive a few instructions +-later. +- +- Asynchronous signals are generated by events outside the control of +-the process that receives them. These signals arrive at unpredictable +-times during execution. External events generate signals +-asynchronously, and so do explicit requests that apply to some other +-process. +- +- A given type of signal is either typically synchronous or typically +-asynchronous. For example, signals for errors are typically synchronous +-because errors generate signals synchronously. But any type of signal +-can be generated synchronously or asynchronously with an explicit +-request. +- +- +-File: libc.info, Node: Delivery of Signal, Prev: Signal Generation, Up: Concepts of Signals +- +-How Signals Are Delivered +-------------------------- +- +- When a signal is generated, it becomes "pending". Normally it +-remains pending for just a short period of time and then is "delivered" +-to the process that was signaled. However, if that kind of signal is +-currently "blocked", it may remain pending indefinitely--until signals +-of that kind are "unblocked". Once unblocked, it will be delivered +-immediately. *Note Blocking Signals::. +- +- When the signal is delivered, whether right away or after a long +-delay, the "specified action" for that signal is taken. For certain +-signals, such as `SIGKILL' and `SIGSTOP', the action is fixed, but for +-most signals, the program has a choice: ignore the signal, specify a +-"handler function", or accept the "default action" for that kind of +-signal. The program specifies its choice using functions such as +-`signal' or `sigaction' (*note Signal Actions::). We sometimes say +-that a handler "catches" the signal. While the handler is running, +-that particular signal is normally blocked. +- +- If the specified action for a kind of signal is to ignore it, then +-any such signal which is generated is discarded immediately. This +-happens even if the signal is also blocked at the time. A signal +-discarded in this way will never be delivered, not even if the program +-subsequently specifies a different action for that kind of signal and +-then unblocks it. +- +- If a signal arrives which the program has neither handled nor +-ignored, its "default action" takes place. Each kind of signal has its +-own default action, documented below (*note Standard Signals::). For +-most kinds of signals, the default action is to terminate the process. +-For certain kinds of signals that represent "harmless" events, the +-default action is to do nothing. +- +- When a signal terminates a process, its parent process can determine +-the cause of termination by examining the termination status code +-reported by the `wait' or `waitpid' functions. (This is discussed in +-more detail in *Note Process Completion::.) The information it can get +-includes the fact that termination was due to a signal and the kind of +-signal involved. If a program you run from a shell is terminated by a +-signal, the shell typically prints some kind of error message. +- +- The signals that normally represent program errors have a special +-property: when one of these signals terminates the process, it also +-writes a "core dump file" which records the state of the process at the +-time of termination. You can examine the core dump with a debugger to +-investigate what caused the error. +- +- If you raise a "program error" signal by explicit request, and this +-terminates the process, it makes a core dump file just as if the signal +-had been due directly to an error. +- +- +-File: libc.info, Node: Standard Signals, Next: Signal Actions, Prev: Concepts of Signals, Up: Signal Handling +- +-Standard Signals +-================ +- +- This section lists the names for various standard kinds of signals +-and describes what kind of event they mean. Each signal name is a macro +-which stands for a positive integer--the "signal number" for that kind +-of signal. Your programs should never make assumptions about the +-numeric code for a particular kind of signal, but rather refer to them +-always by the names defined here. This is because the number for a +-given kind of signal can vary from system to system, but the meanings of +-the names are standardized and fairly uniform. +- +- The signal names are defined in the header file `signal.h'. +- +- - Macro: int NSIG +- The value of this symbolic constant is the total number of signals +- defined. Since the signal numbers are allocated consecutively, +- `NSIG' is also one greater than the largest defined signal number. +- +-* Menu: +- +-* Program Error Signals:: Used to report serious program errors. +-* Termination Signals:: Used to interrupt and/or terminate the +- program. +-* Alarm Signals:: Used to indicate expiration of timers. +-* Asynchronous I/O Signals:: Used to indicate input is available. +-* Job Control Signals:: Signals used to support job control. +-* Operation Error Signals:: Used to report operational system errors. +-* Miscellaneous Signals:: Miscellaneous Signals. +-* Signal Messages:: Printing a message describing a signal. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-39 glibc-2.3.2-200304020432/manual/libc.info-39 +--- glibc-2.3.2/manual/libc.info-39 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-39 Thu Jan 1 01:00:00 1970 +@@ -1,1212 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Program Error Signals, Next: Termination Signals, Up: Standard Signals +- +-Program Error Signals +---------------------- +- +- The following signals are generated when a serious program error is +-detected by the operating system or the computer itself. In general, +-all of these signals are indications that your program is seriously +-broken in some way, and there's usually no way to continue the +-computation which encountered the error. +- +- Some programs handle program error signals in order to tidy up before +-terminating; for example, programs that turn off echoing of terminal +-input should handle program error signals in order to turn echoing back +-on. The handler should end by specifying the default action for the +-signal that happened and then reraising it; this will cause the program +-to terminate with that signal, as if it had not had a handler. (*Note +-Termination in Handler::.) +- +- Termination is the sensible ultimate outcome from a program error in +-most programs. However, programming systems such as Lisp that can load +-compiled user programs might need to keep executing even if a user +-program incurs an error. These programs have handlers which use +-`longjmp' to return control to the command level. +- +- The default action for all of these signals is to cause the process +-to terminate. If you block or ignore these signals or establish +-handlers for them that return normally, your program will probably +-break horribly when such signals happen, unless they are generated by +-`raise' or `kill' instead of a real error. +- +- When one of these program error signals terminates a process, it also +-writes a "core dump file" which records the state of the process at the +-time of termination. The core dump file is named `core' and is written +-in whichever directory is current in the process at the time. (On the +-GNU system, you can specify the file name for core dumps with the +-environment variable `COREFILE'.) The purpose of core dump files is so +-that you can examine them with a debugger to investigate what caused +-the error. +- +- - Macro: int SIGFPE +- The `SIGFPE' signal reports a fatal arithmetic error. Although the +- name is derived from "floating-point exception", this signal +- actually covers all arithmetic errors, including division by zero +- and overflow. If a program stores integer data in a location +- which is then used in a floating-point operation, this often +- causes an "invalid operation" exception, because the processor +- cannot recognize the data as a floating-point number. +- +- Actual floating-point exceptions are a complicated subject because +- there are many types of exceptions with subtly different meanings, +- and the `SIGFPE' signal doesn't distinguish between them. The +- `IEEE Standard for Binary Floating-Point Arithmetic (ANSI/IEEE Std +- 754-1985 and ANSI/IEEE Std 854-1987)' defines various +- floating-point exceptions and requires conforming computer systems +- to report their occurrences. However, this standard does not +- specify how the exceptions are reported, or what kinds of handling +- and control the operating system can offer to the programmer. +- +- BSD systems provide the `SIGFPE' handler with an extra argument that +-distinguishes various causes of the exception. In order to access this +-argument, you must define the handler to accept two arguments, which +-means you must cast it to a one-argument function type in order to +-establish the handler. The GNU library does provide this extra +-argument, but the value is meaningful only on operating systems that +-provide the information (BSD systems and GNU systems). +- +-`FPE_INTOVF_TRAP' +- Integer overflow (impossible in a C program unless you enable +- overflow trapping in a hardware-specific fashion). +- +-`FPE_INTDIV_TRAP' +- Integer division by zero. +- +-`FPE_SUBRNG_TRAP' +- Subscript-range (something that C programs never check for). +- +-`FPE_FLTOVF_TRAP' +- Floating overflow trap. +- +-`FPE_FLTDIV_TRAP' +- Floating/decimal division by zero. +- +-`FPE_FLTUND_TRAP' +- Floating underflow trap. (Trapping on floating underflow is not +- normally enabled.) +- +-`FPE_DECOVF_TRAP' +- Decimal overflow trap. (Only a few machines have decimal +- arithmetic and C never uses it.) +- +- - Macro: int SIGILL +- The name of this signal is derived from "illegal instruction"; it +- usually means your program is trying to execute garbage or a +- privileged instruction. Since the C compiler generates only valid +- instructions, `SIGILL' typically indicates that the executable +- file is corrupted, or that you are trying to execute data. Some +- common ways of getting into the latter situation are by passing an +- invalid object where a pointer to a function was expected, or by +- writing past the end of an automatic array (or similar problems +- with pointers to automatic variables) and corrupting other data on +- the stack such as the return address of a stack frame. +- +- `SIGILL' can also be generated when the stack overflows, or when +- the system has trouble running the handler for a signal. +- +- - Macro: int SIGSEGV +- This signal is generated when a program tries to read or write +- outside the memory that is allocated for it, or to write memory +- that can only be read. (Actually, the signals only occur when the +- program goes far enough outside to be detected by the system's +- memory protection mechanism.) The name is an abbreviation for +- "segmentation violation". +- +- Common ways of getting a `SIGSEGV' condition include dereferencing +- a null or uninitialized pointer, or when you use a pointer to step +- through an array, but fail to check for the end of the array. It +- varies among systems whether dereferencing a null pointer generates +- `SIGSEGV' or `SIGBUS'. +- +- - Macro: int SIGBUS +- This signal is generated when an invalid pointer is dereferenced. +- Like `SIGSEGV', this signal is typically the result of +- dereferencing an uninitialized pointer. The difference between +- the two is that `SIGSEGV' indicates an invalid access to valid +- memory, while `SIGBUS' indicates an access to an invalid address. +- In particular, `SIGBUS' signals often result from dereferencing a +- misaligned pointer, such as referring to a four-word integer at an +- address not divisible by four. (Each kind of computer has its own +- requirements for address alignment.) +- +- The name of this signal is an abbreviation for "bus error". +- +- - Macro: int SIGABRT +- This signal indicates an error detected by the program itself and +- reported by calling `abort'. *Note Aborting a Program::. +- +- - Macro: int SIGIOT +- Generated by the PDP-11 "iot" instruction. On most machines, this +- is just another name for `SIGABRT'. +- +- - Macro: int SIGTRAP +- Generated by the machine's breakpoint instruction, and possibly +- other trap instructions. This signal is used by debuggers. Your +- program will probably only see `SIGTRAP' if it is somehow +- executing bad instructions. +- +- - Macro: int SIGEMT +- Emulator trap; this results from certain unimplemented instructions +- which might be emulated in software, or the operating system's +- failure to properly emulate them. +- +- - Macro: int SIGSYS +- Bad system call; that is to say, the instruction to trap to the +- operating system was executed, but the code number for the system +- call to perform was invalid. +- +- +-File: libc.info, Node: Termination Signals, Next: Alarm Signals, Prev: Program Error Signals, Up: Standard Signals +- +-Termination Signals +-------------------- +- +- These signals are all used to tell a process to terminate, in one way +-or another. They have different names because they're used for slightly +-different purposes, and programs might want to handle them differently. +- +- The reason for handling these signals is usually so your program can +-tidy up as appropriate before actually terminating. For example, you +-might want to save state information, delete temporary files, or restore +-the previous terminal modes. Such a handler should end by specifying +-the default action for the signal that happened and then reraising it; +-this will cause the program to terminate with that signal, as if it had +-not had a handler. (*Note Termination in Handler::.) +- +- The (obvious) default action for all of these signals is to cause the +-process to terminate. +- +- - Macro: int SIGTERM +- The `SIGTERM' signal is a generic signal used to cause program +- termination. Unlike `SIGKILL', this signal can be blocked, +- handled, and ignored. It is the normal way to politely ask a +- program to terminate. +- +- The shell command `kill' generates `SIGTERM' by default. +- +- - Macro: int SIGINT +- The `SIGINT' ("program interrupt") signal is sent when the user +- types the INTR character (normally `C-c'). *Note Special +- Characters::, for information about terminal driver support for +- `C-c'. +- +- - Macro: int SIGQUIT +- The `SIGQUIT' signal is similar to `SIGINT', except that it's +- controlled by a different key--the QUIT character, usually +- `C-\'--and produces a core dump when it terminates the process, +- just like a program error signal. You can think of this as a +- program error condition "detected" by the user. +- +- *Note Program Error Signals::, for information about core dumps. +- *Note Special Characters::, for information about terminal driver +- support. +- +- Certain kinds of cleanups are best omitted in handling `SIGQUIT'. +- For example, if the program creates temporary files, it should +- handle the other termination requests by deleting the temporary +- files. But it is better for `SIGQUIT' not to delete them, so that +- the user can examine them in conjunction with the core dump. +- +- - Macro: int SIGKILL +- The `SIGKILL' signal is used to cause immediate program +- termination. It cannot be handled or ignored, and is therefore +- always fatal. It is also not possible to block this signal. +- +- This signal is usually generated only by explicit request. Since +- it cannot be handled, you should generate it only as a last +- resort, after first trying a less drastic method such as `C-c' or +- `SIGTERM'. If a process does not respond to any other termination +- signals, sending it a `SIGKILL' signal will almost always cause it +- to go away. +- +- In fact, if `SIGKILL' fails to terminate a process, that by itself +- constitutes an operating system bug which you should report. +- +- The system will generate `SIGKILL' for a process itself under some +- unusual conditions where the program cannot possibly continue to +- run (even to run a signal handler). +- +- - Macro: int SIGHUP +- The `SIGHUP' ("hang-up") signal is used to report that the user's +- terminal is disconnected, perhaps because a network or telephone +- connection was broken. For more information about this, see *Note +- Control Modes::. +- +- This signal is also used to report the termination of the +- controlling process on a terminal to jobs associated with that +- session; this termination effectively disconnects all processes in +- the session from the controlling terminal. For more information, +- see *Note Termination Internals::. +- +- +-File: libc.info, Node: Alarm Signals, Next: Asynchronous I/O Signals, Prev: Termination Signals, Up: Standard Signals +- +-Alarm Signals +-------------- +- +- These signals are used to indicate the expiration of timers. *Note +-Setting an Alarm::, for information about functions that cause these +-signals to be sent. +- +- The default behavior for these signals is to cause program +-termination. This default is rarely useful, but no other default would +-be useful; most of the ways of using these signals would require +-handler functions in any case. +- +- - Macro: int SIGALRM +- This signal typically indicates expiration of a timer that +- measures real or clock time. It is used by the `alarm' function, +- for example. +- +- - Macro: int SIGVTALRM +- This signal typically indicates expiration of a timer that +- measures CPU time used by the current process. The name is an +- abbreviation for "virtual time alarm". +- +- - Macro: int SIGPROF +- This signal typically indicates expiration of a timer that measures +- both CPU time used by the current process, and CPU time expended on +- behalf of the process by the system. Such a timer is used to +- implement code profiling facilities, hence the name of this signal. +- +- +-File: libc.info, Node: Asynchronous I/O Signals, Next: Job Control Signals, Prev: Alarm Signals, Up: Standard Signals +- +-Asynchronous I/O Signals +------------------------- +- +- The signals listed in this section are used in conjunction with +-asynchronous I/O facilities. You have to take explicit action by +-calling `fcntl' to enable a particular file descriptor to generate +-these signals (*note Interrupt Input::). The default action for these +-signals is to ignore them. +- +- - Macro: int SIGIO +- This signal is sent when a file descriptor is ready to perform +- input or output. +- +- On most operating systems, terminals and sockets are the only +- kinds of files that can generate `SIGIO'; other kinds, including +- ordinary files, never generate `SIGIO' even if you ask them to. +- +- In the GNU system `SIGIO' will always be generated properly if you +- successfully set asynchronous mode with `fcntl'. +- +- - Macro: int SIGURG +- This signal is sent when "urgent" or out-of-band data arrives on a +- socket. *Note Out-of-Band Data::. +- +- - Macro: int SIGPOLL +- This is a System V signal name, more or less similar to `SIGIO'. +- It is defined only for compatibility. +- +- +-File: libc.info, Node: Job Control Signals, Next: Operation Error Signals, Prev: Asynchronous I/O Signals, Up: Standard Signals +- +-Job Control Signals +-------------------- +- +- These signals are used to support job control. If your system +-doesn't support job control, then these macros are defined but the +-signals themselves can't be raised or handled. +- +- You should generally leave these signals alone unless you really +-understand how job control works. *Note Job Control::. +- +- - Macro: int SIGCHLD +- This signal is sent to a parent process whenever one of its child +- processes terminates or stops. +- +- The default action for this signal is to ignore it. If you +- establish a handler for this signal while there are child +- processes that have terminated but not reported their status via +- `wait' or `waitpid' (*note Process Completion::), whether your new +- handler applies to those processes or not depends on the +- particular operating system. +- +- - Macro: int SIGCLD +- This is an obsolete name for `SIGCHLD'. +- +- - Macro: int SIGCONT +- You can send a `SIGCONT' signal to a process to make it continue. +- This signal is special--it always makes the process continue if it +- is stopped, before the signal is delivered. The default behavior +- is to do nothing else. You cannot block this signal. You can set +- a handler, but `SIGCONT' always makes the process continue +- regardless. +- +- Most programs have no reason to handle `SIGCONT'; they simply +- resume execution without realizing they were ever stopped. You +- can use a handler for `SIGCONT' to make a program do something +- special when it is stopped and continued--for example, to reprint +- a prompt when it is suspended while waiting for input. +- +- - Macro: int SIGSTOP +- The `SIGSTOP' signal stops the process. It cannot be handled, +- ignored, or blocked. +- +- - Macro: int SIGTSTP +- The `SIGTSTP' signal is an interactive stop signal. Unlike +- `SIGSTOP', this signal can be handled and ignored. +- +- Your program should handle this signal if you have a special need +- to leave files or system tables in a secure state when a process is +- stopped. For example, programs that turn off echoing should handle +- `SIGTSTP' so they can turn echoing back on before stopping. +- +- This signal is generated when the user types the SUSP character +- (normally `C-z'). For more information about terminal driver +- support, see *Note Special Characters::. +- +- - Macro: int SIGTTIN +- A process cannot read from the user's terminal while it is running +- as a background job. When any process in a background job tries to +- read from the terminal, all of the processes in the job are sent a +- `SIGTTIN' signal. The default action for this signal is to stop +- the process. For more information about how this interacts with +- the terminal driver, see *Note Access to the Terminal::. +- +- - Macro: int SIGTTOU +- This is similar to `SIGTTIN', but is generated when a process in a +- background job attempts to write to the terminal or set its modes. +- Again, the default action is to stop the process. `SIGTTOU' is +- only generated for an attempt to write to the terminal if the +- `TOSTOP' output mode is set; *note Output Modes::. +- +- While a process is stopped, no more signals can be delivered to it +-until it is continued, except `SIGKILL' signals and (obviously) +-`SIGCONT' signals. The signals are marked as pending, but not +-delivered until the process is continued. The `SIGKILL' signal always +-causes termination of the process and can't be blocked, handled or +-ignored. You can ignore `SIGCONT', but it always causes the process to +-be continued anyway if it is stopped. Sending a `SIGCONT' signal to a +-process causes any pending stop signals for that process to be +-discarded. Likewise, any pending `SIGCONT' signals for a process are +-discarded when it receives a stop signal. +- +- When a process in an orphaned process group (*note Orphaned Process +-Groups::) receives a `SIGTSTP', `SIGTTIN', or `SIGTTOU' signal and does +-not handle it, the process does not stop. Stopping the process would +-probably not be very useful, since there is no shell program that will +-notice it stop and allow the user to continue it. What happens instead +-depends on the operating system you are using. Some systems may do +-nothing; others may deliver another signal instead, such as `SIGKILL' +-or `SIGHUP'. In the GNU system, the process dies with `SIGKILL'; this +-avoids the problem of many stopped, orphaned processes lying around the +-system. +- +- +-File: libc.info, Node: Operation Error Signals, Next: Miscellaneous Signals, Prev: Job Control Signals, Up: Standard Signals +- +-Operation Error Signals +------------------------ +- +- These signals are used to report various errors generated by an +-operation done by the program. They do not necessarily indicate a +-programming error in the program, but an error that prevents an +-operating system call from completing. The default action for all of +-them is to cause the process to terminate. +- +- - Macro: int SIGPIPE +- Broken pipe. If you use pipes or FIFOs, you have to design your +- application so that one process opens the pipe for reading before +- another starts writing. If the reading process never starts, or +- terminates unexpectedly, writing to the pipe or FIFO raises a +- `SIGPIPE' signal. If `SIGPIPE' is blocked, handled or ignored, +- the offending call fails with `EPIPE' instead. +- +- Pipes and FIFO special files are discussed in more detail in *Note +- Pipes and FIFOs::. +- +- Another cause of `SIGPIPE' is when you try to output to a socket +- that isn't connected. *Note Sending Data::. +- +- - Macro: int SIGLOST +- Resource lost. This signal is generated when you have an advisory +- lock on an NFS file, and the NFS server reboots and forgets about +- your lock. +- +- In the GNU system, `SIGLOST' is generated when any server program +- dies unexpectedly. It is usually fine to ignore the signal; +- whatever call was made to the server that died just returns an +- error. +- +- - Macro: int SIGXCPU +- CPU time limit exceeded. This signal is generated when the process +- exceeds its soft resource limit on CPU time. *Note Limits on +- Resources::. +- +- - Macro: int SIGXFSZ +- File size limit exceeded. This signal is generated when the +- process attempts to extend a file so it exceeds the process's soft +- resource limit on file size. *Note Limits on Resources::. +- +- +-File: libc.info, Node: Miscellaneous Signals, Next: Signal Messages, Prev: Operation Error Signals, Up: Standard Signals +- +-Miscellaneous Signals +---------------------- +- +- These signals are used for various other purposes. In general, they +-will not affect your program unless it explicitly uses them for +-something. +- +- - Macro: int SIGUSR1 +- - Macro: int SIGUSR2 +- The `SIGUSR1' and `SIGUSR2' signals are set aside for you to use +- any way you want. They're useful for simple interprocess +- communication, if you write a signal handler for them in the +- program that receives the signal. +- +- There is an example showing the use of `SIGUSR1' and `SIGUSR2' in +- *Note Signaling Another Process::. +- +- The default action is to terminate the process. +- +- - Macro: int SIGWINCH +- Window size change. This is generated on some systems (including +- GNU) when the terminal driver's record of the number of rows and +- columns on the screen is changed. The default action is to ignore +- it. +- +- If a program does full-screen display, it should handle `SIGWINCH'. +- When the signal arrives, it should fetch the new screen size and +- reformat its display accordingly. +- +- - Macro: int SIGINFO +- Information request. In 4.4 BSD and the GNU system, this signal +- is sent to all the processes in the foreground process group of +- the controlling terminal when the user types the STATUS character +- in canonical mode; *note Signal Characters::. +- +- If the process is the leader of the process group, the default +- action is to print some status information about the system and +- what the process is doing. Otherwise the default is to do nothing. +- +- +-File: libc.info, Node: Signal Messages, Prev: Miscellaneous Signals, Up: Standard Signals +- +-Signal Messages +---------------- +- +- We mentioned above that the shell prints a message describing the +-signal that terminated a child process. The clean way to print a +-message describing a signal is to use the functions `strsignal' and +-`psignal'. These functions use a signal number to specify which kind +-of signal to describe. The signal number may come from the termination +-status of a child process (*note Process Completion::) or it may come +-from a signal handler in the same process. +- +- - Function: char * strsignal (int SIGNUM) +- This function returns a pointer to a statically-allocated string +- containing a message describing the signal SIGNUM. You should not +- modify the contents of this string; and, since it can be rewritten +- on subsequent calls, you should save a copy of it if you need to +- reference it later. +- +- This function is a GNU extension, declared in the header file +- `string.h'. +- +- - Function: void psignal (int SIGNUM, const char *MESSAGE) +- This function prints a message describing the signal SIGNUM to the +- standard error output stream `stderr'; see *Note Standard +- Streams::. +- +- If you call `psignal' with a MESSAGE that is either a null pointer +- or an empty string, `psignal' just prints the message +- corresponding to SIGNUM, adding a trailing newline. +- +- If you supply a non-null MESSAGE argument, then `psignal' prefixes +- its output with this string. It adds a colon and a space +- character to separate the MESSAGE from the string corresponding to +- SIGNUM. +- +- This function is a BSD feature, declared in the header file +- `signal.h'. +- +- There is also an array `sys_siglist' which contains the messages for +-the various signal codes. This array exists on BSD systems, unlike +-`strsignal'. +- +- +-File: libc.info, Node: Signal Actions, Next: Defining Handlers, Prev: Standard Signals, Up: Signal Handling +- +-Specifying Signal Actions +-========================= +- +- The simplest way to change the action for a signal is to use the +-`signal' function. You can specify a built-in action (such as to +-ignore the signal), or you can "establish a handler". +- +- The GNU library also implements the more versatile `sigaction' +-facility. This section describes both facilities and gives suggestions +-on which to use when. +- +-* Menu: +- +-* Basic Signal Handling:: The simple `signal' function. +-* Advanced Signal Handling:: The more powerful `sigaction' function. +-* Signal and Sigaction:: How those two functions interact. +-* Sigaction Function Example:: An example of using the sigaction function. +-* Flags for Sigaction:: Specifying options for signal handling. +-* Initial Signal Actions:: How programs inherit signal actions. +- +- +-File: libc.info, Node: Basic Signal Handling, Next: Advanced Signal Handling, Up: Signal Actions +- +-Basic Signal Handling +---------------------- +- +- The `signal' function provides a simple interface for establishing +-an action for a particular signal. The function and associated macros +-are declared in the header file `signal.h'. +- +- - Data Type: sighandler_t +- This is the type of signal handler functions. Signal handlers +- take one integer argument specifying the signal number, and have +- return type `void'. So, you should define handler functions like +- this: +- +- void HANDLER (int `signum') { ... } +- +- The name `sighandler_t' for this data type is a GNU extension. +- +- - Function: sighandler_t signal (int SIGNUM, sighandler_t ACTION) +- The `signal' function establishes ACTION as the action for the +- signal SIGNUM. +- +- The first argument, SIGNUM, identifies the signal whose behavior +- you want to control, and should be a signal number. The proper +- way to specify a signal number is with one of the symbolic signal +- names (*note Standard Signals::)--don't use an explicit number, +- because the numerical code for a given kind of signal may vary +- from operating system to operating system. +- +- The second argument, ACTION, specifies the action to use for the +- signal SIGNUM. This can be one of the following: +- +- `SIG_DFL' +- `SIG_DFL' specifies the default action for the particular +- signal. The default actions for various kinds of signals are +- stated in *Note Standard Signals::. +- +- `SIG_IGN' +- `SIG_IGN' specifies that the signal should be ignored. +- +- Your program generally should not ignore signals that +- represent serious events or that are normally used to request +- termination. You cannot ignore the `SIGKILL' or `SIGSTOP' +- signals at all. You can ignore program error signals like +- `SIGSEGV', but ignoring the error won't enable the program to +- continue executing meaningfully. Ignoring user requests such +- as `SIGINT', `SIGQUIT', and `SIGTSTP' is unfriendly. +- +- When you do not wish signals to be delivered during a certain +- part of the program, the thing to do is to block them, not +- ignore them. *Note Blocking Signals::. +- +- `HANDLER' +- Supply the address of a handler function in your program, to +- specify running this handler as the way to deliver the signal. +- +- For more information about defining signal handler functions, +- see *Note Defining Handlers::. +- +- If you set the action for a signal to `SIG_IGN', or if you set it +- to `SIG_DFL' and the default action is to ignore that signal, then +- any pending signals of that type are discarded (even if they are +- blocked). Discarding the pending signals means that they will +- never be delivered, not even if you subsequently specify another +- action and unblock this kind of signal. +- +- The `signal' function returns the action that was previously in +- effect for the specified SIGNUM. You can save this value and +- restore it later by calling `signal' again. +- +- If `signal' can't honor the request, it returns `SIG_ERR' instead. +- The following `errno' error conditions are defined for this +- function: +- +- `EINVAL' +- You specified an invalid SIGNUM; or you tried to ignore or +- provide a handler for `SIGKILL' or `SIGSTOP'. +- +- *Compatibility Note:* A problem encountered when working with the +-`signal' function is that it has different semantics on BSD and SVID +-systems. The difference is that on SVID systems the signal handler is +-deinstalled after signal delivery. On BSD systems the handler must be +-explicitly deinstalled. In the GNU C Library we use the BSD version by +-default. To use the SVID version you can either use the function +-`sysv_signal' (see below) or use the `_XOPEN_SOURCE' feature select +-macro (*note Feature Test Macros::). In general, use of these +-functions should be avoided because of compatibility problems. It is +-better to use `sigaction' if it is available since the results are much +-more reliable. +- +- Here is a simple example of setting up a handler to delete temporary +-files when certain fatal signals happen: +- +- #include +- +- void +- termination_handler (int signum) +- { +- struct temp_file *p; +- +- for (p = temp_file_list; p; p = p->next) +- unlink (p->name); +- } +- +- int +- main (void) +- { +- ... +- if (signal (SIGINT, termination_handler) == SIG_IGN) +- signal (SIGINT, SIG_IGN); +- if (signal (SIGHUP, termination_handler) == SIG_IGN) +- signal (SIGHUP, SIG_IGN); +- if (signal (SIGTERM, termination_handler) == SIG_IGN) +- signal (SIGTERM, SIG_IGN); +- ... +- } +- +-Note that if a given signal was previously set to be ignored, this code +-avoids altering that setting. This is because non-job-control shells +-often ignore certain signals when starting children, and it is important +-for the children to respect this. +- +- We do not handle `SIGQUIT' or the program error signals in this +-example because these are designed to provide information for debugging +-(a core dump), and the temporary files may give useful information. +- +- - Function: sighandler_t sysv_signal (int SIGNUM, sighandler_t ACTION) +- The `sysv_signal' implements the behavior of the standard `signal' +- function as found on SVID systems. The difference to BSD systems +- is that the handler is deinstalled after a delivery of a signal. +- +- *Compatibility Note:* As said above for `signal', this function +- should be avoided when possible. `sigaction' is the preferred +- method. +- +- - Function: sighandler_t ssignal (int SIGNUM, sighandler_t ACTION) +- The `ssignal' function does the same thing as `signal'; it is +- provided only for compatibility with SVID. +- +- - Macro: sighandler_t SIG_ERR +- The value of this macro is used as the return value from `signal' +- to indicate an error. +- +- +-File: libc.info, Node: Advanced Signal Handling, Next: Signal and Sigaction, Prev: Basic Signal Handling, Up: Signal Actions +- +-Advanced Signal Handling +------------------------- +- +- The `sigaction' function has the same basic effect as `signal': to +-specify how a signal should be handled by the process. However, +-`sigaction' offers more control, at the expense of more complexity. In +-particular, `sigaction' allows you to specify additional flags to +-control when the signal is generated and how the handler is invoked. +- +- The `sigaction' function is declared in `signal.h'. +- +- - Data Type: struct sigaction +- Structures of type `struct sigaction' are used in the `sigaction' +- function to specify all the information about how to handle a +- particular signal. This structure contains at least the following +- members: +- +- `sighandler_t sa_handler' +- This is used in the same way as the ACTION argument to the +- `signal' function. The value can be `SIG_DFL', `SIG_IGN', or +- a function pointer. *Note Basic Signal Handling::. +- +- `sigset_t sa_mask' +- This specifies a set of signals to be blocked while the +- handler runs. Blocking is explained in *Note Blocking for +- Handler::. Note that the signal that was delivered is +- automatically blocked by default before its handler is +- started; this is true regardless of the value in `sa_mask'. +- If you want that signal not to be blocked within its handler, +- you must write code in the handler to unblock it. +- +- `int sa_flags' +- This specifies various flags which can affect the behavior of +- the signal. These are described in more detail in *Note +- Flags for Sigaction::. +- +- - Function: int sigaction (int SIGNUM, const struct sigaction +- *restrict ACTION, struct sigaction *restrict OLD-ACTION) +- The ACTION argument is used to set up a new action for the signal +- SIGNUM, while the OLD-ACTION argument is used to return +- information about the action previously associated with this +- symbol. (In other words, OLD-ACTION has the same purpose as the +- `signal' function's return value--you can check to see what the +- old action in effect for the signal was, and restore it later if +- you want.) +- +- Either ACTION or OLD-ACTION can be a null pointer. If OLD-ACTION +- is a null pointer, this simply suppresses the return of +- information about the old action. If ACTION is a null pointer, +- the action associated with the signal SIGNUM is unchanged; this +- allows you to inquire about how a signal is being handled without +- changing that handling. +- +- The return value from `sigaction' is zero if it succeeds, and `-1' +- on failure. The following `errno' error conditions are defined +- for this function: +- +- `EINVAL' +- The SIGNUM argument is not valid, or you are trying to trap +- or ignore `SIGKILL' or `SIGSTOP'. +- +- +-File: libc.info, Node: Signal and Sigaction, Next: Sigaction Function Example, Prev: Advanced Signal Handling, Up: Signal Actions +- +-Interaction of `signal' and `sigaction' +---------------------------------------- +- +- It's possible to use both the `signal' and `sigaction' functions +-within a single program, but you have to be careful because they can +-interact in slightly strange ways. +- +- The `sigaction' function specifies more information than the +-`signal' function, so the return value from `signal' cannot express the +-full range of `sigaction' possibilities. Therefore, if you use +-`signal' to save and later reestablish an action, it may not be able to +-reestablish properly a handler that was established with `sigaction'. +- +- To avoid having problems as a result, always use `sigaction' to save +-and restore a handler if your program uses `sigaction' at all. Since +-`sigaction' is more general, it can properly save and reestablish any +-action, regardless of whether it was established originally with +-`signal' or `sigaction'. +- +- On some systems if you establish an action with `signal' and then +-examine it with `sigaction', the handler address that you get may not +-be the same as what you specified with `signal'. It may not even be +-suitable for use as an action argument with `signal'. But you can rely +-on using it as an argument to `sigaction'. This problem never happens +-on the GNU system. +- +- So, you're better off using one or the other of the mechanisms +-consistently within a single program. +- +- *Portability Note:* The basic `signal' function is a feature of +-ISO C, while `sigaction' is part of the POSIX.1 standard. If you are +-concerned about portability to non-POSIX systems, then you should use +-the `signal' function instead. +- +- +-File: libc.info, Node: Sigaction Function Example, Next: Flags for Sigaction, Prev: Signal and Sigaction, Up: Signal Actions +- +-`sigaction' Function Example +----------------------------- +- +- In *Note Basic Signal Handling::, we gave an example of establishing +-a simple handler for termination signals using `signal'. Here is an +-equivalent example using `sigaction': +- +- #include +- +- void +- termination_handler (int signum) +- { +- struct temp_file *p; +- +- for (p = temp_file_list; p; p = p->next) +- unlink (p->name); +- } +- +- int +- main (void) +- { +- ... +- struct sigaction new_action, old_action; +- +- /* Set up the structure to specify the new action. */ +- new_action.sa_handler = termination_handler; +- sigemptyset (&new_action.sa_mask); +- new_action.sa_flags = 0; +- +- sigaction (SIGINT, NULL, &old_action); +- if (old_action.sa_handler != SIG_IGN) +- sigaction (SIGINT, &new_action, NULL); +- sigaction (SIGHUP, NULL, &old_action); +- if (old_action.sa_handler != SIG_IGN) +- sigaction (SIGHUP, &new_action, NULL); +- sigaction (SIGTERM, NULL, &old_action); +- if (old_action.sa_handler != SIG_IGN) +- sigaction (SIGTERM, &new_action, NULL); +- ... +- } +- +- The program just loads the `new_action' structure with the desired +-parameters and passes it in the `sigaction' call. The usage of +-`sigemptyset' is described later; see *Note Blocking Signals::. +- +- As in the example using `signal', we avoid handling signals +-previously set to be ignored. Here we can avoid altering the signal +-handler even momentarily, by using the feature of `sigaction' that lets +-us examine the current action without specifying a new one. +- +- Here is another example. It retrieves information about the current +-action for `SIGINT' without changing that action. +- +- struct sigaction query_action; +- +- if (sigaction (SIGINT, NULL, &query_action) < 0) +- /* `sigaction' returns -1 in case of error. */ +- else if (query_action.sa_handler == SIG_DFL) +- /* `SIGINT' is handled in the default, fatal manner. */ +- else if (query_action.sa_handler == SIG_IGN) +- /* `SIGINT' is ignored. */ +- else +- /* A programmer-defined signal handler is in effect. */ +- +- +-File: libc.info, Node: Flags for Sigaction, Next: Initial Signal Actions, Prev: Sigaction Function Example, Up: Signal Actions +- +-Flags for `sigaction' +---------------------- +- +- The `sa_flags' member of the `sigaction' structure is a catch-all +-for special features. Most of the time, `SA_RESTART' is a good value +-to use for this field. +- +- The value of `sa_flags' is interpreted as a bit mask. Thus, you +-should choose the flags you want to set, OR those flags together, and +-store the result in the `sa_flags' member of your `sigaction' structure. +- +- Each signal number has its own set of flags. Each call to +-`sigaction' affects one particular signal number, and the flags that +-you specify apply only to that particular signal. +- +- In the GNU C library, establishing a handler with `signal' sets all +-the flags to zero except for `SA_RESTART', whose value depends on the +-settings you have made with `siginterrupt'. *Note Interrupted +-Primitives::, to see what this is about. +- +- These macros are defined in the header file `signal.h'. +- +- - Macro: int SA_NOCLDSTOP +- This flag is meaningful only for the `SIGCHLD' signal. When the +- flag is set, the system delivers the signal for a terminated child +- process but not for one that is stopped. By default, `SIGCHLD' is +- delivered for both terminated children and stopped children. +- +- Setting this flag for a signal other than `SIGCHLD' has no effect. +- +- - Macro: int SA_ONSTACK +- If this flag is set for a particular signal number, the system +- uses the signal stack when delivering that kind of signal. *Note +- Signal Stack::. If a signal with this flag arrives and you have +- not set a signal stack, the system terminates the program with +- `SIGILL'. +- +- - Macro: int SA_RESTART +- This flag controls what happens when a signal is delivered during +- certain primitives (such as `open', `read' or `write'), and the +- signal handler returns normally. There are two alternatives: the +- library function can resume, or it can return failure with error +- code `EINTR'. +- +- The choice is controlled by the `SA_RESTART' flag for the +- particular kind of signal that was delivered. If the flag is set, +- returning from a handler resumes the library function. If the +- flag is clear, returning from a handler makes the function fail. +- *Note Interrupted Primitives::. +- +- +-File: libc.info, Node: Initial Signal Actions, Prev: Flags for Sigaction, Up: Signal Actions +- +-Initial Signal Actions +----------------------- +- +- When a new process is created (*note Creating a Process::), it +-inherits handling of signals from its parent process. However, when +-you load a new process image using the `exec' function (*note Executing +-a File::), any signals that you've defined your own handlers for revert +-to their `SIG_DFL' handling. (If you think about it a little, this +-makes sense; the handler functions from the old program are specific to +-that program, and aren't even present in the address space of the new +-program image.) Of course, the new program can establish its own +-handlers. +- +- When a program is run by a shell, the shell normally sets the initial +-actions for the child process to `SIG_DFL' or `SIG_IGN', as +-appropriate. It's a good idea to check to make sure that the shell has +-not set up an initial action of `SIG_IGN' before you establish your own +-signal handlers. +- +- Here is an example of how to establish a handler for `SIGHUP', but +-not if `SIGHUP' is currently ignored: +- +- ... +- struct sigaction temp; +- +- sigaction (SIGHUP, NULL, &temp); +- +- if (temp.sa_handler != SIG_IGN) +- { +- temp.sa_handler = handle_sighup; +- sigemptyset (&temp.sa_mask); +- sigaction (SIGHUP, &temp, NULL); +- } +- +- +-File: libc.info, Node: Defining Handlers, Next: Interrupted Primitives, Prev: Signal Actions, Up: Signal Handling +- +-Defining Signal Handlers +-======================== +- +- This section describes how to write a signal handler function that +-can be established with the `signal' or `sigaction' functions. +- +- A signal handler is just a function that you compile together with +-the rest of the program. Instead of directly invoking the function, +-you use `signal' or `sigaction' to tell the operating system to call it +-when a signal arrives. This is known as "establishing" the handler. +-*Note Signal Actions::. +- +- There are two basic strategies you can use in signal handler +-functions: +- +- * You can have the handler function note that the signal arrived by +- tweaking some global data structures, and then return normally. +- +- * You can have the handler function terminate the program or transfer +- control to a point where it can recover from the situation that +- caused the signal. +- +- You need to take special care in writing handler functions because +-they can be called asynchronously. That is, a handler might be called +-at any point in the program, unpredictably. If two signals arrive +-during a very short interval, one handler can run within another. This +-section describes what your handler should do, and what you should +-avoid. +- +-* Menu: +- +-* Handler Returns:: Handlers that return normally, and what +- this means. +-* Termination in Handler:: How handler functions terminate a program. +-* Longjmp in Handler:: Nonlocal transfer of control out of a +- signal handler. +-* Signals in Handler:: What happens when signals arrive while +- the handler is already occupied. +-* Merged Signals:: When a second signal arrives before the +- first is handled. +-* Nonreentrancy:: Do not call any functions unless you know they +- are reentrant with respect to signals. +-* Atomic Data Access:: A single handler can run in the middle of +- reading or writing a single object. +- +- +-File: libc.info, Node: Handler Returns, Next: Termination in Handler, Up: Defining Handlers +- +-Signal Handlers that Return +---------------------------- +- +- Handlers which return normally are usually used for signals such as +-`SIGALRM' and the I/O and interprocess communication signals. But a +-handler for `SIGINT' might also return normally after setting a flag +-that tells the program to exit at a convenient time. +- +- It is not safe to return normally from the handler for a program +-error signal, because the behavior of the program when the handler +-function returns is not defined after a program error. *Note Program +-Error Signals::. +- +- Handlers that return normally must modify some global variable in +-order to have any effect. Typically, the variable is one that is +-examined periodically by the program during normal operation. Its data +-type should be `sig_atomic_t' for reasons described in *Note Atomic +-Data Access::. +- +- Here is a simple example of such a program. It executes the body of +-the loop until it has noticed that a `SIGALRM' signal has arrived. +-This technique is useful because it allows the iteration in progress +-when the signal arrives to complete before the loop exits. +- +- #include +- #include +- #include +- +- /* This flag controls termination of the main loop. */ +- volatile sig_atomic_t keep_going = 1; +- +- /* The signal handler just clears the flag and re-enables itself. */ +- void +- catch_alarm (int sig) +- { +- keep_going = 0; +- signal (sig, catch_alarm); +- } +- +- void +- do_stuff (void) +- { +- puts ("Doing stuff while waiting for alarm...."); +- } +- +- int +- main (void) +- { +- /* Establish a handler for SIGALRM signals. */ +- signal (SIGALRM, catch_alarm); +- +- /* Set an alarm to go off in a little while. */ +- alarm (2); +- +- /* Check the flag once in a while to see when to quit. */ +- while (keep_going) +- do_stuff (); +- +- return EXIT_SUCCESS; +- } +- +- +-File: libc.info, Node: Termination in Handler, Next: Longjmp in Handler, Prev: Handler Returns, Up: Defining Handlers +- +-Handlers That Terminate the Process +------------------------------------ +- +- Handler functions that terminate the program are typically used to +-cause orderly cleanup or recovery from program error signals and +-interactive interrupts. +- +- The cleanest way for a handler to terminate the process is to raise +-the same signal that ran the handler in the first place. Here is how +-to do this: +- +- volatile sig_atomic_t fatal_error_in_progress = 0; +- +- void +- fatal_error_signal (int sig) +- { +- /* Since this handler is established for more than one kind of signal, +- it might still get invoked recursively by delivery of some other kind +- of signal. Use a static variable to keep track of that. */ +- if (fatal_error_in_progress) +- raise (sig); +- fatal_error_in_progress = 1; +- +- /* Now do the clean up actions: +- - reset terminal modes +- - kill child processes +- - remove lock files */ +- ... +- +- /* Now reraise the signal. We reactivate the signal's +- default handling, which is to terminate the process. +- We could just call `exit' or `abort', +- but reraising the signal sets the return status +- from the process correctly. */ +- signal (sig, SIG_DFL); +- raise (sig); +- } +- +- +-File: libc.info, Node: Longjmp in Handler, Next: Signals in Handler, Prev: Termination in Handler, Up: Defining Handlers +- +-Nonlocal Control Transfer in Handlers +-------------------------------------- +- +- You can do a nonlocal transfer of control out of a signal handler +-using the `setjmp' and `longjmp' facilities (*note Non-Local Exits::). +- +- When the handler does a nonlocal control transfer, the part of the +-program that was running will not continue. If this part of the program +-was in the middle of updating an important data structure, the data +-structure will remain inconsistent. Since the program does not +-terminate, the inconsistency is likely to be noticed later on. +- +- There are two ways to avoid this problem. One is to block the signal +-for the parts of the program that update important data structures. +-Blocking the signal delays its delivery until it is unblocked, once the +-critical updating is finished. *Note Blocking Signals::. +- +- The other way to re-initialize the crucial data structures in the +-signal handler, or make their values consistent. +- +- Here is a rather schematic example showing the reinitialization of +-one global variable. +- +- #include +- #include +- +- jmp_buf return_to_top_level; +- +- volatile sig_atomic_t waiting_for_input; +- +- void +- handle_sigint (int signum) +- { +- /* We may have been waiting for input when the signal arrived, +- but we are no longer waiting once we transfer control. */ +- waiting_for_input = 0; +- longjmp (return_to_top_level, 1); +- } +- +- int +- main (void) +- { +- ... +- signal (SIGINT, sigint_handler); +- ... +- while (1) { +- prepare_for_command (); +- if (setjmp (return_to_top_level) == 0) +- read_and_execute_command (); +- } +- } +- +- /* Imagine this is a subroutine used by various commands. */ +- char * +- read_data () +- { +- if (input_from_terminal) { +- waiting_for_input = 1; +- ... +- waiting_for_input = 0; +- } else { +- ... +- } +- } +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-4 glibc-2.3.2-200304020432/manual/libc.info-4 +--- glibc-2.3.2/manual/libc.info-4 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-4 Thu Jan 1 01:00:00 1970 +@@ -1,1208 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Freeing after Malloc, Next: Changing Block Size, Prev: Malloc Examples, Up: Unconstrained Allocation +- +-Freeing Memory Allocated with `malloc' +-...................................... +- +- When you no longer need a block that you got with `malloc', use the +-function `free' to make the block available to be allocated again. The +-prototype for this function is in `stdlib.h'. +- +- - Function: void free (void *PTR) +- The `free' function deallocates the block of memory pointed at by +- PTR. +- +- - Function: void cfree (void *PTR) +- This function does the same thing as `free'. It's provided for +- backward compatibility with SunOS; you should use `free' instead. +- +- Freeing a block alters the contents of the block. *Do not expect to +-find any data (such as a pointer to the next block in a chain of +-blocks) in the block after freeing it.* Copy whatever you need out of +-the block before freeing it! Here is an example of the proper way to +-free all the blocks in a chain, and the strings that they point to: +- +- struct chain +- { +- struct chain *next; +- char *name; +- } +- +- void +- free_chain (struct chain *chain) +- { +- while (chain != 0) +- { +- struct chain *next = chain->next; +- free (chain->name); +- free (chain); +- chain = next; +- } +- } +- +- Occasionally, `free' can actually return memory to the operating +-system and make the process smaller. Usually, all it can do is allow a +-later call to `malloc' to reuse the space. In the meantime, the space +-remains in your program as part of a free-list used internally by +-`malloc'. +- +- There is no point in freeing blocks at the end of a program, because +-all of the program's space is given back to the system when the process +-terminates. +- +- +-File: libc.info, Node: Changing Block Size, Next: Allocating Cleared Space, Prev: Freeing after Malloc, Up: Unconstrained Allocation +- +-Changing the Size of a Block +-............................ +- +- Often you do not know for certain how big a block you will +-ultimately need at the time you must begin to use the block. For +-example, the block might be a buffer that you use to hold a line being +-read from a file; no matter how long you make the buffer initially, you +-may encounter a line that is longer. +- +- You can make the block longer by calling `realloc'. This function +-is declared in `stdlib.h'. +- +- - Function: void * realloc (void *PTR, size_t NEWSIZE) +- The `realloc' function changes the size of the block whose address +- is PTR to be NEWSIZE. +- +- Since the space after the end of the block may be in use, `realloc' +- may find it necessary to copy the block to a new address where +- more free space is available. The value of `realloc' is the new +- address of the block. If the block needs to be moved, `realloc' +- copies the old contents. +- +- If you pass a null pointer for PTR, `realloc' behaves just like +- `malloc (NEWSIZE)'. This can be convenient, but beware that older +- implementations (before ISO C) may not support this behavior, and +- will probably crash when `realloc' is passed a null pointer. +- +- Like `malloc', `realloc' may return a null pointer if no memory +-space is available to make the block bigger. When this happens, the +-original block is untouched; it has not been modified or relocated. +- +- In most cases it makes no difference what happens to the original +-block when `realloc' fails, because the application program cannot +-continue when it is out of memory, and the only thing to do is to give +-a fatal error message. Often it is convenient to write and use a +-subroutine, conventionally called `xrealloc', that takes care of the +-error message as `xmalloc' does for `malloc': +- +- void * +- xrealloc (void *ptr, size_t size) +- { +- register void *value = realloc (ptr, size); +- if (value == 0) +- fatal ("Virtual memory exhausted"); +- return value; +- } +- +- You can also use `realloc' to make a block smaller. The reason you +-would do this is to avoid tying up a lot of memory space when only a +-little is needed. In several allocation implementations, making a +-block smaller sometimes necessitates copying it, so it can fail if no +-other space is available. +- +- If the new size you specify is the same as the old size, `realloc' +-is guaranteed to change nothing and return the same address that you +-gave. +- +- +-File: libc.info, Node: Allocating Cleared Space, Next: Efficiency and Malloc, Prev: Changing Block Size, Up: Unconstrained Allocation +- +-Allocating Cleared Space +-........................ +- +- The function `calloc' allocates memory and clears it to zero. It is +-declared in `stdlib.h'. +- +- - Function: void * calloc (size_t COUNT, size_t ELTSIZE) +- This function allocates a block long enough to contain a vector of +- COUNT elements, each of size ELTSIZE. Its contents are cleared to +- zero before `calloc' returns. +- +- You could define `calloc' as follows: +- +- void * +- calloc (size_t count, size_t eltsize) +- { +- size_t size = count * eltsize; +- void *value = malloc (size); +- if (value != 0) +- memset (value, 0, size); +- return value; +- } +- +- But in general, it is not guaranteed that `calloc' calls `malloc' +-internally. Therefore, if an application provides its own +-`malloc'/`realloc'/`free' outside the C library, it should always +-define `calloc', too. +- +- +-File: libc.info, Node: Efficiency and Malloc, Next: Aligned Memory Blocks, Prev: Allocating Cleared Space, Up: Unconstrained Allocation +- +-Efficiency Considerations for `malloc' +-...................................... +- +- As opposed to other versions, the `malloc' in the GNU C Library does +-not round up block sizes to powers of two, neither for large nor for +-small sizes. Neighboring chunks can be coalesced on a `free' no matter +-what their size is. This makes the implementation suitable for all +-kinds of allocation patterns without generally incurring high memory +-waste through fragmentation. +- +- Very large blocks (much larger than a page) are allocated with +-`mmap' (anonymous or via `/dev/zero') by this implementation. This has +-the great advantage that these chunks are returned to the system +-immediately when they are freed. Therefore, it cannot happen that a +-large chunk becomes "locked" in between smaller ones and even after +-calling `free' wastes memory. The size threshold for `mmap' to be used +-can be adjusted with `mallopt'. The use of `mmap' can also be disabled +-completely. +- +- +-File: libc.info, Node: Aligned Memory Blocks, Next: Malloc Tunable Parameters, Prev: Efficiency and Malloc, Up: Unconstrained Allocation +- +-Allocating Aligned Memory Blocks +-................................ +- +- The address of a block returned by `malloc' or `realloc' in the GNU +-system is always a multiple of eight (or sixteen on 64-bit systems). +-If you need a block whose address is a multiple of a higher power of +-two than that, use `memalign', `posix_memalign', or `valloc'. +-`memalign' is declared in `malloc.h' and `posix_memalign' is declared +-in `stdlib.h'. +- +- With the GNU library, you can use `free' to free the blocks that +-`memalign', `posix_memalign', and `valloc' return. That does not work +-in BSD, however--BSD does not provide any way to free such blocks. +- +- - Function: void * memalign (size_t BOUNDARY, size_t SIZE) +- The `memalign' function allocates a block of SIZE bytes whose +- address is a multiple of BOUNDARY. The BOUNDARY must be a power +- of two! The function `memalign' works by allocating a somewhat +- larger block, and then returning an address within the block that +- is on the specified boundary. +- +- - Function: int posix_memalign (void **MEMPTR, size_t ALIGNMENT, +- size_t SIZE) +- The `posix_memalign' function is similar to the `memalign' +- function in that it returns a buffer of SIZE bytes aligned to a +- multiple of ALIGNMENT. But it adds one requirement to the +- parameter ALIGNMENT: the value must be a power of two multiple of +- `sizeof (void *)'. +- +- If the function succeeds in allocation memory a pointer to the +- allocated memory is returned in `*MEMPTR' and the return value is +- zero. Otherwise the function returns an error value indicating +- the problem. +- +- This function was introduced in POSIX 1003.1d. +- +- - Function: void * valloc (size_t SIZE) +- Using `valloc' is like using `memalign' and passing the page size +- as the value of the second argument. It is implemented like this: +- +- void * +- valloc (size_t size) +- { +- return memalign (getpagesize (), size); +- } +- +- *Note Query Memory Parameters:: for more information about the +- memory subsystem. +- +- +-File: libc.info, Node: Malloc Tunable Parameters, Next: Heap Consistency Checking, Prev: Aligned Memory Blocks, Up: Unconstrained Allocation +- +-Malloc Tunable Parameters +-......................... +- +- You can adjust some parameters for dynamic memory allocation with the +-`mallopt' function. This function is the general SVID/XPG interface, +-defined in `malloc.h'. +- +- - Function: int mallopt (int PARAM, int VALUE) +- When calling `mallopt', the PARAM argument specifies the parameter +- to be set, and VALUE the new value to be set. Possible choices +- for PARAM, as defined in `malloc.h', are: +- +- `M_TRIM_THRESHOLD' +- This is the minimum size (in bytes) of the top-most, +- releasable chunk that will cause `sbrk' to be called with a +- negative argument in order to return memory to the system. +- +- `M_TOP_PAD' +- This parameter determines the amount of extra memory to +- obtain from the system when a call to `sbrk' is required. It +- also specifies the number of bytes to retain when shrinking +- the heap by calling `sbrk' with a negative argument. This +- provides the necessary hysteresis in heap size such that +- excessive amounts of system calls can be avoided. +- +- `M_MMAP_THRESHOLD' +- All chunks larger than this value are allocated outside the +- normal heap, using the `mmap' system call. This way it is +- guaranteed that the memory for these chunks can be returned +- to the system on `free'. Note that requests smaller than +- this threshold might still be allocated via `mmap'. +- +- `M_MMAP_MAX' +- The maximum number of chunks to allocate with `mmap'. +- Setting this to zero disables all use of `mmap'. +- +- +- +-File: libc.info, Node: Heap Consistency Checking, Next: Hooks for Malloc, Prev: Malloc Tunable Parameters, Up: Unconstrained Allocation +- +-Heap Consistency Checking +-......................... +- +- You can ask `malloc' to check the consistency of dynamic memory by +-using the `mcheck' function. This function is a GNU extension, +-declared in `mcheck.h'. +- +- - Function: int mcheck (void (*ABORTFN) (enum mcheck_status STATUS)) +- Calling `mcheck' tells `malloc' to perform occasional consistency +- checks. These will catch things such as writing past the end of a +- block that was allocated with `malloc'. +- +- The ABORTFN argument is the function to call when an inconsistency +- is found. If you supply a null pointer, then `mcheck' uses a +- default function which prints a message and calls `abort' (*note +- Aborting a Program::). The function you supply is called with one +- argument, which says what sort of inconsistency was detected; its +- type is described below. +- +- It is too late to begin allocation checking once you have allocated +- anything with `malloc'. So `mcheck' does nothing in that case. +- The function returns `-1' if you call it too late, and `0' +- otherwise (when it is successful). +- +- The easiest way to arrange to call `mcheck' early enough is to use +- the option `-lmcheck' when you link your program; then you don't +- need to modify your program source at all. Alternatively you +- might use a debugger to insert a call to `mcheck' whenever the +- program is started, for example these gdb commands will +- automatically call `mcheck' whenever the program starts: +- +- (gdb) break main +- Breakpoint 1, main (argc=2, argv=0xbffff964) at whatever.c:10 +- (gdb) command 1 +- Type commands for when breakpoint 1 is hit, one per line. +- End with a line saying just "end". +- >call mcheck(0) +- >continue +- >end +- (gdb) ... +- +- This will however only work if no initialization function of any +- object involved calls any of the `malloc' functions since `mcheck' +- must be called before the first such function. +- +- +- - Function: enum mcheck_status mprobe (void *POINTER) +- The `mprobe' function lets you explicitly check for inconsistencies +- in a particular allocated block. You must have already called +- `mcheck' at the beginning of the program, to do its occasional +- checks; calling `mprobe' requests an additional consistency check +- to be done at the time of the call. +- +- The argument POINTER must be a pointer returned by `malloc' or +- `realloc'. `mprobe' returns a value that says what inconsistency, +- if any, was found. The values are described below. +- +- - Data Type: enum mcheck_status +- This enumerated type describes what kind of inconsistency was +- detected in an allocated block, if any. Here are the possible +- values: +- +- `MCHECK_DISABLED' +- `mcheck' was not called before the first allocation. No +- consistency checking can be done. +- +- `MCHECK_OK' +- No inconsistency detected. +- +- `MCHECK_HEAD' +- The data immediately before the block was modified. This +- commonly happens when an array index or pointer is +- decremented too far. +- +- `MCHECK_TAIL' +- The data immediately after the block was modified. This +- commonly happens when an array index or pointer is +- incremented too far. +- +- `MCHECK_FREE' +- The block was already freed. +- +- Another possibility to check for and guard against bugs in the use of +-`malloc', `realloc' and `free' is to set the environment variable +-`MALLOC_CHECK_'. When `MALLOC_CHECK_' is set, a special (less +-efficient) implementation is used which is designed to be tolerant +-against simple errors, such as double calls of `free' with the same +-argument, or overruns of a single byte (off-by-one bugs). Not all such +-errors can be protected against, however, and memory leaks can result. +-If `MALLOC_CHECK_' is set to `0', any detected heap corruption is +-silently ignored; if set to `1', a diagnostic is printed on `stderr'; +-if set to `2', `abort' is called immediately. This can be useful +-because otherwise a crash may happen much later, and the true cause for +-the problem is then very hard to track down. +- +- There is one problem with `MALLOC_CHECK_': in SUID or SGID binaries +-it could possibly be exploited since diverging from the normal programs +-behavior it now writes something to the standard error descriptor. +-Therefore the use of `MALLOC_CHECK_' is disabled by default for SUID +-and SGID binaries. It can be enabled again by the system administrator +-by adding a file `/etc/suid-debug' (the content is not important it +-could be empty). +- +- So, what's the difference between using `MALLOC_CHECK_' and linking +-with `-lmcheck'? `MALLOC_CHECK_' is orthogonal with respect to +-`-lmcheck'. `-lmcheck' has been added for backward compatibility. +-Both `MALLOC_CHECK_' and `-lmcheck' should uncover the same bugs - but +-using `MALLOC_CHECK_' you don't need to recompile your application. +- +- +-File: libc.info, Node: Hooks for Malloc, Next: Statistics of Malloc, Prev: Heap Consistency Checking, Up: Unconstrained Allocation +- +-Memory Allocation Hooks +-....................... +- +- The GNU C library lets you modify the behavior of `malloc', +-`realloc', and `free' by specifying appropriate hook functions. You +-can use these hooks to help you debug programs that use dynamic memory +-allocation, for example. +- +- The hook variables are declared in `malloc.h'. +- +- - Variable: __malloc_hook +- The value of this variable is a pointer to the function that +- `malloc' uses whenever it is called. You should define this +- function to look like `malloc'; that is, like: +- +- void *FUNCTION (size_t SIZE, const void *CALLER) +- +- The value of CALLER is the return address found on the stack when +- the `malloc' function was called. This value allows you to trace +- the memory consumption of the program. +- +- - Variable: __realloc_hook +- The value of this variable is a pointer to function that `realloc' +- uses whenever it is called. You should define this function to +- look like `realloc'; that is, like: +- +- void *FUNCTION (void *PTR, size_t SIZE, const void *CALLER) +- +- The value of CALLER is the return address found on the stack when +- the `realloc' function was called. This value allows you to trace +- the memory consumption of the program. +- +- - Variable: __free_hook +- The value of this variable is a pointer to function that `free' +- uses whenever it is called. You should define this function to +- look like `free'; that is, like: +- +- void FUNCTION (void *PTR, const void *CALLER) +- +- The value of CALLER is the return address found on the stack when +- the `free' function was called. This value allows you to trace the +- memory consumption of the program. +- +- - Variable: __memalign_hook +- The value of this variable is a pointer to function that `memalign' +- uses whenever it is called. You should define this function to +- look like `memalign'; that is, like: +- +- void *FUNCTION (size_t ALIGNMENT, size_t SIZE, const void *CALLER) +- +- The value of CALLER is the return address found on the stack when +- the `memalign' function was called. This value allows you to +- trace the memory consumption of the program. +- +- You must make sure that the function you install as a hook for one of +-these functions does not call that function recursively without +-restoring the old value of the hook first! Otherwise, your program +-will get stuck in an infinite recursion. Before calling the function +-recursively, one should make sure to restore all the hooks to their +-previous value. When coming back from the recursive call, all the +-hooks should be resaved since a hook might modify itself. +- +- - Variable: __malloc_initialize_hook +- The value of this variable is a pointer to a function that is +- called once when the malloc implementation is initialized. This +- is a weak variable, so it can be overridden in the application +- with a definition like the following: +- +- void (*__MALLOC_INITIALIZE_HOOK) (void) = my_init_hook; +- +- An issue to look out for is the time at which the malloc hook +-functions can be safely installed. If the hook functions call the +-malloc-related functions recursively, it is necessary that malloc has +-already properly initialized itself at the time when `__malloc_hook' +-etc. is assigned to. On the other hand, if the hook functions provide a +-complete malloc implementation of their own, it is vital that the hooks +-are assigned to _before_ the very first `malloc' call has completed, +-because otherwise a chunk obtained from the ordinary, un-hooked malloc +-may later be handed to `__free_hook', for example. +- +- In both cases, the problem can be solved by setting up the hooks from +-within a user-defined function pointed to by +-`__malloc_initialize_hook'--then the hooks will be set up safely at the +-right time. +- +- Here is an example showing how to use `__malloc_hook' and +-`__free_hook' properly. It installs a function that prints out +-information every time `malloc' or `free' is called. We just assume +-here that `realloc' and `memalign' are not used in our program. +- +- /* Prototypes for __malloc_hook, __free_hook */ +- #include +- +- /* Prototypes for our hooks. */ +- static void *my_init_hook (void); +- static void *my_malloc_hook (size_t, const void *); +- static void my_free_hook (void*, const void *); +- +- /* Override initializing hook from the C library. */ +- void (*__malloc_initialize_hook) (void) = my_init_hook; +- +- static void +- my_init_hook (void) +- { +- old_malloc_hook = __malloc_hook; +- old_free_hook = __free_hook; +- __malloc_hook = my_malloc_hook; +- __free_hook = my_free_hook; +- } +- +- static void * +- my_malloc_hook (size_t size, const void *caller) +- { +- void *result; +- /* Restore all old hooks */ +- __malloc_hook = old_malloc_hook; +- __free_hook = old_free_hook; +- /* Call recursively */ +- result = malloc (size); +- /* Save underlying hooks */ +- old_malloc_hook = __malloc_hook; +- old_free_hook = __free_hook; +- /* `printf' might call `malloc', so protect it too. */ +- printf ("malloc (%u) returns %p\n", (unsigned int) size, result); +- /* Restore our own hooks */ +- __malloc_hook = my_malloc_hook; +- __free_hook = my_free_hook; +- return result; +- } +- +- static void * +- my_free_hook (void *ptr, const void *caller) +- { +- /* Restore all old hooks */ +- __malloc_hook = old_malloc_hook; +- __free_hook = old_free_hook; +- /* Call recursively */ +- free (ptr); +- /* Save underlying hooks */ +- old_malloc_hook = __malloc_hook; +- old_free_hook = __free_hook; +- /* `printf' might call `free', so protect it too. */ +- printf ("freed pointer %p\n", ptr); +- /* Restore our own hooks */ +- __malloc_hook = my_malloc_hook; +- __free_hook = my_free_hook; +- } +- +- main () +- { +- ... +- } +- +- The `mcheck' function (*note Heap Consistency Checking::) works by +-installing such hooks. +- +- +-File: libc.info, Node: Statistics of Malloc, Next: Summary of Malloc, Prev: Hooks for Malloc, Up: Unconstrained Allocation +- +-Statistics for Memory Allocation with `malloc' +-.............................................. +- +- You can get information about dynamic memory allocation by calling +-the `mallinfo' function. This function and its associated data type +-are declared in `malloc.h'; they are an extension of the standard +-SVID/XPG version. +- +- - Data Type: struct mallinfo +- This structure type is used to return information about the dynamic +- memory allocator. It contains the following members: +- +- `int arena' +- This is the total size of memory allocated with `sbrk' by +- `malloc', in bytes. +- +- `int ordblks' +- This is the number of chunks not in use. (The memory +- allocator internally gets chunks of memory from the operating +- system, and then carves them up to satisfy individual +- `malloc' requests; see *Note Efficiency and Malloc::.) +- +- `int smblks' +- This field is unused. +- +- `int hblks' +- This is the total number of chunks allocated with `mmap'. +- +- `int hblkhd' +- This is the total size of memory allocated with `mmap', in +- bytes. +- +- `int usmblks' +- This field is unused. +- +- `int fsmblks' +- This field is unused. +- +- `int uordblks' +- This is the total size of memory occupied by chunks handed +- out by `malloc'. +- +- `int fordblks' +- This is the total size of memory occupied by free (not in +- use) chunks. +- +- `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 space's data segment). +- +- +- - Function: struct mallinfo mallinfo (void) +- This function returns information about the current dynamic memory +- usage in a structure of type `struct mallinfo'. +- +- +-File: libc.info, Node: Summary of Malloc, Prev: Statistics of Malloc, Up: Unconstrained Allocation +- +-Summary of `malloc'-Related Functions +-..................................... +- +- Here is a summary of the functions that work with `malloc': +- +-`void *malloc (size_t SIZE)' +- Allocate a block of SIZE bytes. *Note Basic Allocation::. +- +-`void free (void *ADDR)' +- Free a block previously allocated by `malloc'. *Note Freeing +- after Malloc::. +- +-`void *realloc (void *ADDR, size_t SIZE)' +- Make a block previously allocated by `malloc' larger or smaller, +- possibly by copying it to a new location. *Note Changing Block +- Size::. +- +-`void *calloc (size_t COUNT, size_t ELTSIZE)' +- Allocate a block of COUNT * ELTSIZE bytes using `malloc', and set +- its contents to zero. *Note Allocating Cleared Space::. +- +-`void *valloc (size_t SIZE)' +- Allocate a block of SIZE bytes, starting on a page boundary. +- *Note Aligned Memory Blocks::. +- +-`void *memalign (size_t SIZE, size_t BOUNDARY)' +- Allocate a block of SIZE bytes, starting on an address that is a +- multiple of BOUNDARY. *Note Aligned Memory Blocks::. +- +-`int mallopt (int PARAM, int VALUE)' +- Adjust a tunable parameter. *Note Malloc Tunable Parameters::. +- +-`int mcheck (void (*ABORTFN) (void))' +- Tell `malloc' to perform occasional consistency checks on +- dynamically allocated memory, and to call ABORTFN when an +- inconsistency is found. *Note Heap Consistency Checking::. +- +-`void *(*__malloc_hook) (size_t SIZE, const void *CALLER)' +- A pointer to a function that `malloc' uses whenever it is called. +- +-`void *(*__realloc_hook) (void *PTR, size_t SIZE, const void *CALLER)' +- A pointer to a function that `realloc' uses whenever it is called. +- +-`void (*__free_hook) (void *PTR, const void *CALLER)' +- A pointer to a function that `free' uses whenever it is called. +- +-`void (*__memalign_hook) (size_t SIZE, size_t ALIGNMENT, const void *CALLER)' +- A pointer to a function that `memalign' uses whenever it is called. +- +-`struct mallinfo mallinfo (void)' +- Return information about the current dynamic memory usage. *Note +- Statistics of Malloc::. +- +- +-File: libc.info, Node: Allocation Debugging, Next: Obstacks, Prev: Unconstrained Allocation, Up: Memory Allocation +- +-Allocation Debugging +--------------------- +- +- A complicated task when programming with languages which do not use +-garbage collected dynamic memory allocation is to find memory leaks. +-Long running programs must assure that dynamically allocated objects are +-freed at the end of their lifetime. If this does not happen the system +-runs out of memory, sooner or later. +- +- The `malloc' implementation in the GNU C library provides some +-simple means to detect such leaks and obtain some information to find +-the location. To do this the application must be started in a special +-mode which is enabled by an environment variable. There are no speed +-penalties for the program if the debugging mode is not enabled. +- +-* Menu: +- +-* Tracing malloc:: How to install the tracing functionality. +-* Using the Memory Debugger:: Example programs excerpts. +-* Tips for the Memory Debugger:: Some more or less clever ideas. +-* Interpreting the traces:: What do all these lines mean? +- +- +-File: libc.info, Node: Tracing malloc, Next: Using the Memory Debugger, Up: Allocation Debugging +- +-How to install the tracing functionality +-........................................ +- +- - Function: void mtrace (void) +- When the `mtrace' function is called it looks for an environment +- variable named `MALLOC_TRACE'. This variable is supposed to +- contain a valid file name. The user must have write access. If +- the file already exists it is truncated. If the environment +- variable is not set or it does not name a valid file which can be +- opened for writing nothing is done. The behavior of `malloc' etc. +- is not changed. For obvious reasons this also happens if the +- application is installed with the SUID or SGID bit set. +- +- If the named file is successfully opened, `mtrace' installs special +- handlers for the functions `malloc', `realloc', and `free' (*note +- Hooks for Malloc::). From then on, all uses of these functions +- are traced and protocolled into the file. There is now of course +- a speed penalty for all calls to the traced functions so tracing +- should not be enabled during normal use. +- +- This function is a GNU extension and generally not available on +- other systems. The prototype can be found in `mcheck.h'. +- +- - Function: void muntrace (void) +- The `muntrace' function can be called after `mtrace' was used to +- enable tracing the `malloc' calls. If no (successful) call of +- `mtrace' was made `muntrace' does nothing. +- +- Otherwise it deinstalls the handlers for `malloc', `realloc', and +- `free' and then closes the protocol file. No calls are +- protocolled anymore and the program runs again at full speed. +- +- This function is a GNU extension and generally not available on +- other systems. The prototype can be found in `mcheck.h'. +- +- +-File: libc.info, Node: Using the Memory Debugger, Next: Tips for the Memory Debugger, Prev: Tracing malloc, Up: Allocation Debugging +- +-Example program excerpts +-........................ +- +- Even though the tracing functionality does not influence the runtime +-behavior of the program it is not a good idea to call `mtrace' in all +-programs. Just imagine that you debug a program using `mtrace' and all +-other programs used in the debugging session also trace their `malloc' +-calls. The output file would be the same for all programs and thus is +-unusable. Therefore one should call `mtrace' only if compiled for +-debugging. A program could therefore start like this: +- +- #include +- +- int +- main (int argc, char *argv[]) +- { +- #ifdef DEBUGGING +- mtrace (); +- #endif +- ... +- } +- +- This is all what is needed if you want to trace the calls during the +-whole runtime of the program. Alternatively you can stop the tracing at +-any time with a call to `muntrace'. It is even possible to restart the +-tracing again with a new call to `mtrace'. But this can cause +-unreliable results since there may be calls of the functions which are +-not called. Please note that not only the application uses the traced +-functions, also libraries (including the C library itself) use these +-functions. +- +- This last point is also why it is no good idea to call `muntrace' +-before the program terminated. The libraries are informed about the +-termination of the program only after the program returns from `main' +-or calls `exit' and so cannot free the memory they use before this time. +- +- So the best thing one can do is to call `mtrace' as the very first +-function in the program and never call `muntrace'. So the program +-traces almost all uses of the `malloc' functions (except those calls +-which are executed by constructors of the program or used libraries). +- +- +-File: libc.info, Node: Tips for the Memory Debugger, Next: Interpreting the traces, Prev: Using the Memory Debugger, Up: Allocation Debugging +- +-Some more or less clever ideas +-.............................. +- +- You know the situation. The program is prepared for debugging and in +-all debugging sessions it runs well. But once it is started without +-debugging the error shows up. A typical example is a memory leak that +-becomes visible only when we turn off the debugging. If you foresee +-such situations you can still win. Simply use something equivalent to +-the following little program: +- +- #include +- #include +- +- static void +- enable (int sig) +- { +- mtrace (); +- signal (SIGUSR1, enable); +- } +- +- static void +- disable (int sig) +- { +- muntrace (); +- signal (SIGUSR2, disable); +- } +- +- int +- main (int argc, char *argv[]) +- { +- ... +- +- signal (SIGUSR1, enable); +- signal (SIGUSR2, disable); +- +- ... +- } +- +- I.e., the user can start the memory debugger any time s/he wants if +-the program was started with `MALLOC_TRACE' set in the environment. +-The output will of course not show the allocations which happened before +-the first signal but if there is a memory leak this will show up +-nevertheless. +- +- +-File: libc.info, Node: Interpreting the traces, Prev: Tips for the Memory Debugger, Up: Allocation Debugging +- +-Interpreting the traces +-....................... +- +- If you take a look at the output it will look similar to this: +- +- = Start +- [0x8048209] - 0x8064cc8 +- [0x8048209] - 0x8064ce0 +- [0x8048209] - 0x8064cf8 +- [0x80481eb] + 0x8064c48 0x14 +- [0x80481eb] + 0x8064c60 0x14 +- [0x80481eb] + 0x8064c78 0x14 +- [0x80481eb] + 0x8064c90 0x14 +- = End +- +- What this all means is not really important since the trace file is +-not meant to be read by a human. Therefore no attention is given to +-readability. Instead there is a program which comes with the GNU C +-library which interprets the traces and outputs a summary in an +-user-friendly way. The program is called `mtrace' (it is in fact a +-Perl script) and it takes one or two arguments. In any case the name of +-the file with the trace output must be specified. If an optional +-argument precedes the name of the trace file this must be the name of +-the program which generated the trace. +- +- drepper$ mtrace tst-mtrace log +- No memory leaks. +- +- In this case the program `tst-mtrace' was run and it produced a +-trace file `log'. The message printed by `mtrace' shows there are no +-problems with the code, all allocated memory was freed afterwards. +- +- If we call `mtrace' on the example trace given above we would get a +-different outout: +- +- drepper$ mtrace errlog +- - 0x08064cc8 Free 2 was never alloc'd 0x8048209 +- - 0x08064ce0 Free 3 was never alloc'd 0x8048209 +- - 0x08064cf8 Free 4 was never alloc'd 0x8048209 +- +- Memory not freed: +- ----------------- +- Address Size Caller +- 0x08064c48 0x14 at 0x80481eb +- 0x08064c60 0x14 at 0x80481eb +- 0x08064c78 0x14 at 0x80481eb +- 0x08064c90 0x14 at 0x80481eb +- +- We have called `mtrace' with only one argument and so the script has +-no chance to find out what is meant with the addresses given in the +-trace. We can do better: +- +- drepper$ mtrace tst errlog +- - 0x08064cc8 Free 2 was never alloc'd /home/drepper/tst.c:39 +- - 0x08064ce0 Free 3 was never alloc'd /home/drepper/tst.c:39 +- - 0x08064cf8 Free 4 was never alloc'd /home/drepper/tst.c:39 +- +- Memory not freed: +- ----------------- +- Address Size Caller +- 0x08064c48 0x14 at /home/drepper/tst.c:33 +- 0x08064c60 0x14 at /home/drepper/tst.c:33 +- 0x08064c78 0x14 at /home/drepper/tst.c:33 +- 0x08064c90 0x14 at /home/drepper/tst.c:33 +- +- Suddenly the output makes much more sense and the user can see +-immediately where the function calls causing the trouble can be found. +- +- Interpreting this output is not complicated. There are at most two +-different situations being detected. First, `free' was called for +-pointers which were never returned by one of the allocation functions. +-This is usually a very bad problem and what this looks like is shown in +-the first three lines of the output. Situations like this are quite +-rare and if they appear they show up very drastically: the program +-normally crashes. +- +- The other situation which is much harder to detect are memory leaks. +-As you can see in the output the `mtrace' function collects all this +-information and so can say that the program calls an allocation function +-from line 33 in the source file `/home/drepper/tst-mtrace.c' four times +-without freeing this memory before the program terminates. Whether +-this is a real problem remains to be investigated. +- +- +-File: libc.info, Node: Obstacks, Next: Variable Size Automatic, Prev: Allocation Debugging, Up: Memory Allocation +- +-Obstacks +--------- +- +- An "obstack" is a pool of memory containing a stack of objects. You +-can create any number of separate obstacks, and then allocate objects in +-specified obstacks. Within each obstack, the last object allocated must +-always be the first one freed, but distinct obstacks are independent of +-each other. +- +- Aside from this one constraint of order of freeing, obstacks are +-totally general: an obstack can contain any number of objects of any +-size. They are implemented with macros, so allocation is usually very +-fast as long as the objects are usually small. And the only space +-overhead per object is the padding needed to start each object on a +-suitable boundary. +- +-* Menu: +- +-* Creating Obstacks:: How to declare an obstack in your program. +-* Preparing for Obstacks:: Preparations needed before you can +- use obstacks. +-* Allocation in an Obstack:: Allocating objects in an obstack. +-* Freeing Obstack Objects:: Freeing objects in an obstack. +-* Obstack Functions:: The obstack functions are both +- functions and macros. +-* Growing Objects:: Making an object bigger by stages. +-* Extra Fast Growing:: Extra-high-efficiency (though more +- complicated) growing objects. +-* Status of an Obstack:: Inquiries about the status of an obstack. +-* Obstacks Data Alignment:: Controlling alignment of objects in obstacks. +-* Obstack Chunks:: How obstacks obtain and release chunks; +- efficiency considerations. +-* Summary of Obstacks:: +- +- +-File: libc.info, Node: Creating Obstacks, Next: Preparing for Obstacks, Up: Obstacks +- +-Creating Obstacks +-................. +- +- The utilities for manipulating obstacks are declared in the header +-file `obstack.h'. +- +- - Data Type: struct obstack +- An obstack is represented by a data structure of type `struct +- obstack'. This structure has a small fixed size; it records the +- status of the obstack and how to find the space in which objects +- are allocated. It does not contain any of the objects themselves. +- You should not try to access the contents of the structure +- directly; use only the functions described in this chapter. +- +- You can declare variables of type `struct obstack' and use them as +-obstacks, or you can allocate obstacks dynamically like any other kind +-of object. Dynamic allocation of obstacks allows your program to have a +-variable number of different stacks. (You can even allocate an obstack +-structure in another obstack, but this is rarely useful.) +- +- All the functions that work with obstacks require you to specify +-which obstack to use. You do this with a pointer of type `struct +-obstack *'. In the following, we often say "an obstack" when strictly +-speaking the object at hand is such a pointer. +- +- The objects in the obstack are packed into large blocks called +-"chunks". The `struct obstack' structure points to a chain of the +-chunks currently in use. +- +- The obstack library obtains a new chunk whenever you allocate an +-object that won't fit in the previous chunk. Since the obstack library +-manages chunks automatically, you don't need to pay much attention to +-them, but you do need to supply a function which the obstack library +-should use to get a chunk. Usually you supply a function which uses +-`malloc' directly or indirectly. You must also supply a function to +-free a chunk. These matters are described in the following section. +- +- +-File: libc.info, Node: Preparing for Obstacks, Next: Allocation in an Obstack, Prev: Creating Obstacks, Up: Obstacks +- +-Preparing for Using Obstacks +-............................ +- +- Each source file in which you plan to use the obstack functions must +-include the header file `obstack.h', like this: +- +- #include +- +- Also, if the source file uses the macro `obstack_init', it must +-declare or define two functions or macros that will be called by the +-obstack library. One, `obstack_chunk_alloc', is used to allocate the +-chunks of memory into which objects are packed. The other, +-`obstack_chunk_free', is used to return chunks when the objects in them +-are freed. These macros should appear before any use of obstacks in +-the source file. +- +- Usually these are defined to use `malloc' via the intermediary +-`xmalloc' (*note Unconstrained Allocation::). This is done with the +-following pair of macro definitions: +- +- #define obstack_chunk_alloc xmalloc +- #define obstack_chunk_free free +- +-Though the memory you get using obstacks really comes from `malloc', +-using obstacks is faster because `malloc' is called less often, for +-larger blocks of memory. *Note Obstack Chunks::, for full details. +- +- At run time, before the program can use a `struct obstack' object as +-an obstack, it must initialize the obstack by calling `obstack_init'. +- +- - Function: int obstack_init (struct obstack *OBSTACK-PTR) +- Initialize obstack OBSTACK-PTR for allocation of objects. This +- function calls the obstack's `obstack_chunk_alloc' function. If +- allocation of memory fails, the function pointed to by +- `obstack_alloc_failed_handler' is called. The `obstack_init' +- function always returns 1 (Compatibility notice: Former versions of +- obstack returned 0 if allocation failed). +- +- Here are two examples of how to allocate the space for an obstack and +-initialize it. First, an obstack that is a static variable: +- +- static struct obstack myobstack; +- ... +- obstack_init (&myobstack); +- +-Second, an obstack that is itself dynamically allocated: +- +- struct obstack *myobstack_ptr +- = (struct obstack *) xmalloc (sizeof (struct obstack)); +- +- obstack_init (myobstack_ptr); +- +- - Variable: obstack_alloc_failed_handler +- The value of this variable is a pointer to a function that +- `obstack' uses when `obstack_chunk_alloc' fails to allocate +- memory. The default action is to print a message and abort. You +- should supply a function that either calls `exit' (*note Program +- Termination::) or `longjmp' (*note Non-Local Exits::) and doesn't +- return. +- +- void my_obstack_alloc_failed (void) +- ... +- obstack_alloc_failed_handler = &my_obstack_alloc_failed; +- +- +- +-File: libc.info, Node: Allocation in an Obstack, Next: Freeing Obstack Objects, Prev: Preparing for Obstacks, Up: Obstacks +- +-Allocation in an Obstack +-........................ +- +- The most direct way to allocate an object in an obstack is with +-`obstack_alloc', which is invoked almost like `malloc'. +- +- - Function: void * obstack_alloc (struct obstack *OBSTACK-PTR, int +- SIZE) +- This allocates an uninitialized block of SIZE bytes in an obstack +- and returns its address. Here OBSTACK-PTR specifies which obstack +- to allocate the block in; it is the address of the `struct obstack' +- object which represents the obstack. Each obstack function or +- macro requires you to specify an OBSTACK-PTR as the first argument. +- +- This function calls the obstack's `obstack_chunk_alloc' function if +- it needs to allocate a new chunk of memory; it calls +- `obstack_alloc_failed_handler' if allocation of memory by +- `obstack_chunk_alloc' failed. +- +- For example, here is a function that allocates a copy of a string STR +-in a specific obstack, which is in the variable `string_obstack': +- +- struct obstack string_obstack; +- +- char * +- copystring (char *string) +- { +- size_t len = strlen (string) + 1; +- char *s = (char *) obstack_alloc (&string_obstack, len); +- memcpy (s, string, len); +- return s; +- } +- +- To allocate a block with specified contents, use the function +-`obstack_copy', declared like this: +- +- - Function: void * obstack_copy (struct obstack *OBSTACK-PTR, void +- *ADDRESS, int SIZE) +- This allocates a block and initializes it by copying SIZE bytes of +- data starting at ADDRESS. It calls `obstack_alloc_failed_handler' +- if allocation of memory by `obstack_chunk_alloc' failed. +- +- - Function: void * obstack_copy0 (struct obstack *OBSTACK-PTR, void +- *ADDRESS, int SIZE) +- Like `obstack_copy', but appends an extra byte containing a null +- character. This extra byte is not counted in the argument SIZE. +- +- The `obstack_copy0' function is convenient for copying a sequence of +-characters into an obstack as a null-terminated string. Here is an +-example of its use: +- +- char * +- obstack_savestring (char *addr, int size) +- { +- return obstack_copy0 (&myobstack, addr, size); +- } +- +-Contrast this with the previous example of `savestring' using `malloc' +-(*note Basic Allocation::). +- +- +-File: libc.info, Node: Freeing Obstack Objects, Next: Obstack Functions, Prev: Allocation in an Obstack, Up: Obstacks +- +-Freeing Objects in an Obstack +-............................. +- +- To free an object allocated in an obstack, use the function +-`obstack_free'. Since the obstack is a stack of objects, freeing one +-object automatically frees all other objects allocated more recently in +-the same obstack. +- +- - Function: void obstack_free (struct obstack *OBSTACK-PTR, void +- *OBJECT) +- If OBJECT is a null pointer, everything allocated in the obstack +- is freed. Otherwise, OBJECT must be the address of an object +- allocated in the obstack. Then OBJECT is freed, along with +- everything allocated in OBSTACK since OBJECT. +- +- Note that if OBJECT is a null pointer, the result is an +-uninitialized obstack. To free all memory in an obstack but leave it +-valid for further allocation, call `obstack_free' with the address of +-the first object allocated on the obstack: +- +- obstack_free (obstack_ptr, first_object_allocated_ptr); +- +- Recall that the objects in an obstack are grouped into chunks. When +-all the objects in a chunk become free, the obstack library +-automatically frees the chunk (*note Preparing for Obstacks::). Then +-other obstacks, or non-obstack allocation, can reuse the space of the +-chunk. +- +- +-File: libc.info, Node: Obstack Functions, Next: Growing Objects, Prev: Freeing Obstack Objects, Up: Obstacks +- +-Obstack Functions and Macros +-............................ +- +- The interfaces for using obstacks may be defined either as functions +-or as macros, depending on the compiler. The obstack facility works +-with all C compilers, including both ISO C and traditional C, but there +-are precautions you must take if you plan to use compilers other than +-GNU C. +- +- If you are using an old-fashioned non-ISO C compiler, all the obstack +-"functions" are actually defined only as macros. You can call these +-macros like functions, but you cannot use them in any other way (for +-example, you cannot take their address). +- +- Calling the macros requires a special precaution: namely, the first +-operand (the obstack pointer) may not contain any side effects, because +-it may be computed more than once. For example, if you write this: +- +- obstack_alloc (get_obstack (), 4); +- +-you will find that `get_obstack' may be called several times. If you +-use `*obstack_list_ptr++' as the obstack pointer argument, you will get +-very strange results since the incrementation may occur several times. +- +- In ISO C, each function has both a macro definition and a function +-definition. The function definition is used if you take the address of +-the function without calling it. An ordinary call uses the macro +-definition by default, but you can request the function definition +-instead by writing the function name in parentheses, as shown here: +- +- char *x; +- void *(*funcp) (); +- /* Use the macro. */ +- x = (char *) obstack_alloc (obptr, size); +- /* Call the function. */ +- x = (char *) (obstack_alloc) (obptr, size); +- /* Take the address of the function. */ +- funcp = obstack_alloc; +- +-This is the same situation that exists in ISO C for the standard library +-functions. *Note Macro Definitions::. +- +- *Warning:* When you do use the macros, you must observe the +-precaution of avoiding side effects in the first operand, even in ISO C. +- +- If you use the GNU C compiler, this precaution is not necessary, +-because various language extensions in GNU C permit defining the macros +-so as to compute each argument only once. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-40 glibc-2.3.2-200304020432/manual/libc.info-40 +--- glibc-2.3.2/manual/libc.info-40 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-40 Thu Jan 1 01:00:00 1970 +@@ -1,1192 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Signals in Handler, Next: Merged Signals, Prev: Longjmp in Handler, Up: Defining Handlers +- +-Signals Arriving While a Handler Runs +-------------------------------------- +- +- What happens if another signal arrives while your signal handler +-function is running? +- +- When the handler for a particular signal is invoked, that signal is +-automatically blocked until the handler returns. That means that if two +-signals of the same kind arrive close together, the second one will be +-held until the first has been handled. (The handler can explicitly +-unblock the signal using `sigprocmask', if you want to allow more +-signals of this type to arrive; see *Note Process Signal Mask::.) +- +- However, your handler can still be interrupted by delivery of another +-kind of signal. To avoid this, you can use the `sa_mask' member of the +-action structure passed to `sigaction' to explicitly specify which +-signals should be blocked while the signal handler runs. These signals +-are in addition to the signal for which the handler was invoked, and +-any other signals that are normally blocked by the process. *Note +-Blocking for Handler::. +- +- When the handler returns, the set of blocked signals is restored to +-the value it had before the handler ran. So using `sigprocmask' inside +-the handler only affects what signals can arrive during the execution of +-the handler itself, not what signals can arrive once the handler +-returns. +- +- *Portability Note:* Always use `sigaction' to establish a handler +-for a signal that you expect to receive asynchronously, if you want +-your program to work properly on System V Unix. On this system, the +-handling of a signal whose handler was established with `signal' +-automatically sets the signal's action back to `SIG_DFL', and the +-handler must re-establish itself each time it runs. This practice, +-while inconvenient, does work when signals cannot arrive in succession. +-However, if another signal can arrive right away, it may arrive before +-the handler can re-establish itself. Then the second signal would +-receive the default handling, which could terminate the process. +- +- +-File: libc.info, Node: Merged Signals, Next: Nonreentrancy, Prev: Signals in Handler, Up: Defining Handlers +- +-Signals Close Together Merge into One +-------------------------------------- +- +- If multiple signals of the same type are delivered to your process +-before your signal handler has a chance to be invoked at all, the +-handler may only be invoked once, as if only a single signal had +-arrived. In effect, the signals merge into one. This situation can +-arise when the signal is blocked, or in a multiprocessing environment +-where the system is busy running some other processes while the signals +-are delivered. This means, for example, that you cannot reliably use a +-signal handler to count signals. The only distinction you can reliably +-make is whether at least one signal has arrived since a given time in +-the past. +- +- Here is an example of a handler for `SIGCHLD' that compensates for +-the fact that the number of signals received may not equal the number of +-child processes that generate them. It assumes that the program keeps +-track of all the child processes with a chain of structures as follows: +- +- struct process +- { +- struct process *next; +- /* The process ID of this child. */ +- int pid; +- /* The descriptor of the pipe or pseudo terminal +- on which output comes from this child. */ +- int input_descriptor; +- /* Nonzero if this process has stopped or terminated. */ +- sig_atomic_t have_status; +- /* The status of this child; 0 if running, +- otherwise a status value from `waitpid'. */ +- int status; +- }; +- +- struct process *process_list; +- +- This example also uses a flag to indicate whether signals have +-arrived since some time in the past--whenever the program last cleared +-it to zero. +- +- /* Nonzero means some child's status has changed +- so look at `process_list' for the details. */ +- int process_status_change; +- +- Here is the handler itself: +- +- void +- sigchld_handler (int signo) +- { +- int old_errno = errno; +- +- while (1) { +- register int pid; +- int w; +- struct process *p; +- +- /* Keep asking for a status until we get a definitive result. */ +- do +- { +- errno = 0; +- pid = waitpid (WAIT_ANY, &w, WNOHANG | WUNTRACED); +- } +- while (pid <= 0 && errno == EINTR); +- +- if (pid <= 0) { +- /* A real failure means there are no more +- stopped or terminated child processes, so return. */ +- errno = old_errno; +- return; +- } +- +- /* Find the process that signaled us, and record its status. */ +- +- for (p = process_list; p; p = p->next) +- if (p->pid == pid) { +- p->status = w; +- /* Indicate that the `status' field +- has data to look at. We do this only after storing it. */ +- p->have_status = 1; +- +- /* If process has terminated, stop waiting for its output. */ +- if (WIFSIGNALED (w) || WIFEXITED (w)) +- if (p->input_descriptor) +- FD_CLR (p->input_descriptor, &input_wait_mask); +- +- /* The program should check this flag from time to time +- to see if there is any news in `process_list'. */ +- ++process_status_change; +- } +- +- /* Loop around to handle all the processes +- that have something to tell us. */ +- } +- } +- +- Here is the proper way to check the flag `process_status_change': +- +- if (process_status_change) { +- struct process *p; +- process_status_change = 0; +- for (p = process_list; p; p = p->next) +- if (p->have_status) { +- ... Examine `p->status' ... +- } +- } +- +-It is vital to clear the flag before examining the list; otherwise, if a +-signal were delivered just before the clearing of the flag, and after +-the appropriate element of the process list had been checked, the status +-change would go unnoticed until the next signal arrived to set the flag +-again. You could, of course, avoid this problem by blocking the signal +-while scanning the list, but it is much more elegant to guarantee +-correctness by doing things in the right order. +- +- The loop which checks process status avoids examining `p->status' +-until it sees that status has been validly stored. This is to make sure +-that the status cannot change in the middle of accessing it. Once +-`p->have_status' is set, it means that the child process is stopped or +-terminated, and in either case, it cannot stop or terminate again until +-the program has taken notice. *Note Atomic Usage::, for more +-information about coping with interruptions during accesses of a +-variable. +- +- Here is another way you can test whether the handler has run since +-the last time you checked. This technique uses a counter which is never +-changed outside the handler. Instead of clearing the count, the program +-remembers the previous value and sees whether it has changed since the +-previous check. The advantage of this method is that different parts of +-the program can check independently, each part checking whether there +-has been a signal since that part last checked. +- +- sig_atomic_t process_status_change; +- +- sig_atomic_t last_process_status_change; +- +- ... +- { +- sig_atomic_t prev = last_process_status_change; +- last_process_status_change = process_status_change; +- if (last_process_status_change != prev) { +- struct process *p; +- for (p = process_list; p; p = p->next) +- if (p->have_status) { +- ... Examine `p->status' ... +- } +- } +- } +- +- +-File: libc.info, Node: Nonreentrancy, Next: Atomic Data Access, Prev: Merged Signals, Up: Defining Handlers +- +-Signal Handling and Nonreentrant Functions +------------------------------------------- +- +- Handler functions usually don't do very much. The best practice is +-to write a handler that does nothing but set an external variable that +-the program checks regularly, and leave all serious work to the program. +-This is best because the handler can be called asynchronously, at +-unpredictable times--perhaps in the middle of a primitive function, or +-even between the beginning and the end of a C operator that requires +-multiple instructions. The data structures being manipulated might +-therefore be in an inconsistent state when the handler function is +-invoked. Even copying one `int' variable into another can take two +-instructions on most machines. +- +- This means you have to be very careful about what you do in a signal +-handler. +- +- * If your handler needs to access any global variables from your +- program, declare those variables `volatile'. This tells the +- compiler that the value of the variable might change +- asynchronously, and inhibits certain optimizations that would be +- invalidated by such modifications. +- +- * If you call a function in the handler, make sure it is "reentrant" +- with respect to signals, or else make sure that the signal cannot +- interrupt a call to a related function. +- +- A function can be non-reentrant if it uses memory that is not on the +-stack. +- +- * If a function uses a static variable or a global variable, or a +- dynamically-allocated object that it finds for itself, then it is +- non-reentrant and any two calls to the function can interfere. +- +- For example, suppose that the signal handler uses `gethostbyname'. +- This function returns its value in a static object, reusing the +- same object each time. If the signal happens to arrive during a +- call to `gethostbyname', or even after one (while the program is +- still using the value), it will clobber the value that the program +- asked for. +- +- However, if the program does not use `gethostbyname' or any other +- function that returns information in the same object, or if it +- always blocks signals around each use, then you are safe. +- +- There are a large number of library functions that return values +- in a fixed object, always reusing the same object in this fashion, +- and all of them cause the same problem. Function descriptions in +- this manual always mention this behavior. +- +- * If a function uses and modifies an object that you supply, then it +- is potentially non-reentrant; two calls can interfere if they use +- the same object. +- +- This case arises when you do I/O using streams. Suppose that the +- signal handler prints a message with `fprintf'. Suppose that the +- program was in the middle of an `fprintf' call using the same +- stream when the signal was delivered. Both the signal handler's +- message and the program's data could be corrupted, because both +- calls operate on the same data structure--the stream itself. +- +- However, if you know that the stream that the handler uses cannot +- possibly be used by the program at a time when signals can arrive, +- then you are safe. It is no problem if the program uses some +- other stream. +- +- * On most systems, `malloc' and `free' are not reentrant, because +- they use a static data structure which records what memory blocks +- are free. As a result, no library functions that allocate or free +- memory are reentrant. This includes functions that allocate space +- to store a result. +- +- The best way to avoid the need to allocate memory in a handler is +- to allocate in advance space for signal handlers to use. +- +- The best way to avoid freeing memory in a handler is to flag or +- record the objects to be freed, and have the program check from +- time to time whether anything is waiting to be freed. But this +- must be done with care, because placing an object on a chain is +- not atomic, and if it is interrupted by another signal handler +- that does the same thing, you could "lose" one of the objects. +- +- * Any function that modifies `errno' is non-reentrant, but you can +- correct for this: in the handler, save the original value of +- `errno' and restore it before returning normally. This prevents +- errors that occur within the signal handler from being confused +- with errors from system calls at the point the program is +- interrupted to run the handler. +- +- This technique is generally applicable; if you want to call in a +- handler a function that modifies a particular object in memory, +- you can make this safe by saving and restoring that object. +- +- * Merely reading from a memory object is safe provided that you can +- deal with any of the values that might appear in the object at a +- time when the signal can be delivered. Keep in mind that +- assignment to some data types requires more than one instruction, +- which means that the handler could run "in the middle of" an +- assignment to the variable if its type is not atomic. *Note +- Atomic Data Access::. +- +- * Merely writing into a memory object is safe as long as a sudden +- change in the value, at any time when the handler might run, will +- not disturb anything. +- +- +-File: libc.info, Node: Atomic Data Access, Prev: Nonreentrancy, Up: Defining Handlers +- +-Atomic Data Access and Signal Handling +--------------------------------------- +- +- Whether the data in your application concerns atoms, or mere text, +-you have to be careful about the fact that access to a single datum is +-not necessarily "atomic". This means that it can take more than one +-instruction to read or write a single object. In such cases, a signal +-handler might be invoked in the middle of reading or writing the object. +- +- There are three ways you can cope with this problem. You can use +-data types that are always accessed atomically; you can carefully +-arrange that nothing untoward happens if an access is interrupted, or +-you can block all signals around any access that had better not be +-interrupted (*note Blocking Signals::). +- +-* Menu: +- +-* Non-atomic Example:: A program illustrating interrupted access. +-* Types: Atomic Types. Data types that guarantee no interruption. +-* Usage: Atomic Usage. Proving that interruption is harmless. +- +- +-File: libc.info, Node: Non-atomic Example, Next: Atomic Types, Up: Atomic Data Access +- +-Problems with Non-Atomic Access +-............................... +- +- Here is an example which shows what can happen if a signal handler +-runs in the middle of modifying a variable. (Interrupting the reading +-of a variable can also lead to paradoxical results, but here we only +-show writing.) +- +- #include +- #include +- +- struct two_words { int a, b; } memory; +- +- void +- handler(int signum) +- { +- printf ("%d,%d\n", memory.a, memory.b); +- alarm (1); +- } +- +- int +- main (void) +- { +- static struct two_words zeros = { 0, 0 }, ones = { 1, 1 }; +- signal (SIGALRM, handler); +- memory = zeros; +- alarm (1); +- while (1) +- { +- memory = zeros; +- memory = ones; +- } +- } +- +- This program fills `memory' with zeros, ones, zeros, ones, +-alternating forever; meanwhile, once per second, the alarm signal +-handler prints the current contents. (Calling `printf' in the handler +-is safe in this program because it is certainly not being called outside +-the handler when the signal happens.) +- +- Clearly, this program can print a pair of zeros or a pair of ones. +-But that's not all it can do! On most machines, it takes several +-instructions to store a new value in `memory', and the value is stored +-one word at a time. If the signal is delivered in between these +-instructions, the handler might find that `memory.a' is zero and +-`memory.b' is one (or vice versa). +- +- On some machines it may be possible to store a new value in `memory' +-with just one instruction that cannot be interrupted. On these +-machines, the handler will always print two zeros or two ones. +- +- +-File: libc.info, Node: Atomic Types, Next: Atomic Usage, Prev: Non-atomic Example, Up: Atomic Data Access +- +-Atomic Types +-............ +- +- To avoid uncertainty about interrupting access to a variable, you can +-use a particular data type for which access is always atomic: +-`sig_atomic_t'. Reading and writing this data type is guaranteed to +-happen in a single instruction, so there's no way for a handler to run +-"in the middle" of an access. +- +- The type `sig_atomic_t' is always an integer data type, but which +-one it is, and how many bits it contains, may vary from machine to +-machine. +- +- - Data Type: sig_atomic_t +- This is an integer data type. Objects of this type are always +- accessed atomically. +- +- In practice, you can assume that `int' and other integer types no +-longer than `int' are atomic. You can also assume that pointer types +-are atomic; that is very convenient. Both of these assumptions are +-true on all of the machines that the GNU C library supports and on all +-POSIX systems we know of. +- +- +-File: libc.info, Node: Atomic Usage, Prev: Atomic Types, Up: Atomic Data Access +- +-Atomic Usage Patterns +-..................... +- +- Certain patterns of access avoid any problem even if an access is +-interrupted. For example, a flag which is set by the handler, and +-tested and cleared by the main program from time to time, is always safe +-even if access actually requires two instructions. To show that this is +-so, we must consider each access that could be interrupted, and show +-that there is no problem if it is interrupted. +- +- An interrupt in the middle of testing the flag is safe because +-either it's recognized to be nonzero, in which case the precise value +-doesn't matter, or it will be seen to be nonzero the next time it's +-tested. +- +- An interrupt in the middle of clearing the flag is no problem because +-either the value ends up zero, which is what happens if a signal comes +-in just before the flag is cleared, or the value ends up nonzero, and +-subsequent events occur as if the signal had come in just after the flag +-was cleared. As long as the code handles both of these cases properly, +-it can also handle a signal in the middle of clearing the flag. (This +-is an example of the sort of reasoning you need to do to figure out +-whether non-atomic usage is safe.) +- +- Sometimes you can insure uninterrupted access to one object by +-protecting its use with another object, perhaps one whose type +-guarantees atomicity. *Note Merged Signals::, for an example. +- +- +-File: libc.info, Node: Interrupted Primitives, Next: Generating Signals, Prev: Defining Handlers, Up: Signal Handling +- +-Primitives Interrupted by Signals +-================================= +- +- A signal can arrive and be handled while an I/O primitive such as +-`open' or `read' is waiting for an I/O device. If the signal handler +-returns, the system faces the question: what should happen next? +- +- POSIX specifies one approach: make the primitive fail right away. +-The error code for this kind of failure is `EINTR'. This is flexible, +-but usually inconvenient. Typically, POSIX applications that use signal +-handlers must check for `EINTR' after each library function that can +-return it, in order to try the call again. Often programmers forget to +-check, which is a common source of error. +- +- The GNU library provides a convenient way to retry a call after a +-temporary failure, with the macro `TEMP_FAILURE_RETRY': +- +- - Macro: TEMP_FAILURE_RETRY (EXPRESSION) +- This macro evaluates EXPRESSION once. If it fails and reports +- error code `EINTR', `TEMP_FAILURE_RETRY' evaluates it again, and +- over and over until the result is not a temporary failure. +- +- The value returned by `TEMP_FAILURE_RETRY' is whatever value +- EXPRESSION produced. +- +- BSD avoids `EINTR' entirely and provides a more convenient approach: +-to restart the interrupted primitive, instead of making it fail. If +-you choose this approach, you need not be concerned with `EINTR'. +- +- You can choose either approach with the GNU library. If you use +-`sigaction' to establish a signal handler, you can specify how that +-handler should behave. If you specify the `SA_RESTART' flag, return +-from that handler will resume a primitive; otherwise, return from that +-handler will cause `EINTR'. *Note Flags for Sigaction::. +- +- Another way to specify the choice is with the `siginterrupt' +-function. *Note BSD Handler::. +- +- When you don't specify with `sigaction' or `siginterrupt' what a +-particular handler should do, it uses a default choice. The default +-choice in the GNU library depends on the feature test macros you have +-defined. If you define `_BSD_SOURCE' or `_GNU_SOURCE' before calling +-`signal', the default is to resume primitives; otherwise, the default +-is to make them fail with `EINTR'. (The library contains alternate +-versions of the `signal' function, and the feature test macros +-determine which one you really call.) *Note Feature Test Macros::. +- +- The description of each primitive affected by this issue lists +-`EINTR' among the error codes it can return. +- +- There is one situation where resumption never happens no matter which +-choice you make: when a data-transfer function such as `read' or +-`write' is interrupted by a signal after transferring part of the data. +-In this case, the function returns the number of bytes already +-transferred, indicating partial success. +- +- This might at first appear to cause unreliable behavior on +-record-oriented devices (including datagram sockets; *note Datagrams::), +-where splitting one `read' or `write' into two would read or write two +-records. Actually, there is no problem, because interruption after a +-partial transfer cannot happen on such devices; they always transfer an +-entire record in one burst, with no waiting once data transfer has +-started. +- +- +-File: libc.info, Node: Generating Signals, Next: Blocking Signals, Prev: Interrupted Primitives, Up: Signal Handling +- +-Generating Signals +-================== +- +- Besides signals that are generated as a result of a hardware trap or +-interrupt, your program can explicitly send signals to itself or to +-another process. +- +-* Menu: +- +-* Signaling Yourself:: A process can send a signal to itself. +-* Signaling Another Process:: Send a signal to another process. +-* Permission for kill:: Permission for using `kill'. +-* Kill Example:: Using `kill' for Communication. +- +- +-File: libc.info, Node: Signaling Yourself, Next: Signaling Another Process, Up: Generating Signals +- +-Signaling Yourself +------------------- +- +- A process can send itself a signal with the `raise' function. This +-function is declared in `signal.h'. +- +- - Function: int raise (int SIGNUM) +- The `raise' function sends the signal SIGNUM to the calling +- process. It returns zero if successful and a nonzero value if it +- fails. About the only reason for failure would be if the value of +- SIGNUM is invalid. +- +- - Function: int gsignal (int SIGNUM) +- The `gsignal' function does the same thing as `raise'; it is +- provided only for compatibility with SVID. +- +- One convenient use for `raise' is to reproduce the default behavior +-of a signal that you have trapped. For instance, suppose a user of your +-program types the SUSP character (usually `C-z'; *note Special +-Characters::) to send it an interactive stop signal (`SIGTSTP'), and +-you want to clean up some internal data buffers before stopping. You +-might set this up like this: +- +- #include +- +- /* When a stop signal arrives, set the action back to the default +- and then resend the signal after doing cleanup actions. */ +- +- void +- tstp_handler (int sig) +- { +- signal (SIGTSTP, SIG_DFL); +- /* Do cleanup actions here. */ +- ... +- raise (SIGTSTP); +- } +- +- /* When the process is continued again, restore the signal handler. */ +- +- void +- cont_handler (int sig) +- { +- signal (SIGCONT, cont_handler); +- signal (SIGTSTP, tstp_handler); +- } +- +- /* Enable both handlers during program initialization. */ +- +- int +- main (void) +- { +- signal (SIGCONT, cont_handler); +- signal (SIGTSTP, tstp_handler); +- ... +- } +- +- *Portability note:* `raise' was invented by the ISO C committee. +-Older systems may not support it, so using `kill' may be more portable. +-*Note Signaling Another Process::. +- +- +-File: libc.info, Node: Signaling Another Process, Next: Permission for kill, Prev: Signaling Yourself, Up: Generating Signals +- +-Signaling Another Process +-------------------------- +- +- The `kill' function can be used to send a signal to another process. +-In spite of its name, it can be used for a lot of things other than +-causing a process to terminate. Some examples of situations where you +-might want to send signals between processes are: +- +- * A parent process starts a child to perform a task--perhaps having +- the child running an infinite loop--and then terminates the child +- when the task is no longer needed. +- +- * A process executes as part of a group, and needs to terminate or +- notify the other processes in the group when an error or other +- event occurs. +- +- * Two processes need to synchronize while working together. +- +- This section assumes that you know a little bit about how processes +-work. For more information on this subject, see *Note Processes::. +- +- The `kill' function is declared in `signal.h'. +- +- - Function: int kill (pid_t PID, int SIGNUM) +- The `kill' function sends the signal SIGNUM to the process or +- process group specified by PID. Besides the signals listed in +- *Note Standard Signals::, SIGNUM can also have a value of zero to +- check the validity of the PID. +- +- The PID specifies the process or process group to receive the +- signal: +- +- `PID > 0' +- The process whose identifier is PID. +- +- `PID == 0' +- All processes in the same process group as the sender. +- +- `PID < -1' +- The process group whose identifier is -PID. +- +- `PID == -1' +- If the process is privileged, send the signal to all +- processes except for some special system processes. +- Otherwise, send the signal to all processes with the same +- effective user ID. +- +- A process can send a signal to itself with a call like +- `kill (getpid(), SIGNUM)'. If `kill' is used by a process to send +- a signal to itself, and the signal is not blocked, then `kill' +- delivers at least one signal (which might be some other pending +- unblocked signal instead of the signal SIGNUM) to that process +- before it returns. +- +- The return value from `kill' is zero if the signal can be sent +- successfully. Otherwise, no signal is sent, and a value of `-1' is +- returned. If PID specifies sending a signal to several processes, +- `kill' succeeds if it can send the signal to at least one of them. +- There's no way you can tell which of the processes got the signal +- or whether all of them did. +- +- The following `errno' error conditions are defined for this +- function: +- +- `EINVAL' +- The SIGNUM argument is an invalid or unsupported number. +- +- `EPERM' +- You do not have the privilege to send a signal to the process +- or any of the processes in the process group named by PID. +- +- `ESCRH' +- The PID argument does not refer to an existing process or +- group. +- +- - Function: int killpg (int PGID, int SIGNUM) +- This is similar to `kill', but sends signal SIGNUM to the process +- group PGID. This function is provided for compatibility with BSD; +- using `kill' to do this is more portable. +- +- As a simple example of `kill', the call `kill (getpid (), SIG)' has +-the same effect as `raise (SIG)'. +- +- +-File: libc.info, Node: Permission for kill, Next: Kill Example, Prev: Signaling Another Process, Up: Generating Signals +- +-Permission for using `kill' +---------------------------- +- +- There are restrictions that prevent you from using `kill' to send +-signals to any random process. These are intended to prevent antisocial +-behavior such as arbitrarily killing off processes belonging to another +-user. In typical use, `kill' is used to pass signals between parent, +-child, and sibling processes, and in these situations you normally do +-have permission to send signals. The only common exception is when you +-run a setuid program in a child process; if the program changes its +-real UID as well as its effective UID, you may not have permission to +-send a signal. The `su' program does this. +- +- Whether a process has permission to send a signal to another process +-is determined by the user IDs of the two processes. This concept is +-discussed in detail in *Note Process Persona::. +- +- Generally, for a process to be able to send a signal to another +-process, either the sending process must belong to a privileged user +-(like `root'), or the real or effective user ID of the sending process +-must match the real or effective user ID of the receiving process. If +-the receiving process has changed its effective user ID from the +-set-user-ID mode bit on its process image file, then the owner of the +-process image file is used in place of its current effective user ID. +-In some implementations, a parent process might be able to send signals +-to a child process even if the user ID's don't match, and other +-implementations might enforce other restrictions. +- +- The `SIGCONT' signal is a special case. It can be sent if the +-sender is part of the same session as the receiver, regardless of user +-IDs. +- +- +-File: libc.info, Node: Kill Example, Prev: Permission for kill, Up: Generating Signals +- +-Using `kill' for Communication +------------------------------- +- +- Here is a longer example showing how signals can be used for +-interprocess communication. This is what the `SIGUSR1' and `SIGUSR2' +-signals are provided for. Since these signals are fatal by default, +-the process that is supposed to receive them must trap them through +-`signal' or `sigaction'. +- +- In this example, a parent process forks a child process and then +-waits for the child to complete its initialization. The child process +-tells the parent when it is ready by sending it a `SIGUSR1' signal, +-using the `kill' function. +- +- #include +- #include +- #include +- #include +- +- /* When a `SIGUSR1' signal arrives, set this variable. */ +- volatile sig_atomic_t usr_interrupt = 0; +- +- void +- synch_signal (int sig) +- { +- usr_interrupt = 1; +- } +- +- /* The child process executes this function. */ +- void +- child_function (void) +- { +- /* Perform initialization. */ +- printf ("I'm here!!! My pid is %d.\n", (int) getpid ()); +- +- /* Let parent know you're done. */ +- kill (getppid (), SIGUSR1); +- +- /* Continue with execution. */ +- puts ("Bye, now...."); +- exit (0); +- } +- +- int +- main (void) +- { +- struct sigaction usr_action; +- sigset_t block_mask; +- pid_t child_id; +- +- /* Establish the signal handler. */ +- sigfillset (&block_mask); +- usr_action.sa_handler = synch_signal; +- usr_action.sa_mask = block_mask; +- usr_action.sa_flags = 0; +- sigaction (SIGUSR1, &usr_action, NULL); +- +- /* Create the child process. */ +- child_id = fork (); +- if (child_id == 0) +- child_function (); /* Does not return. */ +- +- /* Busy wait for the child to send a signal. */ +- while (!usr_interrupt) +- ; +- +- /* Now continue execution. */ +- puts ("That's all, folks!"); +- +- return 0; +- } +- +- This example uses a busy wait, which is bad, because it wastes CPU +-cycles that other programs could otherwise use. It is better to ask the +-system to wait until the signal arrives. See the example in *Note +-Waiting for a Signal::. +- +- +-File: libc.info, Node: Blocking Signals, Next: Waiting for a Signal, Prev: Generating Signals, Up: Signal Handling +- +-Blocking Signals +-================ +- +- Blocking a signal means telling the operating system to hold it and +-deliver it later. Generally, a program does not block signals +-indefinitely--it might as well ignore them by setting their actions to +-`SIG_IGN'. But it is useful to block signals briefly, to prevent them +-from interrupting sensitive operations. For instance: +- +- * You can use the `sigprocmask' function to block signals while you +- modify global variables that are also modified by the handlers for +- these signals. +- +- * You can set `sa_mask' in your `sigaction' call to block certain +- signals while a particular signal handler runs. This way, the +- signal handler can run without being interrupted itself by signals. +- +-* Menu: +- +-* Why Block:: The purpose of blocking signals. +-* Signal Sets:: How to specify which signals to +- block. +-* Process Signal Mask:: Blocking delivery of signals to your +- process during normal execution. +-* Testing for Delivery:: Blocking to Test for Delivery of +- a Signal. +-* Blocking for Handler:: Blocking additional signals while a +- handler is being run. +-* Checking for Pending Signals:: Checking for Pending Signals +-* Remembering a Signal:: How you can get almost the same +- effect as blocking a signal, by +- handling it and setting a flag +- to be tested later. +- +- +-File: libc.info, Node: Why Block, Next: Signal Sets, Up: Blocking Signals +- +-Why Blocking Signals is Useful +------------------------------- +- +- Temporary blocking of signals with `sigprocmask' gives you a way to +-prevent interrupts during critical parts of your code. If signals +-arrive in that part of the program, they are delivered later, after you +-unblock them. +- +- One example where this is useful is for sharing data between a signal +-handler and the rest of the program. If the type of the data is not +-`sig_atomic_t' (*note Atomic Data Access::), then the signal handler +-could run when the rest of the program has only half finished reading +-or writing the data. This would lead to confusing consequences. +- +- To make the program reliable, you can prevent the signal handler from +-running while the rest of the program is examining or modifying that +-data--by blocking the appropriate signal around the parts of the +-program that touch the data. +- +- Blocking signals is also necessary when you want to perform a certain +-action only if a signal has not arrived. Suppose that the handler for +-the signal sets a flag of type `sig_atomic_t'; you would like to test +-the flag and perform the action if the flag is not set. This is +-unreliable. Suppose the signal is delivered immediately after you test +-the flag, but before the consequent action: then the program will +-perform the action even though the signal has arrived. +- +- The only way to test reliably for whether a signal has yet arrived +-is to test while the signal is blocked. +- +- +-File: libc.info, Node: Signal Sets, Next: Process Signal Mask, Prev: Why Block, Up: Blocking Signals +- +-Signal Sets +------------ +- +- All of the signal blocking functions use a data structure called a +-"signal set" to specify what signals are affected. Thus, every +-activity involves two stages: creating the signal set, and then passing +-it as an argument to a library function. +- +- These facilities are declared in the header file `signal.h'. +- +- - Data Type: sigset_t +- The `sigset_t' data type is used to represent a signal set. +- Internally, it may be implemented as either an integer or structure +- type. +- +- For portability, use only the functions described in this section +- to initialize, change, and retrieve information from `sigset_t' +- objects--don't try to manipulate them directly. +- +- There are two ways to initialize a signal set. You can initially +-specify it to be empty with `sigemptyset' and then add specified +-signals individually. Or you can specify it to be full with +-`sigfillset' and then delete specified signals individually. +- +- You must always initialize the signal set with one of these two +-functions before using it in any other way. Don't try to set all the +-signals explicitly because the `sigset_t' object might include some +-other information (like a version field) that needs to be initialized as +-well. (In addition, it's not wise to put into your program an +-assumption that the system has no signals aside from the ones you know +-about.) +- +- - Function: int sigemptyset (sigset_t *SET) +- This function initializes the signal set SET to exclude all of the +- defined signals. It always returns `0'. +- +- - Function: int sigfillset (sigset_t *SET) +- This function initializes the signal set SET to include all of the +- defined signals. Again, the return value is `0'. +- +- - Function: int sigaddset (sigset_t *SET, int SIGNUM) +- This function adds the signal SIGNUM to the signal set SET. All +- `sigaddset' does is modify SET; it does not block or unblock any +- signals. +- +- The return value is `0' on success and `-1' on failure. The +- following `errno' error condition is defined for this function: +- +- `EINVAL' +- The SIGNUM argument doesn't specify a valid signal. +- +- - Function: int sigdelset (sigset_t *SET, int SIGNUM) +- This function removes the signal SIGNUM from the signal set SET. +- All `sigdelset' does is modify SET; it does not block or unblock +- any signals. The return value and error conditions are the same +- as for `sigaddset'. +- +- Finally, there is a function to test what signals are in a signal +-set: +- +- - Function: int sigismember (const sigset_t *SET, int SIGNUM) +- The `sigismember' function tests whether the signal SIGNUM is a +- member of the signal set SET. It returns `1' if the signal is in +- the set, `0' if not, and `-1' if there is an error. +- +- The following `errno' error condition is defined for this function: +- +- `EINVAL' +- The SIGNUM argument doesn't specify a valid signal. +- +- +-File: libc.info, Node: Process Signal Mask, Next: Testing for Delivery, Prev: Signal Sets, Up: Blocking Signals +- +-Process Signal Mask +-------------------- +- +- The collection of signals that are currently blocked is called the +-"signal mask". Each process has its own signal mask. When you create +-a new process (*note Creating a Process::), it inherits its parent's +-mask. You can block or unblock signals with total flexibility by +-modifying the signal mask. +- +- The prototype for the `sigprocmask' function is in `signal.h'. +- +- Note that you must not use `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 `sigprocmask' +-in a multi-threaded process is "unspeficied". Instead, use +-`pthread_sigmask'. *Note Threads and Signal Handling::. +- +- - Function: int sigprocmask (int HOW, const sigset_t *restrict SET, +- sigset_t *restrict OLDSET) +- The `sigprocmask' function is used to examine or change the calling +- process's signal mask. The HOW argument determines how the signal +- mask is changed, and must be one of the following values: +- +- `SIG_BLOCK' +- Block the signals in `set'--add them to the existing mask. In +- other words, the new mask is the union of the existing mask +- and SET. +- +- `SIG_UNBLOCK' +- Unblock the signals in SET--remove them from the existing +- mask. +- +- `SIG_SETMASK' +- Use SET for the mask; ignore the previous value of the mask. +- +- The last argument, OLDSET, is used to return information about the +- old process signal mask. If you just want to change the mask +- without looking at it, pass a null pointer as the OLDSET argument. +- Similarly, if you want to know what's in the mask without changing +- it, pass a null pointer for SET (in this case the HOW argument is +- not significant). The OLDSET argument is often used to remember +- the previous signal mask in order to restore it later. (Since the +- signal mask is inherited over `fork' and `exec' calls, you can't +- predict what its contents are when your program starts running.) +- +- If invoking `sigprocmask' causes any pending signals to be +- unblocked, at least one of those signals is delivered to the +- process before `sigprocmask' returns. The order in which pending +- signals are delivered is not specified, but you can control the +- order explicitly by making multiple `sigprocmask' calls to unblock +- various signals one at a time. +- +- The `sigprocmask' function returns `0' if successful, and `-1' to +- indicate an error. The following `errno' error conditions are +- defined for this function: +- +- `EINVAL' +- The HOW argument is invalid. +- +- You can't block the `SIGKILL' and `SIGSTOP' signals, but if the +- signal set includes these, `sigprocmask' just ignores them instead +- of returning an error status. +- +- Remember, too, that blocking program error signals such as `SIGFPE' +- leads to undesirable results for signals generated by an actual +- program error (as opposed to signals sent with `raise' or `kill'). +- This is because your program may be too broken to be able to +- continue executing to a point where the signal is unblocked again. +- *Note Program Error Signals::. +- +- +-File: libc.info, Node: Testing for Delivery, Next: Blocking for Handler, Prev: Process Signal Mask, Up: Blocking Signals +- +-Blocking to Test for Delivery of a Signal +------------------------------------------ +- +- Now for a simple example. Suppose you establish a handler for +-`SIGALRM' signals that sets a flag whenever a signal arrives, and your +-main program checks this flag from time to time and then resets it. +-You can prevent additional `SIGALRM' signals from arriving in the +-meantime by wrapping the critical part of the code with calls to +-`sigprocmask', like this: +- +- /* This variable is set by the SIGALRM signal handler. */ +- volatile sig_atomic_t flag = 0; +- +- int +- main (void) +- { +- sigset_t block_alarm; +- +- ... +- +- /* Initialize the signal mask. */ +- sigemptyset (&block_alarm); +- sigaddset (&block_alarm, SIGALRM); +- +- while (1) +- { +- /* Check if a signal has arrived; if so, reset the flag. */ +- sigprocmask (SIG_BLOCK, &block_alarm, NULL); +- if (flag) +- { +- ACTIONS-IF-NOT-ARRIVED +- flag = 0; +- } +- sigprocmask (SIG_UNBLOCK, &block_alarm, NULL); +- +- ... +- } +- } +- +- +-File: libc.info, Node: Blocking for Handler, Next: Checking for Pending Signals, Prev: Testing for Delivery, Up: Blocking Signals +- +-Blocking Signals for a Handler +------------------------------- +- +- When a signal handler is invoked, you usually want it to be able to +-finish without being interrupted by another signal. From the moment the +-handler starts until the moment it finishes, you must block signals that +-might confuse it or corrupt its data. +- +- When a handler function is invoked on a signal, that signal is +-automatically blocked (in addition to any other signals that are already +-in the process's signal mask) during the time the handler is running. +-If you set up a handler for `SIGTSTP', for instance, then the arrival +-of that signal forces further `SIGTSTP' signals to wait during the +-execution of the handler. +- +- However, by default, other kinds of signals are not blocked; they can +-arrive during handler execution. +- +- The reliable way to block other kinds of signals during the +-execution of the handler is to use the `sa_mask' member of the +-`sigaction' structure. +- +- Here is an example: +- +- #include +- #include +- +- void catch_stop (); +- +- void +- install_handler (void) +- { +- struct sigaction setup_action; +- sigset_t block_mask; +- +- sigemptyset (&block_mask); +- /* Block other terminal-generated signals while handler runs. */ +- sigaddset (&block_mask, SIGINT); +- sigaddset (&block_mask, SIGQUIT); +- setup_action.sa_handler = catch_stop; +- setup_action.sa_mask = block_mask; +- setup_action.sa_flags = 0; +- sigaction (SIGTSTP, &setup_action, NULL); +- } +- +- This is more reliable than blocking the other signals explicitly in +-the code for the handler. If you block signals explicitly in the +-handler, you can't avoid at least a short interval at the beginning of +-the handler where they are not yet blocked. +- +- You cannot remove signals from the process's current mask using this +-mechanism. However, you can make calls to `sigprocmask' within your +-handler to block or unblock signals as you wish. +- +- In any case, when the handler returns, the system restores the mask +-that was in place before the handler was entered. If any signals that +-become unblocked by this restoration are pending, the process will +-receive those signals immediately, before returning to the code that was +-interrupted. +- +- +-File: libc.info, Node: Checking for Pending Signals, Next: Remembering a Signal, Prev: Blocking for Handler, Up: Blocking Signals +- +-Checking for Pending Signals +----------------------------- +- +- You can find out which signals are pending at any time by calling +-`sigpending'. This function is declared in `signal.h'. +- +- - Function: int sigpending (sigset_t *SET) +- The `sigpending' function stores information about pending signals +- in SET. If there is a pending signal that is blocked from +- delivery, then that signal is a member of the returned set. (You +- can test whether a particular signal is a member of this set using +- `sigismember'; see *Note Signal Sets::.) +- +- The return value is `0' if successful, and `-1' on failure. +- +- Testing whether a signal is pending is not often useful. Testing +-when that signal is not blocked is almost certainly bad design. +- +- Here is an example. +- +- #include +- #include +- +- sigset_t base_mask, waiting_mask; +- +- sigemptyset (&base_mask); +- sigaddset (&base_mask, SIGINT); +- sigaddset (&base_mask, SIGTSTP); +- +- /* Block user interrupts while doing other processing. */ +- sigprocmask (SIG_SETMASK, &base_mask, NULL); +- ... +- +- /* After a while, check to see whether any signals are pending. */ +- sigpending (&waiting_mask); +- if (sigismember (&waiting_mask, SIGINT)) { +- /* User has tried to kill the process. */ +- } +- else if (sigismember (&waiting_mask, SIGTSTP)) { +- /* User has tried to stop the process. */ +- } +- +- Remember that if there is a particular signal pending for your +-process, additional signals of that same type that arrive in the +-meantime might be discarded. For example, if a `SIGINT' signal is +-pending when another `SIGINT' signal arrives, your program will +-probably only see one of them when you unblock this signal. +- +- *Portability Note:* The `sigpending' function is new in POSIX.1. +-Older systems have no equivalent facility. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-41 glibc-2.3.2-200304020432/manual/libc.info-41 +--- glibc-2.3.2/manual/libc.info-41 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-41 Thu Jan 1 01:00:00 1970 +@@ -1,1252 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Remembering a Signal, Prev: Checking for Pending Signals, Up: Blocking Signals +- +-Remembering a Signal to Act On Later +------------------------------------- +- +- Instead of blocking a signal using the library facilities, you can +-get almost the same results by making the handler set a flag to be +-tested later, when you "unblock". Here is an example: +- +- /* If this flag is nonzero, don't handle the signal right away. */ +- volatile sig_atomic_t signal_pending; +- +- /* This is nonzero if a signal arrived and was not handled. */ +- volatile sig_atomic_t defer_signal; +- +- void +- handler (int signum) +- { +- if (defer_signal) +- signal_pending = signum; +- else +- ... /* "Really" handle the signal. */ +- } +- +- ... +- +- void +- update_mumble (int frob) +- { +- /* Prevent signals from having immediate effect. */ +- defer_signal++; +- /* Now update `mumble', without worrying about interruption. */ +- mumble.a = 1; +- mumble.b = hack (); +- mumble.c = frob; +- /* We have updated `mumble'. Handle any signal that came in. */ +- defer_signal--; +- if (defer_signal == 0 && signal_pending != 0) +- raise (signal_pending); +- } +- +- Note how the particular signal that arrives is stored in +-`signal_pending'. That way, we can handle several types of +-inconvenient signals with the same mechanism. +- +- We increment and decrement `defer_signal' so that nested critical +-sections will work properly; thus, if `update_mumble' were called with +-`signal_pending' already nonzero, signals would be deferred not only +-within `update_mumble', but also within the caller. This is also why +-we do not check `signal_pending' if `defer_signal' is still nonzero. +- +- The incrementing and decrementing of `defer_signal' each require more +-than one instruction; it is possible for a signal to happen in the +-middle. But that does not cause any problem. If the signal happens +-early enough to see the value from before the increment or decrement, +-that is equivalent to a signal which came before the beginning of the +-increment or decrement, which is a case that works properly. +- +- It is absolutely vital to decrement `defer_signal' before testing +-`signal_pending', because this avoids a subtle bug. If we did these +-things in the other order, like this, +- +- if (defer_signal == 1 && signal_pending != 0) +- raise (signal_pending); +- defer_signal--; +- +-then a signal arriving in between the `if' statement and the decrement +-would be effectively "lost" for an indefinite amount of time. The +-handler would merely set `defer_signal', but the program having already +-tested this variable, it would not test the variable again. +- +- Bugs like these are called "timing errors". They are especially bad +-because they happen only rarely and are nearly impossible to reproduce. +-You can't expect to find them with a debugger as you would find a +-reproducible bug. So it is worth being especially careful to avoid +-them. +- +- (You would not be tempted to write the code in this order, given the +-use of `defer_signal' as a counter which must be tested along with +-`signal_pending'. After all, testing for zero is cleaner than testing +-for one. But if you did not use `defer_signal' as a counter, and gave +-it values of zero and one only, then either order might seem equally +-simple. This is a further advantage of using a counter for +-`defer_signal': it will reduce the chance you will write the code in +-the wrong order and create a subtle bug.) +- +- +-File: libc.info, Node: Waiting for a Signal, Next: Signal Stack, Prev: Blocking Signals, Up: Signal Handling +- +-Waiting for a Signal +-==================== +- +- If your program is driven by external events, or uses signals for +-synchronization, then when it has nothing to do it should probably wait +-until a signal arrives. +- +-* Menu: +- +-* Using Pause:: The simple way, using `pause'. +-* Pause Problems:: Why the simple way is often not very good. +-* Sigsuspend:: Reliably waiting for a specific signal. +- +- +-File: libc.info, Node: Using Pause, Next: Pause Problems, Up: Waiting for a Signal +- +-Using `pause' +-------------- +- +- The simple way to wait until a signal arrives is to call `pause'. +-Please read about its disadvantages, in the following section, before +-you use it. +- +- - Function: int pause () +- The `pause' function suspends program execution until a signal +- arrives whose action is either to execute a handler function, or to +- terminate the process. +- +- If the signal causes a handler function to be executed, then +- `pause' returns. This is considered an unsuccessful return (since +- "successful" behavior would be to suspend the program forever), so +- the return value is `-1'. Even if you specify that other +- primitives should resume when a system handler returns (*note +- Interrupted Primitives::), this has no effect on `pause'; it +- always fails when a signal is handled. +- +- The following `errno' error conditions are defined for this +- function: +- +- `EINTR' +- The function was interrupted by delivery of a signal. +- +- If the signal causes program termination, `pause' doesn't return +- (obviously). +- +- This function is a cancellation point in multithreaded programs. +- This is a problem if the thread allocates some resources (like +- memory, file descriptors, semaphores or whatever) at the time +- `pause' is called. If the thread gets cancelled these resources +- stay allocated until the program ends. To avoid this calls to +- `pause' should be protected using cancellation handlers. +- +- The `pause' function is declared in `unistd.h'. +- +- +-File: libc.info, Node: Pause Problems, Next: Sigsuspend, Prev: Using Pause, Up: Waiting for a Signal +- +-Problems with `pause' +---------------------- +- +- The simplicity of `pause' can conceal serious timing errors that can +-make a program hang mysteriously. +- +- It is safe to use `pause' if the real work of your program is done +-by the signal handlers themselves, and the "main program" does nothing +-but call `pause'. Each time a signal is delivered, the handler will do +-the next batch of work that is to be done, and then return, so that the +-main loop of the program can call `pause' again. +- +- You can't safely use `pause' to wait until one more signal arrives, +-and then resume real work. Even if you arrange for the signal handler +-to cooperate by setting a flag, you still can't use `pause' reliably. +-Here is an example of this problem: +- +- /* `usr_interrupt' is set by the signal handler. */ +- if (!usr_interrupt) +- pause (); +- +- /* Do work once the signal arrives. */ +- ... +- +-This has a bug: the signal could arrive after the variable +-`usr_interrupt' is checked, but before the call to `pause'. If no +-further signals arrive, the process would never wake up again. +- +- You can put an upper limit on the excess waiting by using `sleep' in +-a loop, instead of using `pause'. (*Note Sleeping::, for more about +-`sleep'.) Here is what this looks like: +- +- /* `usr_interrupt' is set by the signal handler. +- while (!usr_interrupt) +- sleep (1); +- +- /* Do work once the signal arrives. */ +- ... +- +- For some purposes, that is good enough. But with a little more +-complexity, you can wait reliably until a particular signal handler is +-run, using `sigsuspend'. *Note Sigsuspend::. +- +- +-File: libc.info, Node: Sigsuspend, Prev: Pause Problems, Up: Waiting for a Signal +- +-Using `sigsuspend' +------------------- +- +- The clean and reliable way to wait for a signal to arrive is to +-block it and then use `sigsuspend'. By using `sigsuspend' in a loop, +-you can wait for certain kinds of signals, while letting other kinds of +-signals be handled by their handlers. +- +- - Function: int sigsuspend (const sigset_t *SET) +- This function replaces the process's signal mask with SET and then +- suspends the process until a signal is delivered whose action is +- either to terminate the process or invoke a signal handling +- function. In other words, the program is effectively suspended +- until one of the signals that is not a member of SET arrives. +- +- If the process is woken up by delivery of a signal that invokes a +- handler function, and the handler function returns, then +- `sigsuspend' also returns. +- +- The mask remains SET only as long as `sigsuspend' is waiting. The +- function `sigsuspend' always restores the previous signal mask +- when it returns. +- +- The return value and error conditions are the same as for `pause'. +- +- With `sigsuspend', you can replace the `pause' or `sleep' loop in +-the previous section with something completely reliable: +- +- sigset_t mask, oldmask; +- +- ... +- +- /* Set up the mask of signals to temporarily block. */ +- sigemptyset (&mask); +- sigaddset (&mask, SIGUSR1); +- +- ... +- +- /* Wait for a signal to arrive. */ +- sigprocmask (SIG_BLOCK, &mask, &oldmask); +- while (!usr_interrupt) +- sigsuspend (&oldmask); +- sigprocmask (SIG_UNBLOCK, &mask, NULL); +- +- This last piece of code is a little tricky. The key point to +-remember here is that when `sigsuspend' returns, it resets the process's +-signal mask to the original value, the value from before the call to +-`sigsuspend'--in this case, the `SIGUSR1' signal is once again blocked. +-The second call to `sigprocmask' is necessary to explicitly unblock +-this signal. +- +- One other point: you may be wondering why the `while' loop is +-necessary at all, since the program is apparently only waiting for one +-`SIGUSR1' signal. The answer is that the mask passed to `sigsuspend' +-permits the process to be woken up by the delivery of other kinds of +-signals, as well--for example, job control signals. If the process is +-woken up by a signal that doesn't set `usr_interrupt', it just suspends +-itself again until the "right" kind of signal eventually arrives. +- +- This technique takes a few more lines of preparation, but that is +-needed just once for each kind of wait criterion you want to use. The +-code that actually waits is just four lines. +- +- +-File: libc.info, Node: Signal Stack, Next: BSD Signal Handling, Prev: Waiting for a Signal, Up: Signal Handling +- +-Using a Separate Signal Stack +-============================= +- +- A signal stack is a special area of memory to be used as the +-execution stack during signal handlers. It should be fairly large, to +-avoid any danger that it will overflow in turn; the macro `SIGSTKSZ' is +-defined to a canonical size for signal stacks. You can use `malloc' to +-allocate the space for the stack. Then call `sigaltstack' or +-`sigstack' to tell the system to use that space for the signal stack. +- +- You don't need to write signal handlers differently in order to use a +-signal stack. Switching from one stack to the other happens +-automatically. (Some non-GNU debuggers on some machines may get +-confused if you examine a stack trace while a handler that uses the +-signal stack is running.) +- +- There are two interfaces for telling the system to use a separate +-signal stack. `sigstack' is the older interface, which comes from 4.2 +-BSD. `sigaltstack' is the newer interface, and comes from 4.4 BSD. +-The `sigaltstack' interface has the advantage that it does not require +-your program to know which direction the stack grows, which depends on +-the specific machine and operating system. +- +- - Data Type: stack_t +- This structure describes a signal stack. It contains the +- following members: +- +- `void *ss_sp' +- This points to the base of the signal stack. +- +- `size_t ss_size' +- This is the size (in bytes) of the signal stack which `ss_sp' +- points to. You should set this to however much space you +- allocated for the stack. +- +- There are two macros defined in `signal.h' that you should +- use in calculating this size: +- +- `SIGSTKSZ' +- This is the canonical size for a signal stack. It is +- judged to be sufficient for normal uses. +- +- `MINSIGSTKSZ' +- This is the amount of signal stack space the operating +- system needs just to implement signal delivery. The +- size of a signal stack *must* be greater than this. +- +- For most cases, just using `SIGSTKSZ' for `ss_size' is +- sufficient. But if you know how much stack space your +- program's signal handlers will need, you may want to use +- a different size. In this case, you should allocate +- `MINSIGSTKSZ' additional bytes for the signal stack and +- increase `ss_size' accordingly. +- +- `int ss_flags' +- This field contains the bitwise OR of these flags: +- +- `SS_DISABLE' +- This tells the system that it should not use the signal +- stack. +- +- `SS_ONSTACK' +- This is set by the system, and indicates that the signal +- stack is currently in use. If this bit is not set, then +- signals will be delivered on the normal user stack. +- +- - Function: int sigaltstack (const stack_t *restrict STACK, stack_t +- *restrict OLDSTACK) +- The `sigaltstack' function specifies an alternate stack for use +- during signal handling. When a signal is received by the process +- and its action indicates that the signal stack is used, the system +- arranges a switch to the currently installed signal stack while +- the handler for that signal is executed. +- +- If OLDSTACK is not a null pointer, information about the currently +- installed signal stack is returned in the location it points to. +- If STACK is not a null pointer, then this is installed as the new +- stack for use by signal handlers. +- +- The return value is `0' on success and `-1' on failure. If +- `sigaltstack' fails, it sets `errno' to one of these values: +- +- `EINVAL' +- You tried to disable a stack that was in fact currently in +- use. +- +- `ENOMEM' +- The size of the alternate stack was too small. It must be +- greater than `MINSIGSTKSZ'. +- +- Here is the older `sigstack' interface. You should use +-`sigaltstack' instead on systems that have it. +- +- - Data Type: struct sigstack +- This structure describes a signal stack. It contains the +- following members: +- +- `void *ss_sp' +- This is the stack pointer. If the stack grows downwards on +- your machine, this should point to the top of the area you +- allocated. If the stack grows upwards, it should point to +- the bottom. +- +- `int ss_onstack' +- This field is true if the process is currently using this +- stack. +- +- - Function: int sigstack (const struct sigstack *STACK, struct +- sigstack *OLDSTACK) +- The `sigstack' function specifies an alternate stack for use during +- signal handling. When a signal is received by the process and its +- action indicates that the signal stack is used, the system +- arranges a switch to the currently installed signal stack while +- the handler for that signal is executed. +- +- If OLDSTACK is not a null pointer, information about the currently +- installed signal stack is returned in the location it points to. +- If STACK is not a null pointer, then this is installed as the new +- stack for use by signal handlers. +- +- The return value is `0' on success and `-1' on failure. +- +- +-File: libc.info, Node: BSD Signal Handling, Prev: Signal Stack, Up: Signal Handling +- +-BSD Signal Handling +-=================== +- +- This section describes alternative signal handling functions derived +-from BSD Unix. These facilities were an advance, in their time; today, +-they are mostly obsolete, and supported mainly for compatibility with +-BSD Unix. +- +- There are many similarities between the BSD and POSIX signal handling +-facilities, because the POSIX facilities were inspired by the BSD +-facilities. Besides having different names for all the functions to +-avoid conflicts, the main differences between the two are: +- +- * BSD Unix represents signal masks as an `int' bit mask, rather than +- as a `sigset_t' object. +- +- * The BSD facilities use a different default for whether an +- interrupted primitive should fail or resume. The POSIX facilities +- make system calls fail unless you specify that they should resume. +- With the BSD facility, the default is to make system calls resume +- unless you say they should fail. *Note Interrupted Primitives::. +- +- The BSD facilities are declared in `signal.h'. +- +-* Menu: +- +-* BSD Handler:: BSD Function to Establish a Handler. +-* Blocking in BSD:: BSD Functions for Blocking Signals. +- +- +-File: libc.info, Node: BSD Handler, Next: Blocking in BSD, Up: BSD Signal Handling +- +-BSD Function to Establish a Handler +------------------------------------ +- +- - Data Type: struct sigvec +- This data type is the BSD equivalent of `struct sigaction' (*note +- Advanced Signal Handling::); it is used to specify signal actions +- to the `sigvec' function. It contains the following members: +- +- `sighandler_t sv_handler' +- This is the handler function. +- +- `int sv_mask' +- This is the mask of additional signals to be blocked while +- the handler function is being called. +- +- `int sv_flags' +- This is a bit mask used to specify various flags which affect +- the behavior of the signal. You can also refer to this field +- as `sv_onstack'. +- +- These symbolic constants can be used to provide values for the +-`sv_flags' field of a `sigvec' structure. This field is a bit mask +-value, so you bitwise-OR the flags of interest to you together. +- +- - Macro: int SV_ONSTACK +- If this bit is set in the `sv_flags' field of a `sigvec' +- structure, it means to use the signal stack when delivering the +- signal. +- +- - Macro: int SV_INTERRUPT +- If this bit is set in the `sv_flags' field of a `sigvec' +- structure, it means that system calls interrupted by this kind of +- signal should not be restarted if the handler returns; instead, +- the system calls should return with a `EINTR' error status. *Note +- Interrupted Primitives::. +- +- - Macro: int SV_RESETHAND +- If this bit is set in the `sv_flags' field of a `sigvec' +- structure, it means to reset the action for the signal back to +- `SIG_DFL' when the signal is received. +- +- - Function: int sigvec (int SIGNUM, const struct sigvec *ACTION,struct +- sigvec *OLD-ACTION) +- This function is the equivalent of `sigaction' (*note Advanced +- Signal Handling::); it installs the action ACTION for the signal +- SIGNUM, returning information about the previous action in effect +- for that signal in OLD-ACTION. +- +- - Function: int siginterrupt (int SIGNUM, int FAILFLAG) +- This function specifies which approach to use when certain +- primitives are interrupted by handling signal SIGNUM. If FAILFLAG +- is false, signal SIGNUM restarts primitives. If FAILFLAG is true, +- handling SIGNUM causes these primitives to fail with error code +- `EINTR'. *Note Interrupted Primitives::. +- +- +-File: libc.info, Node: Blocking in BSD, Prev: BSD Handler, Up: BSD Signal Handling +- +-BSD Functions for Blocking Signals +----------------------------------- +- +- - Macro: int sigmask (int SIGNUM) +- This macro returns a signal mask that has the bit for signal SIGNUM +- set. You can bitwise-OR the results of several calls to `sigmask' +- together to specify more than one signal. For example, +- +- (sigmask (SIGTSTP) | sigmask (SIGSTOP) +- | sigmask (SIGTTIN) | sigmask (SIGTTOU)) +- +- specifies a mask that includes all the job-control stop signals. +- +- - Function: int sigblock (int MASK) +- This function is equivalent to `sigprocmask' (*note Process Signal +- Mask::) with a HOW argument of `SIG_BLOCK': it adds the signals +- specified by MASK to the calling process's set of blocked signals. +- The return value is the previous set of blocked signals. +- +- - Function: int sigsetmask (int MASK) +- This function equivalent to `sigprocmask' (*note Process Signal +- Mask::) with a HOW argument of `SIG_SETMASK': it sets the calling +- process's signal mask to MASK. The return value is the previous +- set of blocked signals. +- +- - Function: int sigpause (int MASK) +- This function is the equivalent of `sigsuspend' (*note Waiting for +- a Signal::): it sets the calling process's signal mask to MASK, +- and waits for a signal to arrive. On return the previous set of +- blocked signals is restored. +- +- +-File: libc.info, Node: Program Basics, Next: Processes, Prev: Signal Handling, Up: Top +- +-The Basic Program/System Interface +-********************************** +- +- "Processes" are the primitive units for allocation of system +-resources. Each process has its own address space and (usually) one +-thread of control. A process executes a program; you can have multiple +-processes executing the same program, but each process has its own copy +-of the program within its own address space and executes it +-independently of the other copies. Though it may have multiple threads +-of control within the same program and a program may be composed of +-multiple logically separate modules, a process always executes exactly +-one program. +- +- Note that we are using a specific definition of "program" for the +-purposes of this manual, which corresponds to a common definition in the +-context of Unix system. In popular usage, "program" enjoys a much +-broader definition; it can refer for example to a system's kernel, an +-editor macro, a complex package of software, or a discrete section of +-code executing within a process. +- +- Writing the program is what this manual is all about. This chapter +-explains the most basic interface between your program and the system +-that runs, or calls, it. This includes passing of parameters (arguments +-and environment) from the system, requesting basic services from the +-system, and telling the system the program is done. +- +- A program starts another program with the `exec' family of system +-calls. This chapter looks at program startup from the execee's point +-of view. To see the event from the execor's point of view, *Note +-Executing a File::. +- +-* Menu: +- +-* Program Arguments:: Parsing your program's command-line arguments. +-* Environment Variables:: Less direct parameters affecting your program +-* System Calls:: Requesting service from the system +-* Program Termination:: Telling the system you're done; return status +- +- +-File: libc.info, Node: Program Arguments, Next: Environment Variables, Up: Program Basics +- +-Program Arguments +-================= +- +- The system starts a C program by calling the function `main'. It is +-up to you to write a function named `main'--otherwise, you won't even +-be able to link your program without errors. +- +- In ISO C you can define `main' either to take no arguments, or to +-take two arguments that represent the command line arguments to the +-program, like this: +- +- int main (int ARGC, char *ARGV[]) +- +- The command line arguments are the whitespace-separated tokens given +-in the shell command used to invoke the program; thus, in `cat foo +-bar', the arguments are `foo' and `bar'. The only way a program can +-look at its command line arguments is via the arguments of `main'. If +-`main' doesn't take arguments, then you cannot get at the command line. +- +- The value of the ARGC argument is the number of command line +-arguments. The ARGV argument is a vector of C strings; its elements +-are the individual command line argument strings. The file name of the +-program being run is also included in the vector as the first element; +-the value of ARGC counts this element. A null pointer always follows +-the last element: `ARGV[ARGC]' is this null pointer. +- +- For the command `cat foo bar', ARGC is 3 and ARGV has three +-elements, `"cat"', `"foo"' and `"bar"'. +- +- In Unix systems you can define `main' a third way, using three +-arguments: +- +- int main (int ARGC, char *ARGV[], char *ENVP[]) +- +- The first two arguments are just the same. The third argument ENVP +-gives the program's environment; it is the same as the value of +-`environ'. *Note Environment Variables::. POSIX.1 does not allow this +-three-argument form, so to be portable it is best to write `main' to +-take two arguments, and use the value of `environ'. +- +-* Menu: +- +-* Argument Syntax:: By convention, options start with a hyphen. +-* Parsing Program Arguments:: Ways to parse program options and arguments. +- +- +-File: libc.info, Node: Argument Syntax, Next: Parsing Program Arguments, Up: Program Arguments +- +-Program Argument Syntax Conventions +------------------------------------ +- +- POSIX recommends these conventions for command line arguments. +-`getopt' (*note Getopt::) and `argp_parse' (*note Argp::) make it easy +-to implement them. +- +- * Arguments are options if they begin with a hyphen delimiter (`-'). +- +- * Multiple options may follow a hyphen delimiter in a single token if +- the options do not take arguments. Thus, `-abc' is equivalent to +- `-a -b -c'. +- +- * Option names are single alphanumeric characters (as for `isalnum'; +- *note Classification of Characters::). +- +- * Certain options require an argument. For example, the `-o' command +- of the `ld' command requires an argument--an output file name. +- +- * An option and its argument may or may not appear as separate +- tokens. (In other words, the whitespace separating them is +- optional.) Thus, `-o foo' and `-ofoo' are equivalent. +- +- * Options typically precede other non-option arguments. +- +- The implementations of `getopt' and `argp_parse' in the GNU C +- library normally make it appear as if all the option arguments were +- specified before all the non-option arguments for the purposes of +- parsing, even if the user of your program intermixed option and +- non-option arguments. They do this by reordering the elements of +- the ARGV array. This behavior is nonstandard; if you want to +- suppress it, define the `_POSIX_OPTION_ORDER' environment variable. +- *Note Standard Environment::. +- +- * The argument `--' terminates all options; any following arguments +- are treated as non-option arguments, even if they begin with a +- hyphen. +- +- * A token consisting of a single hyphen character is interpreted as +- an ordinary non-option argument. By convention, it is used to +- specify input from or output to the standard input and output +- streams. +- +- * Options may be supplied in any order, or appear multiple times. +- The interpretation is left up to the particular application +- program. +- +- GNU adds "long options" to these conventions. Long options consist +-of `--' followed by a name made of alphanumeric characters and dashes. +-Option names are typically one to three words long, with hyphens to +-separate words. Users can abbreviate the option names as long as the +-abbreviations are unique. +- +- To specify an argument for a long option, write `--NAME=VALUE'. +-This syntax enables a long option to accept an argument that is itself +-optional. +- +- Eventually, the GNU system will provide completion for long option +-names in the shell. +- +- +-File: libc.info, Node: Parsing Program Arguments, Prev: Argument Syntax, Up: Program Arguments +- +-Parsing Program Arguments +-------------------------- +- +- If the syntax for the command line arguments to your program is +-simple enough, you can simply pick the arguments off from ARGV by hand. +-But unless your program takes a fixed number of arguments, or all of the +-arguments are interpreted in the same way (as file names, for example), +-you are usually better off using `getopt' (*note Getopt::) or +-`argp_parse' (*note Argp::) to do the parsing. +- +- `getopt' is more standard (the short-option only version of it is a +-part of the POSIX standard), but using `argp_parse' is often easier, +-both for very simple and very complex option structures, because it +-does more of the dirty work for you. +- +-* Menu: +- +-* Getopt:: Parsing program options using `getopt'. +-* Argp:: Parsing program options using `argp_parse'. +-* Suboptions:: Some programs need more detailed options. +-* Suboptions Example:: This shows how it could be done for `mount'. +- +- +-File: libc.info, Node: Getopt, Next: Argp, Up: Parsing Program Arguments +- +-Parsing program options using `getopt' +-====================================== +- +- The `getopt' and `getopt_long' functions automate some of the chore +-involved in parsing typical unix command line options. +- +-* Menu: +- +-* Using Getopt:: Using the `getopt' function. +-* Example of Getopt:: An example of parsing options with `getopt'. +-* Getopt Long Options:: GNU suggests utilities accept long-named +- options; here is one way to do. +-* Getopt Long Option Example:: An example of using `getopt_long'. +- +- +-File: libc.info, Node: Using Getopt, Next: Example of Getopt, Up: Getopt +- +-Using the `getopt' function +---------------------------- +- +- Here are the details about how to call the `getopt' function. To +-use this facility, your program must include the header file `unistd.h'. +- +- - Variable: int opterr +- If the value of this variable is nonzero, then `getopt' prints an +- error message to the standard error stream if it encounters an +- unknown option character or an option with a missing required +- argument. This is the default behavior. If you set this variable +- to zero, `getopt' does not print any messages, but it still +- returns the character `?' to indicate an error. +- +- - Variable: int optopt +- When `getopt' encounters an unknown option character or an option +- with a missing required argument, it stores that option character +- in this variable. You can use this for providing your own +- diagnostic messages. +- +- - Variable: int optind +- This variable is set by `getopt' to the index of the next element +- of the ARGV array to be processed. Once `getopt' has found all of +- the option arguments, you can use this variable to determine where +- the remaining non-option arguments begin. The initial value of +- this variable is `1'. +- +- - Variable: char * optarg +- This variable is set by `getopt' to point at the value of the +- option argument, for those options that accept arguments. +- +- - Function: int getopt (int ARGC, char **ARGV, const char *OPTIONS) +- The `getopt' function gets the next option argument from the +- argument list specified by the ARGV and ARGC arguments. Normally +- these values come directly from the arguments received by `main'. +- +- The OPTIONS argument is a string that specifies the option +- characters that are valid for this program. An option character +- in this string can be followed by a colon (`:') to indicate that +- it takes a required argument. If an option character is followed +- by two colons (`::'), its argument is optional; this is a GNU +- extension. +- +- `getopt' has three ways to deal with options that follow +- non-options ARGV elements. The special argument `--' forces in +- all cases the end of option scanning. +- +- * The default is to permute the contents of ARGV while scanning +- it so that eventually all the non-options are at the end. +- This allows options to be given in any order, even with +- programs that were not written to expect this. +- +- * If the OPTIONS argument string begins with a hyphen (`-'), +- this is treated specially. It permits arguments that are not +- options to be returned as if they were associated with option +- character `\1'. +- +- * POSIX demands the following behavior: The first non-option +- stops option processing. This mode is selected by either +- setting the environment variable `POSIXLY_CORRECT' or +- beginning the OPTIONS argument string with a plus sign (`+'). +- +- The `getopt' function returns the option character for the next +- command line option. When no more option arguments are available, +- it returns `-1'. There may still be more non-option arguments; you +- must compare the external variable `optind' against the ARGC +- parameter to check this. +- +- If the option has an argument, `getopt' returns the argument by +- storing it in the variable OPTARG. You don't ordinarily need to +- copy the `optarg' string, since it is a pointer into the original +- ARGV array, not into a static area that might be overwritten. +- +- If `getopt' finds an option character in ARGV that was not +- included in OPTIONS, or a missing option argument, it returns `?' +- and sets the external variable `optopt' to the actual option +- character. If the first character of OPTIONS is a colon (`:'), +- then `getopt' returns `:' instead of `?' to indicate a missing +- option argument. In addition, if the external variable `opterr' +- is nonzero (which is the default), `getopt' prints an error +- message. +- +- +-File: libc.info, Node: Example of Getopt, Next: Getopt Long Options, Prev: Using Getopt, Up: Getopt +- +-Example of Parsing Arguments with `getopt' +------------------------------------------- +- +- Here is an example showing how `getopt' is typically used. The key +-points to notice are: +- +- * Normally, `getopt' is called in a loop. When `getopt' returns +- `-1', indicating no more options are present, the loop terminates. +- +- * A `switch' statement is used to dispatch on the return value from +- `getopt'. In typical use, each case just sets a variable that is +- used later in the program. +- +- * A second loop is used to process the remaining non-option +- arguments. +- +- #include +- #include +- +- int +- main (int argc, char **argv) +- { +- int aflag = 0; +- int bflag = 0; +- char *cvalue = NULL; +- int index; +- int c; +- +- opterr = 0; +- +- while ((c = getopt (argc, argv, "abc:")) != -1) +- switch (c) +- { +- case 'a': +- aflag = 1; +- break; +- case 'b': +- bflag = 1; +- break; +- case 'c': +- cvalue = optarg; +- break; +- case '?': +- if (isprint (optopt)) +- fprintf (stderr, "Unknown option `-%c'.\n", optopt); +- else +- fprintf (stderr, +- "Unknown option character `\\x%x'.\n", +- optopt); +- return 1; +- default: +- abort (); +- } +- +- printf ("aflag = %d, bflag = %d, cvalue = %s\n", +- aflag, bflag, cvalue); +- +- for (index = optind; index < argc; index++) +- printf ("Non-option argument %s\n", argv[index]); +- return 0; +- } +- +- Here are some examples showing what this program prints with +-different combinations of arguments: +- +- % testopt +- aflag = 0, bflag = 0, cvalue = (null) +- +- % testopt -a -b +- aflag = 1, bflag = 1, cvalue = (null) +- +- % testopt -ab +- aflag = 1, bflag = 1, cvalue = (null) +- +- % testopt -c foo +- aflag = 0, bflag = 0, cvalue = foo +- +- % testopt -cfoo +- aflag = 0, bflag = 0, cvalue = foo +- +- % testopt arg1 +- aflag = 0, bflag = 0, cvalue = (null) +- Non-option argument arg1 +- +- % testopt -a arg1 +- aflag = 1, bflag = 0, cvalue = (null) +- Non-option argument arg1 +- +- % testopt -c foo arg1 +- aflag = 0, bflag = 0, cvalue = foo +- Non-option argument arg1 +- +- % testopt -a -- -b +- aflag = 1, bflag = 0, cvalue = (null) +- Non-option argument -b +- +- % testopt -a - +- aflag = 1, bflag = 0, cvalue = (null) +- Non-option argument - +- +- +-File: libc.info, Node: Getopt Long Options, Next: Getopt Long Option Example, Prev: Example of Getopt, Up: Getopt +- +-Parsing Long Options with `getopt_long' +---------------------------------------- +- +- To accept GNU-style long options as well as single-character options, +-use `getopt_long' instead of `getopt'. This function is declared in +-`getopt.h', not `unistd.h'. You should make every program accept long +-options if it uses any options, for this takes little extra work and +-helps beginners remember how to use the program. +- +- - Data Type: struct option +- This structure describes a single long option name for the sake of +- `getopt_long'. The argument LONGOPTS must be an array of these +- structures, one for each long option. Terminate the array with an +- element containing all zeros. +- +- The `struct option' structure has these fields: +- +- `const char *name' +- This field is the name of the option. It is a string. +- +- `int has_arg' +- This field says whether the option takes an argument. It is +- an integer, and there are three legitimate values: +- `no_argument', `required_argument' and `optional_argument'. +- +- `int *flag' +- `int val' +- These fields control how to report or act on the option when +- it occurs. +- +- If `flag' is a null pointer, then the `val' is a value which +- identifies this option. Often these values are chosen to +- uniquely identify particular long options. +- +- If `flag' is not a null pointer, it should be the address of +- an `int' variable which is the flag for this option. The +- value in `val' is the value to store in the flag to indicate +- that the option was seen. +- +- - Function: int getopt_long (int ARGC, char *const *ARGV, const char +- *SHORTOPTS, const struct option *LONGOPTS, int *INDEXPTR) +- Decode options from the vector ARGV (whose length is ARGC). The +- argument SHORTOPTS describes the short options to accept, just as +- it does in `getopt'. The argument LONGOPTS describes the long +- options to accept (see above). +- +- When `getopt_long' encounters a short option, it does the same +- thing that `getopt' would do: it returns the character code for the +- option, and stores the options argument (if it has one) in +- `optarg'. +- +- When `getopt_long' encounters a long option, it takes actions based +- on the `flag' and `val' fields of the definition of that option. +- +- If `flag' is a null pointer, then `getopt_long' returns the +- contents of `val' to indicate which option it found. You should +- arrange distinct values in the `val' field for options with +- different meanings, so you can decode these values after +- `getopt_long' returns. If the long option is equivalent to a short +- option, you can use the short option's character code in `val'. +- +- If `flag' is not a null pointer, that means this option should just +- set a flag in the program. The flag is a variable of type `int' +- that you define. Put the address of the flag in the `flag' field. +- Put in the `val' field the value you would like this option to +- store in the flag. In this case, `getopt_long' returns `0'. +- +- For any long option, `getopt_long' tells you the index in the array +- LONGOPTS of the options definition, by storing it into +- `*INDEXPTR'. You can get the name of the option with +- `LONGOPTS[*INDEXPTR].name'. So you can distinguish among long +- options either by the values in their `val' fields or by their +- indices. You can also distinguish in this way among long options +- that set flags. +- +- When a long option has an argument, `getopt_long' puts the argument +- value in the variable `optarg' before returning. When the option +- has no argument, the value in `optarg' is a null pointer. This is +- how you can tell whether an optional argument was supplied. +- +- When `getopt_long' has no more options to handle, it returns `-1', +- and leaves in the variable `optind' the index in ARGV of the next +- remaining argument. +- +- Since long option names were used before before the `getopt_long' +-options was invented there are program interfaces which require programs +-to recognize options like `-option value' instead of `--option value'. +-To enable these programs to use the GNU getopt functionality there is +-one more function available. +- +- - Function: int getopt_long_only (int ARGC, char *const *ARGV, const +- char *SHORTOPTS, const struct option *LONGOPTS, int *INDEXPTR) +- The `getopt_long_only' function is equivalent to the `getopt_long' +- function but it allows to specify the user of the application to +- pass long options with only `-' instead of `--'. The `--' prefix +- is still recognized but instead of looking through the short +- options if a `-' is seen it is first tried whether this parameter +- names a long option. If not, it is parsed as a short option. +- +- Assuming `getopt_long_only' is used starting an application with +- +- app -foo +- +- the `getopt_long_only' will first look for a long option named +- `foo'. If this is not found, the short options `f', `o', and +- again `o' are recognized. +- +- +-File: libc.info, Node: Getopt Long Option Example, Prev: Getopt Long Options, Up: Getopt +- +-Example of Parsing Long Options with `getopt_long' +--------------------------------------------------- +- +- #include +- #include +- #include +- +- /* Flag set by `--verbose'. */ +- static int verbose_flag; +- +- int +- main (argc, argv) +- int argc; +- char **argv; +- { +- int c; +- +- while (1) +- { +- static struct option long_options[] = +- { +- /* These options set a flag. */ +- {"verbose", no_argument, &verbose_flag, 1}, +- {"brief", no_argument, &verbose_flag, 0}, +- /* These options don't set a flag. +- We distinguish them by their indices. */ +- {"add", no_argument, 0, 'a'}, +- {"append", no_argument, 0, 'b'}, +- {"delete", required_argument, 0, 'd'}, +- {"create", required_argument, 0, 'c'}, +- {"file", required_argument, 0, 'f'}, +- {0, 0, 0, 0} +- }; +- /* `getopt_long' stores the option index here. */ +- int option_index = 0; +- +- c = getopt_long (argc, argv, "abc:d:f:", +- long_options, &option_index); +- +- /* Detect the end of the options. */ +- if (c == -1) +- break; +- +- switch (c) +- { +- case 0: +- /* If this option set a flag, do nothing else now. */ +- if (long_options[option_index].flag != 0) +- break; +- printf ("option %s", long_options[option_index].name); +- if (optarg) +- printf (" with arg %s", optarg); +- printf ("\n"); +- break; +- +- case 'a': +- puts ("option -a\n"); +- break; +- +- case 'b': +- puts ("option -b\n"); +- break; +- +- case 'c': +- printf ("option -c with value `%s'\n", optarg); +- break; +- +- case 'd': +- printf ("option -d with value `%s'\n", optarg); +- break; +- +- case 'f': +- printf ("option -f with value `%s'\n", optarg); +- break; +- +- case '?': +- /* `getopt_long' already printed an error message. */ +- break; +- +- default: +- abort (); +- } +- } +- +- /* Instead of reporting `--verbose' +- and `--brief' as they are encountered, +- we report the final status resulting from them. */ +- if (verbose_flag) +- puts ("verbose flag is set"); +- +- /* Print any remaining command line arguments (not options). */ +- if (optind < argc) +- { +- printf ("non-option ARGV-elements: "); +- while (optind < argc) +- printf ("%s ", argv[optind++]); +- putchar ('\n'); +- } +- +- exit (0); +- } +- +- +-File: libc.info, Node: Argp, Next: Suboptions, Prev: Getopt, Up: Parsing Program Arguments +- +-Parsing Program Options with Argp +-================================= +- +- "Argp" is an interface for parsing unix-style argument vectors. +-*Note Program Arguments::. +- +- Argp provides features unavailable in the more commonly used +-`getopt' interface. These features include automatically producing +-output in response to the `--help' and `--version' options, as +-described in the GNU coding standards. Using argp makes it less likely +-that programmers will neglect to implement these additional options or +-keep them up to date. +- +- Argp also provides the ability to merge several independently defined +-option parsers into one, mediating conflicts between them and making the +-result appear seamless. A library can export an argp option parser that +-user programs might employ in conjunction with their own option parsers, +-resulting in less work for the user programs. Some programs may use +-only argument parsers exported by libraries, thereby achieving +-consistent and efficient option-parsing for abstractions implemented by +-the libraries. +- +- The header file `' should be included to use argp. +- +-The `argp_parse' Function +-------------------------- +- +- The main interface to argp is the `argp_parse' function. In many +-cases, calling `argp_parse' is the only argument-parsing code needed in +-`main'. *Note Program Arguments::. +- +- - Function: error_t argp_parse (const struct argp *ARGP, int ARGC, +- char **ARGV, unsigned FLAGS, int *ARG_INDEX, void *INPUT) +- The `argp_parse' function parses the arguments in ARGV, of length +- ARGC, using the argp parser ARGP. *Note Argp Parsers::. +- +- A value of zero is the same as a `struct argp'containing all +- zeros. FLAGS is a set of flag bits that modify the parsing +- behavior. *Note Argp Flags::. INPUT is passed through to the argp +- parser ARGP, and has meaning defined by ARGP. A typical usage is +- to pass a pointer to a structure which is used for specifying +- parameters to the parser and passing back the results. +- +- Unless the `ARGP_NO_EXIT' or `ARGP_NO_HELP' flags are included in +- FLAGS, calling `argp_parse' may result in the program exiting. +- This behavior is true if an error is detected, or when an unknown +- option is encountered. *Note Program Termination::. +- +- If ARG_INDEX is non-null, the index of the first unparsed option +- in ARGV is returned as a value. +- +- The return value is zero for successful parsing, or an error code +- (*note Error Codes::) if an error is detected. Different argp +- parsers may return arbitrary error codes, but the standard error +- codes are: `ENOMEM' if a memory allocation error occurred, or +- `EINVAL' if an unknown option or option argument is encountered. +- +-* Menu: +- +-* Globals: Argp Global Variables. Global argp parameters. +-* Parsers: Argp Parsers. Defining parsers for use with `argp_parse'. +-* Flags: Argp Flags. Flags that modify the behavior of `argp_parse'. +-* Help: Argp Help. Printing help messages when not parsing. +-* Examples: Argp Examples. Simple examples of programs using argp. +-* Customization: Argp User Customization. +- Users may control the `--help' output format. +- +- +-File: libc.info, Node: Argp Global Variables, Next: Argp Parsers, Up: Argp +- +-Argp Global Variables +---------------------- +- +- These variables make it easy for user programs to implement the +-`--version' option and provide a bug-reporting address in the `--help' +-output. These are implemented in argp by default. +- +- - Variable: const char * argp_program_version +- If defined or set by the user program to a non-zero value, then a +- `--version' option is added when parsing with `argp_parse', which +- will print the `--version' string followed by a newline and exit. +- The exception to this is if the `ARGP_NO_EXIT' flag is used. +- +- - Variable: const char * argp_program_bug_address +- If defined or set by the user program to a non-zero value, +- `argp_program_bug_address' should point to a string that will be +- printed at the end of the standard output for the `--help' option, +- embedded in a sentence that says `Report bugs to ADDRESS.'. +- +- - Variable: argp_program_version_hook +- If defined or set by the user program to a non-zero value, a +- `--version' option is added when parsing with `arg_parse', which +- prints the program version and exits with a status of zero. This +- is not the case if the `ARGP_NO_HELP' flag is used. If the +- `ARGP_NO_EXIT' flag is set, the exit behavior of the program is +- suppressed or modified, as when the argp parser is going to be +- used by other programs. +- +- It should point to a function with this type of signature: +- +- void PRINT-VERSION (FILE *STREAM, struct argp_state *STATE) +- +- *Note Argp Parsing State::, for an explanation of STATE. +- +- This variable takes precedence over `argp_program_version', and is +- useful if a program has version information not easily expressed +- in a simple string. +- +- - Variable: error_t argp_err_exit_status +- This is the exit status used when argp exits due to a parsing +- error. If not defined or set by the user program, this defaults +- to: `EX_USAGE' from `'. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-42 glibc-2.3.2-200304020432/manual/libc.info-42 +--- glibc-2.3.2/manual/libc.info-42 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-42 Thu Jan 1 01:00:00 1970 +@@ -1,1121 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Argp Parsers, Next: Argp Flags, Prev: Argp Global Variables, Up: Argp +- +-Specifying Argp Parsers +------------------------ +- +- The first argument to the `argp_parse' function is a pointer to a +-`struct argp', which is known as an "argp parser": +- +- - Data Type: struct argp +- This structure specifies how to parse a given set of options and +- arguments, perhaps in conjunction with other argp parsers. It has +- the following fields: +- +- `const struct argp_option *options' +- A pointer to a vector of `argp_option' structures specifying +- which options this argp parser understands; it may be zero if +- there are no options at all. *Note Argp Option Vectors::. +- +- `argp_parser_t parser' +- A pointer to a function that defines actions for this parser; +- it is called for each option parsed, and at other +- well-defined points in the parsing process. A value of zero +- is the same as a pointer to a function that always returns +- `ARGP_ERR_UNKNOWN'. *Note Argp Parser Functions::. +- +- `const char *args_doc' +- If non-zero, a string describing what non-option arguments +- are called by this parser. This is only used to print the +- `Usage:' message. If it contains newlines, the strings +- separated by them are considered alternative usage patterns +- and printed on separate lines. Lines after the first are +- prefixed by ` or: ' instead of `Usage:'. +- +- `const char *doc' +- If non-zero, a string containing extra text to be printed +- before and after the options in a long help message, with the +- two sections separated by a vertical tab (`'\v'', `'\013'') +- character. By convention, the documentation before the +- options is just a short string explaining what the program +- does. Documentation printed after the options describe +- behavior in more detail. +- +- `const struct argp_child *children' +- A pointer to a vector of `argp_children' structures. This +- pointer specifies which additional argp parsers should be +- combined with this one. *Note Argp Children::. +- +- `char *(*help_filter)(int KEY, const char *TEXT, void *INPUT)' +- If non-zero, a pointer to a function that filters the output +- of help messages. *Note Argp Help Filtering::. +- +- `const char *argp_domain' +- If non-zero, the strings used in the argp library are +- translated using the domain described by this string. If +- zero, the current default domain is used. +- +- +- Of the above group, `options', `parser', `args_doc', and the `doc' +-fields are usually all that are needed. If an argp parser is defined +-as an initialized C variable, only the fields used need be specified in +-the initializer. The rest will default to zero due to the way C +-structure initialization works. This design is exploited in most argp +-structures; the most-used fields are grouped near the beginning, the +-unused fields left unspecified. +- +-* Menu: +- +-* Options: Argp Option Vectors. Specifying options in an argp parser. +-* Argp Parser Functions:: Defining actions for an argp parser. +-* Children: Argp Children. Combining multiple argp parsers. +-* Help Filtering: Argp Help Filtering. Customizing help output for an argp parser. +- +- +-File: libc.info, Node: Argp Option Vectors, Next: Argp Parser Functions, Prev: Argp Parsers, Up: Argp Parsers +- +-Specifying Options in an Argp Parser +------------------------------------- +- +- The `options' field in a `struct argp' points to a vector of `struct +-argp_option' structures, each of which specifies an option that the +-argp parser supports. Multiple entries may be used for a single option +-provided it has multiple names. This should be terminated by an entry +-with zero in all fields. Note that when using an initialized C array +-for options, writing `{ 0 }' is enough to achieve this. +- +- - Data Type: struct argp_option +- This structure specifies a single option that an argp parser +- understands, as well as how to parse and document that option. It +- has the following fields: +- +- `const char *name' +- The long name for this option, corresponding to the long +- option `--NAME'; this field may be zero if this option _only_ +- has a short name. To specify multiple names for an option, +- additional entries may follow this one, with the +- `OPTION_ALIAS' flag set. *Note Argp Option Flags::. +- +- `int key' +- The integer key provided by the current option to the option +- parser. If KEY has a value that is a printable ASCII +- character (i.e., `isascii (KEY)' is true), it _also_ +- specifies a short option `-CHAR', where CHAR is the ASCII +- character with the code KEY. +- +- `const char *arg' +- If non-zero, this is the name of an argument associated with +- this option, which must be provided (e.g., with the +- `--NAME=VALUE' or `-CHAR VALUE' syntaxes), unless the +- `OPTION_ARG_OPTIONAL' flag (*note Argp Option Flags::) is +- set, in which case it _may_ be provided. +- +- `int flags' +- Flags associated with this option, some of which are referred +- to above. *Note Argp Option Flags::. +- +- `const char *doc' +- A documentation string for this option, for printing in help +- messages. +- +- If both the `name' and `key' fields are zero, this string +- will be printed tabbed left from the normal option column, +- making it useful as a group header. This will be the first +- thing printed in its group. In this usage, it's conventional +- to end the string with a `:' character. +- +- `int group' +- Group identity for this option. +- +- In a long help message, options are sorted alphabetically +- within each group, and the groups presented in the order 0, +- 1, 2, ..., N, -M, ..., -2, -1. +- +- Every entry in an options array with this field 0 will +- inherit the group number of the previous entry, or zero if +- it's the first one. If it's a group header with `name' and +- `key' fields both zero, the previous entry + 1 is the +- default. Automagic options such as `--help' are put into +- group -1. +- +- Note that because of C structure initialization rules, this +- field often need not be specified, because 0 is the correct +- value. +- +-* Menu: +- +-* Flags: Argp Option Flags. Flags for options. +- +- +-File: libc.info, Node: Argp Option Flags, Up: Argp Option Vectors +- +-Flags for Argp Options +-...................... +- +- The following flags may be or'd together in the `flags' field of a +-`struct argp_option'. These flags control various aspects of how that +-option is parsed or displayed in help messages: +- +-`OPTION_ARG_OPTIONAL' +- The argument associated with this option is optional. +- +-`OPTION_HIDDEN' +- This option isn't displayed in any help messages. +- +-`OPTION_ALIAS' +- This option is an alias for the closest previous non-alias option. +- This means that it will be displayed in the same help entry, and +- will inherit fields other than `name' and `key' from the option +- being aliased. +- +-`OPTION_DOC' +- This option isn't actually an option and should be ignored by the +- actual option parser. It is an arbitrary section of documentation +- that should be displayed in much the same manner as the options. +- This is known as a "documentation option". +- +- If this flag is set, then the option `name' field is displayed +- unmodified (e.g., no `--' prefix is added) at the left-margin where +- a _short_ option would normally be displayed, and this +- documentation string is left in it's usual place. For purposes of +- sorting, any leading whitespace and punctuation is ignored, unless +- the first non-whitespace character is `-'. This entry is displayed +- after all options, after `OPTION_DOC' entries with a leading `-', +- in the same group. +- +-`OPTION_NO_USAGE' +- This option shouldn't be included in `long' usage messages, but +- should still be included in other help messages. This is intended +- for options that are completely documented in an argp's `args_doc' +- field. *Note Argp Parsers::. Including this option in the +- generic usage list would be redundant, and should be avoided. +- +- For instance, if `args_doc' is `"FOO BAR\n-x BLAH"', and the `-x' +- option's purpose is to distinguish these two cases, `-x' should +- probably be marked `OPTION_NO_USAGE'. +- +- +-File: libc.info, Node: Argp Parser Functions, Next: Argp Children, Prev: Argp Option Vectors, Up: Argp Parsers +- +-Argp Parser Functions +---------------------- +- +- The function pointed to by the `parser' field in a `struct argp' +-(*note Argp Parsers::) defines what actions take place in response to +-each option or argument parsed. It is also used as a hook, allowing a +-parser to perform tasks at certain other points during parsing. +- +- Argp parser functions have the following type signature: +- +- error_t PARSER (int KEY, char *ARG, struct argp_state *STATE) +- +-where the arguments are as follows: +- +-KEY +- For each option that is parsed, PARSER is called with a value of +- KEY from that option's `key' field in the option vector. *Note +- Argp Option Vectors::. PARSER is also called at other times with +- special reserved keys, such as `ARGP_KEY_ARG' for non-option +- arguments. *Note Argp Special Keys::. +- +-ARG +- If KEY is an option, ARG is its given value. This defaults to +- zero if no value is specified. Only options that have a non-zero +- `arg' field can ever have a value. These must _always_ have a +- value unless the `OPTION_ARG_OPTIONAL' flag is specified. If the +- input being parsed specifies a value for an option that doesn't +- allow one, an error results before PARSER ever gets called. +- +- If KEY is `ARGP_KEY_ARG', ARG is a non-option argument. Other +- special keys always have a zero ARG. +- +-STATE +- STATE points to a `struct argp_state', containing useful +- information about the current parsing state for use by PARSER. +- *Note Argp Parsing State::. +- +- When PARSER is called, it should perform whatever action is +-appropriate for KEY, and return `0' for success, `ARGP_ERR_UNKNOWN' if +-the value of KEY is not handled by this parser function, or a unix +-error code if a real error occurred. *Note Error Codes::. +- +- - Macro: int ARGP_ERR_UNKNOWN +- Argp parser functions should return `ARGP_ERR_UNKNOWN' for any KEY +- value they do not recognize, or for non-option arguments (`KEY == +- ARGP_KEY_ARG') that they are not equipped to handle. +- +- A typical parser function uses a switch statement on KEY: +- +- error_t +- parse_opt (int key, char *arg, struct argp_state *state) +- { +- switch (key) +- { +- case OPTION_KEY: +- ACTION +- break; +- ... +- default: +- return ARGP_ERR_UNKNOWN; +- } +- return 0; +- } +- +-* Menu: +- +-* Keys: Argp Special Keys. Special values for the KEY argument. +-* State: Argp Parsing State. What the STATE argument refers to. +-* Functions: Argp Helper Functions. Functions to help during argp parsing. +- +- +-File: libc.info, Node: Argp Special Keys, Next: Argp Parsing State, Up: Argp Parser Functions +- +-Special Keys for Argp Parser Functions +-...................................... +- +- In addition to key values corresponding to user options, the KEY +-argument to argp parser functions may have a number of other special +-values. In the following example ARG and STATE refer to parser +-function arguments. *Note Argp Parser Functions::. +- +-`ARGP_KEY_ARG' +- This is not an option at all, but rather a command line argument, +- whose value is pointed to by ARG. +- +- When there are multiple parser functions in play due to argp +- parsers being combined, it's impossible to know which one will +- handle a specific argument. Each is called until one returns 0 or +- an error other than `ARGP_ERR_UNKNOWN'; if an argument is not +- handled, `argp_parse' immediately returns success, without parsing +- any more arguments. +- +- Once a parser function returns success for this key, that fact is +- recorded, and the `ARGP_KEY_NO_ARGS' case won't be used. +- _However_, if while processing the argument a parser function +- decrements the `next' field of its STATE argument, the option +- won't be considered processed; this is to allow you to actually +- modify the argument, perhaps into an option, and have it processed +- again. +- +-`ARGP_KEY_ARGS' +- If a parser function returns `ARGP_ERR_UNKNOWN' for +- `ARGP_KEY_ARG', it is immediately called again with the key +- `ARGP_KEY_ARGS', which has a similar meaning, but is slightly more +- convenient for consuming all remaining arguments. ARG is 0, and +- the tail of the argument vector may be found at `STATE->argv + +- STATE->next'. If success is returned for this key, and +- `STATE->next' is unchanged, all remaining arguments are considered +- to have been consumed. Otherwise, the amount by which +- `STATE->next' has been adjusted indicates how many were used. +- Here's an example that uses both, for different args: +- +- ... +- case ARGP_KEY_ARG: +- if (STATE->arg_num == 0) +- /* First argument */ +- first_arg = ARG; +- else +- /* Let the next case parse it. */ +- return ARGP_KEY_UNKNOWN; +- break; +- case ARGP_KEY_ARGS: +- remaining_args = STATE->argv + STATE->next; +- num_remaining_args = STATE->argc - STATE->next; +- break; +- +-`ARGP_KEY_END' +- This indicates that there are no more command line arguments. +- Parser functions are called in a different order, children first. +- This allows each parser to clean up its state for the parent. +- +-`ARGP_KEY_NO_ARGS' +- Because it's common to do some special processing if there aren't +- any non-option args, parser functions are called with this key if +- they didn't successfully process any non-option arguments. This +- is called just before `ARGP_KEY_END', where more general validity +- checks on previously parsed arguments take place. +- +-`ARGP_KEY_INIT' +- This is passed in before any parsing is done. Afterwards, the +- values of each element of the `child_input' field of STATE, if +- any, are copied to each child's state to be the initial value of +- the `input' when _their_ parsers are called. +- +-`ARGP_KEY_SUCCESS' +- Passed in when parsing has successfully been completed, even if +- arguments remain. +- +-`ARGP_KEY_ERROR' +- Passed in if an error has occurred and parsing is terminated. In +- this case a call with a key of `ARGP_KEY_SUCCESS' is never made. +- +-`ARGP_KEY_FINI' +- The final key ever seen by any parser, even after +- `ARGP_KEY_SUCCESS' and `ARGP_KEY_ERROR'. Any resources allocated +- by `ARGP_KEY_INIT' may be freed here. At times, certain resources +- allocated are to be returned to the caller after a successful +- parse. In that case, those particular resources can be freed in +- the `ARGP_KEY_ERROR' case. +- +- In all cases, `ARGP_KEY_INIT' is the first key seen by parser +-functions, and `ARGP_KEY_FINI' the last, unless an error was returned +-by the parser for `ARGP_KEY_INIT'. Other keys can occur in one the +-following orders. OPT refers to an arbitrary option key: +- +-OPT... `ARGP_KEY_NO_ARGS' `ARGP_KEY_END' `ARGP_KEY_SUCCESS' +- The arguments being parsed did not contain any non-option +- arguments. +- +-( OPT | `ARGP_KEY_ARG' )... `ARGP_KEY_END' `ARGP_KEY_SUCCESS' +- All non-option arguments were successfully handled by a parser +- function. There may be multiple parser functions if multiple argp +- parsers were combined. +- +-( OPT | `ARGP_KEY_ARG' )... `ARGP_KEY_SUCCESS' +- Some non-option argument went unrecognized. +- +- This occurs when every parser function returns `ARGP_KEY_UNKNOWN' +- for an argument, in which case parsing stops at that argument if +- ARG_INDEX is a null pointer. Otherwise an error occurs. +- +- In all cases, if a non-null value for ARG_INDEX gets passed to +-`argp_parse', the index of the first unparsed command-line argument is +-passed back in that value. +- +- If an error occurs and is either detected by argp or because a parser +-function returned an error value, each parser is called with +-`ARGP_KEY_ERROR'. No further calls are made, except the final call +-with `ARGP_KEY_FINI'. +- +- +-File: libc.info, Node: Argp Helper Functions, Prev: Argp Parsing State, Up: Argp Parser Functions +- +-Functions For Use in Argp Parsers +-................................. +- +- Argp provides a number of functions available to the user of argp +-(*note Argp Parser Functions::), mostly for producing error messages. +-These take as their first argument the STATE argument to the parser +-function. *Note Argp Parsing State::. +- +- - Function: void argp_usage (const struct argp_state *STATE) +- Outputs the standard usage message for the argp parser referred to +- by STATE to `STATE->err_stream' and terminate the program with +- `exit (argp_err_exit_status)'. *Note Argp Global Variables::. +- +- - Function: void argp_error (const struct argp_state *STATE, const +- char *FMT, ...) +- Prints the printf format string FMT and following args, preceded +- by the program name and `:', and followed by a `Try ... --help' +- message, and terminates the program with an exit status of +- `argp_err_exit_status'. *Note Argp Global Variables::. +- +- - Function: void argp_failure (const struct argp_state *STATE, int +- STATUS, int ERRNUM, const char *FMT, ...) +- Similar to the standard gnu error-reporting function `error', this +- prints the program name and `:', the printf format string FMT, and +- the appropriate following args. If it is non-zero, the standard +- unix error text for ERRNUM is printed. If STATUS is non-zero, it +- terminates the program with that value as its exit status. +- +- The difference between `argp_failure' and `argp_error' is that +- `argp_error' is for _parsing errors_, whereas `argp_failure' is +- for other problems that occur during parsing but don't reflect a +- syntactic problem with the input, such as illegal values for +- options, bad phase of the moon, etc. +- +- - Function: void argp_state_help (const struct argp_state *STATE, FILE +- *STREAM, unsigned FLAGS) +- Outputs a help message for the argp parser referred to by STATE, +- to STREAM. The FLAGS argument determines what sort of help +- message is produced. *Note Argp Help Flags::. +- +- Error output is sent to `STATE->err_stream', and the program name +-printed is `STATE->name'. +- +- The output or program termination behavior of these functions may be +-suppressed if the `ARGP_NO_EXIT' or `ARGP_NO_ERRS' flags are passed to +-`argp_parse'. *Note Argp Flags::. +- +- This behavior is useful if an argp parser is exported for use by +-other programs (e.g., by a library), and may be used in a context where +-it is not desirable to terminate the program in response to parsing +-errors. In argp parsers intended for such general use, and for the +-case where the program _doesn't_ terminate, calls to any of these +-functions should be followed by code that returns the appropriate error +-code: +- +- if (BAD ARGUMENT SYNTAX) +- { +- argp_usage (STATE); +- return EINVAL; +- } +- +-If a parser function will _only_ be used when `ARGP_NO_EXIT' is not +-set, the return may be omitted. +- +- +-File: libc.info, Node: Argp Parsing State, Next: Argp Helper Functions, Prev: Argp Special Keys, Up: Argp Parser Functions +- +-Argp Parsing State +-.................. +- +- The third argument to argp parser functions (*note Argp Parser +-Functions::) is a pointer to a `struct argp_state', which contains +-information about the state of the option parsing. +- +- - Data Type: struct argp_state +- This structure has the following fields, which may be modified as +- noted: +- +- `const struct argp *const root_argp' +- The top level argp parser being parsed. Note that this is +- often _not_ the same `struct argp' passed into `argp_parse' by +- the invoking program. *Note Argp::. It is an internal argp +- parser that contains options implemented by `argp_parse' +- itself, such as `--help'. +- +- `int argc' +- `char **argv' +- The argument vector being parsed. This may be modified. +- +- `int next' +- The index in `argv' of the next argument to be parsed. This +- may be modified. +- +- One way to consume all remaining arguments in the input is to +- set `STATE->next = STATE->argc', perhaps after recording the +- value of the `next' field to find the consumed arguments. The +- current option can be re-parsed immediately by decrementing +- this field, then modifying `STATE->argv[STATE->next]' to +- reflect the option that should be reexamined. +- +- `unsigned flags' +- The flags supplied to `argp_parse'. These may be modified, +- although some flags may only take effect when `argp_parse' is +- first invoked. *Note Argp Flags::. +- +- `unsigned arg_num' +- While calling a parsing function with the KEY argument +- `ARGP_KEY_ARG', this represents the number of the current arg, +- starting at 0. It is incremented after each `ARGP_KEY_ARG' +- call returns. At all other times, this is the number of +- `ARGP_KEY_ARG' arguments that have been processed. +- +- `int quoted' +- If non-zero, the index in `argv' of the first argument +- following a special `--' argument. This prevents anything +- that follows from being interpreted as an option. It is only +- set after argument parsing has proceeded past this point. +- +- `void *input' +- An arbitrary pointer passed in from the caller of +- `argp_parse', in the INPUT argument. +- +- `void **child_inputs' +- These are values that will be passed to child parsers. This +- vector will be the same length as the number of children in +- the current parser. Each child parser will be given the +- value of `STATE->child_inputs[I]' as _its_ `STATE->input' +- field, where I is the index of the child in the this parser's +- `children' field. *Note Argp Children::. +- +- `void *hook' +- For the parser function's use. Initialized to 0, but +- otherwise ignored by argp. +- +- `char *name' +- The name used when printing messages. This is initialized to +- `argv[0]', or `program_invocation_name' if `argv[0]' is +- unavailable. +- +- `FILE *err_stream' +- `FILE *out_stream' +- The stdio streams used when argp prints. Error messages are +- printed to `err_stream', all other output, such as `--help' +- output) to `out_stream'. These are initialized to `stderr' +- and `stdout' respectively. *Note Standard Streams::. +- +- `void *pstate' +- Private, for use by the argp implementation. +- +- +-File: libc.info, Node: Argp Children, Next: Argp Help Filtering, Prev: Argp Parser Functions, Up: Argp Parsers +- +-Combining Multiple Argp Parsers +-------------------------------- +- +- The `children' field in a `struct argp' enables other argp parsers +-to be combined with the referencing one for the parsing of a single set +-of arguments. This field should point to a vector of `struct +-argp_child', which is terminated by an entry having a value of zero in +-the `argp' field. +- +- Where conflicts between combined parsers arise, as when two specify +-an option with the same name, the parser conflicts are resolved in +-favor of the parent argp parser(s), or the earlier of the argp parsers +-in the list of children. +- +- - Data Type: struct argp_child +- An entry in the list of subsidiary argp parsers pointed to by the +- `children' field in a `struct argp'. The fields are as follows: +- +- `const struct argp *argp' +- The child argp parser, or zero to end of the list. +- +- `int flags' +- Flags for this child. +- +- `const char *header' +- If non-zero, this is an optional header to be printed within +- help output before the child options. As a side-effect, a +- non-zero value forces the child options to be grouped +- together. To achieve this effect without actually printing a +- header string, use a value of `""'. As with header strings +- specified in an option entry, the conventional value of the +- last character is `:'. *Note Argp Option Vectors::. +- +- `int group' +- This is where the child options are grouped relative to the +- other `consolidated' options in the parent argp parser. The +- values are the same as the `group' field in `struct +- argp_option'. *Note Argp Option Vectors::. All +- child-groupings follow parent options at a particular group +- level. If both this field and `header' are zero, then the +- child's options aren't grouped together, they are merged with +- parent options at the parent option group level. +- +- +- +-File: libc.info, Node: Argp Flags, Next: Argp Help, Prev: Argp Parsers, Up: Argp +- +-Flags for `argp_parse' +----------------------- +- +- The default behavior of `argp_parse' is designed to be convenient +-for the most common case of parsing program command line argument. To +-modify these defaults, the following flags may be or'd together in the +-FLAGS argument to `argp_parse': +- +-`ARGP_PARSE_ARGV0' +- Don't ignore the first element of the ARGV argument to +- `argp_parse'. Unless `ARGP_NO_ERRS' is set, the first element of +- the argument vector is skipped for option parsing purposes, as it +- corresponds to the program name in a command line. +- +-`ARGP_NO_ERRS' +- Don't print error messages for unknown options to `stderr'; unless +- this flag is set, `ARGP_PARSE_ARGV0' is ignored, as `argv[0]' is +- used as the program name in the error messages. This flag implies +- `ARGP_NO_EXIT'. This is based on the assumption that silent +- exiting upon errors is bad behavior. +- +-`ARGP_NO_ARGS' +- Don't parse any non-option args. Normally these are parsed by +- calling the parse functions with a key of `ARGP_KEY_ARG', the +- actual argument being the value. This flag needn't normally be +- set, as the default behavior is to stop parsing as soon as an +- argument fails to be parsed. *Note Argp Parser Functions::. +- +-`ARGP_IN_ORDER' +- Parse options and arguments in the same order they occur on the +- command line. Normally they're rearranged so that all options +- come first. +- +-`ARGP_NO_HELP' +- Don't provide the standard long option `--help', which ordinarily +- causes usage and option help information to be output to `stdout' +- and `exit (0)'. +- +-`ARGP_NO_EXIT' +- Don't exit on errors, although they may still result in error +- messages. +- +-`ARGP_LONG_ONLY' +- Use the gnu getopt `long-only' rules for parsing arguments. This +- allows long-options to be recognized with only a single `-' (i.e. +- `-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. +- +-`ARGP_SILENT' +- Turns off any message-printing/exiting options, specifically +- `ARGP_NO_EXIT', `ARGP_NO_ERRS', and `ARGP_NO_HELP'. +- +- +-File: libc.info, Node: Argp Help Filtering, Prev: Argp Children, Up: Argp Parsers +- +-Customizing Argp Help Output +----------------------------- +- +- The `help_filter' field in a `struct argp' is a pointer to a +-function that filters the text of help messages before displaying them. +-They have a function signature like: +- +- char *HELP-FILTER (int KEY, const char *TEXT, void *INPUT) +- +-Where KEY is either a key from an option, in which case TEXT is that +-option's help text. *Note Argp Option Vectors::. Alternately, one of +-the special keys with names beginning with `ARGP_KEY_HELP_' might be +-used, describing which other help text TEXT will contain. *Note Argp +-Help Filter Keys::. +- +- The function should return either TEXT if it remains as-is, or a +-replacement string allocated using `malloc'. This will be either be +-freed by argp or zero, which prints nothing. The value of TEXT is +-supplied _after_ any translation has been done, so if any of the +-replacement text needs translation, it will be done by the filter +-function. INPUT is either the input supplied to `argp_parse' or it is +-zero, if `argp_help' was called directly by the user. +- +-* Menu: +- +-* Keys: Argp Help Filter Keys. Special KEY values for help filter functions. +- +- +-File: libc.info, Node: Argp Help Filter Keys, Up: Argp Help Filtering +- +-Special Keys for Argp Help Filter Functions +-........................................... +- +- The following special values may be passed to an argp help filter +-function as the first argument in addition to key values for user +-options. They specify which help text the TEXT argument contains: +- +-`ARGP_KEY_HELP_PRE_DOC' +- The help text preceding options. +- +-`ARGP_KEY_HELP_POST_DOC' +- The help text following options. +- +-`ARGP_KEY_HELP_HEADER' +- The option header string. +- +-`ARGP_KEY_HELP_EXTRA' +- This is used after all other documentation; TEXT is zero for this +- key. +- +-`ARGP_KEY_HELP_DUP_ARGS_NOTE' +- The explanatory note printed when duplicate option arguments have +- been suppressed. +- +-`ARGP_KEY_HELP_ARGS_DOC' +- The argument doc string; formally the `args_doc' field from the +- argp parser. *Note Argp Parsers::. +- +- +-File: libc.info, Node: Argp Help, Next: Argp Examples, Prev: Argp Flags, Up: Argp +- +-The `argp_help' Function +------------------------- +- +- Normally programs using argp need not be written with particular +-printing argument-usage-type help messages in mind as the standard +-`--help' option is handled automatically by argp. Typical error cases +-can be handled using `argp_usage' and `argp_error'. *Note Argp Helper +-Functions::. However, if it's desirable to print a help message in +-some context other than parsing the program options, argp offers the +-`argp_help' interface. +- +- - Function: void argp_help (const struct argp *ARGP, FILE *STREAM, +- unsigned FLAGS, char *NAME) +- This outputs a help message for the argp parser ARGP to STREAM. +- The type of messages printed will be determined by FLAGS. +- +- Any options such as `--help' that are implemented automatically by +- argp itself will _not_ be present in the help output; for this +- reason it is best to use `argp_state_help' if calling from within +- an argp parser function. *Note Argp Helper Functions::. +- +-* Menu: +- +-* Flags: Argp Help Flags. Specifying what sort of help message to print. +- +- +-File: libc.info, Node: Argp Help Flags, Up: Argp Help +- +-Flags for the `argp_help' Function +----------------------------------- +- +- When calling `argp_help' (*note Argp Help::) or `argp_state_help' +-(*note Argp Helper Functions::) the exact output is determined by the +-FLAGS argument. This should consist of any of the following flags, +-or'd together: +- +-`ARGP_HELP_USAGE' +- A unix `Usage:' message that explicitly lists all options. +- +-`ARGP_HELP_SHORT_USAGE' +- A unix `Usage:' message that displays an appropriate placeholder to +- indicate where the options go; useful for showing the non-option +- argument syntax. +- +-`ARGP_HELP_SEE' +- A `Try ... for more help' message; `...' contains the program name +- and `--help'. +- +-`ARGP_HELP_LONG' +- A verbose option help message that gives each option available +- along with its documentation string. +- +-`ARGP_HELP_PRE_DOC' +- The part of the argp parser doc string preceding the verbose +- option help. +- +-`ARGP_HELP_POST_DOC' +- The part of the argp parser doc string that following the verbose +- option help. +- +-`ARGP_HELP_DOC' +- `(ARGP_HELP_PRE_DOC | ARGP_HELP_POST_DOC)' +- +-`ARGP_HELP_BUG_ADDR' +- A message that prints where to report bugs for this program, if the +- `argp_program_bug_address' variable contains this information. +- +-`ARGP_HELP_LONG_ONLY' +- This will modify any output to reflect the `ARGP_LONG_ONLY' mode. +- +- The following flags are only understood when used with +-`argp_state_help'. They control whether the function returns after +-printing its output, or terminates the program: +- +-`ARGP_HELP_EXIT_ERR' +- This will terminate the program with `exit (argp_err_exit_status)'. +- +-`ARGP_HELP_EXIT_OK' +- This will terminate the program with `exit (0)'. +- +- The following flags are combinations of the basic flags for printing +-standard messages: +- +-`ARGP_HELP_STD_ERR' +- Assuming that an error message for a parsing error has printed, +- this prints a message on how to get help, and terminates the +- program with an error. +- +-`ARGP_HELP_STD_USAGE' +- This prints a standard usage message and terminates the program +- with an error. This is used when no other specific error messages +- are appropriate or available. +- +-`ARGP_HELP_STD_HELP' +- This prints the standard response for a `--help' option, and +- terminates the program successfully. +- +- +-File: libc.info, Node: Argp Examples, Next: Argp User Customization, Prev: Argp Help, Up: Argp +- +-Argp Examples +-------------- +- +- These example programs demonstrate the basic usage of argp. +- +-* Menu: +- +-* 1: Argp Example 1. A minimal program using argp. +-* 2: Argp Example 2. A program using only default options. +-* 3: Argp Example 3. A simple program with user options. +-* 4: Argp Example 4. Combining multiple argp parsers. +- +- +-File: libc.info, Node: Argp Example 1, Next: Argp Example 2, Up: Argp Examples +- +-A Minimal Program Using Argp +-............................ +- +- This is perhaps the smallest program possible that uses argp. It +-won't do much except give an error messages and exit when there are any +-arguments, and prints a rather pointless message for `--help'. +- +- /* Argp example #1 - a minimal program using argp */ +- +- /* This is (probably) the smallest possible program that +- uses argp. It won't do much except give an error +- messages and exit when there are any arguments, and print +- a (rather pointless) messages for -help. */ +- +- #include +- +- int main (int argc, char **argv) +- { +- argp_parse (0, argc, argv, 0, 0, 0); +- exit (0); +- } +- +- +-File: libc.info, Node: Argp Example 2, Next: Argp Example 3, Prev: Argp Example 1, Up: Argp Examples +- +-A Program Using Argp with Only Default Options +-.............................................. +- +- This program doesn't use any options or arguments, it uses argp to be +-compliant with the GNU standard command line format. +- +- In addition to giving no arguments and implementing a `--help' +-option, this example has a `--version' option, which will put the given +-documentation string and bug address in the `--help' output, as per GNU +-standards. +- +- The variable `argp' contains the argument parser specification. +-Adding fields to this structure is the way most parameters are passed +-to `argp_parse'. The first three fields are normally used, but they +-are not in this small program. There are also two global variables +-that argp can use defined here, `argp_program_version' and +-`argp_program_bug_address'. They are considered global variables +-because they will almost always be constant for a given program, even +-if they use different argument parsers for various tasks. +- +- /* Argp example #2 - a pretty minimal program using argp */ +- +- /* This program doesn't use any options or arguments, but uses +- argp to be compliant with the GNU standard command line +- format. +- +- In addition to making sure no arguments are given, and +- implementing a -help option, this example will have a +- -version option, and will put the given documentation string +- and bug address in the -help output, as per GNU standards. +- +- The variable ARGP contains the argument parser specification; +- adding fields to this structure is the way most parameters are +- passed to argp_parse (the first three fields are usually used, +- but not in this small program). There are also two global +- variables that argp knows about defined here, +- ARGP_PROGRAM_VERSION and ARGP_PROGRAM_BUG_ADDRESS (they are +- global variables because they will almost always be constant +- for a given program, even if it uses different argument +- parsers for various tasks). */ +- +- #include +- +- const char *argp_program_version = +- "argp-ex2 1.0"; +- const char *argp_program_bug_address = +- ""; +- +- /* Program documentation. */ +- static char doc[] = +- "Argp example #2 -- a pretty minimal program using argp"; +- +- /* Our argument parser. The `options', `parser', and +- `args_doc' fields are zero because we have neither options or +- arguments; `doc' and `argp_program_bug_address' will be +- used in the output for `--help', and the `--version' +- option will print out `argp_program_version'. */ +- static struct argp argp = { 0, 0, 0, doc }; +- +- int main (int argc, char **argv) +- { +- argp_parse (&argp, argc, argv, 0, 0, 0); +- exit (0); +- } +- +- +-File: libc.info, Node: Argp Example 3, Next: Argp Example 4, Prev: Argp Example 2, Up: Argp Examples +- +-A Program Using Argp with User Options +-...................................... +- +- This program uses the same features as example 2, adding user options +-and arguments. +- +- We now use the first four fields in `argp' (*note Argp Parsers::) +-and specify `parse_opt' as the parser function. *Note Argp Parser +-Functions::. +- +- Note that in this example, `main' uses a structure to communicate +-with the `parse_opt' function, a pointer to which it passes in the +-`input' argument to `argp_parse'. *Note Argp::. It is retrieved by +-`parse_opt' through the `input' field in its `state' argument. *Note +-Argp Parsing State::. Of course, it's also possible to use global +-variables instead, but using a structure like this is somewhat more +-flexible and clean. +- +- /* Argp example #3 - a program with options and arguments using argp */ +- +- /* This program uses the same features as example 2, and uses options and +- arguments. +- +- We now use the first four fields in ARGP, so here's a description of them: +- OPTIONS - A pointer to a vector of struct argp_option (see below) +- PARSER - A function to parse a single option, called by argp +- ARGS_DOC - A string describing how the non-option arguments should look +- DOC - A descriptive string about this program; if it contains a +- vertical tab character (\v), the part after it will be +- printed *following* the options +- +- The function PARSER takes the following arguments: +- KEY - An integer specifying which option this is (taken +- from the KEY field in each struct argp_option), or +- a special key specifying something else; the only +- special keys we use here are ARGP_KEY_ARG, meaning +- a non-option argument, and ARGP_KEY_END, meaning +- that all arguments have been parsed +- ARG - For an option KEY, the string value of its +- argument, or NULL if it has none +- STATE- A pointer to a struct argp_state, containing +- various useful information about the parsing state; used here +- are the INPUT field, which reflects the INPUT argument to +- argp_parse, and the ARG_NUM field, which is the number of the +- current non-option argument being parsed +- It should return either 0, meaning success, ARGP_ERR_UNKNOWN, meaning the +- given KEY wasn't recognized, or an errno value indicating some other +- error. +- +- Note that in this example, main uses a structure to communicate with the +- parse_opt function, a pointer to which it passes in the INPUT argument to +- argp_parse. Of course, it's also possible to use global variables +- instead, but this is somewhat more flexible. +- +- The OPTIONS field contains a pointer to a vector of struct argp_option's; +- that structure has the following fields (if you assign your option +- structures using array initialization like this example, unspecified +- fields will be defaulted to 0, and need not be specified): +- NAME - The name of this option's long option (may be zero) +- KEY - The KEY to pass to the PARSER function when parsing this option, +- *and* the name of this option's short option, if it is a +- printable ascii character +- ARG - The name of this option's argument, if any +- FLAGS - Flags describing this option; some of them are: +- OPTION_ARG_OPTIONAL - The argument to this option is optional +- OPTION_ALIAS - This option is an alias for the +- previous option +- OPTION_HIDDEN - Don't show this option in -help output +- DOC - A documentation string for this option, shown in -help output +- +- An options vector should be terminated by an option with all fields zero. */ +- +- #include +- +- const char *argp_program_version = +- "argp-ex3 1.0"; +- const char *argp_program_bug_address = +- ""; +- +- /* Program documentation. */ +- static char doc[] = +- "Argp example #3 -- a program with options and arguments using argp"; +- +- /* A description of the arguments we accept. */ +- static char args_doc[] = "ARG1 ARG2"; +- +- /* The options we understand. */ +- static struct argp_option options[] = { +- {"verbose", 'v', 0, 0, "Produce verbose output" }, +- {"quiet", 'q', 0, 0, "Don't produce any output" }, +- {"silent", 's', 0, OPTION_ALIAS }, +- {"output", 'o', "FILE", 0, +- "Output to FILE instead of standard output" }, +- { 0 } +- }; +- +- /* Used by `main' to communicate with `parse_opt'. */ +- struct arguments +- { +- char *args[2]; /* ARG1 & ARG2 */ +- int silent, verbose; +- char *output_file; +- }; +- +- /* Parse a single option. */ +- static error_t +- parse_opt (int key, char *arg, struct argp_state *state) +- { +- /* Get the INPUT argument from `argp_parse', which we +- know is a pointer to our arguments structure. */ +- struct arguments *arguments = state->input; +- +- switch (key) +- { +- case 'q': case 's': +- arguments->silent = 1; +- break; +- case 'v': +- arguments->verbose = 1; +- break; +- case 'o': +- arguments->output_file = arg; +- break; +- +- case ARGP_KEY_ARG: +- if (state->arg_num >= 2) +- /* Too many arguments. */ +- argp_usage (state); +- +- arguments->args[state->arg_num] = arg; +- +- break; +- +- case ARGP_KEY_END: +- if (state->arg_num < 2) +- /* Not enough arguments. */ +- argp_usage (state); +- break; +- +- default: +- return ARGP_ERR_UNKNOWN; +- } +- return 0; +- } +- +- /* Our argp parser. */ +- static struct argp argp = { options, parse_opt, args_doc, doc }; +- +- int main (int argc, char **argv) +- { +- struct arguments arguments; +- +- /* Default values. */ +- arguments.silent = 0; +- arguments.verbose = 0; +- arguments.output_file = "-"; +- +- /* Parse our arguments; every option seen by `parse_opt' will +- be reflected in `arguments'. */ +- argp_parse (&argp, argc, argv, 0, 0, &arguments); +- +- printf ("ARG1 = %s\nARG2 = %s\nOUTPUT_FILE = %s\n" +- "VERBOSE = %s\nSILENT = %s\n", +- arguments.args[0], arguments.args[1], +- arguments.output_file, +- arguments.verbose ? "yes" : "no", +- arguments.silent ? "yes" : "no"); +- +- exit (0); +- } +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-43 glibc-2.3.2-200304020432/manual/libc.info-43 +--- glibc-2.3.2/manual/libc.info-43 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-43 Thu Jan 1 01:00:00 1970 +@@ -1,1256 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Argp Example 4, Prev: Argp Example 3, Up: Argp Examples +- +-A Program Using Multiple Combined Argp Parsers +-.............................................. +- +- This program uses the same features as example 3, but has more +-options, and presents more structure in the `--help' output. It also +-illustrates how you can `steal' the remainder of the input arguments +-past a certain point for programs that accept a list of items. It also +-illustrates the KEY value `ARGP_KEY_NO_ARGS', which is only given if no +-non-option arguments were supplied to the program. *Note Argp Special +-Keys::. +- +- For structuring help output, two features are used: _headers_ and a +-two part option string. The _headers_ are entries in the options +-vector. *Note Argp Option Vectors::. The first four fields are zero. +-The two part documentation string are in the variable `doc', which +-allows documentation both before and after the options. *Note Argp +-Parsers::, the two parts of `doc' are separated by a vertical-tab +-character (`'\v'', or `'\013''). By convention, the documentation +-before the options is a short string stating what the program does, and +-after any options it is longer, describing the behavior in more detail. +-All documentation strings are automatically filled for output, +-although newlines may be included to force a line break at a particular +-point. In addition, documentation strings are passed to the `gettext' +-function, for possible translation into the current locale. +- +- /* Argp example #4 - a program with somewhat more complicated options */ +- +- /* This program uses the same features as example 3, but has more +- options, and somewhat more structure in the -help output. It +- also shows how you can `steal' the remainder of the input +- arguments past a certain point, for programs that accept a +- list of items. It also shows the special argp KEY value +- ARGP_KEY_NO_ARGS, which is only given if no non-option +- arguments were supplied to the program. +- +- For structuring the help output, two features are used, +- *headers* which are entries in the options vector with the +- first four fields being zero, and a two part documentation +- string (in the variable DOC), which allows documentation both +- before and after the options; the two parts of DOC are +- separated by a vertical-tab character ('\v', or '\013'). By +- convention, the documentation before the options is just a +- short string saying what the program does, and that afterwards +- is longer, describing the behavior in more detail. All +- documentation strings are automatically filled for output, +- although newlines may be included to force a line break at a +- particular point. All documentation strings are also passed to +- the `gettext' function, for possible translation into the +- current locale. */ +- +- #include +- #include +- #include +- +- const char *argp_program_version = +- "argp-ex4 1.0"; +- const char *argp_program_bug_address = +- ""; +- +- /* Program documentation. */ +- static char doc[] = +- "Argp example #4 -- a program with somewhat more complicated\ +- options\ +- \vThis part of the documentation comes *after* the options;\ +- note that the text is automatically filled, but it's possible\ +- to force a line-break, e.g.\n<-- here."; +- +- /* A description of the arguments we accept. */ +- static char args_doc[] = "ARG1 [STRING...]"; +- +- /* Keys for options without short-options. */ +- #define OPT_ABORT 1 /* -abort */ +- +- /* The options we understand. */ +- static struct argp_option options[] = { +- {"verbose", 'v', 0, 0, "Produce verbose output" }, +- {"quiet", 'q', 0, 0, "Don't produce any output" }, +- {"silent", 's', 0, OPTION_ALIAS }, +- {"output", 'o', "FILE", 0, +- "Output to FILE instead of standard output" }, +- +- {0,0,0,0, "The following options should be grouped together:" }, +- {"repeat", 'r', "COUNT", OPTION_ARG_OPTIONAL, +- "Repeat the output COUNT (default 10) times"}, +- {"abort", OPT_ABORT, 0, 0, "Abort before showing any output"}, +- +- { 0 } +- }; +- +- /* Used by `main' to communicate with `parse_opt'. */ +- struct arguments +- { +- char *arg1; /* ARG1 */ +- char **strings; /* [STRING...] */ +- int silent, verbose, abort; /* `-s', `-v', `--abort' */ +- char *output_file; /* FILE arg to `--output' */ +- int repeat_count; /* COUNT arg to `--repeat' */ +- }; +- +- /* Parse a single option. */ +- static error_t +- parse_opt (int key, char *arg, struct argp_state *state) +- { +- /* Get the `input' argument from `argp_parse', which we +- know is a pointer to our arguments structure. */ +- struct arguments *arguments = state->input; +- +- switch (key) +- { +- case 'q': case 's': +- arguments->silent = 1; +- break; +- case 'v': +- arguments->verbose = 1; +- break; +- case 'o': +- arguments->output_file = arg; +- break; +- case 'r': +- arguments->repeat_count = arg ? atoi (arg) : 10; +- break; +- case OPT_ABORT: +- arguments->abort = 1; +- break; +- +- case ARGP_KEY_NO_ARGS: +- argp_usage (state); +- +- case ARGP_KEY_ARG: +- /* Here we know that `state->arg_num == 0', since we +- force argument parsing to end before any more arguments can +- get here. */ +- arguments->arg1 = arg; +- +- /* Now we consume all the rest of the arguments. +- `state->next' is the index in `state->argv' of the +- next argument to be parsed, which is the first STRING +- we're interested in, so we can just use +- `&state->argv[state->next]' as the value for +- arguments->strings. +- +- _In addition_, by setting `state->next' to the end +- of the arguments, we can force argp to stop parsing here and +- return. */ +- arguments->strings = &state->argv[state->next]; +- state->next = state->argc; +- +- break; +- +- default: +- return ARGP_ERR_UNKNOWN; +- } +- return 0; +- } +- +- /* Our argp parser. */ +- static struct argp argp = { options, parse_opt, args_doc, doc }; +- +- int main (int argc, char **argv) +- { +- int i, j; +- struct arguments arguments; +- +- /* Default values. */ +- arguments.silent = 0; +- arguments.verbose = 0; +- arguments.output_file = "-"; +- arguments.repeat_count = 1; +- arguments.abort = 0; +- +- /* Parse our arguments; every option seen by `parse_opt' will be +- reflected in `arguments'. */ +- argp_parse (&argp, argc, argv, 0, 0, &arguments); +- +- if (arguments.abort) +- error (10, 0, "ABORTED"); +- +- for (i = 0; i < arguments.repeat_count; i++) +- { +- printf ("ARG1 = %s\n", arguments.arg1); +- printf ("STRINGS = "); +- for (j = 0; arguments.strings[j]; j++) +- printf (j == 0 ? "%s" : ", %s", arguments.strings[j]); +- printf ("\n"); +- printf ("OUTPUT_FILE = %s\nVERBOSE = %s\nSILENT = %s\n", +- arguments.output_file, +- arguments.verbose ? "yes" : "no", +- arguments.silent ? "yes" : "no"); +- } +- +- exit (0); +- } +- +- +-File: libc.info, Node: Argp User Customization, Prev: Argp Examples, Up: Argp +- +-Argp User Customization +------------------------ +- +- The formatting of argp `--help' output may be controlled to some +-extent by a program's users, by setting the `ARGP_HELP_FMT' environment +-variable to a comma-separated list of tokens. Whitespace is ignored: +- +-`dup-args' +-`no-dup-args' +- These turn "duplicate-argument-mode" on or off. In duplicate +- argument mode, if an option that accepts an argument has multiple +- names, the argument is shown for each name. Otherwise, it is only +- shown for the first long option. A note is subsequently printed +- so the user knows that it applies to other names as well. The +- default is `no-dup-args', which is less consistent, but prettier. +- +-`dup-args-note' +- +-`no-dup-args-note' +- These will enable or disable the note informing the user of +- suppressed option argument duplication. The default is +- `dup-args-note'. +- +-`short-opt-col=N' +- This prints the first short option in column N. The default is 2. +- +-`long-opt-col=N' +- This prints the first long option in column N. The default is 6. +- +-`doc-opt-col=N' +- This prints `documentation options' (*note Argp Option Flags::) in +- column N. The default is 2. +- +-`opt-doc-col=N' +- This prints the documentation for options starting in column N. +- The default is 29. +- +-`header-col=N' +- This will indent the group headers that document groups of options +- to column N. The default is 1. +- +-`usage-indent=N' +- This will indent continuation lines in `Usage:' messages to column +- N. The default is 12. +- +-`rmargin=N' +- This will word wrap help output at or before column N. The default +- is 79. +- +- +-File: libc.info, Node: Suboptions, Next: Suboptions Example, Prev: Argp, Up: Parsing Program Arguments +- +-Parsing of Suboptions +-..................... +- +- Having a single level of options is sometimes not enough. There +-might be too many options which have to be available or a set of +-options is closely related. +- +- For this case some programs use suboptions. One of the most +-prominent programs is certainly `mount'(8). The `-o' option take one +-argument which itself is a comma separated list of options. To ease the +-programming of code like this the function `getsubopt' is available. +- +- - Function: int getsubopt (char **OPTIONP, const char* const *TOKENS, +- char **VALUEP) +- The OPTIONP parameter must be a pointer to a variable containing +- the address of the string to process. When the function returns +- the reference is updated to point to the next suboption or to the +- terminating `\0' character if there is no more suboption available. +- +- The TOKENS parameter references an array of strings containing the +- known suboptions. All strings must be `\0' terminated and to mark +- the end a null pointer must be stored. When `getsubopt' finds a +- possible legal suboption it compares it with all strings available +- in the TOKENS array and returns the index in the string as the +- indicator. +- +- In case the suboption has an associated value introduced by a `=' +- character, a pointer to the value is returned in VALUEP. The +- string is `\0' terminated. If no argument is available VALUEP is +- set to the null pointer. By doing this the caller can check +- whether a necessary value is given or whether no unexpected value +- is present. +- +- In case the next suboption in the string is not mentioned in the +- TOKENS array the starting address of the suboption including a +- possible value is returned in VALUEP and the return value of the +- function is `-1'. +- +- +-File: libc.info, Node: Suboptions Example, Prev: Suboptions, Up: Parsing Program Arguments +- +-Parsing of Suboptions Example +------------------------------ +- +- The code which might appear in the `mount'(8) program is a perfect +-example of the use of `getsubopt': +- +- #include +- #include +- #include +- +- int do_all; +- const char *type; +- int read_size; +- int write_size; +- int read_only; +- +- enum +- { +- RO_OPTION = 0, +- RW_OPTION, +- READ_SIZE_OPTION, +- WRITE_SIZE_OPTION, +- THE_END +- }; +- +- const char *mount_opts[] = +- { +- [RO_OPTION] = "ro", +- [RW_OPTION] = "rw", +- [READ_SIZE_OPTION] = "rsize", +- [WRITE_SIZE_OPTION] = "wsize", +- [THE_END] = NULL +- }; +- +- int +- main (int argc, char *argv[]) +- { +- char *subopts, *value; +- int opt; +- +- while ((opt = getopt (argc, argv, "at:o:")) != -1) +- switch (opt) +- { +- case 'a': +- do_all = 1; +- break; +- case 't': +- type = optarg; +- break; +- case 'o': +- subopts = optarg; +- while (*subopts != '\0') +- switch (getsubopt (&subopts, mount_opts, &value)) +- { +- case RO_OPTION: +- read_only = 1; +- break; +- case RW_OPTION: +- read_only = 0; +- break; +- case READ_SIZE_OPTION: +- if (value == NULL) +- abort (); +- read_size = atoi (value); +- break; +- case WRITE_SIZE_OPTION: +- if (value == NULL) +- abort (); +- write_size = atoi (value); +- break; +- default: +- /* Unknown suboption. */ +- printf ("Unknown suboption `%s'\n", value); +- break; +- } +- break; +- default: +- abort (); +- } +- +- /* Do the real work. */ +- +- return 0; +- } +- +- +-File: libc.info, Node: Environment Variables, Next: System Calls, Prev: Program Arguments, Up: Program Basics +- +-Environment Variables +-===================== +- +- When a program is executed, it receives information about the +-context in which it was invoked in two ways. The first mechanism uses +-the ARGV and ARGC arguments to its `main' function, and is discussed in +-*Note Program Arguments::. The second mechanism uses "environment +-variables" and is discussed in this section. +- +- The ARGV mechanism is typically used to pass command-line arguments +-specific to the particular program being invoked. The environment, on +-the other hand, keeps track of information that is shared by many +-programs, changes infrequently, and that is less frequently used. +- +- The environment variables discussed in this section are the same +-environment variables that you set using assignments and the `export' +-command in the shell. Programs executed from the shell inherit all of +-the environment variables from the shell. +- +- Standard environment variables are used for information about the +-user's home directory, terminal type, current locale, and so on; you +-can define additional variables for other purposes. The set of all +-environment variables that have values is collectively known as the +-"environment". +- +- Names of environment variables are case-sensitive and must not +-contain the character `='. System-defined environment variables are +-invariably uppercase. +- +- The values of environment variables can be anything that can be +-represented as a string. A value must not contain an embedded null +-character, since this is assumed to terminate the string. +- +-* Menu: +- +-* Environment Access:: How to get and set the values of +- environment variables. +-* Standard Environment:: These environment variables have +- standard interpretations. +- +- +-File: libc.info, Node: Environment Access, Next: Standard Environment, Up: Environment Variables +- +-Environment Access +------------------- +- +- The value of an environment variable can be accessed with the +-`getenv' function. This is declared in the header file `stdlib.h'. +-All of the following functions can be safely used in multi-threaded +-programs. It is made sure that concurrent modifications to the +-environment do not lead to errors. +- +- - Function: char * getenv (const char *NAME) +- This function returns a string that is the value of the environment +- variable NAME. You must not modify this string. In some non-Unix +- systems not using the GNU library, it might be overwritten by +- subsequent calls to `getenv' (but not by any other library +- function). If the environment variable NAME is not defined, the +- value is a null pointer. +- +- - Function: int putenv (char *STRING) +- The `putenv' function adds or removes definitions from the +- environment. If the STRING is of the form `NAME=VALUE', the +- definition is added to the environment. Otherwise, the STRING is +- interpreted as the name of an environment variable, and any +- definition for this variable in the environment is removed. +- +- The difference to the `setenv' function is that the exact string +- given as the parameter STRING is put into the environment. If the +- user should change the string after the `putenv' call this will +- reflect in automatically in the environment. This also requires +- that STRING is no automatic variable which scope is left before the +- variable is removed from the environment. The same applies of +- course to dynamically allocated variables which are freed later. +- +- This function is part of the extended Unix interface. Since it +- was also available in old SVID libraries you should define either +- _XOPEN_SOURCE or _SVID_SOURCE before including any header. +- +- - Function: int setenv (const char *NAME, const char *VALUE, int +- REPLACE) +- The `setenv' function can be used to add a new definition to the +- environment. The entry with the name NAME is replaced by the +- value `NAME=VALUE'. Please note that this is also true if VALUE +- is the empty string. To do this a new string is created and the +- strings NAME and VALUE are copied. A null pointer for the VALUE +- parameter is illegal. If the environment already contains an +- entry with key NAME the REPLACE parameter controls the action. If +- replace is zero, nothing happens. Otherwise the old entry is +- replaced by the new one. +- +- Please note that you cannot remove an entry completely using this +- function. +- +- This function was originally part of the BSD library but is now +- part of the Unix standard. +- +- - Function: int unsetenv (const char *NAME) +- Using this function one can remove an entry completely from the +- environment. If the environment contains an entry with the key +- NAME this whole entry is removed. A call to this function is +- equivalent to a call to `putenv' when the VALUE part of the string +- is empty. +- +- The function return `-1' if NAME is a null pointer, points to an +- empty string, or points to a string containing a `=' character. +- It returns `0' if the call succeeded. +- +- This function was originally part of the BSD library but is now +- part of the Unix standard. The BSD version had no return value, +- though. +- +- There is one more function to modify the whole environment. This +-function is said to be used in the POSIX.9 (POSIX bindings for Fortran +-77) and so one should expect it did made it into POSIX.1. But this +-never happened. But we still provide this function as a GNU extension +-to enable writing standard compliant Fortran environments. +- +- - Function: int clearenv (void) +- The `clearenv' function removes all entries from the environment. +- Using `putenv' and `setenv' new entries can be added again later. +- +- If the function is successful it returns `0'. Otherwise the return +- value is nonzero. +- +- You can deal directly with the underlying representation of +-environment objects to add more variables to the environment (for +-example, to communicate with another program you are about to execute; +-*note Executing a File::). +- +- - Variable: char ** environ +- The environment is represented as an array of strings. Each +- string is of the format `NAME=VALUE'. The order in which strings +- appear in the environment is not significant, but the same NAME +- must not appear more than once. The last element of the array is +- a null pointer. +- +- This variable is declared in the header file `unistd.h'. +- +- If you just want to get the value of an environment variable, use +- `getenv'. +- +- Unix systems, and the GNU system, pass the initial value of +-`environ' as the third argument to `main'. *Note Program Arguments::. +- +- +-File: libc.info, Node: Standard Environment, Prev: Environment Access, Up: Environment Variables +- +-Standard Environment Variables +------------------------------- +- +- These environment variables have standard meanings. This doesn't +-mean that they are always present in the environment; but if these +-variables _are_ present, they have these meanings. You shouldn't try +-to use these environment variable names for some other purpose. +- +-`HOME' +- This is a string representing the user's "home directory", or +- initial default working directory. +- +- The user can set `HOME' to any value. If you need to make sure to +- obtain the proper home directory for a particular user, you should +- not use `HOME'; instead, look up the user's name in the user +- database (*note User Database::). +- +- For most purposes, it is better to use `HOME', precisely because +- this lets the user specify the value. +- +-`LOGNAME' +- This is the name that the user used to log in. Since the value in +- the environment can be tweaked arbitrarily, this is not a reliable +- way to identify the user who is running a program; a function like +- `getlogin' (*note Who Logged In::) is better for that purpose. +- +- For most purposes, it is better to use `LOGNAME', precisely because +- this lets the user specify the value. +- +-`PATH' +- A "path" is a sequence of directory names which is used for +- searching for a file. The variable `PATH' holds a path used for +- searching for programs to be run. +- +- The `execlp' and `execvp' functions (*note Executing a File::) use +- this environment variable, as do many shells and other utilities +- which are implemented in terms of those functions. +- +- The syntax of a path is a sequence of directory names separated by +- colons. An empty string instead of a directory name stands for the +- current directory (*note Working Directory::). +- +- A typical value for this environment variable might be a string +- like: +- +- :/bin:/etc:/usr/bin:/usr/new/X11:/usr/new:/usr/local/bin +- +- This means that if the user tries to execute a program named `foo', +- the system will look for files named `foo', `/bin/foo', +- `/etc/foo', and so on. The first of these files that exists is +- the one that is executed. +- +-`TERM' +- This specifies the kind of terminal that is receiving program +- output. Some programs can make use of this information to take +- advantage of special escape sequences or terminal modes supported +- by particular kinds of terminals. Many programs which use the +- termcap library (*note Find: (termcap)Finding a Terminal +- Description.) use the `TERM' environment variable, for example. +- +-`TZ' +- This specifies the time zone. *Note TZ Variable::, for +- information about the format of this string and how it is used. +- +-`LANG' +- This specifies the default locale to use for attribute categories +- where neither `LC_ALL' nor the specific environment variable for +- that category is set. *Note Locales::, for more information about +- locales. +- +-`LC_ALL' +- If this environment variable is set it overrides the selection for +- all the locales done using the other `LC_*' environment variables. +- The value of the other `LC_*' environment variables is simply +- ignored in this case. +- +-`LC_COLLATE' +- This specifies what locale to use for string sorting. +- +-`LC_CTYPE' +- This specifies what locale to use for character sets and character +- classification. +- +-`LC_MESSAGES' +- This specifies what locale to use for printing messages and to +- parse responses. +- +-`LC_MONETARY' +- This specifies what locale to use for formatting monetary values. +- +-`LC_NUMERIC' +- This specifies what locale to use for formatting numbers. +- +-`LC_TIME' +- This specifies what locale to use for formatting date/time values. +- +-`NLSPATH' +- This specifies the directories in which the `catopen' function +- looks for message translation catalogs. +- +-`_POSIX_OPTION_ORDER' +- If this environment variable is defined, it suppresses the usual +- reordering of command line arguments by `getopt' and `argp_parse'. +- *Note Argument Syntax::. +- +- +-File: libc.info, Node: System Calls, Next: Program Termination, Prev: Environment Variables, Up: Program Basics +- +-System Calls +-============ +- +- A system call is a request for service that a program makes of the +-kernel. The service is generally something that only the kernel has +-the privilege to do, such as doing I/O. Programmers don't normally +-need to be concerned with system calls because there are functions in +-the GNU C library to do virtually everything that system calls do. +-These functions work by making system calls themselves. For example, +-there is a system call that changes the permissions of a file, but you +-don't need to know about it because you can just use the GNU C +-library's `chmod' function. +- +- System calls are sometimes called kernel calls. +- +- However, there are times when you want to make a system call +-explicitly, and for that, the GNU C library provides the `syscall' +-function. `syscall' is harder to use and less portable than functions +-like `chmod', but easier and more portable than coding the system call +-in assembler instructions. +- +- `syscall' is most useful when you are working with a system call +-which is special to your system or is newer than the GNU C library you +-are using. `syscall' is implemented in an entirely generic way; the +-function does not know anything about what a particular system call +-does or even if it is valid. +- +- The description of `syscall' in this section assumes a certain +-protocol for system calls on the various platforms on which the GNU C +-library runs. That protocol is not defined by any strong authority, but +-we won't describe it here either because anyone who is coding `syscall' +-probably won't accept anything less than kernel and C library source +-code as a specification of the interface between them anyway. +- +- `syscall' is declared in `unistd.h'. +- +- - Function: long int syscall (long int SYSNO, ...) +- `syscall' performs a generic system call. +- +- SYSNO is the system call number. Each kind of system call is +- identified by a number. Macros for all the possible system call +- numbers are defined in `sys/syscall.h' +- +- The remaining arguments are the arguments for the system call, in +- order, and their meanings depend on the kind of system call. Each +- kind of system call has a definite number of arguments, from zero +- to five. If you code more arguments than the system call takes, +- the extra ones to the right are ignored. +- +- The return value is the return value from the system call, unless +- the system call failed. In that case, `syscall' returns `-1' and +- sets `errno' to an error code that the system call returned. Note +- that system calls do not return `-1' when they succeed. +- +- If you specify an invalid SYSNO, `syscall' returns `-1' with +- `errno' = `ENOSYS'. +- +- Example: +- +- +- #include +- #include +- #include +- +- ... +- +- int rc; +- +- rc = syscall(SYS_chmod, "/etc/passwd", 0444); +- +- if (rc == -1) +- fprintf(stderr, "chmod failed, errno = %d\n", errno); +- +- This, if all the compatibility stars are aligned, is equivalent to +- the following preferable code: +- +- +- #include +- #include +- #include +- +- ... +- +- int rc; +- +- rc = chmod("/etc/passwd", 0444); +- if (rc == -1) +- fprintf(stderr, "chmod failed, errno = %d\n", errno); +- +- +- +-File: libc.info, Node: Program Termination, Prev: System Calls, Up: Program Basics +- +-Program Termination +-=================== +- +- The usual way for a program to terminate is simply for its `main' +-function to return. The "exit status value" returned from the `main' +-function is used to report information back to the process's parent +-process or shell. +- +- A program can also terminate normally by calling the `exit' function. +- +- In addition, programs can be terminated by signals; this is +-discussed in more detail in *Note Signal Handling::. The `abort' +-function causes a signal that kills the program. +- +-* Menu: +- +-* Normal Termination:: If a program calls `exit', a +- process terminates normally. +-* Exit Status:: The `exit status' provides information +- about why the process terminated. +-* Cleanups on Exit:: A process can run its own cleanup +- functions upon normal termination. +-* Aborting a Program:: The `abort' function causes +- abnormal program termination. +-* Termination Internals:: What happens when a process terminates. +- +- +-File: libc.info, Node: Normal Termination, Next: Exit Status, Up: Program Termination +- +-Normal Termination +------------------- +- +- A process terminates normally when its program signals it is done by +-calling `exit'. Returning from `main' is equivalent to calling `exit', +-and the value that `main' returns is used as the argument to `exit'. +- +- - Function: void exit (int STATUS) +- The `exit' function tells the system that the program is done, +- which causes it to terminate the process. +- +- STATUS is the program's exit status, which becomes part of the +- process' termination status. This function does not return. +- +- Normal termination causes the following actions: +- +- 1. Functions that were registered with the `atexit' or `on_exit' +- functions are called in the reverse order of their registration. +- This mechanism allows your application to specify its own +- "cleanup" actions to be performed at program termination. +- Typically, this is used to do things like saving program state +- information in a file, or unlocking locks in shared data bases. +- +- 2. All open streams are closed, writing out any buffered output data. +- See *Note Closing Streams::. In addition, temporary files opened +- with the `tmpfile' function are removed; see *Note Temporary +- Files::. +- +- 3. `_exit' is called, terminating the program. *Note Termination +- Internals::. +- +- +-File: libc.info, Node: Exit Status, Next: Cleanups on Exit, Prev: Normal Termination, Up: Program Termination +- +-Exit Status +------------ +- +- When a program exits, it can return to the parent process a small +-amount of information about the cause of termination, using the "exit +-status". This is a value between 0 and 255 that the exiting process +-passes as an argument to `exit'. +- +- Normally you should use the exit status to report very broad +-information about success or failure. You can't provide a lot of +-detail about the reasons for the failure, and most parent processes +-would not want much detail anyway. +- +- There are conventions for what sorts of status values certain +-programs should return. The most common convention is simply 0 for +-success and 1 for failure. Programs that perform comparison use a +-different convention: they use status 1 to indicate a mismatch, and +-status 2 to indicate an inability to compare. Your program should +-follow an existing convention if an existing convention makes sense for +-it. +- +- A general convention reserves status values 128 and up for special +-purposes. In particular, the value 128 is used to indicate failure to +-execute another program in a subprocess. This convention is not +-universally obeyed, but it is a good idea to follow it in your programs. +- +- *Warning:* Don't try to use the number of errors as the exit status. +-This is actually not very useful; a parent process would generally not +-care how many errors occurred. Worse than that, it does not work, +-because the status value is truncated to eight bits. Thus, if the +-program tried to report 256 errors, the parent would receive a report +-of 0 errors--that is, success. +- +- For the same reason, it does not work to use the value of `errno' as +-the exit status--these can exceed 255. +- +- *Portability note:* Some non-POSIX systems use different conventions +-for exit status values. For greater portability, you can use the +-macros `EXIT_SUCCESS' and `EXIT_FAILURE' for the conventional status +-value for success and failure, respectively. They are declared in the +-file `stdlib.h'. +- +- - Macro: int EXIT_SUCCESS +- This macro can be used with the `exit' function to indicate +- successful program completion. +- +- On POSIX systems, the value of this macro is `0'. On other +- systems, the value might be some other (possibly non-constant) +- integer expression. +- +- - Macro: int EXIT_FAILURE +- This macro can be used with the `exit' function to indicate +- unsuccessful program completion in a general sense. +- +- On POSIX systems, the value of this macro is `1'. On other +- systems, the value might be some other (possibly non-constant) +- integer expression. Other nonzero status values also indicate +- failures. Certain programs use different nonzero status values to +- indicate particular kinds of "non-success". For example, `diff' +- uses status value `1' to mean that the files are different, and +- `2' or more to 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 _is_ +-caused by program termination (i.e. `exit'), though, the program's exit +-status becomes part of the process' termination status. +- +- +-File: libc.info, Node: Cleanups on Exit, Next: Aborting a Program, Prev: Exit Status, Up: Program Termination +- +-Cleanups on Exit +----------------- +- +- Your program can arrange to run its own cleanup functions if normal +-termination happens. If you are writing a library for use in various +-application programs, then it is unreliable to insist that all +-applications call the library's cleanup functions explicitly before +-exiting. It is much more robust to make the cleanup invisible to the +-application, by setting up a cleanup function in the library itself +-using `atexit' or `on_exit'. +- +- - Function: int atexit (void (*FUNCTION) (void)) +- The `atexit' function registers the function FUNCTION to be called +- at normal program termination. The FUNCTION is called with no +- arguments. +- +- The return value from `atexit' is zero on success and nonzero if +- the function cannot be registered. +- +- - Function: int on_exit (void (*FUNCTION)(int STATUS, void *ARG), void +- *ARG) +- This function is a somewhat more powerful variant of `atexit'. It +- accepts two arguments, a function FUNCTION and an arbitrary +- pointer ARG. At normal program termination, the FUNCTION is +- called with two arguments: the STATUS value passed to `exit', and +- the ARG. +- +- This function is included in the GNU C library only for +- compatibility for SunOS, and may not be supported by other +- implementations. +- +- Here's a trivial program that illustrates the use of `exit' and +-`atexit': +- +- #include +- #include +- +- void +- bye (void) +- { +- puts ("Goodbye, cruel world...."); +- } +- +- int +- main (void) +- { +- atexit (bye); +- exit (EXIT_SUCCESS); +- } +- +-When this program is executed, it just prints the message and exits. +- +- +-File: libc.info, Node: Aborting a Program, Next: Termination Internals, Prev: Cleanups on Exit, Up: Program Termination +- +-Aborting a Program +------------------- +- +- You can abort your program using the `abort' function. The prototype +-for this function is in `stdlib.h'. +- +- - Function: void abort (void) +- The `abort' function causes abnormal program termination. This +- does not execute cleanup functions registered with `atexit' or +- `on_exit'. +- +- This function actually terminates the process by raising a +- `SIGABRT' signal, and your program can include a handler to +- intercept this signal; see *Note Signal Handling::. +- +- *Future Change Warning:* Proposed Federal censorship regulations may +-prohibit us from giving you information about the possibility of +-calling this function. We would be required to say that this is not an +-acceptable way of terminating a program. +- +- +-File: libc.info, Node: Termination Internals, Prev: Aborting a Program, Up: Program Termination +- +-Termination Internals +---------------------- +- +- The `_exit' function is the primitive used for process termination +-by `exit'. It is declared in the header file `unistd.h'. +- +- - Function: void _exit (int STATUS) +- The `_exit' function is the primitive for causing a process to +- terminate with status STATUS. Calling this function does not +- execute cleanup functions registered with `atexit' or `on_exit'. +- +- - Function: void _Exit (int STATUS) +- The `_Exit' function is the ISO C equivalent to `_exit'. The +- ISO C committee members were not sure whether the definitions of +- `_exit' and `_Exit' were compatible so they have not used the +- POSIX name. +- +- This function was introduced in ISO C99 and is declared in +- `stdlib.h'. +- +- When a process terminates for any reason--either because the program +-terminates, or as a result of a signal--the following things happen: +- +- * All open file descriptors in the process are closed. *Note +- Low-Level I/O::. Note that streams are not flushed automatically +- when the process terminates; see *Note I/O on Streams::. +- +- * A process exit status is saved to be reported back to the parent +- process via `wait' or `waitpid'; see *Note Process Completion::. +- If the program exited, this status includes as its low-order 8 +- bits the program exit status. +- +- * Any child processes of the process being terminated are assigned a +- new parent process. (On most systems, including GNU, this is the +- `init' process, with process ID 1.) +- +- * A `SIGCHLD' signal is sent to the parent process. +- +- * If the process is a session leader that has a controlling +- terminal, then a `SIGHUP' signal is sent to each process in the +- foreground job, and the controlling terminal is disassociated from +- that session. *Note Job Control::. +- +- * If termination of a process causes a process group to become +- orphaned, and any member of that process group is stopped, then a +- `SIGHUP' signal and a `SIGCONT' signal are sent to each process in +- the group. *Note Job Control::. +- +- +-File: libc.info, Node: Processes, Next: Job Control, Prev: Program Basics, Up: Top +- +-Processes +-********* +- +- "Processes" are the primitive units for allocation of system +-resources. Each process has its own address space and (usually) one +-thread of control. A process executes a program; you can have multiple +-processes executing the same program, but each process has its own copy +-of the program within its own address space and executes it +-independently of the other copies. +- +- Processes are organized hierarchically. Each process has a "parent +-process" which explicitly arranged to create it. The processes created +-by a given parent are called its "child processes". A child inherits +-many of its attributes from the parent process. +- +- This chapter describes how a program can create, terminate, and +-control child processes. Actually, there are three distinct operations +-involved: creating a new child process, causing the new process to +-execute a program, and coordinating the completion of the child process +-with the original program. +- +- The `system' function provides a simple, portable mechanism for +-running another program; it does all three steps automatically. If you +-need more control over the details of how this is done, you can use the +-primitive functions to do each step individually instead. +- +-* Menu: +- +-* Running a Command:: The easy way to run another program. +-* Process Creation Concepts:: An overview of the hard way to do it. +-* Process Identification:: How to get the process ID of a process. +-* Creating a Process:: How to fork a child process. +-* Executing a File:: How to make a process execute another program. +-* Process Completion:: How to tell when a child process has completed. +-* Process Completion Status:: How to interpret the status value +- returned from a child process. +-* BSD Wait Functions:: More functions, for backward compatibility. +-* Process Creation Example:: A complete example program. +- +- +-File: libc.info, Node: Running a Command, Next: Process Creation Concepts, Up: Processes +- +-Running a Command +-================= +- +- The easy way to run another program is to use the `system' function. +-This function does all the work of running a subprogram, but it +-doesn't give you much control over the details: you have to wait until +-the subprogram terminates before you can do anything else. +- +- - Function: int system (const char *COMMAND) +- This function executes COMMAND as a shell command. In the GNU C +- library, it always uses the default shell `sh' to run the command. +- In particular, it searches the directories in `PATH' to find +- programs to execute. The return value is `-1' if it wasn't +- possible to create the shell process, and otherwise is the status +- of the shell process. *Note Process Completion::, for details on +- how this status code can be interpreted. +- +- If the COMMAND argument is a null pointer, a return value of zero +- indicates that no command processor is available. +- +- This function is a cancellation point in multi-threaded programs. +- This is a problem if the thread allocates some resources (like +- memory, file descriptors, semaphores or whatever) at the time +- `system' is called. If the thread gets canceled these resources +- stay allocated until the program ends. To avoid this calls to +- `system' should be protected using cancellation handlers. +- +- The `system' function is declared in the header file `stdlib.h'. +- +- *Portability Note:* Some C implementations may not have any notion +-of a command processor that can execute other programs. You can +-determine whether a command processor exists by executing +-`system (NULL)'; if the return value is nonzero, a command processor is +-available. +- +- The `popen' and `pclose' functions (*note Pipe to a Subprocess::) +-are closely related to the `system' function. They allow the parent +-process to communicate with the standard input and output channels of +-the command being executed. +- +- +-File: libc.info, Node: Process Creation Concepts, Next: Process Identification, Prev: Running a Command, Up: Processes +- +-Process Creation Concepts +-========================= +- +- This section gives an overview of processes and of the steps +-involved in creating a process and making it run another program. +- +- Each process is named by a "process ID" number. A unique process ID +-is allocated to each process when it is created. The "lifetime" of a +-process ends when its termination is reported to its parent process; at +-that time, all of the process resources, including its process ID, are +-freed. +- +- Processes are created with the `fork' system call (so the operation +-of creating a new process is sometimes called "forking" a process). +-The "child process" created by `fork' is a copy of the original "parent +-process", except that it has its own process ID. +- +- After forking a child process, both the parent and child processes +-continue to execute normally. If you want your program to wait for a +-child process to finish executing before continuing, you must do this +-explicitly after the fork operation, by calling `wait' or `waitpid' +-(*note Process Completion::). These functions give you limited +-information about why the child terminated--for example, its exit +-status code. +- +- A newly forked child process continues to execute the same program as +-its parent process, at the point where the `fork' call returns. You +-can use the return value from `fork' to tell whether the program is +-running in the parent process or the child. +- +- Having several processes run the same program is only occasionally +-useful. But the child can execute another program using one of the +-`exec' functions; see *Note Executing a File::. The program that the +-process is executing is called its "process image". Starting execution +-of a new program causes the process to forget all about its previous +-process image; when the new program exits, the process exits too, +-instead of returning to the previous process image. +- +- +-File: libc.info, Node: Process Identification, Next: Creating a Process, Prev: Process Creation Concepts, Up: Processes +- +-Process Identification +-====================== +- +- The `pid_t' data type represents process IDs. You can get the +-process ID of a process by calling `getpid'. The function `getppid' +-returns the process ID of the parent of the current process (this is +-also known as the "parent process ID"). Your program should include +-the header files `unistd.h' and `sys/types.h' to use these functions. +- +- - Data Type: pid_t +- The `pid_t' data type is a signed integer type which is capable of +- representing a process ID. In the GNU library, this is an `int'. +- +- - Function: pid_t getpid (void) +- The `getpid' function returns the process ID of the current +- process. +- +- - Function: pid_t getppid (void) +- The `getppid' function returns the process ID of the parent of the +- current process. +- +- +-File: libc.info, Node: Creating a Process, Next: Executing a File, Prev: Process Identification, Up: Processes +- +-Creating a Process +-================== +- +- The `fork' function is the primitive for creating a process. It is +-declared in the header file `unistd.h'. +- +- - Function: pid_t fork (void) +- The `fork' function creates a new process. +- +- If the operation is successful, there are then both parent and +- child processes and both see `fork' return, but with different +- values: it returns a value of `0' in the child process and returns +- the child's process ID in the parent process. +- +- If process creation failed, `fork' returns a value of `-1' in the +- parent process. The following `errno' error conditions are +- defined for `fork': +- +- `EAGAIN' +- There aren't enough system resources to create another +- process, or the user already has too many processes running. +- This means exceeding the `RLIMIT_NPROC' resource limit, which +- can usually be increased; *note Limits on Resources::. +- +- `ENOMEM' +- The process requires more space than the system can supply. +- +- The specific attributes of the child process that differ from the +-parent process are: +- +- * The child process has its own unique process ID. +- +- * The parent process ID of the child process is the process ID of its +- parent process. +- +- * The child process gets its own copies of the parent process's open +- file descriptors. Subsequently changing attributes of the file +- descriptors in the parent process won't affect the file +- descriptors in the child, and vice versa. *Note Control +- Operations::. However, the file position associated with each +- descriptor is shared by both processes; *note File Position::. +- +- * The elapsed processor times for the child process are set to zero; +- see *Note Processor Time::. +- +- * The child doesn't inherit file locks set by the parent process. +- *Note Control Operations::. +- +- * The child doesn't inherit alarms set by the parent process. *Note +- Setting an Alarm::. +- +- * The set of pending signals (*note Delivery of Signal::) for the +- child process is cleared. (The child process inherits its mask of +- blocked signals and signal actions from the parent process.) +- +- - Function: pid_t vfork (void) +- The `vfork' function is similar to `fork' but on some systems it +- is more efficient; however, there are restrictions you must follow +- to use it safely. +- +- While `fork' makes a complete copy of the calling process's address +- space and allows both the parent and child to execute +- independently, `vfork' does not make this copy. Instead, the +- child process created with `vfork' shares its parent's address +- space until it calls `_exit' or one of the `exec' functions. In +- the meantime, the parent process suspends execution. +- +- You must be very careful not to allow the child process created +- with `vfork' to modify any global data or even local variables +- shared with the parent. Furthermore, the child process cannot +- return from (or do a long jump out of) the function that called +- `vfork'! This would leave the parent process's control +- information very confused. If in doubt, use `fork' instead. +- +- Some operating systems don't really implement `vfork'. The GNU C +- library permits you to use `vfork' on all systems, but actually +- executes `fork' if `vfork' isn't available. If you follow the +- proper precautions for using `vfork', your program will still work +- even if the system uses `fork' instead. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-44 glibc-2.3.2-200304020432/manual/libc.info-44 +--- glibc-2.3.2/manual/libc.info-44 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-44 Thu Jan 1 01:00:00 1970 +@@ -1,1175 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Executing a File, Next: Process Completion, Prev: Creating a Process, Up: Processes +- +-Executing a File +-================ +- +- This section describes the `exec' family of functions, for executing +-a file as a process image. You can use these functions to make a child +-process execute a new program after it has been forked. +- +- To see the effects of `exec' from the point of view of the called +-program, *Note Program Basics::. +- +- The functions in this family differ in how you specify the arguments, +-but otherwise they all do the same thing. They are declared in the +-header file `unistd.h'. +- +- - Function: int execv (const char *FILENAME, char *const ARGV[]) +- The `execv' function executes the file named by FILENAME as a new +- process image. +- +- The ARGV argument is an array of null-terminated strings that is +- used to provide a value for the `argv' argument to the `main' +- function of the program to be executed. The last element of this +- array must be a null pointer. By convention, the first element of +- this array is the file name of the program sans directory names. +- *Note Program Arguments::, for full details on how programs can +- access these arguments. +- +- The environment for the new process image is taken from the +- `environ' variable of the current process image; see *Note +- Environment Variables::, for information about environments. +- +- - Function: int execl (const char *FILENAME, const char *ARG0, ...) +- This is similar to `execv', but the ARGV strings are specified +- individually instead of as an array. A null pointer must be +- passed as the last such argument. +- +- - Function: int execve (const char *FILENAME, char *const ARGV[], char +- *const ENV[]) +- This is similar to `execv', but permits you to specify the +- environment for the new program explicitly as the ENV argument. +- This should be an array of strings in the same format as for the +- `environ' variable; see *Note Environment Access::. +- +- - Function: int execle (const char *FILENAME, const char *ARG0, char +- *const ENV[], ...) +- This is similar to `execl', but permits you to specify the +- environment for the new program explicitly. The environment +- argument is passed following the null pointer that marks the last +- ARGV argument, and should be an array of strings in the same +- format as for the `environ' variable. +- +- - Function: int execvp (const char *FILENAME, char *const ARGV[]) +- The `execvp' function is similar to `execv', except that it +- searches the directories listed in the `PATH' environment variable +- (*note Standard Environment::) to find the full file name of a +- file from FILENAME if FILENAME does not contain a slash. +- +- This function is useful for executing system utility programs, +- because it looks for them in the places that the user has chosen. +- Shells use it to run the commands that users type. +- +- - Function: int execlp (const char *FILENAME, const char *ARG0, ...) +- This function is like `execl', except that it performs the same +- file name searching as the `execvp' function. +- +- The size of the argument list and environment list taken together +-must not be greater than `ARG_MAX' bytes. *Note General Limits::. In +-the GNU system, the size (which compares against `ARG_MAX') includes, +-for each string, the number of characters in the string, plus the size +-of a `char *', plus one, rounded up to a multiple of the size of a +-`char *'. Other systems may have somewhat different rules for counting. +- +- These functions normally don't return, since execution of a new +-program causes the currently executing program to go away completely. +-A value of `-1' is returned in the event of a failure. In addition to +-the usual file name errors (*note File Name Errors::), the following +-`errno' error conditions are defined for these functions: +- +-`E2BIG' +- The combined size of the new program's argument list and +- environment list is larger than `ARG_MAX' bytes. The GNU system +- has no specific limit on the argument list size, so this error +- code cannot result, but you may get `ENOMEM' instead if the +- arguments are too big for available memory. +- +-`ENOEXEC' +- The specified file can't be executed because it isn't in the right +- format. +- +-`ENOMEM' +- Executing the specified file requires more storage than is +- available. +- +- If execution of the new file succeeds, it updates the access time +-field of the file as if the file had been read. *Note File Times::, +-for more details about access times of files. +- +- The point at which the file is closed again is not specified, but is +-at some point before the process exits or before another process image +-is executed. +- +- Executing a new process image completely changes the contents of +-memory, copying only the argument and environment strings to new +-locations. But many other attributes of the process are unchanged: +- +- * The process ID and the parent process ID. *Note Process Creation +- Concepts::. +- +- * Session and process group membership. *Note Concepts of Job +- Control::. +- +- * Real user ID and group ID, and supplementary group IDs. *Note +- Process Persona::. +- +- * Pending alarms. *Note Setting an Alarm::. +- +- * Current working directory and root directory. *Note Working +- Directory::. In the GNU system, the root directory is not copied +- when executing a setuid program; instead the system default root +- directory is used for the new program. +- +- * File mode creation mask. *Note Setting Permissions::. +- +- * Process signal mask; see *Note Process Signal Mask::. +- +- * Pending signals; see *Note Blocking Signals::. +- +- * Elapsed processor time associated with the process; see *Note +- Processor Time::. +- +- If the set-user-ID and set-group-ID mode bits of the process image +-file are set, this affects the effective user ID and effective group ID +-(respectively) of the process. These concepts are discussed in detail +-in *Note Process Persona::. +- +- Signals that are set to be ignored in the existing process image are +-also set to be ignored in the new process image. All other signals are +-set to the default action in the new process image. For more +-information about signals, see *Note Signal Handling::. +- +- File descriptors open in the existing process image remain open in +-the new process image, unless they have the `FD_CLOEXEC' +-(close-on-exec) flag set. The files that remain open inherit all +-attributes of the open file description from the existing process image, +-including file locks. File descriptors are discussed in *Note +-Low-Level I/O::. +- +- Streams, by contrast, cannot survive through `exec' functions, +-because they are located in the memory of the process itself. The new +-process image has no streams except those it creates afresh. Each of +-the streams in the pre-`exec' process image has a descriptor inside it, +-and these descriptors do survive through `exec' (provided that they do +-not have `FD_CLOEXEC' set). The new process image can reconnect these +-to new streams using `fdopen' (*note Descriptors and Streams::). +- +- +-File: libc.info, Node: Process Completion, Next: Process Completion Status, Prev: Executing a File, Up: Processes +- +-Process Completion +-================== +- +- The functions described in this section are used to wait for a child +-process to terminate or stop, and determine its status. These functions +-are declared in the header file `sys/wait.h'. +- +- - Function: pid_t waitpid (pid_t PID, int *STATUS-PTR, int OPTIONS) +- The `waitpid' function is used to request status information from a +- child process whose process ID is PID. Normally, the calling +- process is suspended until the child process makes status +- information available by terminating. +- +- Other values for the PID argument have special interpretations. A +- value of `-1' or `WAIT_ANY' requests status information for any +- child process; a value of `0' or `WAIT_MYPGRP' requests +- information for any child process in the same process group as the +- calling process; and any other negative value - PGID requests +- information for any child process whose process group ID is PGID. +- +- If status information for a child process is available +- immediately, this function returns immediately without waiting. +- If more than one eligible child process has status information +- available, one of them is chosen randomly, and its status is +- returned immediately. To get the status from the other eligible +- child processes, you need to call `waitpid' again. +- +- The OPTIONS argument is a bit mask. Its value should be the +- bitwise OR (that is, the `|' operator) of zero or more of the +- `WNOHANG' and `WUNTRACED' flags. You can use the `WNOHANG' flag +- to indicate that the parent process shouldn't wait; and the +- `WUNTRACED' flag to request status information from stopped +- processes as well as processes that have terminated. +- +- The status information from the child process is stored in the +- object that STATUS-PTR points to, unless STATUS-PTR is a null +- pointer. +- +- This function is a cancellation point in multi-threaded programs. +- This is a problem if the thread allocates some resources (like +- memory, file descriptors, semaphores or whatever) at the time +- `waitpid' is called. If the thread gets canceled these resources +- stay allocated until the program ends. To avoid this calls to +- `waitpid' should be protected using cancellation handlers. +- +- The return value is normally the process ID of the child process +- whose status is reported. If there are child processes but none +- of them is waiting to be noticed, `waitpid' will block until one +- is. However, if the `WNOHANG' option was specified, `waitpid' +- will return zero instead of blocking. +- +- If a specific PID to wait for was given to `waitpid', it will +- ignore all other children (if any). Therefore if there are +- children waiting to be noticed but the child whose PID was +- specified is not one of them, `waitpid' will block or return zero +- as described above. +- +- A value of `-1' is returned in case of error. The following +- `errno' error conditions are defined for this function: +- +- `EINTR' +- The function was interrupted by delivery of a signal to the +- calling process. *Note Interrupted Primitives::. +- +- `ECHILD' +- There are no child processes to wait for, or the specified PID +- is not a child of the calling process. +- +- `EINVAL' +- An invalid value was provided for the OPTIONS argument. +- +- These symbolic constants are defined as values for the PID argument +-to the `waitpid' function. +- +-`WAIT_ANY' +- This constant macro (whose value is `-1') specifies that `waitpid' +- should return status information about any child process. +- +-`WAIT_MYPGRP' +- This constant (with value `0') specifies that `waitpid' should +- return status information about any child process in the same +- process group as the calling process. +- +- These symbolic constants are defined as flags for the OPTIONS +-argument to the `waitpid' function. You can bitwise-OR the flags +-together to obtain a value to use as the argument. +- +-`WNOHANG' +- This flag specifies that `waitpid' should return immediately +- instead of waiting, if there is no child process ready to be +- noticed. +- +-`WUNTRACED' +- This flag specifies that `waitpid' should report the status of any +- child processes that have been stopped as well as those that have +- terminated. +- +- - Function: pid_t wait (int *STATUS-PTR) +- This is a simplified version of `waitpid', and is used to wait +- until any one child process terminates. The call: +- +- wait (&status) +- +- is exactly equivalent to: +- +- waitpid (-1, &status, 0) +- +- This function is a cancellation point in multi-threaded programs. +- This is a problem if the thread allocates some resources (like +- memory, file descriptors, semaphores or whatever) at the time +- `wait' is called. If the thread gets canceled these resources +- stay allocated until the program ends. To avoid this calls to +- `wait' should be protected using cancellation handlers. +- +- - Function: pid_t wait4 (pid_t PID, int *STATUS-PTR, int OPTIONS, +- struct rusage *USAGE) +- If USAGE is a null pointer, `wait4' is equivalent to `waitpid +- (PID, STATUS-PTR, OPTIONS)'. +- +- If USAGE is not null, `wait4' stores usage figures for the child +- process in `*RUSAGE' (but only if the child has terminated, not if +- it has stopped). *Note Resource Usage::. +- +- This function is a BSD extension. +- +- Here's an example of how to use `waitpid' to get the status from all +-child processes that have terminated, without ever waiting. This +-function is designed to be a handler for `SIGCHLD', the signal that +-indicates that at least one child process has terminated. +- +- void +- sigchld_handler (int signum) +- { +- int pid, status, serrno; +- serrno = errno; +- while (1) +- { +- pid = waitpid (WAIT_ANY, &status, WNOHANG); +- if (pid < 0) +- { +- perror ("waitpid"); +- break; +- } +- if (pid == 0) +- break; +- notice_termination (pid, status); +- } +- errno = serrno; +- } +- +- +-File: libc.info, Node: Process Completion Status, Next: BSD Wait Functions, Prev: Process Completion, Up: Processes +- +-Process Completion Status +-========================= +- +- If the exit status value (*note Program Termination::) of the child +-process is zero, then the status value reported by `waitpid' or `wait' +-is also zero. You can test for other kinds of information encoded in +-the returned status value using the following macros. These macros are +-defined in the header file `sys/wait.h'. +- +- - Macro: int WIFEXITED (int STATUS) +- This macro returns a nonzero value if the child process terminated +- normally with `exit' or `_exit'. +- +- - Macro: int WEXITSTATUS (int STATUS) +- If `WIFEXITED' is true of STATUS, this macro returns the low-order +- 8 bits of the exit status value from the child process. *Note +- Exit Status::. +- +- - Macro: int WIFSIGNALED (int STATUS) +- This macro returns a nonzero value if the child process terminated +- because it received a signal that was not handled. *Note Signal +- Handling::. +- +- - Macro: int WTERMSIG (int STATUS) +- If `WIFSIGNALED' is true of STATUS, this macro returns the signal +- number of the signal that terminated the child process. +- +- - Macro: int WCOREDUMP (int STATUS) +- This macro returns a nonzero value if the child process terminated +- and produced a core dump. +- +- - Macro: int WIFSTOPPED (int STATUS) +- This macro returns a nonzero value if the child process is stopped. +- +- - Macro: int WSTOPSIG (int STATUS) +- If `WIFSTOPPED' is true of STATUS, this macro returns the signal +- number of the signal that caused the child process to stop. +- +- +-File: libc.info, Node: BSD Wait Functions, Next: Process Creation Example, Prev: Process Completion Status, Up: Processes +- +-BSD Process Wait Functions +-========================== +- +- The GNU library also provides these related facilities for +-compatibility with BSD Unix. BSD uses the `union wait' data type to +-represent status values rather than an `int'. The two representations +-are actually interchangeable; they describe the same bit patterns. The +-GNU C Library defines macros such as `WEXITSTATUS' so that they will +-work on either kind of object, and the `wait' function is defined to +-accept either type of pointer as its STATUS-PTR argument. +- +- These functions are declared in `sys/wait.h'. +- +- - Data Type: union wait +- This data type represents program termination status values. It +- has the following members: +- +- `int w_termsig' +- The value of this member is the same as that of the +- `WTERMSIG' macro. +- +- `int w_coredump' +- The value of this member is the same as that of the +- `WCOREDUMP' macro. +- +- `int w_retcode' +- The value of this member is the same as that of the +- `WEXITSTATUS' macro. +- +- `int w_stopsig' +- The value of this member is the same as that of the +- `WSTOPSIG' macro. +- +- Instead of accessing these members directly, you should use the +- equivalent macros. +- +- The `wait3' function is the predecessor to `wait4', which is more +-flexible. `wait3' is now obsolete. +- +- - Function: pid_t wait3 (union wait *STATUS-PTR, int OPTIONS, struct +- rusage *USAGE) +- If USAGE is a null pointer, `wait3' is equivalent to `waitpid (-1, +- STATUS-PTR, OPTIONS)'. +- +- If USAGE is not null, `wait3' stores usage figures for the child +- process in `*RUSAGE' (but only if the child has terminated, not if +- it has stopped). *Note Resource Usage::. +- +- +-File: libc.info, Node: Process Creation Example, Prev: BSD Wait Functions, Up: Processes +- +-Process Creation Example +-======================== +- +- Here is an example program showing how you might write a function +-similar to the built-in `system'. It executes its COMMAND argument +-using the equivalent of `sh -c COMMAND'. +- +- #include +- #include +- #include +- #include +- #include +- +- /* Execute the command using this shell program. */ +- #define SHELL "/bin/sh" +- +- int +- my_system (const char *command) +- { +- int status; +- pid_t pid; +- +- pid = fork (); +- if (pid == 0) +- { +- /* This is the child process. Execute the shell command. */ +- execl (SHELL, SHELL, "-c", command, NULL); +- _exit (EXIT_FAILURE); +- } +- else if (pid < 0) +- /* The fork failed. Report failure. */ +- status = -1; +- else +- /* This is the parent process. Wait for the child to complete. */ +- if (waitpid (pid, &status, 0) != pid) +- status = -1; +- return status; +- } +- +- There are a couple of things you should pay attention to in this +-example. +- +- Remember that the first `argv' argument supplied to the program +-represents the name of the program being executed. That is why, in the +-call to `execl', `SHELL' is supplied once to name the program to +-execute and a second time to supply a value for `argv[0]'. +- +- The `execl' call in the child process doesn't return if it is +-successful. If it fails, you must do something to make the child +-process terminate. Just returning a bad status code with `return' +-would leave two processes running the original program. Instead, the +-right behavior is for the child process to report failure to its parent +-process. +- +- Call `_exit' to accomplish this. The reason for using `_exit' +-instead of `exit' is to avoid flushing fully buffered streams such as +-`stdout'. The buffers of these streams probably contain data that was +-copied from the parent process by the `fork', data that will be output +-eventually by the parent process. Calling `exit' in the child would +-output the data twice. *Note Termination Internals::. +- +- +-File: libc.info, Node: Job Control, Next: Name Service Switch, Prev: Processes, Up: Top +- +-Job Control +-*********** +- +- "Job control" refers to the protocol for allowing a user to move +-between multiple "process groups" (or "jobs") within a single "login +-session". The job control facilities are set up so that appropriate +-behavior for most programs happens automatically and they need not do +-anything special about job control. So you can probably ignore the +-material in this chapter unless you are writing a shell or login +-program. +- +- You need to be familiar with concepts relating to process creation +-(*note Process Creation Concepts::) and signal handling (*note Signal +-Handling::) in order to understand this material presented in this +-chapter. +- +-* Menu: +- +-* Concepts of Job Control:: Jobs can be controlled by a shell. +-* Job Control is Optional:: Not all POSIX systems support job control. +-* Controlling Terminal:: How a process gets its controlling terminal. +-* Access to the Terminal:: How processes share the controlling terminal. +-* Orphaned Process Groups:: Jobs left after the user logs out. +-* Implementing a Shell:: What a shell must do to implement job control. +-* Functions for Job Control:: Functions to control process groups. +- +- +-File: libc.info, Node: Concepts of Job Control, Next: Job Control is Optional, Up: Job Control +- +-Concepts of Job Control +-======================= +- +- The fundamental purpose of an interactive shell is to read commands +-from the user's terminal and create processes to execute the programs +-specified by those commands. It can do this using the `fork' (*note +-Creating a Process::) and `exec' (*note Executing a File::) functions. +- +- A single command may run just one process--but often one command uses +-several processes. If you use the `|' operator in a shell command, you +-explicitly request several programs in their own processes. But even +-if you run just one program, it can use multiple processes internally. +-For example, a single compilation command such as `cc -c foo.c' +-typically uses four processes (though normally only two at any given +-time). If you run `make', its job is to run other programs in separate +-processes. +- +- The processes belonging to a single command are called a "process +-group" or "job". This is so that you can operate on all of them at +-once. For example, typing `C-c' sends the signal `SIGINT' to terminate +-all the processes in the foreground process group. +- +- A "session" is a larger group of processes. Normally all the +-processes that stem from a single login belong to the same session. +- +- Every process belongs to a process group. When a process is +-created, it becomes a member of the same process group and session as +-its parent process. You can put it in another process group using the +-`setpgid' function, provided the process group belongs to the same +-session. +- +- The only way to put a process in a different session is to make it +-the initial process of a new session, or a "session leader", using the +-`setsid' function. This also puts the session leader into a new +-process group, and you can't move it out of that process group again. +- +- Usually, new sessions are created by the system login program, and +-the session leader is the process running the user's login shell. +- +- A shell that supports job control must arrange to control which job +-can use the terminal at any time. Otherwise there might be multiple +-jobs trying to read from the terminal at once, and confusion about which +-process should receive the input typed by the user. To prevent this, +-the shell must cooperate with the terminal driver using the protocol +-described in this chapter. +- +- The shell can give unlimited access to the controlling terminal to +-only one process group at a time. This is called the "foreground job" +-on that controlling terminal. Other process groups managed by the shell +-that are executing without such access to the terminal are called +-"background jobs". +- +- If a background job needs to read from its controlling terminal, it +-is "stopped" by the terminal driver; if the `TOSTOP' mode is set, +-likewise for writing. The user can stop a foreground job by typing the +-SUSP character (*note Special Characters::) and a program can stop any +-job by sending it a `SIGSTOP' signal. It's the responsibility of the +-shell to notice when jobs stop, to notify the user about them, and to +-provide mechanisms for allowing the user to interactively continue +-stopped jobs and switch jobs between foreground and background. +- +- *Note Access to the Terminal::, for more information about I/O to the +-controlling terminal, +- +- +-File: libc.info, Node: Job Control is Optional, Next: Controlling Terminal, Prev: Concepts of Job Control, Up: Job Control +- +-Job Control is Optional +-======================= +- +- Not all operating systems support job control. The GNU system does +-support job control, but if you are using the GNU library on some other +-system, that system may not support job control itself. +- +- You can use the `_POSIX_JOB_CONTROL' macro to test at compile-time +-whether the system supports job control. *Note System Options::. +- +- If job control is not supported, then there can be only one process +-group per session, which behaves as if it were always in the foreground. +-The functions for creating additional process groups simply fail with +-the error code `ENOSYS'. +- +- The macros naming the various job control signals (*note Job Control +-Signals::) are defined even if job control is not supported. However, +-the system never generates these signals, and attempts to send a job +-control signal or examine or specify their actions report errors or do +-nothing. +- +- +-File: libc.info, Node: Controlling Terminal, Next: Access to the Terminal, Prev: Job Control is Optional, Up: Job Control +- +-Controlling Terminal of a Process +-================================= +- +- One of the attributes of a process is its controlling terminal. +-Child processes created with `fork' inherit the controlling terminal +-from their parent process. In this way, all the processes in a session +-inherit the controlling terminal from the session leader. A session +-leader that has control of a terminal is called the "controlling +-process" of that terminal. +- +- You generally do not need to worry about the exact mechanism used to +-allocate a controlling terminal to a session, since it is done for you +-by the system when you log in. +- +- An individual process disconnects from its controlling terminal when +-it calls `setsid' to become the leader of a new session. *Note Process +-Group Functions::. +- +- +-File: libc.info, Node: Access to the Terminal, Next: Orphaned Process Groups, Prev: Controlling Terminal, Up: Job Control +- +-Access to the Controlling Terminal +-================================== +- +- Processes in the foreground job of a controlling terminal have +-unrestricted access to that terminal; background processes do not. This +-section describes in more detail what happens when a process in a +-background job tries to access its controlling terminal. +- +- When a process in a background job tries to read from its controlling +-terminal, the process group is usually sent a `SIGTTIN' signal. This +-normally causes all of the processes in that group to stop (unless they +-handle the signal and don't stop themselves). However, if the reading +-process is ignoring or blocking this signal, then `read' fails with an +-`EIO' error instead. +- +- Similarly, when a process in a background job tries to write to its +-controlling terminal, the default behavior is to send a `SIGTTOU' +-signal to the process group. However, the behavior is modified by the +-`TOSTOP' bit of the local modes flags (*note Local Modes::). If this +-bit is not set (which is the default), then writing to the controlling +-terminal is always permitted without sending a signal. Writing is also +-permitted if the `SIGTTOU' signal is being ignored or blocked by the +-writing process. +- +- Most other terminal operations that a program can do are treated as +-reading or as writing. (The description of each operation should say +-which.) +- +- For more information about the primitive `read' and `write' +-functions, see *Note I/O Primitives::. +- +- +-File: libc.info, Node: Orphaned Process Groups, Next: Implementing a Shell, Prev: Access to the Terminal, Up: Job Control +- +-Orphaned Process Groups +-======================= +- +- When a controlling process terminates, its terminal becomes free and +-a new session can be established on it. (In fact, another user could +-log in on the terminal.) This could cause a problem if any processes +-from the old session are still trying to use that terminal. +- +- To prevent problems, process groups that continue running even after +-the session leader has terminated are marked as "orphaned process +-groups". +- +- When a process group becomes an orphan, its processes are sent a +-`SIGHUP' signal. Ordinarily, this causes the processes to terminate. +-However, if a program ignores this signal or establishes a handler for +-it (*note Signal Handling::), it can continue running as in the orphan +-process group even after its controlling process terminates; but it +-still cannot access the terminal any more. +- +- +-File: libc.info, Node: Implementing a Shell, Next: Functions for Job Control, Prev: Orphaned Process Groups, Up: Job Control +- +-Implementing a Job Control Shell +-================================ +- +- This section describes what a shell must do to implement job +-control, by presenting an extensive sample program to illustrate the +-concepts involved. +- +-* Menu: +- +-* Data Structures:: Introduction to the sample shell. +-* Initializing the Shell:: What the shell must do to take +- responsibility for job control. +-* Launching Jobs:: Creating jobs to execute commands. +-* Foreground and Background:: Putting a job in foreground of background. +-* Stopped and Terminated Jobs:: Reporting job status. +-* Continuing Stopped Jobs:: How to continue a stopped job in +- the foreground or background. +-* Missing Pieces:: Other parts of the shell. +- +- +-File: libc.info, Node: Data Structures, Next: Initializing the Shell, Up: Implementing a Shell +- +-Data Structures for the Shell +------------------------------ +- +- All of the program examples included in this chapter are part of a +-simple shell program. This section presents data structures and +-utility functions which are used throughout the example. +- +- The sample shell deals mainly with two data structures. The `job' +-type contains information about a job, which is a set of subprocesses +-linked together with pipes. The `process' type holds information about +-a single subprocess. Here are the relevant data structure declarations: +- +- /* A process is a single process. */ +- typedef struct process +- { +- struct process *next; /* next process in pipeline */ +- char **argv; /* for exec */ +- pid_t pid; /* process ID */ +- char completed; /* true if process has completed */ +- char stopped; /* true if process has stopped */ +- int status; /* reported status value */ +- } process; +- +- /* A job is a pipeline of processes. */ +- typedef struct job +- { +- struct job *next; /* next active job */ +- char *command; /* command line, used for messages */ +- process *first_process; /* list of processes in this job */ +- pid_t pgid; /* process group ID */ +- char notified; /* true if user told about stopped job */ +- struct termios tmodes; /* saved terminal modes */ +- int stdin, stdout, stderr; /* standard i/o channels */ +- } job; +- +- /* The active jobs are linked into a list. This is its head. */ +- job *first_job = NULL; +- +- Here are some utility functions that are used for operating on `job' +-objects. +- +- /* Find the active job with the indicated PGID. */ +- job * +- find_job (pid_t pgid) +- { +- job *j; +- +- for (j = first_job; j; j = j->next) +- if (j->pgid == pgid) +- return j; +- return NULL; +- } +- +- /* Return true if all processes in the job have stopped or completed. */ +- int +- job_is_stopped (job *j) +- { +- process *p; +- +- for (p = j->first_process; p; p = p->next) +- if (!p->completed && !p->stopped) +- return 0; +- return 1; +- } +- +- /* Return true if all processes in the job have completed. */ +- int +- job_is_completed (job *j) +- { +- process *p; +- +- for (p = j->first_process; p; p = p->next) +- if (!p->completed) +- return 0; +- return 1; +- } +- +- +-File: libc.info, Node: Initializing the Shell, Next: Launching Jobs, Prev: Data Structures, Up: Implementing a Shell +- +-Initializing the Shell +----------------------- +- +- When a shell program that normally performs job control is started, +-it has to be careful in case it has been invoked from another shell +-that is already doing its own job control. +- +- A subshell that runs interactively has to ensure that it has been +-placed in the foreground by its parent shell before it can enable job +-control itself. It does this by getting its initial process group ID +-with the `getpgrp' function, and comparing it to the process group ID +-of the current foreground job associated with its controlling terminal +-(which can be retrieved using the `tcgetpgrp' function). +- +- If the subshell is not running as a foreground job, it must stop +-itself by sending a `SIGTTIN' signal to its own process group. It may +-not arbitrarily put itself into the foreground; it must wait for the +-user to tell the parent shell to do this. If the subshell is continued +-again, it should repeat the check and stop itself again if it is still +-not in the foreground. +- +- Once the subshell has been placed into the foreground by its parent +-shell, it can enable its own job control. It does this by calling +-`setpgid' to put itself into its own process group, and then calling +-`tcsetpgrp' to place this process group into the foreground. +- +- When a shell enables job control, it should set itself to ignore all +-the job control stop signals so that it doesn't accidentally stop +-itself. You can do this by setting the action for all the stop signals +-to `SIG_IGN'. +- +- A subshell that runs non-interactively cannot and should not support +-job control. It must leave all processes it creates in the same process +-group as the shell itself; this allows the non-interactive shell and its +-child processes to be treated as a single job by the parent shell. This +-is easy to do--just don't use any of the job control primitives--but +-you must remember to make the shell do it. +- +- Here is the initialization code for the sample shell that shows how +-to do all of this. +- +- /* Keep track of attributes of the shell. */ +- +- #include +- #include +- #include +- +- pid_t shell_pgid; +- struct termios shell_tmodes; +- int shell_terminal; +- int shell_is_interactive; +- +- +- /* Make sure the shell is running interactively as the foreground job +- before proceeding. */ +- +- void +- init_shell () +- { +- +- /* See if we are running interactively. */ +- shell_terminal = STDIN_FILENO; +- shell_is_interactive = isatty (shell_terminal); +- +- if (shell_is_interactive) +- { +- /* Loop until we are in the foreground. */ +- while (tcgetpgrp (shell_terminal) != (shell_pgid = getpgrp ())) +- kill (- shell_pgid, SIGTTIN); +- +- /* Ignore interactive and job-control signals. */ +- signal (SIGINT, SIG_IGN); +- signal (SIGQUIT, SIG_IGN); +- signal (SIGTSTP, SIG_IGN); +- signal (SIGTTIN, SIG_IGN); +- signal (SIGTTOU, SIG_IGN); +- signal (SIGCHLD, SIG_IGN); +- +- /* Put ourselves in our own process group. */ +- shell_pgid = getpid (); +- if (setpgid (shell_pgid, shell_pgid) < 0) +- { +- perror ("Couldn't put the shell in its own process group"); +- exit (1); +- } +- +- /* Grab control of the terminal. */ +- tcsetpgrp (shell_terminal, shell_pgid); +- +- /* Save default terminal attributes for shell. */ +- tcgetattr (shell_terminal, &shell_tmodes); +- } +- } +- +- +-File: libc.info, Node: Launching Jobs, Next: Foreground and Background, Prev: Initializing the Shell, Up: Implementing a Shell +- +-Launching Jobs +--------------- +- +- Once the shell has taken responsibility for performing job control on +-its controlling terminal, it can launch jobs in response to commands +-typed by the user. +- +- To create the processes in a process group, you use the same `fork' +-and `exec' functions described in *Note Process Creation Concepts::. +-Since there are multiple child processes involved, though, things are a +-little more complicated and you must be careful to do things in the +-right order. Otherwise, nasty race conditions can result. +- +- You have two choices for how to structure the tree of parent-child +-relationships among the processes. You can either make all the +-processes in the process group be children of the shell process, or you +-can make one process in group be the ancestor of all the other processes +-in that group. The sample shell program presented in this chapter uses +-the first approach because it makes bookkeeping somewhat simpler. +- +- As each process is forked, it should put itself in the new process +-group by calling `setpgid'; see *Note Process Group Functions::. The +-first process in the new group becomes its "process group leader", and +-its process ID becomes the "process group ID" for the group. +- +- The shell should also call `setpgid' to put each of its child +-processes into the new process group. This is because there is a +-potential timing problem: each child process must be put in the process +-group before it begins executing a new program, and the shell depends on +-having all the child processes in the group before it continues +-executing. If both the child processes and the shell call `setpgid', +-this ensures that the right things happen no matter which process gets +-to it first. +- +- If the job is being launched as a foreground job, the new process +-group also needs to be put into the foreground on the controlling +-terminal using `tcsetpgrp'. Again, this should be done by the shell as +-well as by each of its child processes, to avoid race conditions. +- +- The next thing each child process should do is to reset its signal +-actions. +- +- During initialization, the shell process set itself to ignore job +-control signals; see *Note Initializing the Shell::. As a result, any +-child processes it creates also ignore these signals by inheritance. +-This is definitely undesirable, so each child process should explicitly +-set the actions for these signals back to `SIG_DFL' just after it is +-forked. +- +- Since shells follow this convention, applications can assume that +-they inherit the correct handling of these signals from the parent +-process. But every application has a responsibility not to mess up the +-handling of stop signals. Applications that disable the normal +-interpretation of the SUSP character should provide some other +-mechanism for the user to stop the job. When the user invokes this +-mechanism, the program should send a `SIGTSTP' signal to the process +-group of the process, not just to the process itself. *Note Signaling +-Another Process::. +- +- Finally, each child process should call `exec' in the normal way. +-This is also the point at which redirection of the standard input and +-output channels should be handled. *Note Duplicating Descriptors::, +-for an explanation of how to do this. +- +- Here is the function from the sample shell program that is +-responsible for launching a program. The function is executed by each +-child process immediately after it has been forked by the shell, and +-never returns. +- +- void +- launch_process (process *p, pid_t pgid, +- int infile, int outfile, int errfile, +- int foreground) +- { +- pid_t pid; +- +- if (shell_is_interactive) +- { +- /* Put the process into the process group and give the process group +- the terminal, if appropriate. +- This has to be done both by the shell and in the individual +- child processes because of potential race conditions. */ +- pid = getpid (); +- if (pgid == 0) pgid = pid; +- setpgid (pid, pgid); +- if (foreground) +- tcsetpgrp (shell_terminal, pgid); +- +- /* Set the handling for job control signals back to the default. */ +- signal (SIGINT, SIG_DFL); +- signal (SIGQUIT, SIG_DFL); +- signal (SIGTSTP, SIG_DFL); +- signal (SIGTTIN, SIG_DFL); +- signal (SIGTTOU, SIG_DFL); +- signal (SIGCHLD, SIG_DFL); +- } +- +- /* Set the standard input/output channels of the new process. */ +- if (infile != STDIN_FILENO) +- { +- dup2 (infile, STDIN_FILENO); +- close (infile); +- } +- if (outfile != STDOUT_FILENO) +- { +- dup2 (outfile, STDOUT_FILENO); +- close (outfile); +- } +- if (errfile != STDERR_FILENO) +- { +- dup2 (errfile, STDERR_FILENO); +- close (errfile); +- } +- +- /* Exec the new process. Make sure we exit. */ +- execvp (p->argv[0], p->argv); +- perror ("execvp"); +- exit (1); +- } +- +- If the shell is not running interactively, this function does not do +-anything with process groups or signals. Remember that a shell not +-performing job control must keep all of its subprocesses in the same +-process group as the shell itself. +- +- Next, here is the function that actually launches a complete job. +-After creating the child processes, this function calls some other +-functions to put the newly created job into the foreground or +-background; these are discussed in *Note Foreground and Background::. +- +- void +- launch_job (job *j, int foreground) +- { +- process *p; +- pid_t pid; +- int mypipe[2], infile, outfile; +- +- infile = j->stdin; +- for (p = j->first_process; p; p = p->next) +- { +- /* Set up pipes, if necessary. */ +- if (p->next) +- { +- if (pipe (mypipe) < 0) +- { +- perror ("pipe"); +- exit (1); +- } +- outfile = mypipe[1]; +- } +- else +- outfile = j->stdout; +- +- /* Fork the child processes. */ +- pid = fork (); +- if (pid == 0) +- /* This is the child process. */ +- launch_process (p, j->pgid, infile, +- outfile, j->stderr, foreground); +- else if (pid < 0) +- { +- /* The fork failed. */ +- perror ("fork"); +- exit (1); +- } +- else +- { +- /* This is the parent process. */ +- p->pid = pid; +- if (shell_is_interactive) +- { +- if (!j->pgid) +- j->pgid = pid; +- setpgid (pid, j->pgid); +- } +- } +- +- /* Clean up after pipes. */ +- if (infile != j->stdin) +- close (infile); +- if (outfile != j->stdout) +- close (outfile); +- infile = mypipe[0]; +- } +- +- format_job_info (j, "launched"); +- +- if (!shell_is_interactive) +- wait_for_job (j); +- else if (foreground) +- put_job_in_foreground (j, 0); +- else +- put_job_in_background (j, 0); +- } +- +- +-File: libc.info, Node: Foreground and Background, Next: Stopped and Terminated Jobs, Prev: Launching Jobs, Up: Implementing a Shell +- +-Foreground and Background +-------------------------- +- +- Now let's consider what actions must be taken by the shell when it +-launches a job into the foreground, and how this differs from what must +-be done when a background job is launched. +- +- When a foreground job is launched, the shell must first give it +-access to the controlling terminal by calling `tcsetpgrp'. Then, the +-shell should wait for processes in that process group to terminate or +-stop. This is discussed in more detail in *Note Stopped and Terminated +-Jobs::. +- +- When all of the processes in the group have either completed or +-stopped, the shell should regain control of the terminal for its own +-process group by calling `tcsetpgrp' again. Since stop signals caused +-by I/O from a background process or a SUSP character typed by the user +-are sent to the process group, normally all the processes in the job +-stop together. +- +- The foreground job may have left the terminal in a strange state, so +-the shell should restore its own saved terminal modes before +-continuing. In case the job is merely stopped, the shell should first +-save the current terminal modes so that it can restore them later if +-the job is continued. The functions for dealing with terminal modes are +-`tcgetattr' and `tcsetattr'; these are described in *Note Terminal +-Modes::. +- +- Here is the sample shell's function for doing all of this. +- +- /* Put job J in the foreground. If CONT is nonzero, +- restore the saved terminal modes and send the process group a +- `SIGCONT' signal to wake it up before we block. */ +- +- void +- put_job_in_foreground (job *j, int cont) +- { +- /* Put the job into the foreground. */ +- tcsetpgrp (shell_terminal, j->pgid); +- +- /* Send the job a continue signal, if necessary. */ +- if (cont) +- { +- tcsetattr (shell_terminal, TCSADRAIN, &j->tmodes); +- if (kill (- j->pgid, SIGCONT) < 0) +- perror ("kill (SIGCONT)"); +- } +- +- /* Wait for it to report. */ +- wait_for_job (j); +- +- /* Put the shell back in the foreground. */ +- tcsetpgrp (shell_terminal, shell_pgid); +- +- /* Restore the shell's terminal modes. */ +- tcgetattr (shell_terminal, &j->tmodes); +- tcsetattr (shell_terminal, TCSADRAIN, &shell_tmodes); +- } +- +- If the process group is launched as a background job, the shell +-should remain in the foreground itself and continue to read commands +-from the terminal. +- +- In the sample shell, there is not much that needs to be done to put +-a job into the background. Here is the function it uses: +- +- /* Put a job in the background. If the cont argument is true, send +- the process group a `SIGCONT' signal to wake it up. */ +- +- void +- put_job_in_background (job *j, int cont) +- { +- /* Send the job a continue signal, if necessary. */ +- if (cont) +- if (kill (-j->pgid, SIGCONT) < 0) +- perror ("kill (SIGCONT)"); +- } +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-45 glibc-2.3.2-200304020432/manual/libc.info-45 +--- glibc-2.3.2/manual/libc.info-45 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-45 Thu Jan 1 01:00:00 1970 +@@ -1,1245 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Stopped and Terminated Jobs, Next: Continuing Stopped Jobs, Prev: Foreground and Background, Up: Implementing a Shell +- +-Stopped and Terminated Jobs +---------------------------- +- +- When a foreground process is launched, the shell must block until +-all of the processes in that job have either terminated or stopped. It +-can do this by calling the `waitpid' function; see *Note Process +-Completion::. Use the `WUNTRACED' option so that status is reported +-for processes that stop as well as processes that terminate. +- +- The shell must also check on the status of background jobs so that it +-can report terminated and stopped jobs to the user; this can be done by +-calling `waitpid' with the `WNOHANG' option. A good place to put a +-such a check for terminated and stopped jobs is just before prompting +-for a new command. +- +- The shell can also receive asynchronous notification that there is +-status information available for a child process by establishing a +-handler for `SIGCHLD' signals. *Note Signal Handling::. +- +- In the sample shell program, the `SIGCHLD' signal is normally +-ignored. This is to avoid reentrancy problems involving the global data +-structures the shell manipulates. But at specific times when the shell +-is not using these data structures--such as when it is waiting for +-input on the terminal--it makes sense to enable a handler for +-`SIGCHLD'. The same function that is used to do the synchronous status +-checks (`do_job_notification', in this case) can also be called from +-within this handler. +- +- Here are the parts of the sample shell program that deal with +-checking the status of jobs and reporting the information to the user. +- +- /* Store the status of the process PID that was returned by waitpid. +- Return 0 if all went well, nonzero otherwise. */ +- +- int +- mark_process_status (pid_t pid, int status) +- { +- job *j; +- process *p; +- +- if (pid > 0) +- { +- /* Update the record for the process. */ +- for (j = first_job; j; j = j->next) +- for (p = j->first_process; p; p = p->next) +- if (p->pid == pid) +- { +- p->status = status; +- if (WIFSTOPPED (status)) +- p->stopped = 1; +- else +- { +- p->completed = 1; +- if (WIFSIGNALED (status)) +- fprintf (stderr, "%d: Terminated by signal %d.\n", +- (int) pid, WTERMSIG (p->status)); +- } +- return 0; +- } +- fprintf (stderr, "No child process %d.\n", pid); +- return -1; +- } +- else if (pid == 0 || errno == ECHILD) +- /* No processes ready to report. */ +- return -1; +- else { +- /* Other weird errors. */ +- perror ("waitpid"); +- return -1; +- } +- } +- +- /* Check for processes that have status information available, +- without blocking. */ +- +- void +- update_status (void) +- { +- int status; +- pid_t pid; +- +- do +- pid = waitpid (WAIT_ANY, &status, WUNTRACED|WNOHANG); +- while (!mark_process_status (pid, status)); +- } +- +- /* Check for processes that have status information available, +- blocking until all processes in the given job have reported. */ +- +- void +- wait_for_job (job *j) +- { +- int status; +- pid_t pid; +- +- do +- pid = waitpid (WAIT_ANY, &status, WUNTRACED); +- while (!mark_process_status (pid, status) +- && !job_is_stopped (j) +- && !job_is_completed (j)); +- } +- +- /* Format information about job status for the user to look at. */ +- +- void +- format_job_info (job *j, const char *status) +- { +- fprintf (stderr, "%ld (%s): %s\n", (long)j->pgid, status, j->command); +- } +- +- /* Notify the user about stopped or terminated jobs. +- Delete terminated jobs from the active job list. */ +- +- void +- do_job_notification (void) +- { +- job *j, *jlast, *jnext; +- process *p; +- +- /* Update status information for child processes. */ +- update_status (); +- +- jlast = NULL; +- for (j = first_job; j; j = jnext) +- { +- jnext = j->next; +- +- /* If all processes have completed, tell the user the job has +- completed and delete it from the list of active jobs. */ +- if (job_is_completed (j)) { +- format_job_info (j, "completed"); +- if (jlast) +- jlast->next = jnext; +- else +- first_job = jnext; +- free_job (j); +- } +- +- /* Notify the user about stopped jobs, +- marking them so that we won't do this more than once. */ +- else if (job_is_stopped (j) && !j->notified) { +- format_job_info (j, "stopped"); +- j->notified = 1; +- jlast = j; +- } +- +- /* Don't say anything about jobs that are still running. */ +- else +- jlast = j; +- } +- } +- +- +-File: libc.info, Node: Continuing Stopped Jobs, Next: Missing Pieces, Prev: Stopped and Terminated Jobs, Up: Implementing a Shell +- +-Continuing Stopped Jobs +------------------------ +- +- The shell can continue a stopped job by sending a `SIGCONT' signal +-to its process group. If the job is being continued in the foreground, +-the shell should first invoke `tcsetpgrp' to give the job access to the +-terminal, and restore the saved terminal settings. After continuing a +-job in the foreground, the shell should wait for the job to stop or +-complete, as if the job had just been launched in the foreground. +- +- The sample shell program handles both newly created and continued +-jobs with the same pair of functions, `put_job_in_foreground' and +-`put_job_in_background'. The definitions of these functions were given +-in *Note Foreground and Background::. When continuing a stopped job, a +-nonzero value is passed as the CONT argument to ensure that the +-`SIGCONT' signal is sent and the terminal modes reset, as appropriate. +- +- This leaves only a function for updating the shell's internal +-bookkeeping about the job being continued: +- +- /* Mark a stopped job J as being running again. */ +- +- void +- mark_job_as_running (job *j) +- { +- Process *p; +- +- for (p = j->first_process; p; p = p->next) +- p->stopped = 0; +- j->notified = 0; +- } +- +- /* Continue the job J. */ +- +- void +- continue_job (job *j, int foreground) +- { +- mark_job_as_running (j); +- if (foreground) +- put_job_in_foreground (j, 1); +- else +- put_job_in_background (j, 1); +- } +- +- +-File: libc.info, Node: Missing Pieces, Prev: Continuing Stopped Jobs, Up: Implementing a Shell +- +-The Missing Pieces +------------------- +- +- The code extracts for the sample shell included in this chapter are +-only a part of the entire shell program. In particular, nothing at all +-has been said about how `job' and `program' data structures are +-allocated and initialized. +- +- Most real shells provide a complex user interface that has support +-for a command language; variables; abbreviations, substitutions, and +-pattern matching on file names; and the like. All of this is far too +-complicated to explain here! Instead, we have concentrated on showing +-how to implement the core process creation and job control functions +-that can be called from such a shell. +- +- Here is a table summarizing the major entry points we have presented: +- +-`void init_shell (void)' +- Initialize the shell's internal state. *Note Initializing the +- Shell::. +- +-`void launch_job (job *J, int FOREGROUND)' +- Launch the job J as either a foreground or background job. *Note +- Launching Jobs::. +- +-`void do_job_notification (void)' +- Check for and report any jobs that have terminated or stopped. +- Can be called synchronously or within a handler for `SIGCHLD' +- signals. *Note Stopped and Terminated Jobs::. +- +-`void continue_job (job *J, int FOREGROUND)' +- Continue the job J. *Note Continuing Stopped Jobs::. +- +- Of course, a real shell would also want to provide other functions +-for managing jobs. For example, it would be useful to have commands to +-list all active jobs or to send a signal (such as `SIGKILL') to a job. +- +- +-File: libc.info, Node: Functions for Job Control, Prev: Implementing a Shell, Up: Job Control +- +-Functions for Job Control +-========================= +- +- This section contains detailed descriptions of the functions relating +-to job control. +- +-* Menu: +- +-* Identifying the Terminal:: Determining the controlling terminal's name. +-* Process Group Functions:: Functions for manipulating process groups. +-* Terminal Access Functions:: Functions for controlling terminal access. +- +- +-File: libc.info, Node: Identifying the Terminal, Next: Process Group Functions, Up: Functions for Job Control +- +-Identifying the Controlling Terminal +------------------------------------- +- +- You can use the `ctermid' function to get a file name that you can +-use to open the controlling terminal. In the GNU library, it returns +-the same string all the time: `"/dev/tty"'. That is a special "magic" +-file name that refers to the controlling terminal of the current +-process (if it has one). To find the name of the specific terminal +-device, use `ttyname'; *note Is It a Terminal::. +- +- The function `ctermid' is declared in the header file `stdio.h'. +- +- - Function: char * ctermid (char *STRING) +- The `ctermid' function returns a string containing the file name of +- the controlling terminal for the current process. If STRING is +- not a null pointer, it should be an array that can hold at least +- `L_ctermid' characters; the string is returned in this array. +- Otherwise, a pointer to a string in a static area is returned, +- which might get overwritten on subsequent calls to this function. +- +- An empty string is returned if the file name cannot be determined +- for any reason. Even if a file name is returned, access to the +- file it represents is not guaranteed. +- +- - Macro: int L_ctermid +- The value of this macro is an integer constant expression that +- represents the size of a string large enough to hold the file name +- returned by `ctermid'. +- +- See also the `isatty' and `ttyname' functions, in *Note Is It a +-Terminal::. +- +- +-File: libc.info, Node: Process Group Functions, Next: Terminal Access Functions, Prev: Identifying the Terminal, Up: Functions for Job Control +- +-Process Group Functions +------------------------ +- +- Here are descriptions of the functions for manipulating process +-groups. Your program should include the header files `sys/types.h' and +-`unistd.h' to use these functions. +- +- - Function: pid_t setsid (void) +- The `setsid' function creates a new session. The calling process +- becomes the session leader, and is put in a new process group whose +- process group ID is the same as the process ID of that process. +- There are initially no other processes in the new process group, +- and no other process groups in the new session. +- +- This function also makes the calling process have no controlling +- terminal. +- +- The `setsid' function returns the new process group ID of the +- calling process if successful. A return value of `-1' indicates an +- error. The following `errno' error conditions are defined for this +- function: +- +- `EPERM' +- The calling process is already a process group leader, or +- there is already another process group around that has the +- same process group ID. +- +- - Function: pid_t getsid (pid_t PID) +- The `getsid' function returns the process group ID of the session +- leader of the specified process. If a PID is `0', the process +- group ID of the session leader of the current process is returned. +- +- In case of error `-1' is returned and `errno' is set. The +- following `errno' error conditions are defined for this function: +- +- `ESRCH' +- There is no process with the given process ID PID. +- +- `EPERM' +- The calling process and the process specified by PID are in +- different sessions, and the implementation doesn't allow to +- access the process group ID of the session leader of the +- process with ID PID from the calling process. +- +- The `getpgrp' function has two definitions: one derived from BSD +-Unix, and one from the POSIX.1 standard. The feature test macros you +-have selected (*note Feature Test Macros::) determine which definition +-you get. Specifically, you get the BSD version if you define +-`_BSD_SOURCE'; otherwise, you get the POSIX version if you define +-`_POSIX_SOURCE' or `_GNU_SOURCE'. Programs written for old BSD systems +-will not include `unistd.h', which defines `getpgrp' specially under +-`_BSD_SOURCE'. You must link such programs with the `-lbsd-compat' +-option to get the BSD definition. +- +- - POSIX.1 Function: pid_t getpgrp (void) +- The POSIX.1 definition of `getpgrp' returns the process group ID of +- the calling process. +- +- - BSD Function: pid_t getpgrp (pid_t PID) +- The BSD definition of `getpgrp' returns the process group ID of the +- process PID. You can supply a value of `0' for the PID argument +- to get information about the calling process. +- +- - System V Function: int getpgid (pid_t PID) +- `getpgid' is the same as the BSD function `getpgrp'. It returns +- the process group ID of the process PID. You can supply a value +- of `0' for the PID argument to get information about the calling +- process. +- +- In case of error `-1' is returned and `errno' is set. The +- following `errno' error conditions are defined for this function: +- +- `ESRCH' +- There is no process with the given process ID PID. The +- calling process and the process specified by PID are in +- different sessions, and the implementation doesn't allow to +- access the process group ID of the process with ID PID from +- the calling process. +- +- - Function: int setpgid (pid_t PID, pid_t PGID) +- The `setpgid' function puts the process PID into the process group +- PGID. As a special case, either PID or PGID can be zero to +- indicate the process ID of the calling process. +- +- This function fails on a system that does not support job control. +- *Note Job Control is Optional::, for more information. +- +- If the operation is successful, `setpgid' returns zero. Otherwise +- it returns `-1'. The following `errno' error conditions are +- defined for this function: +- +- `EACCES' +- The child process named by PID has executed an `exec' +- function since it was forked. +- +- `EINVAL' +- The value of the PGID is not valid. +- +- `ENOSYS' +- The system doesn't support job control. +- +- `EPERM' +- The process indicated by the PID argument is a session leader, +- or is not in the same session as the calling process, or the +- value of the PGID argument doesn't match a process group ID +- in the same session as the calling process. +- +- `ESRCH' +- The process indicated by the PID argument is not the calling +- process or a child of the calling process. +- +- - Function: int setpgrp (pid_t PID, pid_t PGID) +- This is the BSD Unix name for `setpgid'. Both functions do exactly +- the same thing. +- +- +-File: libc.info, Node: Terminal Access Functions, Prev: Process Group Functions, Up: Functions for Job Control +- +-Functions for Controlling Terminal Access +------------------------------------------ +- +- These are the functions for reading or setting the foreground +-process group of a terminal. You should include the header files +-`sys/types.h' and `unistd.h' in your application to use these functions. +- +- Although these functions take a file descriptor argument to specify +-the terminal device, the foreground job is associated with the terminal +-file itself and not a particular open file descriptor. +- +- - Function: pid_t tcgetpgrp (int FILEDES) +- This function returns the process group ID of the foreground +- process group associated with the terminal open on descriptor +- FILEDES. +- +- If there is no foreground process group, the return value is a +- number greater than `1' that does not match the process group ID +- of any existing process group. This can happen if all of the +- processes in the job that was formerly the foreground job have +- terminated, and no other job has yet been moved into the +- foreground. +- +- In case of an error, a value of `-1' is returned. The following +- `errno' error conditions are defined for this function: +- +- `EBADF' +- The FILEDES argument is not a valid file descriptor. +- +- `ENOSYS' +- The system doesn't support job control. +- +- `ENOTTY' +- The terminal file associated with the FILEDES argument isn't +- the controlling terminal of the calling process. +- +- - Function: int tcsetpgrp (int FILEDES, pid_t PGID) +- This function is used to set a terminal's foreground process group +- ID. The argument FILEDES is a descriptor which specifies the +- terminal; PGID specifies the process group. The calling process +- must be a member of the same session as PGID and must have the same +- controlling terminal. +- +- For terminal access purposes, this function is treated as output. +- If it is called from a background process on its controlling +- terminal, normally all processes in the process group are sent a +- `SIGTTOU' signal. The exception is if the calling process itself +- is ignoring or blocking `SIGTTOU' signals, in which case the +- operation is performed and no signal is sent. +- +- If successful, `tcsetpgrp' returns `0'. A return value of `-1' +- indicates an error. The following `errno' error conditions are +- defined for this function: +- +- `EBADF' +- The FILEDES argument is not a valid file descriptor. +- +- `EINVAL' +- The PGID argument is not valid. +- +- `ENOSYS' +- The system doesn't support job control. +- +- `ENOTTY' +- The FILEDES isn't the controlling terminal of the calling +- process. +- +- `EPERM' +- The PGID isn't a process group in the same session as the +- calling process. +- +- - Function: pid_t tcgetsid (int FILDES) +- This function is used to obtain the process group ID of the session +- for which the terminal specified by FILDES is the controlling +- terminal. If the call is successful the group ID is returned. +- Otherwise the return value is `(pid_t) -1' and the global variable +- ERRNO is set to the following value: +- `EBADF' +- The FILEDES argument is not a valid file descriptor. +- +- `ENOTTY' +- The calling process does not have a controlling terminal, or +- the file is not the controlling terminal. +- +- +-File: libc.info, Node: Name Service Switch, Next: Users and Groups, Prev: Job Control, Up: Top +- +-System Databases and Name Service Switch +-**************************************** +- +- Various functions in the C Library need to be configured to work +-correctly in the local environment. Traditionally, this was done by +-using files (e.g., `/etc/passwd'), but other nameservices (like the +-Network Information Service (NIS) and the Domain Name Service (DNS)) +-became popular, and were hacked into the C library, usually with a fixed +-search order (*note frobnicate: (jargon)frobnicate.). +- +- The GNU C Library contains a cleaner solution of this problem. It is +-designed after a method used by Sun Microsystems in the C library of +-Solaris 2. GNU C Library follows their name and calls this scheme +-"Name Service Switch" (NSS). +- +- Though the interface might be similar to Sun's version there is no +-common code. We never saw any source code of Sun's implementation and +-so the internal interface is incompatible. This also manifests in the +-file names we use as we will see later. +- +-* Menu: +- +-* NSS Basics:: What is this NSS good for. +-* NSS Configuration File:: Configuring NSS. +-* NSS Module Internals:: How does it work internally. +-* Extending NSS:: What to do to add services or databases. +- +- +-File: libc.info, Node: NSS Basics, Next: NSS Configuration File, Prev: Name Service Switch, Up: Name Service Switch +- +-NSS Basics +-========== +- +- The basic idea is to put the implementation of the different services +-offered to access the databases in separate modules. This has some +-advantages: +- +- 1. Contributors can add new services without adding them to GNU C +- Library. +- +- 2. The modules can be updated separately. +- +- 3. The C library image is smaller. +- +- To fulfill the first goal above the ABI of the modules will be +-described below. For getting the implementation of a new service right +-it is important to understand how the functions in the modules get +-called. They are in no way designed to be used by the programmer +-directly. Instead the programmer should only use the documented and +-standardized functions to access the databases. +- +-The databases available in the NSS are +- +-`aliases' +- Mail aliases +- +-`ethers' +- Ethernet numbers, +- +-`group' +- Groups of users, *note Group Database::. +- +-`hosts' +- Host names and numbers, *note Host Names::. +- +-`netgroup' +- Network wide list of host and users, *note Netgroup Database::. +- +-`networks' +- Network names and numbers, *note Networks Database::. +- +-`protocols' +- Network protocols, *note Protocols Database::. +- +-`passwd' +- User passwords, *note User Database::. +- +-`rpc' +- Remote procedure call names and numbers, +- +-`services' +- Network services, *note Services Database::. +- +-`shadow' +- Shadow user passwords, +- +-There will be some more added later (`automount', `bootparams', +-`netmasks', and `publickey'). +- +- +-File: libc.info, Node: NSS Configuration File, Next: NSS Module Internals, Prev: NSS Basics, Up: Name Service Switch +- +-The NSS Configuration File +-========================== +- +- Somehow the NSS code must be told about the wishes of the user. For +-this reason there is the file `/etc/nsswitch.conf'. For each database +-this file contain a specification how the lookup process should work. +-The file could look like this: +- +- # /etc/nsswitch.conf +- # +- # Name Service Switch configuration file. +- # +- +- passwd: db files nis +- shadow: files +- group: db files nis +- +- hosts: files nisplus nis dns +- networks: nisplus [NOTFOUND=return] files +- +- ethers: nisplus [NOTFOUND=return] db files +- protocols: nisplus [NOTFOUND=return] db files +- rpc: nisplus [NOTFOUND=return] db files +- services: nisplus [NOTFOUND=return] db files +- +- The first column is the database as you can guess from the table +-above. The rest of the line specifies how the lookup process works. +-Please note that you specify the way it works for each database +-individually. This cannot be done with the old way of a monolithic +-implementation. +- +- The configuration specification for each database can contain two +-different items: +- +- * the service specification like `files', `db', or `nis'. +- +- * the reaction on lookup result like `[NOTFOUND=return]'. +- +-* Menu: +- +-* Services in the NSS configuration:: Service names in the NSS configuration. +-* Actions in the NSS configuration:: React appropriately to the lookup result. +-* Notes on NSS Configuration File:: Things to take care about while +- configuring NSS. +- +- +-File: libc.info, Node: Services in the NSS configuration, Next: Actions in the NSS configuration, Prev: NSS Configuration File, Up: NSS Configuration File +- +-Services in the NSS configuration File +--------------------------------------- +- +- The above example file mentions four different services: `files', +-`db', `nis', and `nisplus'. This does not mean these services are +-available on all sites and it does also not mean these are all the +-services which will ever be available. +- +- In fact, these names are simply strings which the NSS code uses to +-find the implicitly addressed functions. The internal interface will be +-described later. Visible to the user are the modules which implement an +-individual service. +- +- Assume the service NAME shall be used for a lookup. The code for +-this service is implemented in a module called `libnss_NAME'. On a +-system supporting shared libraries this is in fact a shared library +-with the name (for example) `libnss_NAME.so.2'. The number at the end +-is the currently used version of the interface which will not change +-frequently. Normally the user should not have to be cognizant of these +-files since they should be placed in a directory where they are found +-automatically. Only the names of all available services are important. +- +- +-File: libc.info, Node: Actions in the NSS configuration, Next: Notes on NSS Configuration File, Prev: Services in the NSS configuration, Up: NSS Configuration File +- +-Actions in the NSS configuration +--------------------------------- +- +- The second item in the specification gives the user much finer +-control on the lookup process. Action items are placed between two +-service names and are written within brackets. The general form is +- +- `[' ( `!'? STATUS `=' ACTION )+ `]' +- +-where +- +- STATUS => success | notfound | unavail | tryagain +- ACTION => return | continue +- +- The case of the keywords is insignificant. The STATUS values are +-the results of a call to a lookup function of a specific service. They +-mean +- +-`success' +- No error occurred and the wanted entry is returned. The default +- action for this is `return'. +- +-`notfound' +- The lookup process works ok but the needed value was not found. +- The default action is `continue'. +- +-`unavail' +- The service is permanently unavailable. This can either mean the +- needed file is not available, or, for DNS, the server is not +- available or does not allow queries. The default action is +- `continue'. +- +-`tryagain' +- The service is temporarily unavailable. This could mean a file is +- locked or a server currently cannot accept more connections. The +- default action is `continue'. +- +-If we have a line like +- +- ethers: nisplus [NOTFOUND=return] db files +- +-this is equivalent to +- +- ethers: nisplus [SUCCESS=return NOTFOUND=return UNAVAIL=continue +- TRYAGAIN=continue] +- db [SUCCESS=return NOTFOUND=continue UNAVAIL=continue +- TRYAGAIN=continue] +- files +- +-(except that it would have to be written on one line). The default +-value for the actions are normally what you want, and only need to be +-changed in exceptional cases. +- +- If the optional `!' is placed before the STATUS this means the +-following action is used for all statuses but STATUS itself. I.e., `!' +-is negation as in the C language (and others). +- +- Before we explain the exception which makes this action item +-necessary one more remark: obviously it makes no sense to add another +-action item after the `files' service. Since there is no other service +-following the action _always_ is `return'. +- +- Now, why is this `[NOTFOUND=return]' action useful? To understand +-this we should know that the `nisplus' service is often complete; i.e., +-if an entry is not available in the NIS+ tables it is not available +-anywhere else. This is what is expressed by this action item: it is +-useless to examine further services since they will not give us a +-result. +- +- The situation would be different if the NIS+ service is not available +-because the machine is booting. In this case the return value of the +-lookup function is not `notfound' but instead `unavail'. And as you +-can see in the complete form above: in this situation the `db' and +-`files' services are used. Neat, isn't it? The system administrator +-need not pay special care for the time the system is not completely +-ready to work (while booting or shutdown or network problems). +- +- +-File: libc.info, Node: Notes on NSS Configuration File, Prev: Actions in the NSS configuration, Up: NSS Configuration File +- +-Notes on the NSS Configuration File +------------------------------------ +- +- Finally a few more hints. The NSS implementation is not completely +-helpless if `/etc/nsswitch.conf' does not exist. For all supported +-databases there is a default value so it should normally be possible to +-get the system running even if the file is corrupted or missing. +- +- For the `hosts' and `networks' databases the default value is `dns +-[!UNAVAIL=return] files'. I.e., the system is prepared for the DNS +-service not to be available but if it is available the answer it +-returns is definitive. +- +- The `passwd', `group', and `shadow' databases are traditionally +-handled in a special way. The appropriate files in the `/etc' +-directory are read but if an entry with a name starting with a `+' +-character is found NIS is used. This kind of lookup remains possible +-by using the special lookup service `compat' and the default value for +-the three databases above is `compat [NOTFOUND=return] files'. +- +- For all other databases the default value is `nis [NOTFOUND=return] +-files'. This solution give the best chance to be correct since NIS and +-file based lookup is used. +- +- A second point is that the user should try to optimize the lookup +-process. The different service have different response times. A +-simple file look up on a local file could be fast, but if the file is +-long and the needed entry is near the end of the file this may take +-quite some time. In this case it might be better to use the `db' +-service which allows fast local access to large data sets. +- +- Often the situation is that some global information like NIS must be +-used. So it is unavoidable to use service entries like `nis' etc. But +-one should avoid slow services like this if possible. +- +- +-File: libc.info, Node: NSS Module Internals, Next: Extending NSS, Prev: NSS Configuration File, Up: Name Service Switch +- +-NSS Module Internals +-==================== +- +- Now it is time to describe what the modules look like. The functions +-contained in a module are identified by their names. I.e., there is no +-jump table or the like. How this is done is of no interest here; those +-interested in this topic should read about Dynamic Linking. +- +-* Menu: +- +-* NSS Module Names:: Construction of the interface function of +- the NSS modules. +-* NSS Modules Interface:: Programming interface in the NSS module +- functions. +- +- +-File: libc.info, Node: NSS Module Names, Next: NSS Modules Interface, Prev: NSS Module Internals, Up: NSS Module Internals +- +-The Naming Scheme of the NSS Modules +------------------------------------- +- +-The name of each function consist of various parts: +- +- _nss_SERVICE_FUNCTION +- +- SERVICE of course corresponds to the name of the module this +-function is found in.(1) The FUNCTION part is derived from the +-interface function in the C library itself. If the user calls the +-function `gethostbyname' and the service used is `files' the function +- +- _nss_files_gethostbyname_r +- +-in the module +- +- libnss_files.so.2 +- +-is used. You see, what is explained above in not the whole truth. In +-fact the NSS modules only contain reentrant versions of the lookup +-functions. I.e., if the user would call the `gethostbyname_r' function +-this also would end in the above function. For all user interface +-functions the C library maps this call to a call to the reentrant +-function. For reentrant functions this is trivial since the interface +-is (nearly) the same. For the non-reentrant version The library keeps +-internal buffers which are used to replace the user supplied buffer. +- +- I.e., the reentrant functions _can_ have counterparts. No service +-module is forced to have functions for all databases and all kinds to +-access them. If a function is not available it is simply treated as if +-the function would return `unavail' (*note Actions in the NSS +-configuration::). +- +- The file name `libnss_files.so.2' would be on a Solaris 2 system +-`nss_files.so.2'. This is the difference mentioned above. Sun's NSS +-modules are usable as modules which get indirectly loaded only. +- +- The NSS modules in the GNU C Library are prepared to be used as +-normal libraries themselves. This is _not_ true at the moment, though. +-However, the organization of the name space in the modules does not +-make it impossible like it is for Solaris. Now you can see why the +-modules are still libraries.(2) +- +- ---------- Footnotes ---------- +- +- (1) Now you might ask why this information is duplicated. The +-answer is that we want to make it possible to link directly with these +-shared objects. +- +- (2) There is a second explanation: we were too lazy to change the +-Makefiles to allow the generation of shared objects not starting with +-`lib' but don't tell this to anybody. +- +- +-File: libc.info, Node: NSS Modules Interface, Prev: NSS Module Names, Up: NSS Module Internals +- +-The Interface of the Function in NSS Modules +--------------------------------------------- +- +- Now we know about the functions contained in the modules. It is now +-time to describe the types. When we mentioned the reentrant versions of +-the functions above, this means there are some additional arguments +-(compared with the standard, non-reentrant version). The prototypes for +-the non-reentrant and reentrant versions of our function above are: +- +- struct hostent *gethostbyname (const char *name) +- +- int gethostbyname_r (const char *name, struct hostent *result_buf, +- char *buf, size_t buflen, struct hostent **result, +- int *h_errnop) +- +-The actual prototype of the function in the NSS modules in this case is +- +- enum nss_status _nss_files_gethostbyname_r (const char *name, +- struct hostent *result_buf, +- char *buf, size_t buflen, +- int *errnop, int *h_errnop) +- +- I.e., the interface function is in fact the reentrant function with +-the change of the return value and the omission of the RESULT +-parameter. While the user-level function returns a pointer to the +-result the reentrant function return an `enum nss_status' value: +- +-`NSS_STATUS_TRYAGAIN' +- numeric value `-2' +- +-`NSS_STATUS_UNAVAIL' +- numeric value `-1' +- +-`NSS_STATUS_NOTFOUND' +- numeric value `0' +- +-`NSS_STATUS_SUCCESS' +- numeric value `1' +- +-Now you see where the action items of the `/etc/nsswitch.conf' file are +-used. +- +- If you study the source code you will find there is a fifth value: +-`NSS_STATUS_RETURN'. This is an internal use only value, used by a few +-functions in places where none of the above value can be used. If +-necessary the source code should be examined to learn about the details. +- +- In case the interface function has to return an error it is important +-that the correct error code is stored in `*ERRNOP'. Some return status +-value have only one associated error code, others have more. +- +-`NSS_STATUS_TRYAGAIN' `EAGAIN' One of the functions used ran +- temporarily out of resources or a +- service is currently not available. +- `ERANGE' The provided buffer is not large +- enough. The function should be +- called again with a larger buffer. +-`NSS_STATUS_UNAVAIL' `ENOENT' A necessary input file cannot be +- found. +-`NSS_STATUS_NOTFOUND' `ENOENT' The requested entry is not +- available. +- +- These are proposed values. There can be other error codes and the +-described error codes can have different meaning. *With one +-exception:* when returning `NSS_STATUS_TRYAGAIN' the error code +-`ERANGE' _must_ mean that the user provided buffer is too small. +-Everything is non-critical. +- +- The above function has something special which is missing for almost +-all the other module functions. There is an argument H_ERRNOP. This +-points to a variable which will be filled with the error code in case +-the execution of the function fails for some reason. The reentrant +-function cannot use the global variable H_ERRNO; `gethostbyname' calls +-`gethostbyname_r' with the last argument set to `&h_errno'. +- +- The `getXXXbyYYY' functions are the most important functions in the +-NSS modules. But there are others which implement the other ways to +-access system databases (say for the password database, there are +-`setpwent', `getpwent', and `endpwent'). These will be described in +-more detail later. Here we give a general way to determine the +-signature of the module function: +- +- * the return value is `int'; +- +- * the name is as explained in *note NSS Module Names::; +- +- * the first arguments are identical to the arguments of the +- non-reentrant function; +- +- * the next three arguments are: +- +- `STRUCT_TYPE *result_buf' +- pointer to buffer where the result is stored. `STRUCT_TYPE' +- is normally a struct which corresponds to the database. +- +- `char *buffer' +- pointer to a buffer where the function can store additional +- data for the result etc. +- +- `size_t buflen' +- length of the buffer pointed to by BUFFER. +- +- * possibly a last argument H_ERRNOP, for the host name and network +- name lookup functions. +- +-This table is correct for all functions but the `set...ent' and +-`end...ent' functions. +- +- +-File: libc.info, Node: Extending NSS, Prev: NSS Module Internals, Up: Name Service Switch +- +-Extending NSS +-============= +- +- One of the advantages of NSS mentioned above is that it can be +-extended quite easily. There are two ways in which the extension can +-happen: adding another database or adding another service. The former +-is normally done only by the C library developers. It is here only +-important to remember that adding another database is independent from +-adding another service because a service need not support all databases +-or lookup functions. +- +- A designer/implementor of a new service is therefore free to choose +-the databases s/he is interested in and leave the rest for later (or +-completely aside). +- +-* Menu: +- +-* Adding another Service to NSS:: What is to do to add a new service. +-* NSS Module Function Internals:: Guidelines for writing new NSS +- service functions. +- +- +-File: libc.info, Node: Adding another Service to NSS, Next: NSS Module Function Internals, Prev: Extending NSS, Up: Extending NSS +- +-Adding another Service to NSS +------------------------------ +- +- The sources for a new service need not (and should not) be part of +-the GNU C Library itself. The developer retains complete control over +-the sources and its development. The links between the C library and +-the new service module consists solely of the interface functions. +- +- Each module is designed following a specific interface specification. +-For now the version is 2 (the interface in version 1 was not adequate) +-and this manifests in the version number of the shared library object of +-the NSS modules: they have the extension `.2'. If the interface +-changes again in an incompatible way, this number will be increased. +-Modules using the old interface will still be usable. +- +- Developers of a new service will have to make sure that their module +-is created using the correct interface number. This means the file +-itself must have the correct name and on ELF systems the "soname" +-(Shared Object Name) must also have this number. Building a module +-from a bunch of object files on an ELF system using GNU CC could be +-done like this: +- +- gcc -shared -o libnss_NAME.so.2 -Wl,-soname,libnss_NAME.so.2 OBJECTS +- +-*Note Options for Linking: (gcc)Link Options, to learn more about this +-command line. +- +- To use the new module the library must be able to find it. This can +-be achieved by using options for the dynamic linker so that it will +-search the directory where the binary is placed. For an ELF system +-this could be done by adding the wanted directory to the value of +-`LD_LIBRARY_PATH'. +- +- But this is not always possible since some programs (those which run +-under IDs which do not belong to the user) ignore this variable. +-Therefore the stable version of the module should be placed into a +-directory which is searched by the dynamic linker. Normally this should +-be the directory `$prefix/lib', where `$prefix' corresponds to the +-value given to configure using the `--prefix' option. But be careful: +-this should only be done if it is clear the module does not cause any +-harm. System administrators should be careful. +- +- +-File: libc.info, Node: NSS Module Function Internals, Prev: Adding another Service to NSS, Up: Extending NSS +- +-Internals of the NSS Module Functions +-------------------------------------- +- +- Until now we only provided the syntactic interface for the functions +-in the NSS module. In fact there is not much more we can say since the +-implementation obviously is different for each function. But a few +-general rules must be followed by all functions. +- +- In fact there are four kinds of different functions which may appear +-in the interface. All derive from the traditional ones for system +-databases. DB in the following table is normally an abbreviation for +-the database (e.g., it is `pw' for the password database). +- +-`enum nss_status _nss_DATABASE_setDBent (void)' +- This function prepares the service for following operations. For a +- simple file based lookup this means files could be opened, for +- other services this function simply is a noop. +- +- One special case for this function is that it takes an additional +- argument for some DATABASEs (i.e., the interface is `int setDBent +- (int)'). *Note Host Names::, which describes the `sethostent' +- function. +- +- The return value should be NSS_STATUS_SUCCESS or according to the +- table above in case of an error (*note NSS Modules Interface::). +- +-`enum nss_status _nss_DATABASE_endDBent (void)' +- This function simply closes all files which are still open or +- removes buffer caches. If there are no files or buffers to remove +- this is again a simple noop. +- +- There normally is no return value different to NSS_STATUS_SUCCESS. +- +-`enum nss_status _nss_DATABASE_getDBent_r (STRUCTURE *result, char *buffer, size_t buflen, int *errnop)' +- Since this function will be called several times in a row to +- retrieve one entry after the other it must keep some kind of +- state. But this also means the functions are not really +- reentrant. They are reentrant only in that simultaneous calls to +- this function will not try to write the retrieved data in the same +- place (as it would be the case for the non-reentrant functions); +- instead, it writes to the structure pointed to by the RESULT +- parameter. But the calls share a common state and in the case of +- a file access this means they return neighboring entries in the +- file. +- +- The buffer of length BUFLEN pointed to by BUFFER can be used for +- storing some additional data for the result. It is _not_ +- guaranteed that the same buffer will be passed for the next call +- of this function. Therefore one must not misuse this buffer to +- save some state information from one call to another. +- +- Before the function returns the implementation should store the +- value of the local ERRNO variable in the variable pointed to be +- ERRNOP. This is important to guarantee the module working in +- statically linked programs. +- +- As explained above this function could also have an additional last +- argument. This depends on the database used; it happens only for +- `host' and `networks'. +- +- The function shall return `NSS_STATUS_SUCCESS' as long as there are +- more entries. When the last entry was read it should return +- `NSS_STATUS_NOTFOUND'. When the buffer given as an argument is too +- small for the data to be returned `NSS_STATUS_TRYAGAIN' should be +- returned. When the service was not formerly initialized by a call +- to `_nss_DATABASE_setDBent' all return value allowed for this +- function can also be returned here. +- +-`enum nss_status _nss_DATABASE_getDBbyXX_r (PARAMS, STRUCTURE *result, char *buffer, size_t buflen, int *errnop)' +- This function shall return the entry from the database which is +- addressed by the PARAMS. The type and number of these arguments +- vary. It must be individually determined by looking to the +- user-level interface functions. All arguments given to the +- non-reentrant version are here described by PARAMS. +- +- The result must be stored in the structure pointed to by RESULT. +- If there is additional data to return (say strings, where the +- RESULT structure only contains pointers) the function must use the +- BUFFER or length BUFLEN. There must not be any references to +- non-constant global data. +- +- The implementation of this function should honor the STAYOPEN flag +- set by the `setDBent' function whenever this makes sense. +- +- Before the function returns the implementation should store the +- value of the local ERRNO variable in the variable pointed to be +- ERRNOP. This is important to guarantee the module working in +- statically linked programs. +- +- Again, this function takes an additional last argument for the +- `host' and `networks' database. +- +- The return value should as always follow the rules given above +- (*note NSS Modules Interface::). +- +- +-File: libc.info, Node: Users and Groups, Next: System Management, Prev: Name Service Switch, Up: Top +- +-Users and Groups +-**************** +- +- Every user who can log in on the system is identified by a unique +-number called the "user ID". Each process has an effective user ID +-which says which user's access permissions it has. +- +- Users are classified into "groups" for access control purposes. Each +-process has one or more "group ID values" which say which groups the +-process can use for access to files. +- +- The effective user and group IDs of a process collectively form its +-"persona". This determines which files the process can access. +-Normally, a process inherits its persona from the parent process, but +-under special circumstances a process can change its persona and thus +-change its access permissions. +- +- Each file in the system also has a user ID and a group ID. Access +-control works by comparing the user and group IDs of the file with those +-of the running process. +- +- The system keeps a database of all the registered users, and another +-database of all the defined groups. There are library functions you +-can use to examine these databases. +- +-* Menu: +- +-* User and Group IDs:: Each user has a unique numeric ID; +- likewise for groups. +-* Process Persona:: The user IDs and group IDs of a process. +-* Why Change Persona:: Why a program might need to change +- its user and/or group IDs. +-* How Change Persona:: Changing the user and group IDs. +-* Reading Persona:: How to examine the user and group IDs. +- +-* Setting User ID:: Functions for setting the user ID. +-* Setting Groups:: Functions for setting the group IDs. +- +-* Enable/Disable Setuid:: Turning setuid access on and off. +-* Setuid Program Example:: The pertinent parts of one sample program. +-* Tips for Setuid:: How to avoid granting unlimited access. +- +-* Who Logged In:: Getting the name of the user who logged in, +- or of the real user ID of the current process. +- +-* User Accounting Database:: Keeping information about users and various +- actions in databases. +- +-* User Database:: Functions and data structures for +- accessing the user database. +-* Group Database:: Functions and data structures for +- accessing the group database. +-* Database Example:: Example program showing the use of database +- inquiry functions. +-* Netgroup Database:: Functions for accessing the netgroup database. +- +- +-File: libc.info, Node: User and Group IDs, Next: Process Persona, Up: Users and Groups +- +-User and Group IDs +-================== +- +- Each user account on a computer system is identified by a "user +-name" (or "login name") and "user ID". Normally, each user name has a +-unique user ID, but it is possible for several login names to have the +-same user ID. The user names and corresponding user IDs are stored in +-a data base which you can access as described in *Note User Database::. +- +- Users are classified in "groups". Each user name belongs to one +-"default group" and may also belong to any number of "supplementary +-groups". Users who are members of the same group can share resources +-(such as files) that are not accessible to users who are not a member +-of that group. Each group has a "group name" and "group ID". *Note +-Group Database::, for how to find information about a group ID or group +-name. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-46 glibc-2.3.2-200304020432/manual/libc.info-46 +--- glibc-2.3.2/manual/libc.info-46 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-46 Thu Jan 1 01:00:00 1970 +@@ -1,1238 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Process Persona, Next: Why Change Persona, Prev: User and Group IDs, Up: Users and Groups +- +-The Persona of a Process +-======================== +- +- At any time, each process has an "effective user ID", a "effective +-group ID", and a set of "supplementary group IDs". These IDs determine +-the privileges of the process. They are collectively called the +-"persona" of the process, because they determine "who it is" for +-purposes of access control. +- +- Your login shell starts out with a persona which consists of your +-user ID, your default group ID, and your supplementary group IDs (if +-you are in more than one group). In normal circumstances, all your +-other processes inherit these values. +- +- A process also has a "real user ID" which identifies the user who +-created the process, and a "real group ID" which identifies that user's +-default group. These values do not play a role in access control, so +-we do not consider them part of the persona. But they are also +-important. +- +- Both the real and effective user ID can be changed during the +-lifetime of a process. *Note Why Change Persona::. +- +- For details on how a process's effective user ID and group IDs affect +-its permission to access files, see *Note Access Permission::. +- +- The effective user ID of a process also controls permissions for +-sending signals using the `kill' function. *Note Signaling Another +-Process::. +- +- Finally, there are many operations which can only be performed by a +-process whose effective user ID is zero. A process with this user ID is +-a "privileged process". Commonly the user name `root' is associated +-with user ID 0, but there may be other user names with this ID. +- +- +-File: libc.info, Node: Why Change Persona, Next: How Change Persona, Prev: Process Persona, Up: Users and Groups +- +-Why Change the Persona of a Process? +-==================================== +- +- The most obvious situation where it is necessary for a process to +-change its user and/or group IDs is the `login' program. When `login' +-starts running, its user ID is `root'. Its job is to start a shell +-whose user and group IDs are those of the user who is logging in. (To +-accomplish this fully, `login' must set the real user and group IDs as +-well as its persona. But this is a special case.) +- +- The more common case of changing persona is when an ordinary user +-program needs access to a resource that wouldn't ordinarily be +-accessible to the user actually running it. +- +- For example, you may have a file that is controlled by your program +-but that shouldn't be read or modified directly by other users, either +-because it implements some kind of locking protocol, or because you want +-to preserve the integrity or privacy of the information it contains. +-This kind of restricted access can be implemented by having the program +-change its effective user or group ID to match that of the resource. +- +- Thus, imagine a game program that saves scores in a file. The game +-program itself needs to be able to update this file no matter who is +-running it, but if users can write the file without going through the +-game, they can give themselves any scores they like. Some people +-consider this undesirable, or even reprehensible. It can be prevented +-by creating a new user ID and login name (say, `games') to own the +-scores file, and make the file writable only by this user. Then, when +-the game program wants to update this file, it can change its effective +-user ID to be that for `games'. In effect, the program must adopt the +-persona of `games' so it can write the scores file. +- +- +-File: libc.info, Node: How Change Persona, Next: Reading Persona, Prev: Why Change Persona, Up: Users and Groups +- +-How an Application Can Change Persona +-===================================== +- +- The ability to change the persona of a process can be a source of +-unintentional privacy violations, or even intentional abuse. Because of +-the potential for problems, changing persona is restricted to special +-circumstances. +- +- You can't arbitrarily set your user ID or group ID to anything you +-want; only privileged processes can do that. Instead, the normal way +-for a program to change its persona is that it has been set up in +-advance to change to a particular user or group. This is the function +-of the setuid and setgid bits of a file's access mode. *Note +-Permission Bits::. +- +- When the setuid bit of an executable file is on, executing that file +-gives the process a third user ID: the "file user ID". This ID is set +-to the owner ID of the file. The system then changes the effective +-user ID to the file user ID. The real user ID remains as it was. +-Likewise, if the setgid bit is on, the process is given a "file group +-ID" equal to the group ID of the file, and its effective group ID is +-changed to the file group ID. +- +- If a process has a file ID (user or group), then it can at any time +-change its effective ID to its real ID and back to its file ID. +-Programs use this feature to relinquish their special privileges except +-when they actually need them. This makes it less likely that they can +-be tricked into doing something inappropriate with their privileges. +- +- *Portability Note:* Older systems do not have file IDs. To +-determine if a system has this feature, you can test the compiler +-define `_POSIX_SAVED_IDS'. (In the POSIX standard, file IDs are known +-as saved IDs.) +- +- *Note File Attributes::, for a more general discussion of file modes +-and accessibility. +- +- +-File: libc.info, Node: Reading Persona, Next: Setting User ID, Prev: How Change Persona, Up: Users and Groups +- +-Reading the Persona of a Process +-================================ +- +- Here are detailed descriptions of the functions for reading the user +-and group IDs of a process, both real and effective. To use these +-facilities, you must include the header files `sys/types.h' and +-`unistd.h'. +- +- - Data Type: uid_t +- This is an integer data type used to represent user IDs. In the +- GNU library, this is an alias for `unsigned int'. +- +- - Data Type: gid_t +- This is an integer data type used to represent group IDs. In the +- GNU library, this is an alias for `unsigned int'. +- +- - Function: uid_t getuid (void) +- The `getuid' function returns the real user ID of the process. +- +- - Function: gid_t getgid (void) +- The `getgid' function returns the real group ID of the process. +- +- - Function: uid_t geteuid (void) +- The `geteuid' function returns the effective user ID of the +- process. +- +- - Function: gid_t getegid (void) +- The `getegid' function returns the effective group ID of the +- process. +- +- - Function: int getgroups (int COUNT, gid_t *GROUPS) +- The `getgroups' function is used to inquire about the supplementary +- group IDs of the process. Up to COUNT of these group IDs are +- stored in the array GROUPS; the return value from the function is +- the number of group IDs actually stored. If COUNT is smaller than +- the total number of supplementary group IDs, then `getgroups' +- returns a value of `-1' and `errno' is set to `EINVAL'. +- +- If COUNT is zero, then `getgroups' just returns the total number +- of supplementary group IDs. On systems that do not support +- supplementary groups, this will always be zero. +- +- Here's how to use `getgroups' to read all the supplementary group +- IDs: +- +- gid_t * +- read_all_groups (void) +- { +- int ngroups = getgroups (0, NULL); +- gid_t *groups +- = (gid_t *) xmalloc (ngroups * sizeof (gid_t)); +- int val = getgroups (ngroups, groups); +- if (val < 0) +- { +- free (groups); +- return NULL; +- } +- return groups; +- } +- +- +-File: libc.info, Node: Setting User ID, Next: Setting Groups, Prev: Reading Persona, Up: Users and Groups +- +-Setting the User ID +-=================== +- +- This section describes the functions for altering the user ID (real +-and/or effective) of a process. To use these facilities, you must +-include the header files `sys/types.h' and `unistd.h'. +- +- - Function: int seteuid (uid_t NEWEUID) +- This function sets the effective user ID of a process to NEWUID, +- provided that the process is allowed to change its effective user +- ID. A privileged process (effective user ID zero) can change its +- effective user ID to any legal value. An unprivileged process +- with a file user ID can change its effective user ID to its real +- user ID or to its file user ID. Otherwise, a process may not +- change its effective user ID at all. +- +- The `seteuid' function returns a value of `0' to indicate +- successful completion, and a value of `-1' to indicate an error. +- The following `errno' error conditions are defined for this +- function: +- +- `EINVAL' +- The value of the NEWUID argument is invalid. +- +- `EPERM' +- The process may not change to the specified ID. +- +- Older systems (those without the `_POSIX_SAVED_IDS' feature) do not +- have this function. +- +- - Function: int setuid (uid_t NEWUID) +- If the calling process is privileged, this function sets both the +- real and effective user ID of the process to NEWUID. It also +- deletes the file user ID of the process, if any. NEWUID may be any +- legal value. (Once this has been done, there is no way to recover +- the old effective user ID.) +- +- If the process is not privileged, and the system supports the +- `_POSIX_SAVED_IDS' feature, then this function behaves like +- `seteuid'. +- +- The return values and error conditions are the same as for +- `seteuid'. +- +- - Function: int setreuid (uid_t RUID, uid_t EUID) +- This function sets the real user ID of the process to RUID and the +- effective user ID to EUID. If RUID is `-1', it means not to +- change the real user ID; likewise if EUID is `-1', it means not to +- change the effective user ID. +- +- The `setreuid' function exists for compatibility with 4.3 BSD Unix, +- which does not support file IDs. You can use this function to +- swap the effective and real user IDs of the process. (Privileged +- processes are not limited to this particular usage.) If file IDs +- are supported, you should use that feature instead of this +- function. *Note Enable/Disable Setuid::. +- +- The return value is `0' on success and `-1' on failure. The +- following `errno' error conditions are defined for this function: +- +- `EPERM' +- The process does not have the appropriate privileges; you do +- not have permission to change to the specified ID. +- +- +-File: libc.info, Node: Setting Groups, Next: Enable/Disable Setuid, Prev: Setting User ID, Up: Users and Groups +- +-Setting the Group IDs +-===================== +- +- This section describes the functions for altering the group IDs (real +-and effective) of a process. To use these facilities, you must include +-the header files `sys/types.h' and `unistd.h'. +- +- - Function: int setegid (gid_t NEWGID) +- This function sets the effective group ID of the process to +- NEWGID, provided that the process is allowed to change its group +- ID. Just as with `seteuid', if the process is privileged it may +- change its effective group ID to any value; if it isn't, but it +- has a file group ID, then it may change to its real group ID or +- file group ID; otherwise it may not change its effective group ID. +- +- Note that a process is only privileged if its effective _user_ ID +- is zero. The effective group ID only affects access permissions. +- +- The return values and error conditions for `setegid' are the same +- as those for `seteuid'. +- +- This function is only present if `_POSIX_SAVED_IDS' is defined. +- +- - Function: int setgid (gid_t NEWGID) +- This function sets both the real and effective group ID of the +- process to NEWGID, provided that the process is privileged. It +- also deletes the file group ID, if any. +- +- If the process is not privileged, then `setgid' behaves like +- `setegid'. +- +- The return values and error conditions for `setgid' are the same +- as those for `seteuid'. +- +- - Function: int setregid (gid_t RGID, gid_t EGID) +- This function sets the real group ID of the process to RGID and +- the effective group ID to EGID. If RGID is `-1', it means not to +- change the real group ID; likewise if EGID is `-1', it means not +- to change the effective group ID. +- +- The `setregid' function is provided for compatibility with 4.3 BSD +- Unix, which does not support file IDs. You can use this function +- to swap the effective and real group IDs of the process. +- (Privileged processes are not limited to this usage.) If file IDs +- are supported, you should use that feature instead of using this +- function. *Note Enable/Disable Setuid::. +- +- The return values and error conditions for `setregid' are the same +- as those for `setreuid'. +- +- `setuid' and `setgid' behave differently depending on whether the +-effective user ID at the time is zero. If it is not zero, they behave +-like `seteuid' and `setegid'. If it is, they change both effective and +-real IDs and delete the file ID. To avoid confusion, we recommend you +-always use `seteuid' and `setegid' except when you know the effective +-user ID is zero and your intent is to change the persona permanently. +-This case is rare--most of the programs that need it, such as `login' +-and `su', have already been written. +- +- Note that if your program is setuid to some user other than `root', +-there is no way to drop privileges permanently. +- +- The system also lets privileged processes change their supplementary +-group IDs. To use `setgroups' or `initgroups', your programs should +-include the header file `grp.h'. +- +- - Function: int setgroups (size_t COUNT, gid_t *GROUPS) +- This function sets the process's supplementary group IDs. It can +- only be called from privileged processes. The COUNT argument +- specifies the number of group IDs in the array GROUPS. +- +- This function returns `0' if successful and `-1' on error. The +- following `errno' error conditions are defined for this function: +- +- `EPERM' +- The calling process is not privileged. +- +- - Function: int initgroups (const char *USER, gid_t GROUP) +- The `initgroups' function sets the process's supplementary group +- IDs to be the normal default for the user name USER. The group +- GROUP is automatically included. +- +- This function works by scanning the group database for all the +- groups USER belongs to. It then calls `setgroups' with the list it +- has constructed. +- +- The return values and error conditions are the same as for +- `setgroups'. +- +- If you are interested in the groups a particular user belongs to, +-but do not want to change the process's supplementary group IDs, you +-can use `getgrouplist'. To use `getgrouplist', your programs should +-include the header file `grp.h'. +- +- - Function: int getgrouplist (const char *USER, gid_t GROUP, gid_t +- *GROUPS, int *NGROUPS) +- The `getgrouplist' function scans the group database for all the +- groups USER belongs to. Up to *NGROUPS group IDs corresponding to +- these groups are stored in the array GROUPS; the return value from +- the function is the number of group IDs actually stored. If +- *NGROUPS is smaller than the total number of groups found, then +- `getgrouplist' returns a value of `-1' and stores the actual +- number of groups in *NGROUPS. The group GROUP is automatically +- included in the list of groups returned by `getgrouplist'. +- +- Here's how to use `getgrouplist' to read all supplementary groups +- for USER: +- +- gid_t * +- supplementary_groups (char *user) +- { +- int ngroups = 16; +- gid_t *groups +- = (gid_t *) xmalloc (ngroups * sizeof (gid_t)); +- struct passwd *pw = getpwnam (user); +- +- if (pw == NULL) +- return NULL; +- +- if (getgrouplist (pw->pw_name, pw->pw_gid, groups, &ngroups) < 0) +- { +- groups = xrealloc (ngroups * sizeof (gid_t)); +- getgrouplist (pw->pw_name, pw->pw_gid, groups, &ngroups); +- } +- return groups; +- } +- +- +-File: libc.info, Node: Enable/Disable Setuid, Next: Setuid Program Example, Prev: Setting Groups, Up: Users and Groups +- +-Enabling and Disabling Setuid Access +-==================================== +- +- A typical setuid program does not need its special access all of the +-time. It's a good idea to turn off this access when it isn't needed, +-so it can't possibly give unintended access. +- +- If the system supports the `_POSIX_SAVED_IDS' feature, you can +-accomplish this with `seteuid'. When the game program starts, its real +-user ID is `jdoe', its effective user ID is `games', and its saved user +-ID is also `games'. The program should record both user ID values once +-at the beginning, like this: +- +- user_user_id = getuid (); +- game_user_id = geteuid (); +- +- Then it can turn off game file access with +- +- seteuid (user_user_id); +- +-and turn it on with +- +- seteuid (game_user_id); +- +-Throughout this process, the real user ID remains `jdoe' and the file +-user ID remains `games', so the program can always set its effective +-user ID to either one. +- +- On other systems that don't support file user IDs, you can turn +-setuid access on and off by using `setreuid' to swap the real and +-effective user IDs of the process, as follows: +- +- setreuid (geteuid (), getuid ()); +- +-This special case is always allowed--it cannot fail. +- +- Why does this have the effect of toggling the setuid access? +-Suppose a game program has just started, and its real user ID is `jdoe' +-while its effective user ID is `games'. In this state, the game can +-write the scores file. If it swaps the two uids, the real becomes +-`games' and the effective becomes `jdoe'; now the program has only +-`jdoe' access. Another swap brings `games' back to the effective user +-ID and restores access to the scores file. +- +- In order to handle both kinds of systems, test for the saved user ID +-feature with a preprocessor conditional, like this: +- +- #ifdef _POSIX_SAVED_IDS +- seteuid (user_user_id); +- #else +- setreuid (geteuid (), getuid ()); +- #endif +- +- +-File: libc.info, Node: Setuid Program Example, Next: Tips for Setuid, Prev: Enable/Disable Setuid, Up: Users and Groups +- +-Setuid Program Example +-====================== +- +- Here's an example showing how to set up a program that changes its +-effective user ID. +- +- This is part of a game program called `caber-toss' that manipulates +-a file `scores' that should be writable only by the game program +-itself. The program assumes that its executable file will be installed +-with the setuid bit set and owned by the same user as the `scores' +-file. Typically, a system administrator will set up an account like +-`games' for this purpose. +- +- The executable file is given mode `4755', so that doing an `ls -l' +-on it produces output like: +- +- -rwsr-xr-x 1 games 184422 Jul 30 15:17 caber-toss +- +-The setuid bit shows up in the file modes as the `s'. +- +- The scores file is given mode `644', and doing an `ls -l' on it +-shows: +- +- -rw-r--r-- 1 games 0 Jul 31 15:33 scores +- +- Here are the parts of the program that show how to set up the changed +-user ID. This program is conditionalized so that it makes use of the +-file IDs feature if it is supported, and otherwise uses `setreuid' to +-swap the effective and real user IDs. +- +- #include +- #include +- #include +- #include +- +- +- /* Remember the effective and real UIDs. */ +- +- static uid_t euid, ruid; +- +- +- /* Restore the effective UID to its original value. */ +- +- void +- do_setuid (void) +- { +- int status; +- +- #ifdef _POSIX_SAVED_IDS +- status = seteuid (euid); +- #else +- status = setreuid (ruid, euid); +- #endif +- if (status < 0) { +- fprintf (stderr, "Couldn't set uid.\n"); +- exit (status); +- } +- } +- +- +- /* Set the effective UID to the real UID. */ +- +- void +- undo_setuid (void) +- { +- int status; +- +- #ifdef _POSIX_SAVED_IDS +- status = seteuid (ruid); +- #else +- status = setreuid (euid, ruid); +- #endif +- if (status < 0) { +- fprintf (stderr, "Couldn't set uid.\n"); +- exit (status); +- } +- } +- +- /* Main program. */ +- +- int +- main (void) +- { +- /* Remember the real and effective user IDs. */ +- ruid = getuid (); +- euid = geteuid (); +- undo_setuid (); +- +- /* Do the game and record the score. */ +- ... +- } +- +- Notice how the first thing the `main' function does is to set the +-effective user ID back to the real user ID. This is so that any other +-file accesses that are performed while the user is playing the game use +-the real user ID for determining permissions. Only when the program +-needs to open the scores file does it switch back to the file user ID, +-like this: +- +- /* Record the score. */ +- +- int +- record_score (int score) +- { +- FILE *stream; +- char *myname; +- +- /* Open the scores file. */ +- do_setuid (); +- stream = fopen (SCORES_FILE, "a"); +- undo_setuid (); +- +- /* Write the score to the file. */ +- if (stream) +- { +- myname = cuserid (NULL); +- if (score < 0) +- fprintf (stream, "%10s: Couldn't lift the caber.\n", myname); +- else +- fprintf (stream, "%10s: %d feet.\n", myname, score); +- fclose (stream); +- return 0; +- } +- else +- return -1; +- } +- +- +-File: libc.info, Node: Tips for Setuid, Next: Who Logged In, Prev: Setuid Program Example, Up: Users and Groups +- +-Tips for Writing Setuid Programs +-================================ +- +- It is easy for setuid programs to give the user access that isn't +-intended--in fact, if you want to avoid this, you need to be careful. +-Here are some guidelines for preventing unintended access and +-minimizing its consequences when it does occur: +- +- * Don't have `setuid' programs with privileged user IDs such as +- `root' unless it is absolutely necessary. If the resource is +- specific to your particular program, it's better to define a new, +- nonprivileged user ID or group ID just to manage that resource. +- It's better if you can write your program to use a special group +- than a special user. +- +- * Be cautious about using the `exec' functions in combination with +- changing the effective user ID. Don't let users of your program +- execute arbitrary programs under a changed user ID. Executing a +- shell is especially bad news. Less obviously, the `execlp' and +- `execvp' functions are a potential risk (since the program they +- execute depends on the user's `PATH' environment variable). +- +- If you must `exec' another program under a changed ID, specify an +- absolute file name (*note File Name Resolution::) for the +- executable, and make sure that the protections on that executable +- and _all_ containing directories are such that ordinary users +- cannot replace it with some other program. +- +- You should also check the arguments passed to the program to make +- sure they do not have unexpected effects. Likewise, you should +- examine the environment variables. Decide which arguments and +- variables are safe, and reject all others. +- +- You should never use `system' in a privileged program, because it +- invokes a shell. +- +- * Only use the user ID controlling the resource in the part of the +- program that actually uses that resource. When you're finished +- with it, restore the effective user ID back to the actual user's +- user ID. *Note Enable/Disable Setuid::. +- +- * If the `setuid' part of your program needs to access other files +- besides the controlled resource, it should verify that the real +- user would ordinarily have permission to access those files. You +- can use the `access' function (*note Access Permission::) to check +- this; it uses the real user and group IDs, rather than the +- effective IDs. +- +- +-File: libc.info, Node: Who Logged In, Next: User Accounting Database, Prev: Tips for Setuid, Up: Users and Groups +- +-Identifying Who Logged In +-========================= +- +- You can use the functions listed in this section to determine the +-login name of the user who is running a process, and the name of the +-user who logged in the current session. See also the function `getuid' +-and friends (*note Reading Persona::). How this information is +-collected by the system and how to control/add/remove information from +-the background storage is described in *Note User Accounting Database::. +- +- The `getlogin' function is declared in `unistd.h', while `cuserid' +-and `L_cuserid' are declared in `stdio.h'. +- +- - Function: char * getlogin (void) +- The `getlogin' function returns a pointer to a string containing +- the name of the user logged in on the controlling terminal of the +- process, or a null pointer if this information cannot be +- determined. The string is statically allocated and might be +- overwritten on subsequent calls to this function or to `cuserid'. +- +- - Function: char * cuserid (char *STRING) +- The `cuserid' function returns a pointer to a string containing a +- user name associated with the effective ID of the process. If +- STRING is not a null pointer, it should be an array that can hold +- at least `L_cuserid' characters; the string is returned in this +- array. Otherwise, a pointer to a string in a static area is +- returned. This string is statically allocated and might be +- overwritten on subsequent calls to this function or to `getlogin'. +- +- The use of this function is deprecated since it is marked to be +- withdrawn in XPG4.2 and has already been removed from newer +- revisions of POSIX.1. +- +- - Macro: int L_cuserid +- An integer constant that indicates how long an array you might +- need to store a user name. +- +- These functions let your program identify positively the user who is +-running or the user who logged in this session. (These can differ when +-setuid programs are involved; see *Note Process Persona::.) The user +-cannot do anything to fool these functions. +- +- For most purposes, it is more useful to use the environment variable +-`LOGNAME' to find out who the user is. This is more flexible precisely +-because the user can set `LOGNAME' arbitrarily. *Note Standard +-Environment::. +- +- +-File: libc.info, Node: User Accounting Database, Next: User Database, Prev: Who Logged In, Up: Users and Groups +- +-The User Accounting Database +-============================ +- +- Most Unix-like operating systems keep track of logged in users by +-maintaining a user accounting database. This user accounting database +-stores for each terminal, who has logged on, at what time, the process +-ID of the user's login shell, etc., etc., but also stores information +-about the run level of the system, the time of the last system reboot, +-and possibly more. +- +- The user accounting database typically lives in `/etc/utmp', +-`/var/adm/utmp' or `/var/run/utmp'. However, these files should +-*never* be accessed directly. For reading information from and writing +-information to the user accounting database, the functions described in +-this section should be used. +- +-* Menu: +- +-* Manipulating the Database:: Scanning and modifying the user +- accounting database. +-* XPG Functions:: A standardized way for doing the same thing. +-* Logging In and Out:: Functions from BSD that modify the user +- accounting database. +- +- +-File: libc.info, Node: Manipulating the Database, Next: XPG Functions, Up: User Accounting Database +- +-Manipulating the User Accounting Database +------------------------------------------ +- +- These functions and the corresponding data structures are declared in +-the header file `utmp.h'. +- +- - Data Type: struct exit_status +- The `exit_status' data structure is used to hold information about +- the exit status of processes marked as `DEAD_PROCESS' in the user +- accounting database. +- +- `short int e_termination' +- The exit status of the process. +- +- `short int e_exit' +- The exit status of the process. +- +- - Data Type: struct utmp +- The `utmp' data structure is used to hold information about entries +- in the user accounting database. On the GNU system it has the +- following members: +- +- `short int ut_type' +- Specifies the type of login; one of `EMPTY', `RUN_LVL', +- `BOOT_TIME', `OLD_TIME', `NEW_TIME', `INIT_PROCESS', +- `LOGIN_PROCESS', `USER_PROCESS', `DEAD_PROCESS' or +- `ACCOUNTING'. +- +- `pid_t ut_pid' +- The process ID number of the login process. +- +- `char ut_line[]' +- The device name of the tty (without `/dev/'). +- +- `char ut_id[]' +- The inittab ID of the process. +- +- `char ut_user[]' +- The user's login name. +- +- `char ut_host[]' +- The name of the host from which the user logged in. +- +- `struct exit_status ut_exit' +- The exit status of a process marked as `DEAD_PROCESS'. +- +- `long ut_session' +- The Session ID, used for windowing. +- +- `struct timeval ut_tv' +- Time the entry was made. For entries of type `OLD_TIME' this +- is the time when the system clock changed, and for entries of +- type `NEW_TIME' this is the time the system clock was set to. +- +- `int32_t ut_addr_v6[4]' +- The Internet address of a remote host. +- +- The `ut_type', `ut_pid', `ut_id', `ut_tv', and `ut_host' fields are +-not available on all systems. Portable applications therefore should +-be prepared for these situations. To help doing this the `utmp.h' +-header provides macros `_HAVE_UT_TYPE', `_HAVE_UT_PID', `_HAVE_UT_ID', +-`_HAVE_UT_TV', and `_HAVE_UT_HOST' if the respective field is +-available. The programmer can handle the situations by using `#ifdef' +-in the program code. +- +- The following macros are defined for use as values for the `ut_type' +-member of the `utmp' structure. The values are integer constants. +- +-`EMPTY' +- This macro is used to indicate that the entry contains no valid +- user accounting information. +- +-`RUN_LVL' +- This macro is used to identify the systems runlevel. +- +-`BOOT_TIME' +- This macro is used to identify the time of system boot. +- +-`OLD_TIME' +- This macro is used to identify the time when the system clock +- changed. +- +-`NEW_TIME' +- This macro is used to identify the time after the system changed. +- +-`INIT_PROCESS' +- This macro is used to identify a process spawned by the init +- process. +- +-`LOGIN_PROCESS' +- This macro is used to identify the session leader of a logged in +- user. +- +-`USER_PROCESS' +- This macro is used to identify a user process. +- +-`DEAD_PROCESS' +- This macro is used to identify a terminated process. +- +-`ACCOUNTING' +- ??? +- +- The size of the `ut_line', `ut_id', `ut_user' and `ut_host' arrays +-can be found using the `sizeof' operator. +- +- Many older systems have, instead of an `ut_tv' member, an `ut_time' +-member, usually of type `time_t', for representing the time associated +-with the entry. Therefore, for backwards compatibility only, `utmp.h' +-defines `ut_time' as an alias for `ut_tv.tv_sec'. +- +- - Function: void setutent (void) +- This function opens the user accounting database to begin scanning +- it. You can then call `getutent', `getutid' or `getutline' to +- read entries and `pututline' to write entries. +- +- If the database is already open, it resets the input to the +- beginning of the database. +- +- - Function: struct utmp * getutent (void) +- The `getutent' function reads the next entry from the user +- accounting database. It returns a pointer to the entry, which is +- statically allocated and may be overwritten by subsequent calls to +- `getutent'. You must copy the contents of the structure if you +- wish to save the information or you can use the `getutent_r' +- function which stores the data in a user-provided buffer. +- +- A null pointer is returned in case no further entry is available. +- +- - Function: void endutent (void) +- This function closes the user accounting database. +- +- - Function: struct utmp * getutid (const struct utmp *ID) +- This function searches forward from the current point in the +- database for an entry that matches ID. If the `ut_type' member of +- the ID structure is one of `RUN_LVL', `BOOT_TIME', `OLD_TIME' or +- `NEW_TIME' the entries match if the `ut_type' members are +- identical. If the `ut_type' member of the ID structure is +- `INIT_PROCESS', `LOGIN_PROCESS', `USER_PROCESS' or `DEAD_PROCESS', +- the entries match if the `ut_type' member of the entry read from +- the database is one of these four, and the `ut_id' members match. +- However if the `ut_id' member of either the ID structure or the +- entry read from the database is empty it checks if the `ut_line' +- members match instead. If a matching entry is found, `getutid' +- returns a pointer to the entry, which is statically allocated, and +- may be overwritten by a subsequent call to `getutent', `getutid' +- or `getutline'. You must copy the contents of the structure if +- you wish to save the information. +- +- A null pointer is returned in case the end of the database is +- reached without a match. +- +- The `getutid' function may cache the last read entry. Therefore, +- if you are using `getutid' to search for multiple occurrences, it +- is necessary to zero out the static data after each call. +- Otherwise `getutid' could just return a pointer to the same entry +- over and over again. +- +- - Function: struct utmp * getutline (const struct utmp *LINE) +- This function searches forward from the current point in the +- database until it finds an entry whose `ut_type' value is +- `LOGIN_PROCESS' or `USER_PROCESS', and whose `ut_line' member +- matches the `ut_line' member of the LINE structure. If it finds +- such an entry, it returns a pointer to the entry which is +- statically allocated, and may be overwritten by a subsequent call +- to `getutent', `getutid' or `getutline'. You must copy the +- contents of the structure if you wish to save the information. +- +- A null pointer is returned in case the end of the database is +- reached without a match. +- +- The `getutline' function may cache the last read entry. Therefore +- if you are using `getutline' to search for multiple occurrences, it +- is necessary to zero out the static data after each call. +- Otherwise `getutline' could just return a pointer to the same +- entry over and over again. +- +- - Function: struct utmp * pututline (const struct utmp *UTMP) +- The `pututline' function inserts the entry `*UTMP' at the +- appropriate place in the user accounting database. If it finds +- that it is not already at the correct place in the database, it +- uses `getutid' to search for the position to insert the entry, +- however this will not modify the static structure returned by +- `getutent', `getutid' and `getutline'. If this search fails, the +- entry is appended to the database. +- +- The `pututline' function returns a pointer to a copy of the entry +- inserted in the user accounting database, or a null pointer if the +- entry could not be added. The following `errno' error conditions +- are defined for this function: +- +- `EPERM' +- The process does not have the appropriate privileges; you +- cannot modify the user accounting database. +- +- All the `get*' functions mentioned before store the information they +-return in a static buffer. This can be a problem in multi-threaded +-programs since the data returned for the request is overwritten by the +-return value data in another thread. Therefore the GNU C Library +-provides as extensions three more functions which return the data in a +-user-provided buffer. +- +- - Function: int getutent_r (struct utmp *BUFFER, struct utmp **RESULT) +- The `getutent_r' is equivalent to the `getutent' function. It +- returns the next entry from the database. But instead of storing +- the information in a static buffer it stores it in the buffer +- pointed to by the parameter BUFFER. +- +- If the call was successful, the function returns `0' and the +- pointer variable pointed to by the parameter RESULT contains a +- pointer to the buffer which contains the result (this is most +- probably the same value as BUFFER). If something went wrong +- during the execution of `getutent_r' the function returns `-1'. +- +- This function is a GNU extension. +- +- - Function: int getutid_r (const struct utmp *ID, struct utmp *BUFFER, +- struct utmp **RESULT) +- This function retrieves just like `getutid' the next entry matching +- the information stored in ID. But the result is stored in the +- buffer pointed to by the parameter BUFFER. +- +- If successful the function returns `0' and the pointer variable +- pointed to by the parameter RESULT contains a pointer to the +- buffer with the result (probably the same as RESULT. If not +- successful the function return `-1'. +- +- This function is a GNU extension. +- +- - Function: int getutline_r (const struct utmp *LINE, struct utmp +- *BUFFER, struct utmp **RESULT) +- This function retrieves just like `getutline' the next entry +- matching the information stored in LINE. But the result is stored +- in the buffer pointed to by the parameter BUFFER. +- +- If successful the function returns `0' and the pointer variable +- pointed to by the parameter RESULT contains a pointer to the +- buffer with the result (probably the same as RESULT. If not +- successful the function return `-1'. +- +- This function is a GNU extension. +- +- In addition to the user accounting database, most systems keep a +-number of similar databases. For example most systems keep a log file +-with all previous logins (usually in `/etc/wtmp' or `/var/log/wtmp'). +- +- For specifying which database to examine, the following function +-should be used. +- +- - Function: int utmpname (const char *FILE) +- The `utmpname' function changes the name of the database to be +- examined to FILE, and closes any previously opened database. By +- default `getutent', `getutid', `getutline' and `pututline' read +- from and write to the user accounting database. +- +- The following macros are defined for use as the FILE argument: +- +- - Macro: char * _PATH_UTMP +- This macro is used to specify the user accounting database. +- +- - Macro: char * _PATH_WTMP +- This macro is used to specify the user accounting log file. +- +- The `utmpname' function returns a value of `0' if the new name was +- successfully stored, and a value of `-1' to indicate an error. +- Note that `utmpname' does not try to open the database, and that +- therefore the return value does not say anything about whether the +- database can be successfully opened. +- +- Specially for maintaining log-like databases the GNU C Library +-provides the following function: +- +- - Function: void updwtmp (const char *WTMP_FILE, const struct utmp +- *UTMP) +- The `updwtmp' function appends the entry *UTMP to the database +- specified by WTMP_FILE. For possible values for the WTMP_FILE +- argument see the `utmpname' function. +- +- *Portability Note:* Although many operating systems provide a subset +-of these functions, they are not standardized. There are often subtle +-differences in the return types, and there are considerable differences +-between the various definitions of `struct utmp'. When programming for +-the GNU system, it is probably best to stick with the functions +-described in this section. If however, you want your program to be +-portable, consider using the XPG functions described in *Note XPG +-Functions::, or take a look at the BSD compatible functions in *Note +-Logging In and Out::. +- +- +-File: libc.info, Node: XPG Functions, Next: Logging In and Out, Prev: Manipulating the Database, Up: User Accounting Database +- +-XPG User Accounting Database Functions +--------------------------------------- +- +- These functions, described in the X/Open Portability Guide, are +-declared in the header file `utmpx.h'. +- +- - Data Type: struct utmpx +- The `utmpx' data structure contains at least the following members: +- +- `short int ut_type' +- Specifies the type of login; one of `EMPTY', `RUN_LVL', +- `BOOT_TIME', `OLD_TIME', `NEW_TIME', `INIT_PROCESS', +- `LOGIN_PROCESS', `USER_PROCESS' or `DEAD_PROCESS'. +- +- `pid_t ut_pid' +- The process ID number of the login process. +- +- `char ut_line[]' +- The device name of the tty (without `/dev/'). +- +- `char ut_id[]' +- The inittab ID of the process. +- +- `char ut_user[]' +- The user's login name. +- +- `struct timeval ut_tv' +- Time the entry was made. For entries of type `OLD_TIME' this +- is the time when the system clock changed, and for entries of +- type `NEW_TIME' this is the time the system clock was set to. +- On the GNU system, `struct utmpx' is identical to `struct utmp' +- except for the fact that including `utmpx.h' does not make visible +- the declaration of `struct exit_status'. +- +- The following macros are defined for use as values for the `ut_type' +-member of the `utmpx' structure. The values are integer constants and +-are, on the GNU system, identical to the definitions in `utmp.h'. +- +-`EMPTY' +- This macro is used to indicate that the entry contains no valid +- user accounting information. +- +-`RUN_LVL' +- This macro is used to identify the systems runlevel. +- +-`BOOT_TIME' +- This macro is used to identify the time of system boot. +- +-`OLD_TIME' +- This macro is used to identify the time when the system clock +- changed. +- +-`NEW_TIME' +- This macro is used to identify the time after the system changed. +- +-`INIT_PROCESS' +- This macro is used to identify a process spawned by the init +- process. +- +-`LOGIN_PROCESS' +- This macro is used to identify the session leader of a logged in +- user. +- +-`USER_PROCESS' +- This macro is used to identify a user process. +- +-`DEAD_PROCESS' +- This macro is used to identify a terminated process. +- +- The size of the `ut_line', `ut_id' and `ut_user' arrays can be found +-using the `sizeof' operator. +- +- - Function: void setutxent (void) +- This function is similar to `setutent'. On the GNU system it is +- simply an alias for `setutent'. +- +- - Function: struct utmpx * getutxent (void) +- The `getutxent' function is similar to `getutent', but returns a +- pointer to a `struct utmpx' instead of `struct utmp'. On the GNU +- system it simply is an alias for `getutent'. +- +- - Function: void endutxent (void) +- This function is similar to `endutent'. On the GNU system it is +- simply an alias for `endutent'. +- +- - Function: struct utmpx * getutxid (const struct utmpx *ID) +- This function is similar to `getutid', but uses `struct utmpx' +- instead of `struct utmp'. On the GNU system it is simply an alias +- for `getutid'. +- +- - Function: struct utmpx * getutxline (const struct utmpx *LINE) +- This function is similar to `getutid', but uses `struct utmpx' +- instead of `struct utmp'. On the GNU system it is simply an alias +- for `getutline'. +- +- - Function: struct utmpx * pututxline (const struct utmpx *UTMP) +- The `pututxline' function is functionally identical to +- `pututline', but uses `struct utmpx' instead of `struct utmp'. On +- the GNU system, `pututxline' is simply an alias for `pututline'. +- +- - Function: int utmpxname (const char *FILE) +- The `utmpxname' function is functionally identical to `utmpname'. +- On the GNU system, `utmpxname' is simply an alias for `utmpname'. +- +- You can translate between a traditional `struct utmp' and an XPG +-`struct utmpx' with the following functions. On the GNU system, these +-functions are merely copies, since the two structures are identical. +- +- - Function: int getutmp (const struct utmpx *utmpx, struct utmp *utmp) +- `getutmp' copies the information, insofar as the structures are +- compatible, from UTMPX to UTMP. +- +- - Function: int getutmpx (const struct utmp *utmp, struct utmpx *utmpx) +- `getutmpx' copies the information, insofar as the structures are +- compatible, from UTMP to UTMPX. +- +- +-File: libc.info, Node: Logging In and Out, Prev: XPG Functions, Up: User Accounting Database +- +-Logging In and Out +------------------- +- +- These functions, derived from BSD, are available in the separate +-`libutil' library, and declared in `utmp.h'. +- +- Note that the `ut_user' member of `struct utmp' is called `ut_name' +-in BSD. Therefore, `ut_name' is defined as an alias for `ut_user' in +-`utmp.h'. +- +- - Function: int login_tty (int FILEDES) +- This function makes FILEDES the controlling terminal of the +- current process, redirects standard input, standard output and +- standard error output to this terminal, and closes FILEDES. +- +- This function returns `0' on successful completion, and `-1' on +- error. +- +- - Function: void login (const struct utmp *ENTRY) +- The `login' functions inserts an entry into the user accounting +- database. The `ut_line' member is set to the name of the terminal +- on standard input. If standard input is not a terminal `login' +- uses standard output or standard error output to determine the +- name of the terminal. If `struct utmp' has a `ut_type' member, +- `login' sets it to `USER_PROCESS', and if there is an `ut_pid' +- member, it will be set to the process ID of the current process. +- The remaining entries are copied from ENTRY. +- +- A copy of the entry is written to the user accounting log file. +- +- - Function: int logout (const char *UT_LINE) +- This function modifies the user accounting database to indicate +- that the user on UT_LINE has logged out. +- +- The `logout' function returns `1' if the entry was successfully +- written to the database, or `0' on error. +- +- - Function: void logwtmp (const char *UT_LINE, const char *UT_NAME, +- const char *UT_HOST) +- The `logwtmp' function appends an entry to the user accounting log +- file, for the current time and the information provided in the +- UT_LINE, UT_NAME and UT_HOST arguments. +- +- *Portability Note:* The BSD `struct utmp' only has the `ut_line', +-`ut_name', `ut_host' and `ut_time' members. Older systems do not even +-have the `ut_host' member. +- +- +-File: libc.info, Node: User Database, Next: Group Database, Prev: User Accounting Database, Up: Users and Groups +- +-User Database +-============= +- +- This section describes how to search and scan the database of +-registered users. The database itself is kept in the file +-`/etc/passwd' on most systems, but on some systems a special network +-server gives access to it. +- +-* Menu: +- +-* User Data Structure:: What each user record contains. +-* Lookup User:: How to look for a particular user. +-* Scanning All Users:: Scanning the list of all users, one by one. +-* Writing a User Entry:: How a program can rewrite a user's record. +- +- +-File: libc.info, Node: User Data Structure, Next: Lookup User, Up: User Database +- +-The Data Structure that Describes a User +----------------------------------------- +- +- The functions and data structures for accessing the system user +-database are declared in the header file `pwd.h'. +- +- - Data Type: struct passwd +- The `passwd' data structure is used to hold information about +- entries in the system user data base. It has at least the +- following members: +- +- `char *pw_name' +- The user's login name. +- +- `char *pw_passwd.' +- The encrypted password string. +- +- `uid_t pw_uid' +- The user ID number. +- +- `gid_t pw_gid' +- The user's default group ID number. +- +- `char *pw_gecos' +- A string typically containing the user's real name, and +- possibly other information such as a phone number. +- +- `char *pw_dir' +- The user's home directory, or initial working directory. +- This might be a null pointer, in which case the +- interpretation is system-dependent. +- +- `char *pw_shell' +- The user's default shell, or the initial program run when the +- user logs in. This might be a null pointer, indicating that +- the system default should be used. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-47 glibc-2.3.2-200304020432/manual/libc.info-47 +--- glibc-2.3.2/manual/libc.info-47 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-47 Thu Jan 1 01:00:00 1970 +@@ -1,1034 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Lookup User, Next: Scanning All Users, Prev: User Data Structure, Up: User Database +- +-Looking Up One User +-------------------- +- +- You can search the system user database for information about a +-specific user using `getpwuid' or `getpwnam'. These functions are +-declared in `pwd.h'. +- +- - Function: struct passwd * getpwuid (uid_t UID) +- This function returns a pointer to a statically-allocated structure +- containing information about the user whose user ID is UID. This +- structure may be overwritten on subsequent calls to `getpwuid'. +- +- A null pointer value indicates there is no user in the data base +- with user ID UID. +- +- - Function: int getpwuid_r (uid_t UID, struct passwd *RESULT_BUF, char +- *BUFFER, size_t BUFLEN, struct passwd **RESULT) +- This function is similar to `getpwuid' in that it returns +- information about the user whose user ID is UID. However, it +- fills the user supplied structure pointed to by RESULT_BUF with +- the information instead of using a static buffer. The first +- BUFLEN bytes of the additional buffer pointed to by BUFFER are +- used to contain additional information, normally strings which are +- pointed to by the elements of the result structure. +- +- If a user with ID UID is found, the pointer returned in RESULT +- points to the record which contains the wanted data (i.e., RESULT +- contains the value RESULT_BUF). If no user is found or if an +- error occurred, the pointer returned in RESULT is a null pointer. +- The function returns zero or an error code. If the buffer BUFFER +- is too small to contain all the needed information, the error code +- `ERANGE' is returned and ERRNO is set to `ERANGE'. +- +- - Function: struct passwd * getpwnam (const char *NAME) +- This function returns a pointer to a statically-allocated structure +- containing information about the user whose user name is NAME. +- This structure may be overwritten on subsequent calls to +- `getpwnam'. +- +- A null pointer return indicates there is no user named NAME. +- +- - Function: int getpwnam_r (const char *NAME, struct passwd +- *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct passwd +- **RESULT) +- This function is similar to `getpwnam' in that is returns +- information about the user whose user name is NAME. However, like +- `getpwuid_r', it fills the user supplied buffers in RESULT_BUF and +- BUFFER with the information instead of using a static buffer. +- +- The return values are the same as for `getpwuid_r'. +- +- +-File: libc.info, Node: Scanning All Users, Next: Writing a User Entry, Prev: Lookup User, Up: User Database +- +-Scanning the List of All Users +------------------------------- +- +- This section explains how a program can read the list of all users in +-the system, one user at a time. The functions described here are +-declared in `pwd.h'. +- +- You can use the `fgetpwent' function to read user entries from a +-particular file. +- +- - Function: struct passwd * fgetpwent (FILE *STREAM) +- This function reads the next user entry from STREAM and returns a +- pointer to the entry. The structure is statically allocated and is +- rewritten on subsequent calls to `fgetpwent'. You must copy the +- contents of the structure if you wish to save the information. +- +- The stream must correspond to a file in the same format as the +- standard password database file. +- +- - Function: int fgetpwent_r (FILE *STREAM, struct passwd *RESULT_BUF, +- char *BUFFER, size_t BUFLEN, struct passwd **RESULT) +- This function is similar to `fgetpwent' in that it reads the next +- user entry from STREAM. But the result is returned in the +- structure pointed to by RESULT_BUF. The first BUFLEN bytes of the +- additional buffer pointed to by BUFFER are used to contain +- additional information, normally strings which are pointed to by +- the elements of the result structure. +- +- The stream must correspond to a file in the same format as the +- standard password database file. +- +- If the function returns zero RESULT points to the structure with +- the wanted data (normally this is in RESULT_BUF). If errors +- occurred the return value is nonzero and RESULT contains a null +- pointer. +- +- The way to scan all the entries in the user database is with +-`setpwent', `getpwent', and `endpwent'. +- +- - Function: void setpwent (void) +- This function initializes a stream which `getpwent' and +- `getpwent_r' use to read the user database. +- +- - Function: struct passwd * getpwent (void) +- The `getpwent' function reads the next entry from the stream +- initialized by `setpwent'. It returns a pointer to the entry. The +- structure is statically allocated and is rewritten on subsequent +- calls to `getpwent'. You must copy the contents of the structure +- if you wish to save the information. +- +- A null pointer is returned when no more entries are available. +- +- - Function: int getpwent_r (struct passwd *RESULT_BUF, char *BUFFER, +- int BUFLEN, struct passwd **RESULT) +- This function is similar to `getpwent' in that it returns the next +- entry from the stream initialized by `setpwent'. Like +- `fgetpwent_r', it uses the user-supplied buffers in RESULT_BUF and +- BUFFER to return the information requested. +- +- The return values are the same as for `fgetpwent_r'. +- +- +- - Function: void endpwent (void) +- This function closes the internal stream used by `getpwent' or +- `getpwent_r'. +- +- +-File: libc.info, Node: Writing a User Entry, Prev: Scanning All Users, Up: User Database +- +-Writing a User Entry +--------------------- +- +- - Function: int putpwent (const struct passwd *P, FILE *STREAM) +- This function writes the user entry `*P' to the stream STREAM, in +- the format used for the standard user database file. The return +- value is zero on success and nonzero on failure. +- +- This function exists for compatibility with SVID. We recommend +- that you avoid using it, because it makes sense only on the +- assumption that the `struct passwd' structure has no members +- except the standard ones; on a system which merges the traditional +- Unix data base with other extended information about users, adding +- an entry using this function would inevitably leave out much of +- the important information. +- +- The function `putpwent' is declared in `pwd.h'. +- +- +-File: libc.info, Node: Group Database, Next: Database Example, Prev: User Database, Up: Users and Groups +- +-Group Database +-============== +- +- This section describes how to search and scan the database of +-registered groups. The database itself is kept in the file +-`/etc/group' on most systems, but on some systems a special network +-service provides access to it. +- +-* Menu: +- +-* Group Data Structure:: What each group record contains. +-* Lookup Group:: How to look for a particular group. +-* Scanning All Groups:: Scanning the list of all groups. +- +- +-File: libc.info, Node: Group Data Structure, Next: Lookup Group, Up: Group Database +- +-The Data Structure for a Group +------------------------------- +- +- The functions and data structures for accessing the system group +-database are declared in the header file `grp.h'. +- +- - Data Type: struct group +- The `group' structure is used to hold information about an entry in +- the system group database. It has at least the following members: +- +- `char *gr_name' +- The name of the group. +- +- `gid_t gr_gid' +- The group ID of the group. +- +- `char **gr_mem' +- A vector of pointers to the names of users in the group. +- Each user name is a null-terminated string, and the vector +- itself is terminated by a null pointer. +- +- +-File: libc.info, Node: Lookup Group, Next: Scanning All Groups, Prev: Group Data Structure, Up: Group Database +- +-Looking Up One Group +--------------------- +- +- You can search the group database for information about a specific +-group using `getgrgid' or `getgrnam'. These functions are declared in +-`grp.h'. +- +- - Function: struct group * getgrgid (gid_t GID) +- This function returns a pointer to a statically-allocated structure +- containing information about the group whose group ID is GID. +- This structure may be overwritten by subsequent calls to +- `getgrgid'. +- +- A null pointer indicates there is no group with ID GID. +- +- - Function: int getgrgid_r (gid_t GID, struct group *RESULT_BUF, char +- *BUFFER, size_t BUFLEN, struct group **RESULT) +- This function is similar to `getgrgid' in that it returns +- information about the group whose group ID is GID. However, it +- fills the user supplied structure pointed to by RESULT_BUF with +- the information instead of using a static buffer. The first +- BUFLEN bytes of the additional buffer pointed to by BUFFER are +- used to contain additional information, normally strings which are +- pointed to by the elements of the result structure. +- +- If a group with ID GID is found, the pointer returned in RESULT +- points to the record which contains the wanted data (i.e., RESULT +- contains the value RESULT_BUF). If no group is found or if an +- error occurred, the pointer returned in RESULT is a null pointer. +- The function returns zero or an error code. If the buffer BUFFER +- is too small to contain all the needed information, the error code +- `ERANGE' is returned and ERRNO is set to `ERANGE'. +- +- - Function: struct group * getgrnam (const char *NAME) +- This function returns a pointer to a statically-allocated structure +- containing information about the group whose group name is NAME. +- This structure may be overwritten by subsequent calls to +- `getgrnam'. +- +- A null pointer indicates there is no group named NAME. +- +- - Function: int getgrnam_r (const char *NAME, struct group +- *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct group +- **RESULT) +- This function is similar to `getgrnam' in that is returns +- information about the group whose group name is NAME. Like +- `getgrgid_r', it uses the user supplied buffers in RESULT_BUF and +- BUFFER, not a static buffer. +- +- The return values are the same as for `getgrgid_r' `ERANGE'. +- +- +-File: libc.info, Node: Scanning All Groups, Prev: Lookup Group, Up: Group Database +- +-Scanning the List of All Groups +-------------------------------- +- +- This section explains how a program can read the list of all groups +-in the system, one group at a time. The functions described here are +-declared in `grp.h'. +- +- You can use the `fgetgrent' function to read group entries from a +-particular file. +- +- - Function: struct group * fgetgrent (FILE *STREAM) +- The `fgetgrent' function reads the next entry from STREAM. It +- returns a pointer to the entry. The structure is statically +- allocated and is overwritten on subsequent calls to `fgetgrent'. +- You must copy the contents of the structure if you wish to save the +- information. +- +- The stream must correspond to a file in the same format as the +- standard group database file. +- +- - Function: int fgetgrent_r (FILE *STREAM, struct group *RESULT_BUF, +- char *BUFFER, size_t BUFLEN, struct group **RESULT) +- This function is similar to `fgetgrent' in that it reads the next +- user entry from STREAM. But the result is returned in the +- structure pointed to by RESULT_BUF. The first BUFLEN bytes of the +- additional buffer pointed to by BUFFER are used to contain +- additional information, normally strings which are pointed to by +- the elements of the result structure. +- +- This stream must correspond to a file in the same format as the +- standard group database file. +- +- If the function returns zero RESULT points to the structure with +- the wanted data (normally this is in RESULT_BUF). If errors +- occurred the return value is non-zero and RESULT contains a null +- pointer. +- +- The way to scan all the entries in the group database is with +-`setgrent', `getgrent', and `endgrent'. +- +- - Function: void setgrent (void) +- This function initializes a stream for reading from the group data +- base. You use this stream by calling `getgrent' or `getgrent_r'. +- +- - Function: struct group * getgrent (void) +- The `getgrent' function reads the next entry from the stream +- initialized by `setgrent'. It returns a pointer to the entry. The +- structure is statically allocated and is overwritten on subsequent +- calls to `getgrent'. You must copy the contents of the structure +- if you wish to save the information. +- +- - Function: int getgrent_r (struct group *RESULT_BUF, char *BUFFER, +- size_t BUFLEN, struct group **RESULT) +- This function is similar to `getgrent' in that it returns the next +- entry from the stream initialized by `setgrent'. Like +- `fgetgrent_r', it places the result in user-supplied buffers +- pointed to RESULT_BUF and BUFFER. +- +- If the function returns zero RESULT contains a pointer to the data +- (normally equal to RESULT_BUF). If errors occurred the return +- value is non-zero and RESULT contains a null pointer. +- +- - Function: void endgrent (void) +- This function closes the internal stream used by `getgrent' or +- `getgrent_r'. +- +- +-File: libc.info, Node: Database Example, Next: Netgroup Database, Prev: Group Database, Up: Users and Groups +- +-User and Group Database Example +-=============================== +- +- Here is an example program showing the use of the system database +-inquiry functions. The program prints some information about the user +-running the program. +- +- #include +- #include +- #include +- #include +- #include +- +- int +- main (void) +- { +- uid_t me; +- struct passwd *my_passwd; +- struct group *my_group; +- char **members; +- +- /* Get information about the user ID. */ +- me = getuid (); +- my_passwd = getpwuid (me); +- if (!my_passwd) +- { +- printf ("Couldn't find out about user %d.\n", (int) me); +- exit (EXIT_FAILURE); +- } +- +- /* Print the information. */ +- printf ("I am %s.\n", my_passwd->pw_gecos); +- printf ("My login name is %s.\n", my_passwd->pw_name); +- printf ("My uid is %d.\n", (int) (my_passwd->pw_uid)); +- printf ("My home directory is %s.\n", my_passwd->pw_dir); +- printf ("My default shell is %s.\n", my_passwd->pw_shell); +- +- /* Get information about the default group ID. */ +- my_group = getgrgid (my_passwd->pw_gid); +- if (!my_group) +- { +- printf ("Couldn't find out about group %d.\n", +- (int) my_passwd->pw_gid); +- exit (EXIT_FAILURE); +- } +- +- /* Print the information. */ +- printf ("My default group is %s (%d).\n", +- my_group->gr_name, (int) (my_passwd->pw_gid)); +- printf ("The members of this group are:\n"); +- members = my_group->gr_mem; +- while (*members) +- { +- printf (" %s\n", *(members)); +- members++; +- } +- +- return EXIT_SUCCESS; +- } +- +- Here is some output from this program: +- +- I am Throckmorton Snurd. +- My login name is snurd. +- My uid is 31093. +- My home directory is /home/fsg/snurd. +- My default shell is /bin/sh. +- My default group is guest (12). +- The members of this group are: +- friedman +- tami +- +- +-File: libc.info, Node: Netgroup Database, Prev: Database Example, Up: Users and Groups +- +-Netgroup Database +-================= +- +-* Menu: +- +-* Netgroup Data:: Data in the Netgroup database and where +- it comes from. +-* Lookup Netgroup:: How to look for a particular netgroup. +-* Netgroup Membership:: How to test for netgroup membership. +- +- +-File: libc.info, Node: Netgroup Data, Next: Lookup Netgroup, Up: Netgroup Database +- +-Netgroup Data +-------------- +- +- Sometimes it is useful to group users according to other criteria +-(*note Group Database::). E.g., it is useful to associate a certain +-group of users with a certain machine. On the other hand grouping of +-host names is not supported so far. +- +- In Sun Microsystems SunOS appeared a new kind of database, the +-netgroup database. It allows grouping hosts, users, and domains +-freely, giving them individual names. To be more concrete, a netgroup +-is a list of triples consisting of a host name, a user name, and a +-domain name where any of the entries can be a wildcard entry matching +-all inputs. A last possibility is that names of other netgroups can +-also be given in the list specifying a netgroup. So one can construct +-arbitrary hierarchies without loops. +- +- Sun's implementation allows netgroups only for the `nis' or +-`nisplus' service, *note Services in the NSS configuration::. The +-implementation in the GNU C library has no such restriction. An entry +-in either of the input services must have the following form: +- +- GROUPNAME ( GROUPNAME | `('HOSTNAME`,'USERNAME`,'`domainname'`)' )+ +- +- Any of the fields in the triple can be empty which means anything +-matches. While describing the functions we will see that the opposite +-case is useful as well. I.e., there may be entries which will not +-match any input. For entries like this, a name consisting of the single +-character `-' shall be used. +- +- +-File: libc.info, Node: Lookup Netgroup, Next: Netgroup Membership, Prev: Netgroup Data, Up: Netgroup Database +- +-Looking up one Netgroup +------------------------ +- +- The lookup functions for netgroups are a bit different to all other +-system database handling functions. Since a single netgroup can contain +-many entries a two-step process is needed. First a single netgroup is +-selected and then one can iterate over all entries in this netgroup. +-These functions are declared in `netdb.h'. +- +- - Function: int setnetgrent (const char *NETGROUP) +- A call to this function initializes the internal state of the +- library to allow following calls of the `getnetgrent' to iterate +- over all entries in the netgroup with name NETGROUP. +- +- When the call is successful (i.e., when a netgroup with this name +- exists) the return value is `1'. When the return value is `0' no +- netgroup of this name is known or some other error occurred. +- +- It is important to remember that there is only one single state for +-iterating the netgroups. Even if the programmer uses the +-`getnetgrent_r' function the result is not really reentrant since +-always only one single netgroup at a time can be processed. If the +-program needs to process more than one netgroup simultaneously she must +-protect this by using external locking. This problem was introduced in +-the original netgroups implementation in SunOS and since we must stay +-compatible it is not possible to change this. +- +- Some other functions also use the netgroups state. Currently these +-are the `innetgr' function and parts of the implementation of the +-`compat' service part of the NSS implementation. +- +- - Function: int getnetgrent (char **HOSTP, char **USERP, char +- **DOMAINP) +- This function returns the next unprocessed entry of the currently +- selected netgroup. The string pointers, in which addresses are +- passed in the arguments HOSTP, USERP, and DOMAINP, will contain +- after a successful call pointers to appropriate strings. If the +- string in the next entry is empty the pointer has the value `NULL'. +- The returned string pointers are only valid if none of the netgroup +- related functions are called. +- +- The return value is `1' if the next entry was successfully read. A +- value of `0' means no further entries exist or internal errors +- occurred. +- +- - Function: int getnetgrent_r (char **HOSTP, char **USERP, char +- **DOMAINP, char *BUFFER, int BUFLEN) +- This function is similar to `getnetgrent' with only one exception: +- the strings the three string pointers HOSTP, USERP, and DOMAINP +- point to, are placed in the buffer of BUFLEN bytes starting at +- BUFFER. This means the returned values are valid even after other +- netgroup related functions are called. +- +- The return value is `1' if the next entry was successfully read and +- the buffer contains enough room to place the strings in it. `0' is +- returned in case no more entries are found, the buffer is too +- small, or internal errors occurred. +- +- This function is a GNU extension. The original implementation in +- the SunOS libc does not provide this function. +- +- - Function: void endnetgrent (void) +- This function frees all buffers which were allocated to process +- the last selected netgroup. As a result all string pointers +- returned by calls to `getnetgrent' are invalid afterwards. +- +- +-File: libc.info, Node: Netgroup Membership, Prev: Lookup Netgroup, Up: Netgroup Database +- +-Testing for Netgroup Membership +-------------------------------- +- +- It is often not necessary to scan the whole netgroup since often the +-only interesting question is whether a given entry is part of the +-selected netgroup. +- +- - Function: int innetgr (const char *NETGROUP, const char *HOST, const +- char *USER, const char *DOMAIN) +- This function tests whether the triple specified by the parameters +- HOSTP, USERP, and DOMAINP is part of the netgroup NETGROUP. Using +- this function has the advantage that +- +- 1. no other netgroup function can use the global netgroup state +- since internal locking is used and +- +- 2. the function is implemented more efficiently than successive +- calls to the other `set'/`get'/`endnetgrent' functions. +- +- Any of the pointers HOSTP, USERP, and DOMAINP can be `NULL' which +- means any value is accepted in this position. This is also true +- for the name `-' which should not match any other string otherwise. +- +- The return value is `1' if an entry matching the given triple is +- found in the netgroup. The return value is `0' if the netgroup +- itself is not found, the netgroup does not contain the triple or +- internal errors occurred. +- +- +-File: libc.info, Node: System Management, Next: System Configuration, Prev: Users and Groups, Up: Top +- +-System Management +-***************** +- +- This chapter describes facilities for controlling the system that +-underlies a process (including the operating system and hardware) and +-for getting information about it. Anyone can generally use the +-informational facilities, but usually only a properly privileged process +-can make changes. +- +-* Menu: +- +-* Host Identification:: Determining the name of the machine. +-* Platform Type:: Determining operating system and basic +- machine type +-* Filesystem Handling:: Controlling/querying mounts +-* System Parameters:: Getting and setting various system parameters +- +- To get information on parameters of the system that are built into +-the system, such as the maximum length of a filename, *Note System +-Configuration::. +- +- +-File: libc.info, Node: Host Identification, Next: Platform Type, Up: System Management +- +-Host Identification +-=================== +- +- This section explains how to identify the particular system on which +-your program is running. First, let's review the various ways computer +-systems are named, which is a little complicated because of the history +-of the development of the Internet. +- +- Every Unix system (also known as a host) has a host name, whether +-it's connected to a network or not. In its simplest form, as used +-before computer networks were an issue, it's just a word like `chicken'. +- +- But any system attached to the Internet or any network like it +-conforms to a more rigorous naming convention as part of the Domain +-Name System (DNS). In DNS, every host name is composed of two parts: +- +- 1. hostname +- +- 2. domain name +- +- You will note that "hostname" looks a lot like "host name", but is +-not the same thing, and that people often incorrectly refer to entire +-host names as "domain names." +- +- In DNS, the full host name is properly called the FQDN (Fully +-Qualified Domain Name) and consists of the hostname, then a period, +-then the domain name. The domain name itself usually has multiple +-components separated by periods. So for example, a system's hostname +-may be `chicken' and its domain name might be `ai.mit.edu', so its FQDN +-(which is its host name) is `chicken.ai.mit.edu'. +- +- Adding to the confusion, though, is that DNS is not the only name +-space in which a computer needs to be known. Another name space is the +-NIS (aka YP) name space. For NIS purposes, there is another domain +-name, which is called the NIS domain name or the YP domain name. It +-need not have anything to do with the DNS domain name. +- +- Confusing things even more is the fact that in DNS, it is possible +-for multiple FQDNs to refer to the same system. However, there is +-always exactly one of them that is the true host name, and it is called +-the canonical FQDN. +- +- In some contexts, the host name is called a "node name." +- +- For more information on DNS host naming, *Note Host Names::. +- +- Prototypes for these functions appear in `unistd.h'. +- +- The programs `hostname', `hostid', and `domainname' work by calling +-these functions. +- +- - Function: int gethostname (char *NAME, size_t SIZE) +- This function returns the host name of the system on which it is +- called, in the array NAME. The SIZE argument specifies the size of +- this array, in bytes. Note that this is _not_ the DNS hostname. +- If the system participates in DNS, this is the FQDN (see above). +- +- The return value is `0' on success and `-1' on failure. In the +- GNU C library, `gethostname' fails if SIZE is not large enough; +- then you can try again with a larger array. The following `errno' +- error condition is defined for this function: +- +- `ENAMETOOLONG' +- The SIZE argument is less than the size of the host name plus +- one. +- +- On some systems, there is a symbol for the maximum possible host +- name length: `MAXHOSTNAMELEN'. It is defined in `sys/param.h'. +- But you can't count on this to exist, so it is cleaner to handle +- failure and try again. +- +- `gethostname' stores the beginning of the host name in NAME even +- if the host name won't entirely fit. For some purposes, a +- truncated host name is good enough. If it is, you can ignore the +- error code. +- +- - Function: int sethostname (const char *NAME, size_t LENGTH) +- The `sethostname' function sets the host name of the system that +- calls it to NAME, a string with length LENGTH. Only privileged +- processes are permitted to do this. +- +- Usually `sethostname' gets called just once, at system boot time. +- Often, the program that calls it sets it to the value it finds in +- the file `/etc/hostname'. +- +- Be sure to set the host name to the full host name, not just the +- DNS hostname (see above). +- +- The return value is `0' on success and `-1' on failure. The +- following `errno' error condition is defined for this function: +- +- `EPERM' +- This process cannot set the host name because it is not +- privileged. +- +- - Function: int getdomainnname (char *NAME, size_t LENGTH) +- `getdomainname' returns the NIS (aka YP) domain name of the system +- on which it is called. Note that this is not the more popular DNS +- domain name. Get that with `gethostname'. +- +- The specifics of this function are analogous to `gethostname', +- above. +- +- +- - Function: int setdomainname (const char *NAME, size_t LENGTH) +- `getdomainname' sets the NIS (aka YP) domain name of the system on +- which it is called. Note that this is not the more popular DNS +- domain name. Set that with `sethostname'. +- +- The specifics of this function are analogous to `sethostname', +- above. +- +- +- - Function: long int gethostid (void) +- This function returns the "host ID" of the machine the program is +- running on. By convention, this is usually the primary Internet +- IP address of that machine, converted to a `long int'. However, +- on some systems it is a meaningless but unique number which is +- hard-coded for each machine. +- +- This is not widely used. It arose in BSD 4.2, but was dropped in +- BSD 4.4. It is not required by POSIX. +- +- The proper way to query the IP address is to use `gethostbyname' +- on the results of `gethostname'. For more information on IP +- addresses, *Note Host Addresses::. +- +- - Function: int sethostid (long int ID) +- The `sethostid' function sets the "host ID" of the host machine to +- ID. Only privileged processes are permitted to do this. Usually +- it happens just once, at system boot time. +- +- The proper way to establish the primary IP address of a system is +- to configure the IP address resolver to associate that IP address +- with the system's host name as returned by `gethostname'. For +- example, put a record for the system in `/etc/hosts'. +- +- See `gethostid' above for more information on host ids. +- +- The return value is `0' on success and `-1' on failure. The +- following `errno' error conditions are defined for this function: +- +- `EPERM' +- This process cannot set the host name because it is not +- privileged. +- +- `ENOSYS' +- The operating system does not support setting the host ID. +- On some systems, the host ID is a meaningless but unique +- number hard-coded for each machine. +- +- +-File: libc.info, Node: Platform Type, Next: Filesystem Handling, Prev: Host Identification, Up: System Management +- +-Platform Type Identification +-============================ +- +- You can use the `uname' function to find out some information about +-the type of computer your program is running on. This function and the +-associated data type are declared in the header file `sys/utsname.h'. +- +- As a bonus, `uname' also gives some information identifying the +-particular system your program is running on. This is the same +-information which you can get with functions targetted to this purpose +-described in *Note Host Identification::. +- +- - Data Type: struct utsname +- The `utsname' structure is used to hold information returned by +- the `uname' function. It has the following members: +- +- `char sysname[]' +- This is the name of the operating system in use. +- +- `char release[]' +- This is the current release level of the operating system +- implementation. +- +- `char version[]' +- This is the current version level within the release of the +- operating system. +- +- `char machine[]' +- This is a description of the type of hardware that is in use. +- +- Some systems provide a mechanism to interrogate the kernel +- directly for this information. On systems without such a +- mechanism, the GNU C library fills in this field based on the +- configuration name that was specified when building and +- installing the library. +- +- GNU uses a three-part name to describe a system +- configuration; the three parts are CPU, MANUFACTURER and +- SYSTEM-TYPE, and they are separated with dashes. Any +- possible combination of three names is potentially +- meaningful, but most such combinations are meaningless in +- practice and even the meaningful ones are not necessarily +- supported by any particular GNU program. +- +- Since the value in `machine' is supposed to describe just the +- hardware, it consists of the first two parts of the +- configuration name: `CPU-MANUFACTURER'. For example, it +- might be one of these: +- +- `"sparc-sun"', `"i386-ANYTHING"', `"m68k-hp"', +- `"m68k-sony"', `"m68k-sun"', `"mips-dec"' +- +- `char nodename[]' +- This is the host name of this particular computer. In the +- GNU C library, the value is the same as that returned by +- `gethostname'; see *Note Host Identification::. +- +- gethostname() is implemented with a call to uname(). +- +- `char domainname[]' +- This is the NIS or YP domain name. It is the same value +- returned by `getdomainname'; see *Note Host Identification::. +- This element is a relatively recent invention and use of it +- is not as portable as use of the rest of the structure. +- +- +- - Function: int uname (struct utsname *INFO) +- The `uname' function fills in the structure pointed to by INFO +- with information about the operating system and host machine. A +- non-negative value indicates that the data was successfully stored. +- +- `-1' as the value indicates an error. The only error possible is +- `EFAULT', which we normally don't mention as it is always a +- possibility. +- +- +-File: libc.info, Node: Filesystem Handling, Next: System Parameters, Prev: Platform Type, Up: System Management +- +-Controlling and Querying Mounts +-=============================== +- +- All files are in filesystems, and before you can access any file, its +-filesystem must be mounted. Because of Unix's concept of _Everything +-is a file_, mounting of filesystems is central to doing almost +-anything. This section explains how to find out what filesystems are +-currently mounted and what filesystems are available for mounting, and +-how to change what is mounted. +- +- The classic filesystem is the contents of a disk drive. The concept +-is considerably more abstract, though, and lots of things other than +-disk drives can be mounted. +- +- Some block devices don't correspond to traditional devices like disk +-drives. For example, a loop device is a block device whose driver uses +-a regular file in another filesystem as its medium. So if that regular +-file contains appropriate data for a filesystem, you can by mounting the +-loop device essentially mount a regular file. +- +- Some filesystems aren't based on a device of any kind. The "proc" +-filesystem, for example, contains files whose data is made up by the +-filesystem driver on the fly whenever you ask for it. And when you +-write to it, the data you write causes changes in the system. No data +-gets stored. +- +-* Menu: +- +-* Mount Information:: What is or could be mounted? +-* Mount-Unmount-Remount:: Controlling what is mounted and how +- +- +-File: libc.info, Node: Mount Information, Next: Mount-Unmount-Remount, Up: Filesystem Handling +- +-Mount Information +------------------ +- +- For some programs it is desirable and necessary to access information +-about whether a certain filesystem is mounted and, if it is, where, or +-simply to get lists of all the available filesystems. The GNU libc +-provides some functions to retrieve this information portably. +- +- Traditionally Unix systems have a file named `/etc/fstab' which +-describes all possibly mounted filesystems. The `mount' program uses +-this file to mount at startup time of the system all the necessary +-filesystems. The information about all the filesystems actually +-mounted is normally kept in a file named either `/var/run/mtab' or +-`/etc/mtab'. Both files share the same syntax and it is crucial that +-this syntax is followed all the time. Therefore it is best to never +-directly write the files. The functions described in this section can +-do this and they also provide the functionality to convert the external +-textual representation to the internal representation. +- +- Note that the `fstab' and `mtab' files are maintained on a system by +-_convention_. It is possible for the files not to exist or not to be +-consistent with what is really mounted or available to mount, if the +-system's administration policy allows it. But programs that mount and +-unmount filesystems typically maintain and use these files as described +-herein. +- +- The filenames given above should never be used directly. The +-portable way to handle these file is to use the macro `_PATH_FSTAB', +-defined in `fstab.h', or `_PATH_MNTTAB', defined in `mntent.h' and +-`paths.h', for `fstab'; and the macro `_PATH_MOUNTED', also defined in +-`mntent.h' and `paths.h', for `mtab'. There are also two alternate +-macro names `FSTAB', `MNTTAB', and `MOUNTED' defined but these names +-are deprecated and kept only for backward compatibility. The names +-`_PATH_MNTTAB' and `_PATH_MOUNTED' should always be used. +- +-* Menu: +- +-* fstab:: The `fstab' file +-* mtab:: The `mtab' file +-* Other Mount Information:: Other (non-libc) sources of mount information +- +- +-File: libc.info, Node: fstab, Next: mtab, Up: Mount Information +- +-The `fstab' file +-................ +- +- The internal representation for entries of the file is +-`struct fstab', defined in `fstab.h'. +- +- - Data Type: struct fstab +- This structure is used with the `getfsent', `getfsspec', and +- `getfsfile' functions. +- +- `char *fs_spec' +- This element describes the device from which the filesystem +- is mounted. Normally this is the name of a special device, +- such as a hard disk partition, but it could also be a more or +- less generic string. For "NFS" it would be a hostname and +- directory name combination. +- +- Even though the element is not declared `const' it shouldn't +- be modified. The missing `const' has historic reasons, since +- this function predates ISO C. The same is true for the other +- string elements of this structure. +- +- `char *fs_file' +- This describes the mount point on the local system. I.e., +- accessing any file in this filesystem has implicitly or +- explicitly this string as a prefix. +- +- `char *fs_vfstype' +- This is the type of the filesystem. Depending on what the +- underlying kernel understands it can be any string. +- +- `char *fs_mntops' +- This is a string containing options passed to the kernel with +- the `mount' call. Again, this can be almost anything. There +- can be more than one option, separated from the others by a +- comma. Each option consists of a name and an optional value +- part, introduced by an `=' character. +- +- If the value of this element must be processed it should +- ideally be done using the `getsubopt' function; see *Note +- Suboptions::. +- +- `const char *fs_type' +- This name is poorly chosen. This element points to a string +- (possibly in the `fs_mntops' string) which describes the +- modes with which the filesystem is mounted. `fstab' defines +- five macros to describe the possible values: +- +- `FSTAB_RW' +- The filesystems gets mounted with read and write enabled. +- +- `FSTAB_RQ' +- The filesystems gets mounted with read and write +- enabled. Write access is restricted by quotas. +- +- `FSTAB_RO' +- The filesystem gets mounted read-only. +- +- `FSTAB_SW' +- This is not a real filesystem, it is a swap device. +- +- `FSTAB_XX' +- This entry from the `fstab' file is totally ignored. +- +- Testing for equality with these value must happen using +- `strcmp' since these are all strings. Comparing the pointer +- will probably always fail. +- +- `int fs_freq' +- This element describes the dump frequency in days. +- +- `int fs_passno' +- This element describes the pass number on parallel dumps. It +- is closely related to the `dump' utility used on Unix systems. +- +- To read the entire content of the of the `fstab' file the GNU libc +-contains a set of three functions which are designed in the usual way. +- +- - Function: int setfsent (void) +- This function makes sure that the internal read pointer for the +- `fstab' file is at the beginning of the file. This is done by +- either opening the file or resetting the read pointer. +- +- Since the file handle is internal to the libc this function is not +- thread-safe. +- +- This function returns a non-zero value if the operation was +- successful and the `getfs*' functions can be used to read the +- entries of the file. +- +- - Function: void endfsent (void) +- This function makes sure that all resources acquired by a prior +- call to `setfsent' (explicitly or implicitly by calling +- `getfsent') are freed. +- +- - Function: struct fstab * getfsent (void) +- This function returns the next entry of the `fstab' file. If this +- is the first call to any of the functions handling `fstab' since +- program start or the last call of `endfsent', the file will be +- opened. +- +- The function returns a pointer to a variable of type `struct +- fstab'. This variable is shared by all threads and therefore this +- function is not thread-safe. If an error occurred `getfsent' +- returns a `NULL' pointer. +- +- - Function: struct fstab * getfsspec (const char *NAME) +- This function returns the next entry of the `fstab' file which has +- a string equal to NAME pointed to by the `fs_spec' element. Since +- there is normally exactly one entry for each special device it +- makes no sense to call this function more than once for the same +- argument. If this is the first call to any of the functions +- handling `fstab' since program start or the last call of +- `endfsent', the file will be opened. +- +- The function returns a pointer to a variable of type `struct +- fstab'. This variable is shared by all threads and therefore this +- function is not thread-safe. If an error occurred `getfsent' +- returns a `NULL' pointer. +- +- - Function: struct fstab * getfsfile (const char *NAME) +- This function returns the next entry of the `fstab' file which has +- a string equal to NAME pointed to by the `fs_file' element. Since +- there is normally exactly one entry for each mount point it makes +- no sense to call this function more than once for the same +- argument. If this is the first call to any of the functions +- handling `fstab' since program start or the last call of +- `endfsent', the file will be opened. +- +- The function returns a pointer to a variable of type `struct +- fstab'. This variable is shared by all threads and therefore this +- function is not thread-safe. If an error occurred `getfsent' +- returns a `NULL' pointer. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-48 glibc-2.3.2-200304020432/manual/libc.info-48 +--- glibc-2.3.2/manual/libc.info-48 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-48 Thu Jan 1 01:00:00 1970 +@@ -1,1353 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: mtab, Next: Other Mount Information, Prev: fstab, Up: Mount Information +- +-The `mtab' file +-............... +- +- The following functions and data structure access the `mtab' file. +- +- - Data Type: struct mntent +- This structure is used with the `getmntent', `getmntent_t', +- `addmntent', and `hasmntopt' functions. +- +- `char *mnt_fsname' +- This element contains a pointer to a string describing the +- name of the special device from which the filesystem is +- mounted. It corresponds to the `fs_spec' element in `struct +- fstab'. +- +- `char *mnt_dir' +- This element points to a string describing the mount point of +- the filesystem. It corresponds to the `fs_file' element in +- `struct fstab'. +- +- `char *mnt_type' +- `mnt_type' describes the filesystem type and is therefore +- equivalent to `fs_vfstype' in `struct fstab'. `mntent.h' +- defines a few symbolic names for some of the values this +- string can have. But since the kernel can support arbitrary +- filesystems it does not make much sense to give them symbolic +- names. If one knows the symbol name one also knows the +- filesystem name. Nevertheless here follows the list of the +- symbols provided in `mntent.h'. +- +- `MNTTYPE_IGNORE' +- This symbol expands to `"ignore"'. The value is +- sometime used in `fstab' files to make sure entries are +- not used without removing them. +- +- `MNTTYPE_NFS' +- Expands to `"nfs"'. Using this macro sometimes could +- make sense since it names the default NFS +- implementation, in case both version 2 and 3 are +- supported. +- +- `MNTTYPE_SWAP' +- This symbol expands to `"swap"'. It names the special +- `fstab' entry which names one of the possibly multiple +- swap partitions. +- +- `char *mnt_opts' +- The element contains a string describing the options used +- while mounting the filesystem. As for the equivalent element +- `fs_mntops' of `struct fstab' it is best to use the function +- `getsubopt' (*note Suboptions::) to access the parts of this +- string. +- +- The `mntent.h' file defines a number of macros with string +- values which correspond to some of the options understood by +- the kernel. There might be many more options which are +- possible so it doesn't make much sense to rely on these +- macros but to be consistent here is the list: +- +- `MNTOPT_DEFAULTS' +- Expands to `"defaults"'. This option should be used +- alone since it indicates all values for the customizable +- values are chosen to be the default. +- +- `MNTOPT_RO' +- Expands to `"ro"'. See the `FSTAB_RO' value, it means +- the filesystem is mounted read-only. +- +- `MNTOPT_RW' +- Expand to `"rw"'. See the `FSTAB_RW' value, it means the +- filesystem is mounted with read and write permissions. +- +- `MNTOPT_SUID' +- Expands to `"suid"'. This means that the SUID bit +- (*note How Change Persona::) is respected when a program +- from the filesystem is started. +- +- `MNTOPT_NOSUID' +- Expands to `"nosuid"'. This is the opposite of +- `MNTOPT_SUID', the SUID bit for all files from the +- filesystem is ignored. +- +- `MNTOPT_NOAUTO' +- Expands to `"noauto"'. At startup time the `mount' +- program will ignore this entry if it is started with the +- `-a' option to mount all filesystems mentioned in the +- `fstab' file. +- +- As for the `FSTAB_*' entries introduced above it is important +- to use `strcmp' to check for equality. +- +- `mnt_freq' +- This elements corresponds to `fs_freq' and also specifies the +- frequency in days in which dumps are made. +- +- `mnt_passno' +- This element is equivalent to `fs_passno' with the same +- meaning which is uninteresting for all programs beside `dump'. +- +- For accessing the `mtab' file there is again a set of three +-functions to access all entries in a row. Unlike the functions to +-handle `fstab' these functions do not access a fixed file and there is +-even a thread safe variant of the get function. Beside this the GNU +-libc contains functions to alter the file and test for specific options. +- +- - Function: FILE * setmntent (const char *FILE, const char *MODE) +- The `setmntent' function prepares the file named FILE which must +- be in the format of a `fstab' and `mtab' file for the upcoming +- processing through the other functions of the family. The MODE +- parameter can be chosen in the way the OPENTYPE parameter for +- `fopen' (*note Opening Streams::) can be chosen. If the file is +- opened for writing the file is also allowed to be empty. +- +- If the file was successfully opened `setmntent' returns a file +- descriptor for future use. Otherwise the return value is `NULL' +- and `errno' is set accordingly. +- +- - Function: int endmntent (FILE *STREAM) +- This function takes for the STREAM parameter a file handle which +- previously was returned from the `setmntent' call. `endmntent' +- closes the stream and frees all resources. +- +- The return value is 1 unless an error occurred in which case it is +- 0. +- +- - Function: struct mntent * getmntent (FILE *STREAM) +- The `getmntent' function takes as the parameter a file handle +- previously returned by successful call to `setmntent'. It returns +- a pointer to a static variable of type `struct mntent' which is +- filled with the information from the next entry from the file +- currently read. +- +- The file format used prescribes the use of spaces or tab +- characters to separate the fields. This makes it harder to use +- name containing one of these characters (e.g., mount points using +- spaces). Therefore these characters are encoded in the files and +- the `getmntent' function takes care of the decoding while reading +- the entries back in. `'\040'' is used to encode a space +- character, `'\012'' to encode a tab character and `'\\'' to encode +- a backslash. +- +- If there was an error or the end of the file is reached the return +- value is `NULL'. +- +- This function is not thread-safe since all calls to this function +- return a pointer to the same static variable. `getmntent_r' +- should be used in situations where multiple threads access the +- file. +- +- - Function: struct mntent * getmntent_r (FILE *STREAM, struct mentent +- *RESULT, char *BUFFER, int BUFSIZE) +- The `getmntent_r' function is the reentrant variant of +- `getmntent'. It also returns the next entry from the file and +- returns a pointer. The actual variable the values are stored in +- is not static, though. Instead the function stores the values in +- the variable pointed to by the RESULT parameter. Additional +- information (e.g., the strings pointed to by the elements of the +- result) are kept in the buffer of size BUFSIZE pointed to by +- BUFFER. +- +- Escaped characters (space, tab, backslash) are converted back in +- the same way as it happens for `getmentent'. +- +- The function returns a `NULL' pointer in error cases. Errors +- could be: +- * error while reading the file, +- +- * end of file reached, +- +- * BUFSIZE is too small for reading a complete new entry. +- +- - Function: int addmntent (FILE *STREAM, const struct mntent *MNT) +- The `addmntent' function allows adding a new entry to the file +- previously opened with `setmntent'. The new entries are always +- appended. I.e., even if the position of the file descriptor is +- not at the end of the file this function does not overwrite an +- existing entry following the current position. +- +- The implication of this is that to remove an entry from a file one +- has to create a new file while leaving out the entry to be removed +- and after closing the file remove the old one and rename the new +- file to the chosen name. +- +- This function takes care of spaces and tab characters in the names +- to be written to the file. It converts them and the backslash +- character into the format describe in the `getmntent' description +- above. +- +- This function returns 0 in case the operation was successful. +- Otherwise the return value is 1 and `errno' is set appropriately. +- +- - Function: char * hasmntopt (const struct mntent *MNT, const char +- *OPT) +- This function can be used to check whether the string pointed to +- by the `mnt_opts' element of the variable pointed to by MNT +- contains the option OPT. If this is true a pointer to the +- beginning of the option in the `mnt_opts' element is returned. If +- no such option exists the function returns `NULL'. +- +- This function is useful to test whether a specific option is +- present but when all options have to be processed one is better +- off with using the `getsubopt' function to iterate over all +- options in the string. +- +- +-File: libc.info, Node: Other Mount Information, Prev: mtab, Up: Mount Information +- +-Other (Non-libc) Sources of Mount Information +-............................................. +- +- On a system with a Linux kernel and the `proc' filesystem, you can +-get information on currently mounted filesystems from the file `mounts' +-in the `proc' filesystem. Its format is similar to that of the `mtab' +-file, but represents what is truly mounted without relying on +-facilities outside the kernel to keep `mtab' up to date. +- +- +-File: libc.info, Node: Mount-Unmount-Remount, Prev: Mount Information, Up: Filesystem Handling +- +-Mount, Unmount, Remount +------------------------ +- +- This section describes the functions for mounting, unmounting, and +-remounting filesystems. +- +- Only the superuser can mount, unmount, or remount a filesystem. +- +- These functions do not access the `fstab' and `mtab' files. You +-should maintain and use these separately. *Note Mount Information::. +- +- The symbols in this section are declared in `sys/mount.h'. +- +- - Function: int mount (const char *SPECIAL_FILE, const char *DIR, +- const char *FSTYPE, unsigned long int OPTIONS, const void +- *DATA) +- `mount' mounts or remounts a filesystem. The two operations are +- quite different and are merged rather unnaturally into this one +- function. The `MS_REMOUNT' option, explained below, determines +- whether `mount' mounts or remounts. +- +- For a mount, the filesystem on the block device represented by the +- device special file named SPECIAL_FILE gets mounted over the mount +- point DIR. This means that the directory DIR (along with any +- files in it) is no longer visible; in its place (and still with +- the name DIR) is the root directory of the filesystem on the +- device. +- +- As an exception, if the filesystem type (see below) is one which +- is not based on a device (e.g. "proc"), `mount' instantiates a +- filesystem and mounts it over DIR and ignores SPECIAL_FILE. +- +- For a remount, DIR specifies the mount point where the filesystem +- to be remounted is (and remains) mounted and SPECIAL_FILE is +- ignored. Remounting a filesystem means changing the options that +- control operations on the filesystem while it is mounted. It does +- not mean unmounting and mounting again. +- +- For a mount, you must identify the type of the filesystem as +- FSTYPE. This type tells the kernel how to access the filesystem +- and can be thought of as the name of a filesystem driver. The +- acceptable values are system dependent. On a system with a Linux +- kernel and the `proc' filesystem, the list of possible values is +- in the file `filesystems' in the `proc' filesystem (e.g. type `cat +- /proc/filesystems' to see the list). With a Linux kernel, the +- types of filesystems that `mount' can mount, and their type names, +- depends on what filesystem drivers are configured into the kernel +- or loaded as loadable kernel modules. An example of a common +- value for FSTYPE is `ext2'. +- +- For a remount, `mount' ignores FSTYPE. +- +- OPTIONS specifies a variety of options that apply until the +- filesystem is unmounted or remounted. The precise meaning of an +- option depends on the filesystem and with some filesystems, an +- option may have no effect at all. Furthermore, for some +- filesystems, some of these options (but never `MS_RDONLY') can be +- overridden for individual file accesses via `ioctl'. +- +- OPTIONS is a bit string with bit fields defined using the +- following mask and masked value macros: +- +- `MS_MGC_MASK' +- This multibit field contains a magic number. If it does not +- have the value `MS_MGC_VAL', `mount' assumes all the +- following bits are zero and the DATA argument is a null +- string, regardless of their actual values. +- +- `MS_REMOUNT' +- This bit on means to remount the filesystem. Off means to +- mount it. +- +- `MS_RDONLY' +- This bit on specifies that no writing to the filesystem shall +- be allowed while it is mounted. This cannot be overridden by +- `ioctl'. This option is available on nearly all filesystems. +- +- `S_IMMUTABLE' +- This bit on specifies that no writing to the files in the +- filesystem shall be allowed while it is mounted. This can be +- overridden for a particular file access by a properly +- privileged call to `ioctl'. This option is a relatively new +- invention and is not available on many filesystems. +- +- `S_APPEND' +- This bit on specifies that the only file writing that shall +- be allowed while the filesystem is mounted is appending. +- Some filesystems allow this to be overridden for a particular +- process by a properly privileged call to `ioctl'. This is a +- relatively new invention and is not available on many +- filesystems. +- +- `MS_NOSUID' +- This bit on specifies that Setuid and Setgid permissions on +- files in the filesystem shall be ignored while it is mounted. +- +- `MS_NOEXEC' +- This bit on specifies that no files in the filesystem shall +- be executed while the filesystem is mounted. +- +- `MS_NODEV' +- This bit on specifies that no device special files in the +- filesystem shall be accessible while the filesystem is +- mounted. +- +- `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 write completes rather than held in the buffer +- cache. +- +- `MS_MANDLOCK' +- This bit on specifies that mandatory locks on files shall be +- permitted while the filesystem is mounted. +- +- `MS_NOATIME' +- This bit on specifies that access times of files shall not be +- updated when the files are accessed while the filesystem is +- mounted. +- +- `MS_NODIRATIME' +- This bit on specifies that access times of directories shall +- not be updated when the directories are accessed while the +- filesystem in mounted. +- +- Any bits not covered by the above masks should be set off; +- otherwise, results are undefined. +- +- The meaning of DATA depends on the filesystem type and is +- controlled entirely by the filesystem driver in the kernel. +- +- Example: +- +- #include +- +- mount("/dev/hdb", "/cdrom", MS_MGC_VAL | MS_RDONLY | MS_NOSUID, ""); +- +- mount("/dev/hda2", "/mnt", MS_MGC_VAL | MS_REMOUNT, ""); +- +- Appropriate arguments for `mount' are conventionally recorded in +- the `fstab' table. *Note Mount Information::. +- +- The return value is zero if the mount or remount is successful. +- Otherwise, it is `-1' and `errno' is set appropriately. The +- values of `errno' are filesystem dependent, but here is a general +- list: +- +- `EPERM' +- The process is not superuser. +- +- `ENODEV' +- The file system type FSTYPE is not known to the kernel. +- +- `ENOTBLK' +- The file DEV is not a block device special file. +- +- `EBUSY' +- * The device is already mounted. +- +- * The mount point is busy. (E.g. it is some process' +- working directory or has a filesystem mounted on it +- already). +- +- * The request is to remount read-only, but there are files +- open for write. +- +- `EINVAL' +- * A remount was attempted, but there is no filesystem +- mounted over the specified mount point. +- +- * The supposed filesystem has an invalid superblock. +- +- +- `EACCES' +- * The filesystem is inherently read-only (possibly due to +- a switch on the device) and the process attempted to +- mount it read/write (by setting the `MS_RDONLY' bit off). +- +- * SPECIAL_FILE or DIR is not accessible due to file +- permissions. +- +- * SPECIAL_FILE is not accessible because it is in a +- filesystem that is mounted with the `MS_NODEV' option. +- +- +- `EM_FILE' +- The table of dummy devices is full. `mount' needs to create a +- dummy device (aka "unnamed" device) if the filesystem being +- mounted is not one that uses a device. +- +- +- - Function: int umount2 (const char *FILE, int FLAGS) +- `umount2' unmounts a filesystem. +- +- You can identify the filesystem to unmount either by the device +- special file that contains the filesystem or by the mount point. +- The effect is the same. Specify either as the string FILE. +- +- FLAGS contains the one-bit field identified by the following mask +- macro: +- +- `MNT_FORCE' +- This bit on means to force the unmounting even if the +- filesystem is busy, by making it unbusy first. If the bit is +- off and the filesystem is busy, `umount2' fails with `errno' +- = `EBUSY'. Depending on the filesystem, this may override +- all, some, or no busy conditions. +- +- All other bits in FLAGS should be set to zero; otherwise, the +- result is undefined. +- +- Example: +- +- #include +- +- umount2("/mnt", MNT_FORCE); +- +- umount2("/dev/hdd1", 0); +- +- After the filesystem is unmounted, the directory that was the +- mount point is visible, as are any files in it. +- +- As part of unmounting, `umount2' syncs the filesystem. +- +- If the unmounting is successful, the return value is zero. +- Otherwise, it is `-1' and `errno' is set accordingly: +- +- `EPERM' +- The process is not superuser. +- +- `EBUSY' +- The filesystem cannot be unmounted because it is busy. E.g. +- it contains a directory that is some process's working +- directory or a file that some process has open. With some +- filesystems in some cases, you can avoid this failure with +- the `MNT_FORCE' option. +- +- `EINVAL' +- FILE validly refers to a file, but that file is neither a +- mount point nor a device special file of a currently mounted +- filesystem. +- +- This function is not available on all systems. +- +- - Function: int umount (const char *FILE) +- `umount' does the same thing as `umount2' with FLAGS set to +- zeroes. It is more widely available than `umount2' but since it +- lacks the possibility to forcefully unmount a filesystem is +- deprecated when `umount2' is also available. +- +- +-File: libc.info, Node: System Parameters, Prev: Filesystem Handling, Up: System Management +- +-System Parameters +-================= +- +- This section describes the `sysctl' function, which gets and sets a +-variety of system parameters. +- +- The symbols used in this section are declared in the file `sysctl.h'. +- +- - Function: int sysctl (int *NAMES, int NLEN, void *OLDVAL, +- size_t *OLDLENP, void *NEWVAL, size_t NEWLEN) +- +- `sysctl' gets or sets a specified system parameter. There are so +- many of these parameters that it is not practical to list them all +- here, but here are some examples: +- +- * network domain name +- +- * paging parameters +- +- * network Address Resolution Protocol timeout time +- +- * maximum number of files that may be open +- +- * root filesystem device +- +- * when kernel was built +- +- The set of available parameters depends on the kernel +- configuration and can change while the system is running, +- particularly when you load and unload loadable kernel modules. +- +- The system parameters with which `syslog' is concerned are arranged +- in a hierarchical structure like a hierarchical filesystem. To +- identify a particular parameter, you specify a path through the +- structure in a way analogous to specifying the pathname of a file. +- Each component of the path is specified by an integer and each of +- these integers has a macro defined for it by `sysctl.h'. NAMES is +- the path, in the form of an array of integers. Each component of +- the path is one element of the array, in order. NLEN is the +- number of components in the path. +- +- For example, the first component of the path for all the paging +- parameters is the value `CTL_VM'. For the free page thresholds, +- the second component of the path is `VM_FREEPG'. So to get the +- free page threshold values, make NAMES an array containing the two +- elements `CTL_VM' and `VM_FREEPG' and make NLEN = 2. +- +- The format of the value of a parameter depends on the parameter. +- Sometimes it is an integer; sometimes it is an ASCII string; +- sometimes it is an elaborate structure. In the case of the free +- page thresholds used in the example above, the parameter value is +- a structure containing several integers. +- +- In any case, you identify a place to return the parameter's value +- with OLDVAL and specify the amount of storage available at that +- location as *OLDLENP. *OLDLENP does double duty because it is +- also the output location that contains the actual length of the +- returned value. +- +- If you don't want the parameter value returned, specify a null +- pointer for OLDVAL. +- +- To set the parameter, specify the address and length of the new +- value as NEWVAL and NEWLEN. If you don't want to set the +- parameter, specify a null pointer as NEWVAL. +- +- If you get and set a parameter in the same `sysctl' call, the value +- returned is the value of the parameter before it was set. +- +- Each system parameter has a set of permissions similar to the +- permissions for a file (including the permissions on directories +- in its path) that determine whether you may get or set it. For +- the purposes of these permissions, every parameter is considered +- to be owned by the superuser and Group 0 so processes with that +- effective uid or gid may have more access to system parameters. +- Unlike with files, the superuser does not invariably have full +- permission to all system parameters, because some of them are +- designed not to be changed ever. +- +- `sysctl' returns a zero return value if it succeeds. Otherwise, it +- returns `-1' and sets `errno' appropriately. Besides the failures +- that apply to all system calls, the following are the `errno' +- codes for all possible failures: +- +- `EPERM' +- The process is not permitted to access one of the components +- of the path of the system parameter or is not permitted to +- access the system parameter itself in the way (read or write) +- that it requested. +- +- `ENOTDIR' +- There is no system parameter corresponding to NAME. +- +- `EFAULT' +- OLDVAL is not null, which means the process wanted to read +- the parameter, but *OLDLENP is zero, so there is no place to +- return it. +- +- `EINVAL' +- * The process attempted to set a system parameter to a +- value that is not valid for that parameter. +- +- * The space provided for the return of the system +- parameter is not the right size for that parameter. +- +- `ENOMEM' +- This value may be returned instead of the more correct +- `EINVAL' in some cases where the space provided for the +- return of the system parameter is too small. +- +- +- If you have a Linux kernel with the `proc' filesystem, you can get +-and set most of the same parameters by reading and writing to files in +-the `sys' directory of the `proc' filesystem. In the `sys' directory, +-the directory structure represents the hierarchical structure of the +-parameters. E.g. you can display the free page thresholds with +- cat /proc/sys/vm/freepages +- +- Some more traditional and more widely available, though less general, +-GNU C library functions for getting and setting some of the same system +-parameters are: +- +- * `getdomainname', `setdomainname' +- +- * `gethostname', `sethostname' (*Note Host Identification::.) +- +- * `uname' (*Note Platform Type::.) +- +- * `bdflush' +- +- +-File: libc.info, Node: System Configuration, Next: Cryptographic Functions, Prev: System Management, Up: Top +- +-System Configuration Parameters +-******************************* +- +- The functions and macros listed in this chapter give information +-about configuration parameters of the operating system--for example, +-capacity limits, presence of optional POSIX features, and the default +-path for executable files (*note String Parameters::). +- +-* Menu: +- +-* General Limits:: Constants and functions that describe +- various process-related limits that have +- one uniform value for any given machine. +-* System Options:: Optional POSIX features. +-* Version Supported:: Version numbers of POSIX.1 and POSIX.2. +-* Sysconf:: Getting specific configuration values +- of general limits and system options. +-* Minimums:: Minimum values for general limits. +- +-* Limits for Files:: Size limitations that pertain to individual files. +- These can vary between file systems +- or even from file to file. +-* Options for Files:: Optional features that some files may support. +-* File Minimums:: Minimum values for file limits. +-* Pathconf:: Getting the limit values for a particular file. +- +-* Utility Limits:: Capacity limits of some POSIX.2 utility programs. +-* Utility Minimums:: Minimum allowable values of those limits. +- +-* String Parameters:: Getting the default search path. +- +- +-File: libc.info, Node: General Limits, Next: System Options, Up: System Configuration +- +-General Capacity Limits +-======================= +- +- The POSIX.1 and POSIX.2 standards specify a number of parameters that +-describe capacity limitations of the system. These limits can be fixed +-constants for a given operating system, or they can vary from machine to +-machine. For example, some limit values may be configurable by the +-system administrator, either at run time or by rebuilding the kernel, +-and this should not require recompiling application programs. +- +- Each of the following limit parameters has a macro that is defined in +-`limits.h' only if the system has a fixed, uniform limit for the +-parameter in question. If the system allows different file systems or +-files to have different limits, then the macro is undefined; use +-`sysconf' to find out the limit that applies at a particular time on a +-particular machine. *Note Sysconf::. +- +- Each of these parameters also has another macro, with a name starting +-with `_POSIX', which gives the lowest value that the limit is allowed +-to have on _any_ POSIX system. *Note Minimums::. +- +- - Macro: int ARG_MAX +- If defined, the unvarying maximum combined length of the ARGV and +- ENVIRON arguments that can be passed to the `exec' functions. +- +- - Macro: int CHILD_MAX +- If defined, the unvarying maximum number of processes that can +- exist with the same real user ID at any one time. In BSD and GNU, +- this is controlled by the `RLIMIT_NPROC' resource limit; *note +- Limits on Resources::. +- +- - Macro: int OPEN_MAX +- If defined, the unvarying maximum number of files that a single +- process can have open simultaneously. In BSD and GNU, this is +- controlled by the `RLIMIT_NOFILE' resource limit; *note Limits on +- Resources::. +- +- - Macro: int STREAM_MAX +- If defined, the unvarying maximum number of streams that a single +- process can have open simultaneously. *Note Opening Streams::. +- +- - Macro: int TZNAME_MAX +- If defined, the unvarying maximum length of a time zone name. +- *Note Time Zone Functions::. +- +- These limit macros are always defined in `limits.h'. +- +- - Macro: int NGROUPS_MAX +- The maximum number of supplementary group IDs that one process can +- have. +- +- The value of this macro is actually a lower bound for the maximum. +- That is, you can count on being able to have that many +- supplementary group IDs, but a particular machine might let you +- have even more. You can use `sysconf' to see whether a particular +- machine will let you have more (*note Sysconf::). +- +- - Macro: int SSIZE_MAX +- The largest value that can fit in an object of type `ssize_t'. +- Effectively, this is the limit on the number of bytes that can be +- read or written in a single operation. +- +- This macro is defined in all POSIX systems because this limit is +- never configurable. +- +- - Macro: int RE_DUP_MAX +- The largest number of repetitions you are guaranteed is allowed in +- the construct `\{MIN,MAX\}' in a regular expression. +- +- The value of this macro is actually a lower bound for the maximum. +- That is, you can count on being able to have that many +- repetitions, but a particular machine might let you have even +- more. You can use `sysconf' to see whether a particular machine +- will let you have more (*note Sysconf::). And even the value that +- `sysconf' tells you is just a lower bound--larger values might +- work. +- +- This macro is defined in all POSIX.2 systems, because POSIX.2 says +- it should always be defined even if there is no specific imposed +- limit. +- +- +-File: libc.info, Node: System Options, Next: Version Supported, Prev: General Limits, Up: System Configuration +- +-Overall System Options +-====================== +- +- POSIX defines certain system-specific options that not all POSIX +-systems support. Since these options are provided in the kernel, not +-in the library, simply using the GNU C library does not guarantee any +-of these features is supported; it depends on the system you are using. +- +- You can test for the availability of a given option using the macros +-in this section, together with the function `sysconf'. The macros are +-defined only if you include `unistd.h'. +- +- For the following macros, if the macro is defined in `unistd.h', +-then the option is supported. Otherwise, the option may or may not be +-supported; use `sysconf' to find out. *Note Sysconf::. +- +- - Macro: int _POSIX_JOB_CONTROL +- If this symbol is defined, it indicates that the system supports +- job control. Otherwise, the implementation behaves as if all +- processes within a session belong to a single process group. +- *Note Job Control::. +- +- - Macro: int _POSIX_SAVED_IDS +- If this symbol is defined, it indicates that the system remembers +- the effective user and group IDs of a process before it executes an +- executable file with the set-user-ID or set-group-ID bits set, and +- that explicitly changing the effective user or group IDs back to +- these values is permitted. If this option is not defined, then if +- a nonprivileged process changes its effective user or group ID to +- the real user or group ID of the process, it can't change it back +- again. *Note Enable/Disable Setuid::. +- +- For the following macros, if the macro is defined in `unistd.h', +-then its value indicates whether the option is supported. A value of +-`-1' means no, and any other value means yes. If the macro is not +-defined, then the option may or may not be supported; use `sysconf' to +-find out. *Note Sysconf::. +- +- - Macro: int _POSIX2_C_DEV +- If this symbol is defined, it indicates that the system has the +- POSIX.2 C compiler command, `c89'. The GNU C library always +- defines this as `1', on the assumption that you would not have +- installed it if you didn't have a C compiler. +- +- - Macro: int _POSIX2_FORT_DEV +- If this symbol is defined, it indicates that the system has the +- POSIX.2 Fortran compiler command, `fort77'. The GNU C library +- never defines this, because we don't know what the system has. +- +- - Macro: int _POSIX2_FORT_RUN +- If this symbol is defined, it indicates that the system has the +- POSIX.2 `asa' command to interpret Fortran carriage control. The +- GNU C library never defines this, because we don't know what the +- system has. +- +- - Macro: int _POSIX2_LOCALEDEF +- If this symbol is defined, it indicates that the system has the +- POSIX.2 `localedef' command. The GNU C library never defines +- this, because we don't know what the system has. +- +- - Macro: int _POSIX2_SW_DEV +- If this symbol is defined, it indicates that the system has the +- POSIX.2 commands `ar', `make', and `strip'. The GNU C library +- always defines this as `1', on the assumption that you had to have +- `ar' and `make' to install the library, and it's unlikely that +- `strip' would be absent when those are present. +- +- +-File: libc.info, Node: Version Supported, Next: Sysconf, Prev: System Options, Up: System Configuration +- +-Which Version of POSIX is Supported +-=================================== +- +- - Macro: long int _POSIX_VERSION +- This constant represents the version of the POSIX.1 standard to +- which the implementation conforms. For an implementation +- conforming to the 1995 POSIX.1 standard, the value is the integer +- `199506L'. +- +- `_POSIX_VERSION' is always defined (in `unistd.h') in any POSIX +- system. +- +- *Usage Note:* Don't try to test whether the system supports POSIX +- by including `unistd.h' and then checking whether `_POSIX_VERSION' +- is defined. On a non-POSIX system, this will probably fail +- because there is no `unistd.h'. We do not know of _any_ way you +- can reliably test at compilation time whether your target system +- supports POSIX or whether `unistd.h' exists. +- +- The GNU C compiler predefines the symbol `__POSIX__' if the target +- system is a POSIX system. Provided you do not use any other +- compilers on POSIX systems, testing `defined (__POSIX__)' will +- reliably detect such systems. +- +- - Macro: long int _POSIX2_C_VERSION +- This constant represents the version of the POSIX.2 standard which +- the library and system kernel support. We don't know what value +- this will be for the first version of the POSIX.2 standard, +- because the value is based on the year and month in which the +- standard is officially adopted. +- +- The value of this symbol says nothing about the utilities +- installed on the system. +- +- *Usage Note:* You can use this macro to tell whether a POSIX.1 +- system library supports POSIX.2 as well. Any POSIX.1 system +- contains `unistd.h', so include that file and then test `defined +- (_POSIX2_C_VERSION)'. +- +- +-File: libc.info, Node: Sysconf, Next: Minimums, Prev: Version Supported, Up: System Configuration +- +-Using `sysconf' +-=============== +- +- When your system has configurable system limits, you can use the +-`sysconf' function to find out the value that applies to any particular +-machine. The function and the associated PARAMETER constants are +-declared in the header file `unistd.h'. +- +-* Menu: +- +-* Sysconf Definition:: Detailed specifications of `sysconf'. +-* Constants for Sysconf:: The list of parameters `sysconf' can read. +-* Examples of Sysconf:: How to use `sysconf' and the parameter +- macros properly together. +- +- +-File: libc.info, Node: Sysconf Definition, Next: Constants for Sysconf, Up: Sysconf +- +-Definition of `sysconf' +------------------------ +- +- - Function: long int sysconf (int PARAMETER) +- This function is used to inquire about runtime system parameters. +- The PARAMETER argument should be one of the `_SC_' symbols listed +- below. +- +- The normal return value from `sysconf' is the value you requested. +- A value of `-1' is returned both if the implementation does not +- impose a limit, and in case of an error. +- +- The following `errno' error conditions are defined for this +- function: +- +- `EINVAL' +- The value of the PARAMETER is invalid. +- +- +-File: libc.info, Node: Constants for Sysconf, Next: Examples of Sysconf, Prev: Sysconf Definition, Up: Sysconf +- +-Constants for `sysconf' Parameters +----------------------------------- +- +- Here are the symbolic constants for use as the PARAMETER argument to +-`sysconf'. The values are all integer constants (more specifically, +-enumeration type values). +- +-`_SC_ARG_MAX' +- Inquire about the parameter corresponding to `ARG_MAX'. +- +-`_SC_CHILD_MAX' +- Inquire about the parameter corresponding to `CHILD_MAX'. +- +-`_SC_OPEN_MAX' +- Inquire about the parameter corresponding to `OPEN_MAX'. +- +-`_SC_STREAM_MAX' +- Inquire about the parameter corresponding to `STREAM_MAX'. +- +-`_SC_TZNAME_MAX' +- Inquire about the parameter corresponding to `TZNAME_MAX'. +- +-`_SC_NGROUPS_MAX' +- Inquire about the parameter corresponding to `NGROUPS_MAX'. +- +-`_SC_JOB_CONTROL' +- Inquire about the parameter corresponding to `_POSIX_JOB_CONTROL'. +- +-`_SC_SAVED_IDS' +- Inquire about the parameter corresponding to `_POSIX_SAVED_IDS'. +- +-`_SC_VERSION' +- Inquire about the parameter corresponding to `_POSIX_VERSION'. +- +-`_SC_CLK_TCK' +- Inquire about the parameter corresponding to `CLOCKS_PER_SEC'; +- *note CPU Time::. +- +-`_SC_CHARCLASS_NAME_MAX' +- Inquire about the parameter corresponding to maximal length +- allowed for a character class name in an extended locale +- specification. These extensions are not yet standardized and so +- this option is not standardized as well. +- +-`_SC_REALTIME_SIGNALS' +- Inquire about the parameter corresponding to +- `_POSIX_REALTIME_SIGNALS'. +- +-`_SC_PRIORITY_SCHEDULING' +- Inquire about the parameter corresponding to +- `_POSIX_PRIORITY_SCHEDULING'. +- +-`_SC_TIMERS' +- Inquire about the parameter corresponding to `_POSIX_TIMERS'. +- +-`_SC_ASYNCHRONOUS_IO' +- Inquire about the parameter corresponding to +- `_POSIX_ASYNCHRONOUS_IO'. +- +-`_SC_PRIORITIZED_IO' +- Inquire about the parameter corresponding to +- `_POSIX_PRIORITIZED_IO'. +- +-`_SC_SYNCHRONIZED_IO' +- Inquire about the parameter corresponding to +- `_POSIX_SYNCHRONIZED_IO'. +- +-`_SC_FSYNC' +- Inquire about the parameter corresponding to `_POSIX_FSYNC'. +- +-`_SC_MAPPED_FILES' +- Inquire about the parameter corresponding to `_POSIX_MAPPED_FILES'. +- +-`_SC_MEMLOCK' +- Inquire about the parameter corresponding to `_POSIX_MEMLOCK'. +- +-`_SC_MEMLOCK_RANGE' +- Inquire about the parameter corresponding to +- `_POSIX_MEMLOCK_RANGE'. +- +-`_SC_MEMORY_PROTECTION' +- Inquire about the parameter corresponding to +- `_POSIX_MEMORY_PROTECTION'. +- +-`_SC_MESSAGE_PASSING' +- Inquire about the parameter corresponding to +- `_POSIX_MESSAGE_PASSING'. +- +-`_SC_SEMAPHORES' +- Inquire about the parameter corresponding to `_POSIX_SEMAPHORES'. +- +-`_SC_SHARED_MEMORY_OBJECTS' +- Inquire about the parameter corresponding to +- `_POSIX_SHARED_MEMORY_OBJECTS'. +- +-`_SC_AIO_LISTIO_MAX' +- Inquire about the parameter corresponding to +- `_POSIX_AIO_LISTIO_MAX'. +- +-`_SC_AIO_MAX' +- Inquire about the parameter corresponding to `_POSIX_AIO_MAX'. +- +-`_SC_AIO_PRIO_DELTA_MAX' +- Inquire the value by which a process can decrease its asynchronous +- I/O priority level from its own scheduling priority. This +- corresponds to the run-time invariant value `AIO_PRIO_DELTA_MAX'. +- +-`_SC_DELAYTIMER_MAX' +- Inquire about the parameter corresponding to +- `_POSIX_DELAYTIMER_MAX'. +- +-`_SC_MQ_OPEN_MAX' +- Inquire about the parameter corresponding to `_POSIX_MQ_OPEN_MAX'. +- +-`_SC_MQ_PRIO_MAX' +- Inquire about the parameter corresponding to `_POSIX_MQ_PRIO_MAX'. +- +-`_SC_RTSIG_MAX' +- Inquire about the parameter corresponding to `_POSIX_RTSIG_MAX'. +- +-`_SC_SEM_NSEMS_MAX' +- Inquire about the parameter corresponding to +- `_POSIX_SEM_NSEMS_MAX'. +- +-`_SC_SEM_VALUE_MAX' +- Inquire about the parameter corresponding to +- `_POSIX_SEM_VALUE_MAX'. +- +-`_SC_SIGQUEUE_MAX' +- Inquire about the parameter corresponding to `_POSIX_SIGQUEUE_MAX'. +- +-`_SC_TIMER_MAX' +- Inquire about the parameter corresponding to `_POSIX_TIMER_MAX'. +- +-`_SC_PII' +- Inquire about the parameter corresponding to `_POSIX_PII'. +- +-`_SC_PII_XTI' +- Inquire about the parameter corresponding to `_POSIX_PII_XTI'. +- +-`_SC_PII_SOCKET' +- Inquire about the parameter corresponding to `_POSIX_PII_SOCKET'. +- +-`_SC_PII_INTERNET' +- Inquire about the parameter corresponding to `_POSIX_PII_INTERNET'. +- +-`_SC_PII_OSI' +- Inquire about the parameter corresponding to `_POSIX_PII_OSI'. +- +-`_SC_SELECT' +- Inquire about the parameter corresponding to `_POSIX_SELECT'. +- +-`_SC_UIO_MAXIOV' +- Inquire about the parameter corresponding to `_POSIX_UIO_MAXIOV'. +- +-`_SC_PII_INTERNET_STREAM' +- Inquire about the parameter corresponding to +- `_POSIX_PII_INTERNET_STREAM'. +- +-`_SC_PII_INTERNET_DGRAM' +- Inquire about the parameter corresponding to +- `_POSIX_PII_INTERNET_DGRAM'. +- +-`_SC_PII_OSI_COTS' +- Inquire about the parameter corresponding to `_POSIX_PII_OSI_COTS'. +- +-`_SC_PII_OSI_CLTS' +- Inquire about the parameter corresponding to `_POSIX_PII_OSI_CLTS'. +- +-`_SC_PII_OSI_M' +- Inquire about the parameter corresponding to `_POSIX_PII_OSI_M'. +- +-`_SC_T_IOV_MAX' +- Inquire the value of the value associated with the `T_IOV_MAX' +- variable. +- +-`_SC_THREADS' +- Inquire about the parameter corresponding to `_POSIX_THREADS'. +- +-`_SC_THREAD_SAFE_FUNCTIONS' +- Inquire about the parameter corresponding to +- `_POSIX_THREAD_SAFE_FUNCTIONS'. +- +-`_SC_GETGR_R_SIZE_MAX' +- Inquire about the parameter corresponding to +- `_POSIX_GETGR_R_SIZE_MAX'. +- +-`_SC_GETPW_R_SIZE_MAX' +- Inquire about the parameter corresponding to +- `_POSIX_GETPW_R_SIZE_MAX'. +- +-`_SC_LOGIN_NAME_MAX' +- Inquire about the parameter corresponding to +- `_POSIX_LOGIN_NAME_MAX'. +- +-`_SC_TTY_NAME_MAX' +- Inquire about the parameter corresponding to `_POSIX_TTY_NAME_MAX'. +- +-`_SC_THREAD_DESTRUCTOR_ITERATIONS' +- Inquire about the parameter corresponding to +- `_POSIX_THREAD_DESTRUCTOR_ITERATIONS'. +- +-`_SC_THREAD_KEYS_MAX' +- Inquire about the parameter corresponding to +- `_POSIX_THREAD_KEYS_MAX'. +- +-`_SC_THREAD_STACK_MIN' +- Inquire about the parameter corresponding to +- `_POSIX_THREAD_STACK_MIN'. +- +-`_SC_THREAD_THREADS_MAX' +- Inquire about the parameter corresponding to +- `_POSIX_THREAD_THREADS_MAX'. +- +-`_SC_THREAD_ATTR_STACKADDR' +- Inquire about the parameter corresponding to +- a `_POSIX_THREAD_ATTR_STACKADDR'. +- +-`_SC_THREAD_ATTR_STACKSIZE' +- Inquire about the parameter corresponding to +- `_POSIX_THREAD_ATTR_STACKSIZE'. +- +-`_SC_THREAD_PRIORITY_SCHEDULING' +- Inquire about the parameter corresponding to +- `_POSIX_THREAD_PRIORITY_SCHEDULING'. +- +-`_SC_THREAD_PRIO_INHERIT' +- Inquire about the parameter corresponding to +- `_POSIX_THREAD_PRIO_INHERIT'. +- +-`_SC_THREAD_PRIO_PROTECT' +- Inquire about the parameter corresponding to +- `_POSIX_THREAD_PRIO_PROTECT'. +- +-`_SC_THREAD_PROCESS_SHARED' +- Inquire about the parameter corresponding to +- `_POSIX_THREAD_PROCESS_SHARED'. +- +-`_SC_2_C_DEV' +- Inquire about whether the system has the POSIX.2 C compiler +- command, `c89'. +- +-`_SC_2_FORT_DEV' +- Inquire about whether the system has the POSIX.2 Fortran compiler +- command, `fort77'. +- +-`_SC_2_FORT_RUN' +- Inquire about whether the system has the POSIX.2 `asa' command to +- interpret Fortran carriage control. +- +-`_SC_2_LOCALEDEF' +- Inquire about whether the system has the POSIX.2 `localedef' +- command. +- +-`_SC_2_SW_DEV' +- Inquire about whether the system has the POSIX.2 commands `ar', +- `make', and `strip'. +- +-`_SC_BC_BASE_MAX' +- Inquire about the maximum value of `obase' in the `bc' utility. +- +-`_SC_BC_DIM_MAX' +- Inquire about the maximum size of an array in the `bc' utility. +- +-`_SC_BC_SCALE_MAX' +- Inquire about the maximum value of `scale' in the `bc' utility. +- +-`_SC_BC_STRING_MAX' +- Inquire about the maximum size of a string constant in the `bc' +- utility. +- +-`_SC_COLL_WEIGHTS_MAX' +- Inquire about the maximum number of weights that can necessarily +- be used in defining the collating sequence for a locale. +- +-`_SC_EXPR_NEST_MAX' +- Inquire about the maximum number of expressions nested within +- parentheses when using the `expr' utility. +- +-`_SC_LINE_MAX' +- Inquire about the maximum size of a text line that the POSIX.2 text +- utilities can handle. +- +-`_SC_EQUIV_CLASS_MAX' +- Inquire about the maximum number of weights that can be assigned +- to an entry of the `LC_COLLATE' category `order' keyword in a +- locale definition. The GNU C library does not presently support +- locale definitions. +- +-`_SC_VERSION' +- Inquire about the version number of POSIX.1 that the library and +- kernel support. +- +-`_SC_2_VERSION' +- Inquire about the version number of POSIX.2 that the system +- utilities support. +- +-`_SC_PAGESIZE' +- Inquire about the virtual memory page size of the machine. +- `getpagesize' returns the same value (*note Query Memory +- Parameters::). +- +-`_SC_NPROCESSORS_CONF' +- Inquire about the number of configured processors. +- +-`_SC_NPROCESSORS_ONLN' +- Inquire about the number of processors online. +- +-`_SC_PHYS_PAGES' +- Inquire about the number of physical pages in the system. +- +-`_SC_AVPHYS_PAGES' +- Inquire about the number of available physical pages in the system. +- +-`_SC_ATEXIT_MAX' +- Inquire about the number of functions which can be registered as +- termination functions for `atexit'; *note Cleanups on Exit::. +- +-`_SC_XOPEN_VERSION' +- Inquire about the parameter corresponding to `_XOPEN_VERSION'. +- +-`_SC_XOPEN_XCU_VERSION' +- Inquire about the parameter corresponding to `_XOPEN_XCU_VERSION'. +- +-`_SC_XOPEN_UNIX' +- Inquire about the parameter corresponding to `_XOPEN_UNIX'. +- +-`_SC_XOPEN_REALTIME' +- Inquire about the parameter corresponding to `_XOPEN_REALTIME'. +- +-`_SC_XOPEN_REALTIME_THREADS' +- Inquire about the parameter corresponding to +- `_XOPEN_REALTIME_THREADS'. +- +-`_SC_XOPEN_LEGACY' +- Inquire about the parameter corresponding to `_XOPEN_LEGACY'. +- +-`_SC_XOPEN_CRYPT' +- Inquire about the parameter corresponding to `_XOPEN_CRYPT'. +- +-`_SC_XOPEN_ENH_I18N' +- Inquire about the parameter corresponding to `_XOPEN_ENH_I18N'. +- +-`_SC_XOPEN_SHM' +- Inquire about the parameter corresponding to `_XOPEN_SHM'. +- +-`_SC_XOPEN_XPG2' +- Inquire about the parameter corresponding to `_XOPEN_XPG2'. +- +-`_SC_XOPEN_XPG3' +- Inquire about the parameter corresponding to `_XOPEN_XPG3'. +- +-`_SC_XOPEN_XPG4' +- Inquire about the parameter corresponding to `_XOPEN_XPG4'. +- +-`_SC_CHAR_BIT' +- Inquire about the number of bits in a variable of type `char'. +- +-`_SC_CHAR_MAX' +- Inquire about the maximum value which can be stored in a variable +- of type `char'. +- +-`_SC_CHAR_MIN' +- Inquire about the minimum value which can be stored in a variable +- of type `char'. +- +-`_SC_INT_MAX' +- Inquire about the maximum value which can be stored in a variable +- of type `int'. +- +-`_SC_INT_MIN' +- Inquire about the minimum value which can be stored in a variable +- of type `int'. +- +-`_SC_LONG_BIT' +- Inquire about the number of bits in a variable of type `long int'. +- +-`_SC_WORD_BIT' +- Inquire about the number of bits in a variable of a register word. +- +-`_SC_MB_LEN_MAX' +- Inquire the maximum length of a multi-byte representation of a wide +- character value. +- +-`_SC_NZERO' +- Inquire about the value used to internally represent the zero +- priority level for the process execution. +- +-`SC_SSIZE_MAX' +- Inquire about the maximum value which can be stored in a variable +- of type `ssize_t'. +- +-`_SC_SCHAR_MAX' +- Inquire about the maximum value which can be stored in a variable +- of type `signed char'. +- +-`_SC_SCHAR_MIN' +- Inquire about the minimum value which can be stored in a variable +- of type `signed char'. +- +-`_SC_SHRT_MAX' +- Inquire about the maximum value which can be stored in a variable +- of type `short int'. +- +-`_SC_SHRT_MIN' +- Inquire about the minimum value which can be stored in a variable +- of type `short int'. +- +-`_SC_UCHAR_MAX' +- Inquire about the maximum value which can be stored in a variable +- of type `unsigned char'. +- +-`_SC_UINT_MAX' +- Inquire about the maximum value which can be stored in a variable +- of type `unsigned int'. +- +-`_SC_ULONG_MAX' +- Inquire about the maximum value which can be stored in a variable +- of type `unsigned long int'. +- +-`_SC_USHRT_MAX' +- Inquire about the maximum value which can be stored in a variable +- of type `unsigned short int'. +- +-`_SC_NL_ARGMAX' +- Inquire about the parameter corresponding to `NL_ARGMAX'. +- +-`_SC_NL_LANGMAX' +- Inquire about the parameter corresponding to `NL_LANGMAX'. +- +-`_SC_NL_MSGMAX' +- Inquire about the parameter corresponding to `NL_MSGMAX'. +- +-`_SC_NL_NMAX' +- Inquire about the parameter corresponding to `NL_NMAX'. +- +-`_SC_NL_SETMAX' +- Inquire about the parameter corresponding to `NL_SETMAX'. +- +-`_SC_NL_TEXTMAX' +- Inquire about the parameter corresponding to `NL_TEXTMAX'. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-49 glibc-2.3.2-200304020432/manual/libc.info-49 +--- glibc-2.3.2/manual/libc.info-49 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-49 Thu Jan 1 01:00:00 1970 +@@ -1,1219 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Examples of Sysconf, Prev: Constants for Sysconf, Up: Sysconf +- +-Examples of `sysconf' +---------------------- +- +- We recommend that you first test for a macro definition for the +-parameter you are interested in, and call `sysconf' only if the macro +-is not defined. For example, here is how to test whether job control +-is supported: +- +- int +- have_job_control (void) +- { +- #ifdef _POSIX_JOB_CONTROL +- return 1; +- #else +- int value = sysconf (_SC_JOB_CONTROL); +- if (value < 0) +- /* If the system is that badly wedged, +- there's no use trying to go on. */ +- fatal (strerror (errno)); +- return value; +- #endif +- } +- +- Here is how to get the value of a numeric limit: +- +- int +- get_child_max () +- { +- #ifdef CHILD_MAX +- return CHILD_MAX; +- #else +- int value = sysconf (_SC_CHILD_MAX); +- if (value < 0) +- fatal (strerror (errno)); +- return value; +- #endif +- } +- +- +-File: libc.info, Node: Minimums, Next: Limits for Files, Prev: Sysconf, Up: System Configuration +- +-Minimum Values for General Capacity Limits +-========================================== +- +- Here are the names for the POSIX minimum upper bounds for the system +-limit parameters. The significance of these values is that you can +-safely push to these limits without checking whether the particular +-system you are using can go that far. +- +-`_POSIX_AIO_LISTIO_MAX' +- The most restrictive limit permitted by POSIX for the maximum +- number of I/O operations that can be specified in a list I/O call. +- The value of this constant is `2'; thus you can add up to two new +- entries of the list of outstanding operations. +- +-`_POSIX_AIO_MAX' +- The most restrictive limit permitted by POSIX for the maximum +- number of outstanding asynchronous I/O operations. The value of +- this constant is `1'. So you cannot expect that you can issue +- more than one operation and immediately continue with the normal +- work, receiving the notifications asynchronously. +- +-`_POSIX_ARG_MAX' +- The value of this macro is the most restrictive limit permitted by +- POSIX for the maximum combined length of the ARGV and ENVIRON +- arguments that can be passed to the `exec' functions. Its value +- is `4096'. +- +-`_POSIX_CHILD_MAX' +- The value of this macro is the most restrictive limit permitted by +- POSIX for the maximum number of simultaneous processes per real +- user ID. Its value is `6'. +- +-`_POSIX_NGROUPS_MAX' +- The value of this macro is the most restrictive limit permitted by +- POSIX for the maximum number of supplementary group IDs per +- process. Its value is `0'. +- +-`_POSIX_OPEN_MAX' +- The value of this macro is the most restrictive limit permitted by +- POSIX for the maximum number of files that a single process can +- have open simultaneously. Its value is `16'. +- +-`_POSIX_SSIZE_MAX' +- The value of this macro is the most restrictive limit permitted by +- POSIX for the maximum value that can be stored in an object of type +- `ssize_t'. Its value is `32767'. +- +-`_POSIX_STREAM_MAX' +- The value of this macro is the most restrictive limit permitted by +- POSIX for the maximum number of streams that a single process can +- have open simultaneously. Its value is `8'. +- +-`_POSIX_TZNAME_MAX' +- The value of this macro is the most restrictive limit permitted by +- POSIX for the maximum length of a time zone name. Its value is +- `3'. +- +-`_POSIX2_RE_DUP_MAX' +- The value of this macro is the most restrictive limit permitted by +- POSIX for the numbers used in the `\{MIN,MAX\}' construct in a +- regular expression. Its value is `255'. +- +- +-File: libc.info, Node: Limits for Files, Next: Options for Files, Prev: Minimums, Up: System Configuration +- +-Limits on File System Capacity +-============================== +- +- The POSIX.1 standard specifies a number of parameters that describe +-the limitations of the file system. It's possible for the system to +-have a fixed, uniform limit for a parameter, but this isn't the usual +-case. On most systems, it's possible for different file systems (and, +-for some parameters, even different files) to have different maximum +-limits. For example, this is very likely if you use NFS to mount some +-of the file systems from other machines. +- +- Each of the following macros is defined in `limits.h' only if the +-system has a fixed, uniform limit for the parameter in question. If the +-system allows different file systems or files to have different limits, +-then the macro is undefined; use `pathconf' or `fpathconf' to find out +-the limit that applies to a particular file. *Note Pathconf::. +- +- Each parameter also has another macro, with a name starting with +-`_POSIX', which gives the lowest value that the limit is allowed to +-have on _any_ POSIX system. *Note File Minimums::. +- +- - Macro: int LINK_MAX +- The uniform system limit (if any) for the number of names for a +- given file. *Note Hard Links::. +- +- - Macro: int MAX_CANON +- The uniform system limit (if any) for the amount of text in a line +- of input when input editing is enabled. *Note Canonical or Not::. +- +- - Macro: int MAX_INPUT +- The uniform system limit (if any) for the total number of +- characters typed ahead as input. *Note I/O Queues::. +- +- - Macro: int NAME_MAX +- The uniform system limit (if any) for the length of a file name +- component. +- +- - Macro: int PATH_MAX +- The uniform system limit (if any) for the length of an entire file +- name (that is, the argument given to system calls such as `open'). +- +- - Macro: int PIPE_BUF +- The uniform system limit (if any) for the number of bytes that can +- be written atomically to a pipe. If multiple processes are +- writing to the same pipe simultaneously, output from different +- processes might be interleaved in chunks of this size. *Note +- Pipes and FIFOs::. +- +- These are alternative macro names for some of the same information. +- +- - Macro: int MAXNAMLEN +- This is the BSD name for `NAME_MAX'. It is defined in `dirent.h'. +- +- - Macro: int FILENAME_MAX +- The value of this macro is an integer constant expression that +- represents the maximum length of a file name string. It is +- defined in `stdio.h'. +- +- Unlike `PATH_MAX', this macro is defined even if there is no actual +- limit imposed. In such a case, its value is typically a very large +- number. *This is always the case on the GNU system.* +- +- *Usage Note:* Don't use `FILENAME_MAX' as the size of an array in +- which to store a file name! You can't possibly make an array that +- big! Use dynamic allocation (*note Memory Allocation::) instead. +- +- +-File: libc.info, Node: Options for Files, Next: File Minimums, Prev: Limits for Files, Up: System Configuration +- +-Optional Features in File Support +-================================= +- +- POSIX defines certain system-specific options in the system calls for +-operating on files. Some systems support these options and others do +-not. Since these options are provided in the kernel, not in the +-library, simply using the GNU C library does not guarantee that any of +-these features is supported; it depends on the system you are using. +-They can also vary between file systems on a single machine. +- +- This section describes the macros you can test to determine whether a +-particular option is supported on your machine. If a given macro is +-defined in `unistd.h', then its value says whether the corresponding +-feature is supported. (A value of `-1' indicates no; any other value +-indicates yes.) If the macro is undefined, it means particular files +-may or may not support the feature. +- +- Since all the machines that support the GNU C library also support +-NFS, one can never make a general statement about whether all file +-systems support the `_POSIX_CHOWN_RESTRICTED' and `_POSIX_NO_TRUNC' +-features. So these names are never defined as macros in the GNU C +-library. +- +- - Macro: int _POSIX_CHOWN_RESTRICTED +- If this option is in effect, the `chown' function is restricted so +- that the only changes permitted to nonprivileged processes is to +- change the group owner of a file to either be the effective group +- ID of the process, or one of its supplementary group IDs. *Note +- File Owner::. +- +- - Macro: int _POSIX_NO_TRUNC +- If this option is in effect, file name components longer than +- `NAME_MAX' generate an `ENAMETOOLONG' error. Otherwise, file name +- components that are too long are silently truncated. +- +- - Macro: unsigned char _POSIX_VDISABLE +- This option is only meaningful for files that are terminal devices. +- If it is enabled, then handling for special control characters can +- be disabled individually. *Note Special Characters::. +- +- If one of these macros is undefined, that means that the option +-might be in effect for some files and not for others. To inquire about +-a particular file, call `pathconf' or `fpathconf'. *Note Pathconf::. +- +- +-File: libc.info, Node: File Minimums, Next: Pathconf, Prev: Options for Files, Up: System Configuration +- +-Minimum Values for File System Limits +-===================================== +- +- Here are the names for the POSIX minimum upper bounds for some of the +-above parameters. The significance of these values is that you can +-safely push to these limits without checking whether the particular +-system you are using can go that far. In most cases GNU systems do not +-have these strict limitations. The actual limit should be requested if +-necessary. +- +-`_POSIX_LINK_MAX' +- The most restrictive limit permitted by POSIX for the maximum +- value of a file's link count. The value of this constant is `8'; +- thus, you can always make up to eight names for a file without +- running into a system limit. +- +-`_POSIX_MAX_CANON' +- The most restrictive limit permitted by POSIX for the maximum +- number of bytes in a canonical input line from a terminal device. +- The value of this constant is `255'. +- +-`_POSIX_MAX_INPUT' +- The most restrictive limit permitted by POSIX for the maximum +- number of bytes in a terminal device input queue (or typeahead +- buffer). *Note Input Modes::. The value of this constant is +- `255'. +- +-`_POSIX_NAME_MAX' +- The most restrictive limit permitted by POSIX for the maximum +- number of bytes in a file name component. The value of this +- constant is `14'. +- +-`_POSIX_PATH_MAX' +- The most restrictive limit permitted by POSIX for the maximum +- number of bytes in a file name. The value of this constant is +- `256'. +- +-`_POSIX_PIPE_BUF' +- The most restrictive limit permitted by POSIX for the maximum +- number of bytes that can be written atomically to a pipe. The +- value of this constant is `512'. +- +-`SYMLINK_MAX' +- Maximum number of bytes in a symbolic link. +- +-`POSIX_REC_INCR_XFER_SIZE' +- Recommended increment for file transfer sizes between the +- `POSIX_REC_MIN_XFER_SIZE' and `POSIX_REC_MAX_XFER_SIZE' values. +- +-`POSIX_REC_MAX_XFER_SIZE' +- Maximum recommended file transfer size. +- +-`POSIX_REC_MIN_XFER_SIZE' +- Minimum recommended file transfer size. +- +-`POSIX_REC_XFER_ALIGN' +- Recommended file transfer buffer alignment. +- +- +-File: libc.info, Node: Pathconf, Next: Utility Limits, Prev: File Minimums, Up: System Configuration +- +-Using `pathconf' +-================ +- +- When your machine allows different files to have different values +-for a file system parameter, you can use the functions in this section +-to find out the value that applies to any particular file. +- +- These functions and the associated constants for the PARAMETER +-argument are declared in the header file `unistd.h'. +- +- - Function: long int pathconf (const char *FILENAME, int PARAMETER) +- This function is used to inquire about the limits that apply to +- the file named FILENAME. +- +- The PARAMETER argument should be one of the `_PC_' constants +- listed below. +- +- The normal return value from `pathconf' is the value you requested. +- A value of `-1' is returned both if the implementation does not +- impose a limit, and in case of an error. In the former case, +- `errno' is not set, while in the latter case, `errno' is set to +- indicate the cause of the problem. So the only way to use this +- function robustly is to store `0' into `errno' just before calling +- it. +- +- Besides the usual file name errors (*note File Name Errors::), the +- following error condition is defined for this function: +- +- `EINVAL' +- The value of PARAMETER is invalid, or the implementation +- doesn't support the PARAMETER for the specific file. +- +- - Function: long int fpathconf (int FILEDES, int PARAMETER) +- This is just like `pathconf' except that an open file descriptor +- is used to specify the file for which information is requested, +- instead of a file name. +- +- The following `errno' error conditions are defined for this +- function: +- +- `EBADF' +- The FILEDES argument is not a valid file descriptor. +- +- `EINVAL' +- The value of PARAMETER is invalid, or the implementation +- doesn't support the PARAMETER for the specific file. +- +- Here are the symbolic constants that you can use as the PARAMETER +-argument to `pathconf' and `fpathconf'. The values are all integer +-constants. +- +-`_PC_LINK_MAX' +- Inquire about the value of `LINK_MAX'. +- +-`_PC_MAX_CANON' +- Inquire about the value of `MAX_CANON'. +- +-`_PC_MAX_INPUT' +- Inquire about the value of `MAX_INPUT'. +- +-`_PC_NAME_MAX' +- Inquire about the value of `NAME_MAX'. +- +-`_PC_PATH_MAX' +- Inquire about the value of `PATH_MAX'. +- +-`_PC_PIPE_BUF' +- Inquire about the value of `PIPE_BUF'. +- +-`_PC_CHOWN_RESTRICTED' +- Inquire about the value of `_POSIX_CHOWN_RESTRICTED'. +- +-`_PC_NO_TRUNC' +- Inquire about the value of `_POSIX_NO_TRUNC'. +- +-`_PC_VDISABLE' +- Inquire about the value of `_POSIX_VDISABLE'. +- +-`_PC_SYNC_IO' +- Inquire about the value of `_POSIX_SYNC_IO'. +- +-`_PC_ASYNC_IO' +- Inquire about the value of `_POSIX_ASYNC_IO'. +- +-`_PC_PRIO_IO' +- Inquire about the value of `_POSIX_PRIO_IO'. +- +-`_PC_SOCK_MAXBUF' +- Inquire about the value of `_POSIX_PIPE_BUF'. +- +-`_PC_FILESIZEBITS' +- Inquire about the availability of large files on the filesystem. +- +-`_PC_REC_INCR_XFER_SIZE' +- Inquire about the value of `POSIX_REC_INCR_XFER_SIZE'. +- +-`_PC_REC_MAX_XFER_SIZE' +- Inquire about the value of `POSIX_REC_MAX_XFER_SIZE'. +- +-`_PC_REC_MIN_XFER_SIZE' +- Inquire about the value of `POSIX_REC_MIN_XFER_SIZE'. +- +-`_PC_REC_XFER_ALIGN' +- Inquire about the value of `POSIX_REC_XFER_ALIGN'. +- +- +-File: libc.info, Node: Utility Limits, Next: Utility Minimums, Prev: Pathconf, Up: System Configuration +- +-Utility Program Capacity Limits +-=============================== +- +- The POSIX.2 standard specifies certain system limits that you can +-access through `sysconf' that apply to utility behavior rather than the +-behavior of the library or the operating system. +- +- The GNU C library defines macros for these limits, and `sysconf' +-returns values for them if you ask; but these values convey no +-meaningful information. They are simply the smallest values that +-POSIX.2 permits. +- +- - Macro: int BC_BASE_MAX +- The largest value of `obase' that the `bc' utility is guaranteed +- to support. +- +- - Macro: int BC_DIM_MAX +- The largest number of elements in one array that the `bc' utility +- is guaranteed to support. +- +- - Macro: int BC_SCALE_MAX +- The largest value of `scale' that the `bc' utility is guaranteed +- to support. +- +- - Macro: int BC_STRING_MAX +- The largest number of characters in one string constant that the +- `bc' utility is guaranteed to support. +- +- - Macro: int COLL_WEIGHTS_MAX +- The largest number of weights that can necessarily be used in +- defining the collating sequence for a locale. +- +- - Macro: int EXPR_NEST_MAX +- The maximum number of expressions that can be nested within +- parenthesis by the `expr' utility. +- +- - Macro: int LINE_MAX +- The largest text line that the text-oriented POSIX.2 utilities can +- support. (If you are using the GNU versions of these utilities, +- then there is no actual limit except that imposed by the available +- virtual memory, but there is no way that the library can tell you +- this.) +- +- - Macro: int EQUIV_CLASS_MAX +- The maximum number of weights that can be assigned to an entry of +- the `LC_COLLATE' category `order' keyword in a locale definition. +- The GNU C library does not presently support locale definitions. +- +- +-File: libc.info, Node: Utility Minimums, Next: String Parameters, Prev: Utility Limits, Up: System Configuration +- +-Minimum Values for Utility Limits +-================================= +- +-`_POSIX2_BC_BASE_MAX' +- The most restrictive limit permitted by POSIX.2 for the maximum +- value of `obase' in the `bc' utility. Its value is `99'. +- +-`_POSIX2_BC_DIM_MAX' +- The most restrictive limit permitted by POSIX.2 for the maximum +- size of an array in the `bc' utility. Its value is `2048'. +- +-`_POSIX2_BC_SCALE_MAX' +- The most restrictive limit permitted by POSIX.2 for the maximum +- value of `scale' in the `bc' utility. Its value is `99'. +- +-`_POSIX2_BC_STRING_MAX' +- The most restrictive limit permitted by POSIX.2 for the maximum +- size of a string constant in the `bc' utility. Its value is +- `1000'. +- +-`_POSIX2_COLL_WEIGHTS_MAX' +- The most restrictive limit permitted by POSIX.2 for the maximum +- number of weights that can necessarily be used in defining the +- collating sequence for a locale. Its value is `2'. +- +-`_POSIX2_EXPR_NEST_MAX' +- The most restrictive limit permitted by POSIX.2 for the maximum +- number of expressions nested within parenthesis when using the +- `expr' utility. Its value is `32'. +- +-`_POSIX2_LINE_MAX' +- The most restrictive limit permitted by POSIX.2 for the maximum +- size of a text line that the text utilities can handle. Its value +- is `2048'. +- +-`_POSIX2_EQUIV_CLASS_MAX' +- The most restrictive limit permitted by POSIX.2 for the maximum +- number of weights that can be assigned to an entry of the +- `LC_COLLATE' category `order' keyword in a locale definition. Its +- value is `2'. The GNU C library does not presently support locale +- definitions. +- +- +-File: libc.info, Node: String Parameters, Prev: Utility Minimums, Up: System Configuration +- +-String-Valued Parameters +-======================== +- +- POSIX.2 defines a way to get string-valued parameters from the +-operating system with the function `confstr': +- +- - Function: size_t confstr (int PARAMETER, char *BUF, size_t LEN) +- This function reads the value of a string-valued system parameter, +- storing the string into LEN bytes of memory space starting at BUF. +- The PARAMETER argument should be one of the `_CS_' symbols listed +- below. +- +- The normal return value from `confstr' is the length of the string +- value that you asked for. If you supply a null pointer for BUF, +- then `confstr' does not try to store the string; it just returns +- its length. A value of `0' indicates an error. +- +- If the string you asked for is too long for the buffer (that is, +- longer than `LEN - 1'), then `confstr' stores just that much +- (leaving room for the terminating null character). You can tell +- that this has happened because `confstr' returns a value greater +- than or equal to LEN. +- +- The following `errno' error conditions are defined for this +- function: +- +- `EINVAL' +- The value of the PARAMETER is invalid. +- +- Currently there is just one parameter you can read with `confstr': +- +-`_CS_PATH' +- This parameter's value is the recommended default path for +- searching for executable files. This is the path that a user has +- by default just after logging in. +- +-`_CS_LFS_CFLAGS' +- The returned string specifies which additional flags must be given +- to the C compiler if a source is compiled using the +- `_LARGEFILE_SOURCE' feature select macro; *note Feature Test +- Macros::. +- +-`_CS_LFS_LDFLAGS' +- The returned string specifies which additional flags must be given +- to the linker if a source is compiled using the +- `_LARGEFILE_SOURCE' feature select macro; *note Feature Test +- Macros::. +- +-`_CS_LFS_LIBS' +- The returned string specifies which additional libraries must be +- linked to the application if a source is compiled using the +- `_LARGEFILE_SOURCE' feature select macro; *note Feature Test +- Macros::. +- +-`_CS_LFS_LINTFLAGS' +- The returned string specifies which additional flags must be given +- to the lint tool if a source is compiled using the +- `_LARGEFILE_SOURCE' feature select macro; *note Feature Test +- Macros::. +- +-`_CS_LFS64_CFLAGS' +- The returned string specifies which additional flags must be given +- to the C compiler if a source is compiled using the +- `_LARGEFILE64_SOURCE' feature select macro; *note Feature Test +- Macros::. +- +-`_CS_LFS64_LDFLAGS' +- The returned string specifies which additional flags must be given +- to the linker if a source is compiled using the +- `_LARGEFILE64_SOURCE' feature select macro; *note Feature Test +- Macros::. +- +-`_CS_LFS64_LIBS' +- The returned string specifies which additional libraries must be +- linked to the application if a source is compiled using the +- `_LARGEFILE64_SOURCE' feature select macro; *note Feature Test +- Macros::. +- +-`_CS_LFS64_LINTFLAGS' +- The returned string specifies which additional flags must be given +- to the lint tool if a source is compiled using the +- `_LARGEFILE64_SOURCE' feature select macro; *note Feature Test +- Macros::. +- +- The way to use `confstr' without any arbitrary limit on string size +-is to call it twice: first call it to get the length, allocate the +-buffer accordingly, and then call `confstr' again to fill the buffer, +-like this: +- +- char * +- get_default_path (void) +- { +- size_t len = confstr (_CS_PATH, NULL, 0); +- char *buffer = (char *) xmalloc (len); +- +- if (confstr (_CS_PATH, buf, len + 1) == 0) +- { +- free (buffer); +- return NULL; +- } +- +- return buffer; +- } +- +- +-File: libc.info, Node: Cryptographic Functions, Next: Debugging Support, Prev: System Configuration, Up: Top +- +-DES Encryption and Password Handling +-************************************ +- +- On many systems, it is unnecessary to have any kind of user +-authentication; for instance, a workstation which is not connected to a +-network probably does not need any user authentication, because to use +-the machine an intruder must have physical access. +- +- Sometimes, however, it is necessary to be sure that a user is +-authorized to use some service a machine provides--for instance, to log +-in as a particular user id (*note Users and Groups::). One traditional +-way of doing this is for each user to choose a secret "password"; then, +-the system can ask someone claiming to be a user what the user's +-password is, and if the person gives the correct password then the +-system can grant the appropriate privileges. +- +- If all the passwords are just stored in a file somewhere, then this +-file has to be very carefully protected. To avoid this, passwords are +-run through a "one-way function", a function which makes it difficult to +-work out what its input was by looking at its output, before storing in +-the file. +- +- The GNU C library provides a one-way function that is compatible with +-the behavior of the `crypt' function introduced in FreeBSD 2.0. It +-supports two one-way algorithms: one based on the MD5 message-digest +-algorithm that is compatible with modern BSD systems, and the other +-based on the Data Encryption Standard (DES) that is compatible with +-Unix systems. +- +- It also provides support for Secure RPC, and some library functions +-that can be used to perform normal DES encryption. +- +-* Menu: +- +-* Legal Problems:: This software can get you locked up, or worse. +-* getpass:: Prompting the user for a password. +-* crypt:: A one-way function for passwords. +-* DES Encryption:: Routines for DES encryption. +- +- +-File: libc.info, Node: Legal Problems, Next: getpass, Up: Cryptographic Functions +- +-Legal Problems +-============== +- +- Because of the continuously changing state of the law, it's not +-possible to provide a definitive survey of the laws affecting +-cryptography. Instead, this section warns you of some of the known +-trouble spots; this may help you when you try to find out what the laws +-of your country are. +- +- Some countries require that you have a licence to use, possess, or +-import cryptography. These countries are believed to include +-Byelorussia, Burma, India, Indonesia, Israel, Kazakhstan, Pakistan, +-Russia, and Saudi Arabia. +- +- Some countries restrict the transmission of encrypted messages by +-radio; some telecommunications carriers restrict the transmission of +-encrypted messages over their network. +- +- Many countries have some form of export control for encryption +-software. The Wassenaar Arrangement is a multilateral agreement +-between 33 countries (Argentina, Australia, Austria, Belgium, Bulgaria, +-Canada, the Czech Republic, Denmark, Finland, France, Germany, Greece, +-Hungary, Ireland, Italy, Japan, Luxembourg, the Netherlands, New +-Zealand, Norway, Poland, Portugal, the Republic of Korea, Romania, the +-Russian Federation, the Slovak Republic, Spain, Sweden, Switzerland, +-Turkey, Ukraine, the United Kingdom and the United States) which +-restricts some kinds of encryption exports. Different countries apply +-the arrangement in different ways; some do not allow the exception for +-certain kinds of "public domain" software (which would include this +-library), some only restrict the export of software in tangible form, +-and others impose significant additional restrictions. +- +- The United States has additional rules. This software would +-generally be exportable under 15 CFR 740.13(e), which permits exports of +-"encryption source code" which is "publicly available" and which is +-"not subject to an express agreement for the payment of a licensing fee +-or royalty for commercial production or sale of any product developed +-with the source code" to most countries. +- +- The rules in this area are continuously changing. If you know of any +-information in this manual that is out-of-date, please report it using +-the `glibcbug' script. *Note Reporting Bugs::. +- +- +-File: libc.info, Node: getpass, Next: crypt, Prev: Legal Problems, Up: Cryptographic Functions +- +-Reading Passwords +-================= +- +- When reading in a password, it is desirable to avoid displaying it on +-the screen, to help keep it secret. The following function handles this +-in a convenient way. +- +- - Function: char * getpass (const char *PROMPT) +- `getpass' outputs PROMPT, then reads a string in from the terminal +- without echoing it. It tries to connect to the real terminal, +- `/dev/tty', if possible, to encourage users not to put plaintext +- passwords in files; otherwise, it uses `stdin' and `stderr'. +- `getpass' also disables the INTR, QUIT, and SUSP characters on the +- terminal using the `ISIG' terminal attribute (*note Local Modes::). +- The terminal is flushed before and after `getpass', so that +- characters of a mistyped password are not accidentally visible. +- +- In other C libraries, `getpass' may only return the first +- `PASS_MAX' bytes of a password. The GNU C library has no limit, so +- `PASS_MAX' is undefined. +- +- The prototype for this function is in `unistd.h'. `PASS_MAX' +- would be defined in `limits.h'. +- +- This precise set of operations may not suit all possible situations. +-In this case, it is recommended that users write their own `getpass' +-substitute. For instance, a very simple substitute is as follows: +- +- #include +- #include +- +- ssize_t +- my_getpass (char **lineptr, size_t *n, FILE *stream) +- { +- struct termios old, new; +- int nread; +- +- /* Turn echoing off and fail if we can't. */ +- if (tcgetattr (fileno (stream), &old) != 0) +- return -1; +- new = old; +- new.c_lflag &= ~ECHO; +- if (tcsetattr (fileno (stream), TCSAFLUSH, &new) != 0) +- return -1; +- +- /* Read the password. */ +- nread = getline (lineptr, n, stream); +- +- /* Restore terminal. */ +- (void) tcsetattr (fileno (stream), TCSAFLUSH, &old); +- +- return nread; +- } +- +- The substitute takes the same parameters as `getline' (*note Line +-Input::); the user must print any prompt desired. +- +- +-File: libc.info, Node: crypt, Next: DES Encryption, Prev: getpass, Up: Cryptographic Functions +- +-Encrypting Passwords +-==================== +- +- - Function: char * crypt (const char *KEY, const char *SALT) +- The `crypt' function takes a password, KEY, as a string, and a +- SALT character array which is described below, and returns a +- printable ASCII string which starts with another salt. It is +- believed that, given the output of the function, the best way to +- find a KEY that will produce that output is to guess values of KEY +- until the original value of KEY is found. +- +- The SALT parameter does two things. Firstly, it selects which +- algorithm is used, the MD5-based one or the DES-based one. +- Secondly, it makes life harder for someone trying to guess +- passwords against a file containing many passwords; without a +- SALT, an intruder can make a guess, run `crypt' on it once, and +- compare the result with all the passwords. With a SALT, the +- intruder must run `crypt' once for each different salt. +- +- For the MD5-based algorithm, the SALT should consist of the string +- `$1$', followed by up to 8 characters, terminated by either +- another `$' or the end of the string. The result of `crypt' will +- be the SALT, followed by a `$' if the salt didn't end with one, +- followed by 22 characters from the alphabet `./0-9A-Za-z', up to +- 34 characters total. Every character in the KEY is significant. +- +- For the DES-based algorithm, the SALT should consist of two +- characters from the alphabet `./0-9A-Za-z', and the result of +- `crypt' will be those two characters followed by 11 more from the +- same alphabet, 13 in total. Only the first 8 characters in the +- KEY are significant. +- +- The MD5-based algorithm has no limit on the useful length of the +- password used, and is slightly more secure. It is therefore +- preferred over the DES-based algorithm. +- +- When the user enters their password for the first time, the SALT +- should be set to a new string which is reasonably random. To +- verify a password against the result of a previous call to +- `crypt', pass the result of the previous call as the SALT. +- +- The following short program is an example of how to use `crypt' the +-first time a password is entered. Note that the SALT generation is +-just barely acceptable; in particular, it is not unique between +-machines, and in many applications it would not be acceptable to let an +-attacker know what time the user's password was last set. +- +- #include +- #include +- #include +- #include +- +- int +- main(void) +- { +- unsigned long seed[2]; +- char salt[] = "$1$........"; +- const char *const seedchars = +- "./0123456789ABCDEFGHIJKLMNOPQRST" +- "UVWXYZabcdefghijklmnopqrstuvwxyz"; +- char *password; +- int i; +- +- /* Generate a (not very) random seed. +- You should do it better than this... */ +- seed[0] = time(NULL); +- seed[1] = getpid() ^ (seed[0] >> 14 & 0x30000); +- +- /* Turn it into printable characters from `seedchars'. */ +- for (i = 0; i < 8; i++) +- salt[3+i] = seedchars[(seed[i/5] >> (i%5)*6) & 0x3f]; +- +- /* Read in the user's password and encrypt it. */ +- password = crypt(getpass("Password:"), salt); +- +- /* Print the results. */ +- puts(password); +- return 0; +- } +- +- The next program shows how to verify a password. It prompts the user +-for a password and prints "Access granted." if the user types `GNU libc +-manual'. +- +- #include +- #include +- #include +- #include +- +- int +- main(void) +- { +- /* Hashed form of "GNU libc manual". */ +- const char *const pass = "$1$/iSaq7rB$EoUw5jJPPvAPECNaaWzMK/"; +- +- char *result; +- int ok; +- +- /* Read in the user's password and encrypt it, +- passing the expected password in as the salt. */ +- result = crypt(getpass("Password:"), pass); +- +- /* Test the result. */ +- ok = strcmp (result, pass) == 0; +- +- puts(ok ? "Access granted." : "Access denied."); +- return ok ? 0 : 1; +- } +- +- - Function: char * crypt_r (const char *KEY, const char *SALT, struct +- crypt_data * DATA) +- The `crypt_r' function does the same thing as `crypt', but takes +- an extra parameter which includes space for its result (among +- other things), so it can be reentrant. `data->initialized' must be +- cleared to zero before the first time `crypt_r' is called. +- +- The `crypt_r' function is a GNU extension. +- +- The `crypt' and `crypt_r' functions are prototyped in the header +-`crypt.h'. +- +- +-File: libc.info, Node: DES Encryption, Prev: crypt, Up: Cryptographic Functions +- +-DES Encryption +-============== +- +- The Data Encryption Standard is described in the US Government +-Federal Information Processing Standards (FIPS) 46-3 published by the +-National Institute of Standards and Technology. The DES has been very +-thoroughly analyzed since it was developed in the late 1970s, and no new +-significant flaws have been found. +- +- However, the DES uses only a 56-bit key (plus 8 parity bits), and a +-machine has been built in 1998 which can search through all possible +-keys in about 6 days, which cost about US$200000; faster searches would +-be possible with more money. This makes simple DES insecure for most +-purposes, and NIST no longer permits new US government systems to use +-simple DES. +- +- For serious encryption functionality, it is recommended that one of +-the many free encryption libraries be used instead of these routines. +- +- The DES is a reversible operation which takes a 64-bit block and a +-64-bit key, and produces another 64-bit block. Usually the bits are +-numbered so that the most-significant bit, the first bit, of each block +-is numbered 1. +- +- Under that numbering, every 8th bit of the key (the 8th, 16th, and so +-on) is not used by the encryption algorithm itself. But the key must +-have odd parity; that is, out of bits 1 through 8, and 9 through 16, and +-so on, there must be an odd number of `1' bits, and this completely +-specifies the unused bits. +- +- - Function: void setkey (const char *KEY) +- The `setkey' function sets an internal data structure to be an +- expanded form of KEY. KEY is specified as an array of 64 bits +- each stored in a `char', the first bit is `key[0]' and the 64th +- bit is `key[63]'. The KEY should have the correct parity. +- +- - Function: void encrypt (char *BLOCK, int EDFLAG) +- The `encrypt' function encrypts BLOCK if EDFLAG is 0, otherwise it +- decrypts BLOCK, using a key previously set by `setkey'. The +- result is placed in BLOCK. +- +- Like `setkey', BLOCK is specified as an array of 64 bits each +- stored in a `char', but there are no parity bits in BLOCK. +- +- - Function: void setkey_r (const char *KEY, struct crypt_data * DATA) +- - Function: void encrypt_r (char *BLOCK, int EDFLAG, struct crypt_data +- * DATA) +- These are reentrant versions of `setkey' and `encrypt'. The only +- difference is the extra parameter, which stores the expanded +- version of KEY. Before calling `setkey_r' the first time, +- `data->initialized' must be cleared to zero. +- +- The `setkey_r' and `encrypt_r' functions are GNU extensions. +-`setkey', `encrypt', `setkey_r', and `encrypt_r' are defined in +-`crypt.h'. +- +- - Function: int ecb_crypt (char *KEY, char *BLOCKS, unsigned LEN, +- unsigned MODE) +- The function `ecb_crypt' encrypts or decrypts one or more blocks +- using DES. Each block is encrypted independently. +- +- The BLOCKS and the KEY are stored packed in 8-bit bytes, so that +- the first bit of the key is the most-significant bit of `key[0]' +- and the 63rd bit of the key is stored as the least-significant bit +- of `key[7]'. The KEY should have the correct parity. +- +- LEN is the number of bytes in BLOCKS. It should be a multiple of +- 8 (so that there is a whole number of blocks to encrypt). LEN is +- limited to a maximum of `DES_MAXDATA' bytes. +- +- The result of the encryption replaces the input in BLOCKS. +- +- The MODE parameter is the bitwise OR of two of the following: +- +- `DES_ENCRYPT' +- This constant, used in the MODE parameter, specifies that +- BLOCKS is to be encrypted. +- +- `DES_DECRYPT' +- This constant, used in the MODE parameter, specifies that +- BLOCKS is to be decrypted. +- +- `DES_HW' +- This constant, used in the MODE parameter, asks to use a +- hardware device. If no hardware device is available, +- encryption happens anyway, but in software. +- +- `DES_SW' +- This constant, used in the MODE parameter, specifies that no +- hardware device is to be used. +- +- The result of the function will be one of these values: +- +- `DESERR_NONE' +- The encryption succeeded. +- +- `DESERR_NOHWDEVICE' +- The encryption succeeded, but there was no hardware device +- available. +- +- `DESERR_HWERROR' +- The encryption failed because of a hardware problem. +- +- `DESERR_BADPARAM' +- The encryption failed because of a bad parameter, for +- instance LEN is not a multiple of 8 or LEN is larger than +- `DES_MAXDATA'. +- +- - Function: int DES_FAILED (int ERR) +- This macro returns 1 if ERR is a `success' result code from +- `ecb_crypt' or `cbc_crypt', and 0 otherwise. +- +- - Function: int cbc_crypt (char *KEY, char *BLOCKS, unsigned LEN, +- unsigned MODE, char *IVEC) +- The function `cbc_crypt' encrypts or decrypts one or more blocks +- using DES in Cipher Block Chaining mode. +- +- For encryption in CBC mode, each block is exclusive-ored with IVEC +- before being encrypted, then IVEC is replaced with the result of +- the encryption, then the next block is processed. Decryption is +- the reverse of this process. +- +- This has the advantage that blocks which are the same before being +- encrypted are very unlikely to be the same after being encrypted, +- making it much harder to detect patterns in the data. +- +- Usually, IVEC is set to 8 random bytes before encryption starts. +- Then the 8 random bytes are transmitted along with the encrypted +- data (without themselves being encrypted), and passed back in as +- IVEC for decryption. Another possibility is to set IVEC to 8 +- zeroes initially, and have the first the block encrypted consist +- of 8 random bytes. +- +- Otherwise, all the parameters are similar to those for `ecb_crypt'. +- +- - Function: void des_setparity (char *KEY) +- The function `des_setparity' changes the 64-bit KEY, stored packed +- in 8-bit bytes, to have odd parity by altering the low bits of +- each byte. +- +- The `ecb_crypt', `cbc_crypt', and `des_setparity' functions and +-their accompanying macros are all defined in the header +-`rpc/des_crypt.h'. +- +- +-File: libc.info, Node: Debugging Support, Next: POSIX Threads, Prev: Cryptographic Functions, Up: Top +- +-Debugging support +-***************** +- +- Applications are usually debugged using dedicated debugger programs. +-But sometimes this is not possible and, in any case, it is useful to +-provide the developer with as much information as possible at the time +-the problems are experienced. For this reason a few functions are +-provided which a program can use to help the developer more easily +-locate the problem. +- +-* Menu: +- +-* Backtraces:: Obtaining and printing a back trace of the +- current stack. +- +- +-File: libc.info, Node: Backtraces, Up: Debugging Support +- +-Backtraces +-========== +- +- A "backtrace" is a list of the function calls that are currently +-active in a thread. The usual way to inspect a backtrace of a program +-is to use an external debugger such as gdb. However, sometimes it is +-useful to obtain a backtrace programmatically from within a program, +-e.g., for the purposes of logging or diagnostics. +- +- The header file `execinfo.h' declares three functions that obtain +-and manipulate backtraces of the current thread. +- +- - Function: int backtrace (void **BUFFER, int SIZE) +- The `backtrace' function obtains a backtrace for the current +- thread, as a list of pointers, and places the information into +- BUFFER. The argument SIZE should be the number of `void *' +- elements that will fit into BUFFER. The return value is the +- actual number of entries of BUFFER that are obtained, and is at +- most SIZE. +- +- The pointers placed in BUFFER are actually return addresses +- obtained by inspecting the stack, one return address per stack +- frame. +- +- Note that certain compiler optimizations may interfere with +- obtaining a valid backtrace. Function inlining causes the inlined +- function to not have a stack frame; tail call optimization +- replaces one stack frame with another; frame pointer elimination +- will stop `backtrace' from interpreting the stack contents +- correctly. +- +- - Function: char ** backtrace_symbols (void *const *BUFFER, int SIZE) +- The `backtrace_symbols' function translates the information +- obtained from the `backtrace' function into an array of strings. +- The argument BUFFER should be a pointer to an array of addresses +- obtained via the `backtrace' function, and SIZE is the number of +- entries in that array (the return value of `backtrace'). +- +- The return value is a pointer to an array of strings, which has +- SIZE entries just like the array BUFFER. Each string contains a +- printable representation of the corresponding element of BUFFER. +- It includes the function name (if this can be determined), an +- offset into the function, and the actual return address (in +- hexadecimal). +- +- Currently, the function name and offset only be obtained on +- systems that use the ELF binary format for programs and libraries. +- On other systems, only the hexadecimal return address will be +- present. Also, you may need to pass additional flags to the +- linker to make the function names available to the program. (For +- example, on systems using GNU ld, you must pass (`-rdynamic'.) +- +- The return value of `backtrace_symbols' is a pointer obtained via +- the `malloc' function, and it is the responsibility of the caller +- to `free' that pointer. Note that only the return value need be +- freed, not the individual strings. +- +- The return value is `NULL' if sufficient memory for the strings +- cannot be obtained. +- +- - Function: void backtrace_symbols_fd (void *const *BUFFER, int SIZE, +- int FD) +- The `backtrace_symbols_fd' function performs the same translation +- as the function `backtrace_symbols' function. Instead of returning +- the strings to the caller, it writes the strings to the file +- descriptor FD, one per line. It does not use the `malloc' +- function, and can therefore be used in situations where that +- function might fail. +- +- The following program illustrates the use of these functions. Note +-that the array to contain the return addresses returned by `backtrace' +-is allocated on the stack. Therefore code like this can be used in +-situations where the memory handling via `malloc' does not work anymore +-(in which case the `backtrace_symbols' has to be replaced by a +-`backtrace_symbols_fd' call as well). The number of return addresses +-is normally not very large. Even complicated programs rather seldom +-have a nesting level of more than, say, 50 and with 200 possible +-entries probably all programs should be covered. +- +- #include +- #include +- #include +- +- /* Obtain a backtrace and print it to `stdout'. */ +- void +- print_trace (void) +- { +- void *array[10]; +- size_t size; +- char **strings; +- size_t i; +- +- size = backtrace (array, 10); +- strings = backtrace_symbols (array, size); +- +- printf ("Obtained %zd stack frames.\n", size); +- +- for (i = 0; i < size; i++) +- printf ("%s\n", strings[i]); +- +- free (strings); +- } +- +- /* A dummy function to make the backtrace more interesting. */ +- void +- dummy_function (void) +- { +- print_trace (); +- } +- +- int +- main (void) +- { +- dummy_function (); +- return 0; +- } +- +- +-File: libc.info, Node: POSIX Threads, Next: Language Features, Prev: Debugging Support, Up: Top +- +-POSIX Threads +-************* +- +- This chapter describes the pthreads (POSIX threads) library. This +-library provides support functions for multithreaded programs: thread +-primitives, synchronization objects, and so forth. It also implements +-POSIX 1003.1b semaphores (not to be confused with System V semaphores). +- +- The threads operations (`pthread_*') do not use ERRNO. Instead they +-return an error code directly. The semaphore operations do use ERRNO. +- +-* Menu: +- +-* Basic Thread Operations:: Creating, terminating, and waiting for threads. +-* Thread Attributes:: Tuning thread scheduling. +-* Cancellation:: Stopping a thread before it's done. +-* Cleanup Handlers:: Deallocating resources when a thread is +- canceled. +-* Mutexes:: One way to synchronize threads. +-* Condition Variables:: Another way. +-* POSIX Semaphores:: And a third way. +-* Thread-Specific Data:: Variables with different values in +- different threads. +-* Threads and Signal Handling:: Why you should avoid mixing the two, and +- how to do it if you must. +-* Threads and Fork:: Interactions between threads and the +- `fork' function. +-* Streams and Fork:: Interactions between stdio streams and +- `fork'. +-* Miscellaneous Thread Functions:: A grab bag of utility routines. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-5 glibc-2.3.2-200304020432/manual/libc.info-5 +--- glibc-2.3.2/manual/libc.info-5 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-5 Thu Jan 1 01:00:00 1970 +@@ -1,1081 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Growing Objects, Next: Extra Fast Growing, Prev: Obstack Functions, Up: Obstacks +- +-Growing Objects +-............... +- +- Because memory in obstack chunks is used sequentially, it is +-possible to build up an object step by step, adding one or more bytes +-at a time to the end of the object. With this technique, you do not +-need to know how much data you will put in the object until you come to +-the end of it. We call this the technique of "growing objects". The +-special functions for adding data to the growing object are described +-in this section. +- +- You don't need to do anything special when you start to grow an +-object. Using one of the functions to add data to the object +-automatically starts it. However, it is necessary to say explicitly +-when the object is finished. This is done with the function +-`obstack_finish'. +- +- The actual address of the object thus built up is not known until the +-object is finished. Until then, it always remains possible that you +-will add so much data that the object must be copied into a new chunk. +- +- While the obstack is in use for a growing object, you cannot use it +-for ordinary allocation of another object. If you try to do so, the +-space already added to the growing object will become part of the other +-object. +- +- - Function: void obstack_blank (struct obstack *OBSTACK-PTR, int SIZE) +- The most basic function for adding to a growing object is +- `obstack_blank', which adds space without initializing it. +- +- - Function: void obstack_grow (struct obstack *OBSTACK-PTR, void +- *DATA, int SIZE) +- To add a block of initialized space, use `obstack_grow', which is +- the growing-object analogue of `obstack_copy'. It adds SIZE bytes +- of data to the growing object, copying the contents from DATA. +- +- - Function: void obstack_grow0 (struct obstack *OBSTACK-PTR, void +- *DATA, int SIZE) +- This is the growing-object analogue of `obstack_copy0'. It adds +- SIZE bytes copied from DATA, followed by an additional null +- character. +- +- - Function: void obstack_1grow (struct obstack *OBSTACK-PTR, char C) +- To add one character at a time, use the function `obstack_1grow'. +- It adds a single byte containing C to the growing object. +- +- - Function: void obstack_ptr_grow (struct obstack *OBSTACK-PTR, void +- *DATA) +- Adding the value of a pointer one can use the function +- `obstack_ptr_grow'. It adds `sizeof (void *)' bytes containing +- the value of DATA. +- +- - Function: void obstack_int_grow (struct obstack *OBSTACK-PTR, int +- DATA) +- A single value of type `int' can be added by using the +- `obstack_int_grow' function. It adds `sizeof (int)' bytes to the +- growing object and initializes them with the value of DATA. +- +- - Function: void * obstack_finish (struct obstack *OBSTACK-PTR) +- When you are finished growing the object, use the function +- `obstack_finish' to close it off and return its final address. +- +- Once you have finished the object, the obstack is available for +- ordinary allocation or for growing another object. +- +- This function can return a null pointer under the same conditions +- as `obstack_alloc' (*note Allocation in an Obstack::). +- +- When you build an object by growing it, you will probably need to +-know afterward how long it became. You need not keep track of this as +-you grow the object, because you can find out the length from the +-obstack just before finishing the object with the function +-`obstack_object_size', declared as follows: +- +- - Function: int obstack_object_size (struct obstack *OBSTACK-PTR) +- This function returns the current size of the growing object, in +- bytes. Remember to call this function _before_ finishing the +- object. After it is finished, `obstack_object_size' will return +- zero. +- +- If you have started growing an object and wish to cancel it, you +-should finish it and then free it, like this: +- +- obstack_free (obstack_ptr, obstack_finish (obstack_ptr)); +- +-This has no effect if no object was growing. +- +- You can use `obstack_blank' with a negative size argument to make +-the current object smaller. Just don't try to shrink it beyond zero +-length--there's no telling what will happen if you do that. +- +- +-File: libc.info, Node: Extra Fast Growing, Next: Status of an Obstack, Prev: Growing Objects, Up: Obstacks +- +-Extra Fast Growing Objects +-.......................... +- +- The usual functions for growing objects incur overhead for checking +-whether there is room for the new growth in the current chunk. If you +-are frequently constructing objects in small steps of growth, this +-overhead can be significant. +- +- You can reduce the overhead by using special "fast growth" functions +-that grow the object without checking. In order to have a robust +-program, you must do the checking yourself. If you do this checking in +-the simplest way each time you are about to add data to the object, you +-have not saved anything, because that is what the ordinary growth +-functions do. But if you can arrange to check less often, or check +-more efficiently, then you make the program faster. +- +- The function `obstack_room' returns the amount of room available in +-the current chunk. It is declared as follows: +- +- - Function: int obstack_room (struct obstack *OBSTACK-PTR) +- This returns the number of bytes that can be added safely to the +- current growing object (or to an object about to be started) in +- obstack OBSTACK using the fast growth functions. +- +- While you know there is room, you can use these fast growth functions +-for adding data to a growing object: +- +- - Function: void obstack_1grow_fast (struct obstack *OBSTACK-PTR, char +- C) +- The function `obstack_1grow_fast' adds one byte containing the +- character C to the growing object in obstack OBSTACK-PTR. +- +- - Function: void obstack_ptr_grow_fast (struct obstack *OBSTACK-PTR, +- void *DATA) +- The function `obstack_ptr_grow_fast' adds `sizeof (void *)' bytes +- containing the value of DATA to the growing object in obstack +- OBSTACK-PTR. +- +- - Function: void obstack_int_grow_fast (struct obstack *OBSTACK-PTR, +- int DATA) +- The function `obstack_int_grow_fast' adds `sizeof (int)' bytes +- containing the value of DATA to the growing object in obstack +- OBSTACK-PTR. +- +- - Function: void obstack_blank_fast (struct obstack *OBSTACK-PTR, int +- SIZE) +- The function `obstack_blank_fast' adds SIZE bytes to the growing +- object in obstack OBSTACK-PTR without initializing them. +- +- When you check for space using `obstack_room' and there is not +-enough room for what you want to add, the fast growth functions are not +-safe. In this case, simply use the corresponding ordinary growth +-function instead. Very soon this will copy the object to a new chunk; +-then there will be lots of room available again. +- +- So, each time you use an ordinary growth function, check afterward +-for sufficient space using `obstack_room'. Once the object is copied +-to a new chunk, there will be plenty of space again, so the program will +-start using the fast growth functions again. +- +- Here is an example: +- +- void +- add_string (struct obstack *obstack, const char *ptr, int len) +- { +- while (len > 0) +- { +- int room = obstack_room (obstack); +- if (room == 0) +- { +- /* Not enough room. Add one character slowly, +- which may copy to a new chunk and make room. */ +- obstack_1grow (obstack, *ptr++); +- len--; +- } +- else +- { +- if (room > len) +- room = len; +- /* Add fast as much as we have room for. */ +- len -= room; +- while (room-- > 0) +- obstack_1grow_fast (obstack, *ptr++); +- } +- } +- } +- +- +-File: libc.info, Node: Status of an Obstack, Next: Obstacks Data Alignment, Prev: Extra Fast Growing, Up: Obstacks +- +-Status of an Obstack +-.................... +- +- Here are functions that provide information on the current status of +-allocation in an obstack. You can use them to learn about an object +-while still growing it. +- +- - Function: void * obstack_base (struct obstack *OBSTACK-PTR) +- This function returns the tentative address of the beginning of the +- currently growing object in OBSTACK-PTR. If you finish the object +- immediately, it will have that address. If you make it larger +- first, it may outgrow the current chunk--then its address will +- change! +- +- If no object is growing, this value says where the next object you +- allocate will start (once again assuming it fits in the current +- chunk). +- +- - Function: void * obstack_next_free (struct obstack *OBSTACK-PTR) +- This function returns the address of the first free byte in the +- current chunk of obstack OBSTACK-PTR. This is the end of the +- currently growing object. If no object is growing, +- `obstack_next_free' returns the same value as `obstack_base'. +- +- - Function: int obstack_object_size (struct obstack *OBSTACK-PTR) +- This function returns the size in bytes of the currently growing +- object. This is equivalent to +- +- obstack_next_free (OBSTACK-PTR) - obstack_base (OBSTACK-PTR) +- +- +-File: libc.info, Node: Obstacks Data Alignment, Next: Obstack Chunks, Prev: Status of an Obstack, Up: Obstacks +- +-Alignment of Data in Obstacks +-............................. +- +- Each obstack has an "alignment boundary"; each object allocated in +-the obstack automatically starts on an address that is a multiple of the +-specified boundary. By default, this boundary is 4 bytes. +- +- To access an obstack's alignment boundary, use the macro +-`obstack_alignment_mask', whose function prototype looks like this: +- +- - Macro: int obstack_alignment_mask (struct obstack *OBSTACK-PTR) +- The value is a bit mask; a bit that is 1 indicates that the +- corresponding bit in the address of an object should be 0. The +- mask value should be one less than a power of 2; the effect is +- that all object addresses are multiples of that power of 2. The +- default value of the mask is 3, so that addresses are multiples of +- 4. A mask value of 0 means an object can start on any multiple of +- 1 (that is, no alignment is required). +- +- The expansion of the macro `obstack_alignment_mask' is an lvalue, +- so you can alter the mask by assignment. For example, this +- statement: +- +- obstack_alignment_mask (obstack_ptr) = 0; +- +- has the effect of turning off alignment processing in the +- specified obstack. +- +- Note that a change in alignment mask does not take effect until +-_after_ the next time an object is allocated or finished in the +-obstack. If you are not growing an object, you can make the new +-alignment mask take effect immediately by calling `obstack_finish'. +-This will finish a zero-length object and then do proper alignment for +-the next object. +- +- +-File: libc.info, Node: Obstack Chunks, Next: Summary of Obstacks, Prev: Obstacks Data Alignment, Up: Obstacks +- +-Obstack Chunks +-.............. +- +- Obstacks work by allocating space for themselves in large chunks, and +-then parceling out space in the chunks to satisfy your requests. Chunks +-are normally 4096 bytes long unless you specify a different chunk size. +-The chunk size includes 8 bytes of overhead that are not actually used +-for storing objects. Regardless of the specified size, longer chunks +-will be allocated when necessary for long objects. +- +- The obstack library allocates chunks by calling the function +-`obstack_chunk_alloc', which you must define. When a chunk is no +-longer needed because you have freed all the objects in it, the obstack +-library frees the chunk by calling `obstack_chunk_free', which you must +-also define. +- +- These two must be defined (as macros) or declared (as functions) in +-each source file that uses `obstack_init' (*note Creating Obstacks::). +-Most often they are defined as macros like this: +- +- #define obstack_chunk_alloc malloc +- #define obstack_chunk_free free +- +- Note that these are simple macros (no arguments). Macro definitions +-with arguments will not work! It is necessary that +-`obstack_chunk_alloc' or `obstack_chunk_free', alone, expand into a +-function name if it is not itself a function name. +- +- If you allocate chunks with `malloc', the chunk size should be a +-power of 2. The default chunk size, 4096, was chosen because it is long +-enough to satisfy many typical requests on the obstack yet short enough +-not to waste too much memory in the portion of the last chunk not yet +-used. +- +- - Macro: int obstack_chunk_size (struct obstack *OBSTACK-PTR) +- This returns the chunk size of the given obstack. +- +- Since this macro expands to an lvalue, you can specify a new chunk +-size by assigning it a new value. Doing so does not affect the chunks +-already allocated, but will change the size of chunks allocated for +-that particular obstack in the future. It is unlikely to be useful to +-make the chunk size smaller, but making it larger might improve +-efficiency if you are allocating many objects whose size is comparable +-to the chunk size. Here is how to do so cleanly: +- +- if (obstack_chunk_size (obstack_ptr) < NEW-CHUNK-SIZE) +- obstack_chunk_size (obstack_ptr) = NEW-CHUNK-SIZE; +- +- +-File: libc.info, Node: Summary of Obstacks, Prev: Obstack Chunks, Up: Obstacks +- +-Summary of Obstack Functions +-............................ +- +- Here is a summary of all the functions associated with obstacks. +-Each takes the address of an obstack (`struct obstack *') as its first +-argument. +- +-`void obstack_init (struct obstack *OBSTACK-PTR)' +- Initialize use of an obstack. *Note Creating Obstacks::. +- +-`void *obstack_alloc (struct obstack *OBSTACK-PTR, int SIZE)' +- Allocate an object of SIZE uninitialized bytes. *Note Allocation +- in an Obstack::. +- +-`void *obstack_copy (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)' +- Allocate an object of SIZE bytes, with contents copied from +- ADDRESS. *Note Allocation in an Obstack::. +- +-`void *obstack_copy0 (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)' +- Allocate an object of SIZE+1 bytes, with SIZE of them copied from +- ADDRESS, followed by a null character at the end. *Note +- Allocation in an Obstack::. +- +-`void obstack_free (struct obstack *OBSTACK-PTR, void *OBJECT)' +- Free OBJECT (and everything allocated in the specified obstack +- more recently than OBJECT). *Note Freeing Obstack Objects::. +- +-`void obstack_blank (struct obstack *OBSTACK-PTR, int SIZE)' +- Add SIZE uninitialized bytes to a growing object. *Note Growing +- Objects::. +- +-`void obstack_grow (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)' +- Add SIZE bytes, copied from ADDRESS, to a growing object. *Note +- Growing Objects::. +- +-`void obstack_grow0 (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)' +- Add SIZE bytes, copied from ADDRESS, to a growing object, and then +- add another byte containing a null character. *Note Growing +- Objects::. +- +-`void obstack_1grow (struct obstack *OBSTACK-PTR, char DATA-CHAR)' +- Add one byte containing DATA-CHAR to a growing object. *Note +- Growing Objects::. +- +-`void *obstack_finish (struct obstack *OBSTACK-PTR)' +- Finalize the object that is growing and return its permanent +- address. *Note Growing Objects::. +- +-`int obstack_object_size (struct obstack *OBSTACK-PTR)' +- Get the current size of the currently growing object. *Note +- Growing Objects::. +- +-`void obstack_blank_fast (struct obstack *OBSTACK-PTR, int SIZE)' +- Add SIZE uninitialized bytes to a growing object without checking +- that there is enough room. *Note Extra Fast Growing::. +- +-`void obstack_1grow_fast (struct obstack *OBSTACK-PTR, char DATA-CHAR)' +- Add one byte containing DATA-CHAR to a growing object without +- checking that there is enough room. *Note Extra Fast Growing::. +- +-`int obstack_room (struct obstack *OBSTACK-PTR)' +- Get the amount of room now available for growing the current +- object. *Note Extra Fast Growing::. +- +-`int obstack_alignment_mask (struct obstack *OBSTACK-PTR)' +- The mask used for aligning the beginning of an object. This is an +- lvalue. *Note Obstacks Data Alignment::. +- +-`int obstack_chunk_size (struct obstack *OBSTACK-PTR)' +- The size for allocating chunks. This is an lvalue. *Note Obstack +- Chunks::. +- +-`void *obstack_base (struct obstack *OBSTACK-PTR)' +- Tentative starting address of the currently growing object. *Note +- Status of an Obstack::. +- +-`void *obstack_next_free (struct obstack *OBSTACK-PTR)' +- Address just after the end of the currently growing object. *Note +- Status of an Obstack::. +- +- +-File: libc.info, Node: Variable Size Automatic, Prev: Obstacks, Up: Memory Allocation +- +-Automatic Storage with Variable Size +------------------------------------- +- +- The function `alloca' supports a kind of half-dynamic allocation in +-which blocks are allocated dynamically but freed automatically. +- +- Allocating a block with `alloca' is an explicit action; you can +-allocate as many blocks as you wish, and compute the size at run time. +-But all the blocks are freed when you exit the function that `alloca' +-was called from, just as if they were automatic variables declared in +-that function. There is no way to free the space explicitly. +- +- The prototype for `alloca' is in `stdlib.h'. This function is a BSD +-extension. +- +- - Function: void * alloca (size_t SIZE); +- The return value of `alloca' is the address of a block of SIZE +- bytes of memory, allocated in the stack frame of the calling +- function. +- +- Do not use `alloca' inside the arguments of a function call--you +-will get unpredictable results, because the stack space for the +-`alloca' would appear on the stack in the middle of the space for the +-function arguments. An example of what to avoid is `foo (x, alloca +-(4), y)'. +- +-* Menu: +- +-* Alloca Example:: Example of using `alloca'. +-* Advantages of Alloca:: Reasons to use `alloca'. +-* Disadvantages of Alloca:: Reasons to avoid `alloca'. +-* GNU C Variable-Size Arrays:: Only in GNU C, here is an alternative +- method of allocating dynamically and +- freeing automatically. +- +- +-File: libc.info, Node: Alloca Example, Next: Advantages of Alloca, Up: Variable Size Automatic +- +-`alloca' Example +-................ +- +- As an example of the use of `alloca', here is a function that opens +-a file name made from concatenating two argument strings, and returns a +-file descriptor or minus one signifying failure: +- +- int +- open2 (char *str1, char *str2, int flags, int mode) +- { +- char *name = (char *) alloca (strlen (str1) + strlen (str2) + 1); +- stpcpy (stpcpy (name, str1), str2); +- return open (name, flags, mode); +- } +- +-Here is how you would get the same results with `malloc' and `free': +- +- int +- open2 (char *str1, char *str2, int flags, int mode) +- { +- char *name = (char *) malloc (strlen (str1) + strlen (str2) + 1); +- int desc; +- if (name == 0) +- fatal ("virtual memory exceeded"); +- stpcpy (stpcpy (name, str1), str2); +- desc = open (name, flags, mode); +- free (name); +- return desc; +- } +- +- As you can see, it is simpler with `alloca'. But `alloca' has +-other, more important advantages, and some disadvantages. +- +- +-File: libc.info, Node: Advantages of Alloca, Next: Disadvantages of Alloca, Prev: Alloca Example, Up: Variable Size Automatic +- +-Advantages of `alloca' +-...................... +- +- Here are the reasons why `alloca' may be preferable to `malloc': +- +- * Using `alloca' wastes very little space and is very fast. (It is +- open-coded by the GNU C compiler.) +- +- * Since `alloca' does not have separate pools for different sizes of +- block, space used for any size block can be reused for any other +- size. `alloca' does not cause memory fragmentation. +- +- * Nonlocal exits done with `longjmp' (*note Non-Local Exits::) +- automatically free the space allocated with `alloca' when they exit +- through the function that called `alloca'. This is the most +- important reason to use `alloca'. +- +- To illustrate this, suppose you have a function +- `open_or_report_error' which returns a descriptor, like `open', if +- it succeeds, but does not return to its caller if it fails. If +- the file cannot be opened, it prints an error message and jumps +- out to the command level of your program using `longjmp'. Let's +- change `open2' (*note Alloca Example::) to use this subroutine: +- +- int +- open2 (char *str1, char *str2, int flags, int mode) +- { +- char *name = (char *) alloca (strlen (str1) + strlen (str2) + 1); +- stpcpy (stpcpy (name, str1), str2); +- return open_or_report_error (name, flags, mode); +- } +- +- Because of the way `alloca' works, the memory it allocates is +- freed even when an error occurs, with no special effort required. +- +- By contrast, the previous definition of `open2' (which uses +- `malloc' and `free') would develop a memory leak if it were +- changed in this way. Even if you are willing to make more changes +- to fix it, there is no easy way to do so. +- +- +-File: libc.info, Node: Disadvantages of Alloca, Next: GNU C Variable-Size Arrays, Prev: Advantages of Alloca, Up: Variable Size Automatic +- +-Disadvantages of `alloca' +-......................... +- +- These are the disadvantages of `alloca' in comparison with `malloc': +- +- * If you try to allocate more memory than the machine can provide, +- you don't get a clean error message. Instead you get a fatal +- signal like the one you would get from an infinite recursion; +- probably a segmentation violation (*note Program Error Signals::). +- +- * Some non-GNU systems fail to support `alloca', so it is less +- portable. However, a slower emulation of `alloca' written in C is +- available for use on systems with this deficiency. +- +- +-File: libc.info, Node: GNU C Variable-Size Arrays, Prev: Disadvantages of Alloca, Up: Variable Size Automatic +- +-GNU C Variable-Size Arrays +-.......................... +- +- In GNU C, you can replace most uses of `alloca' with an array of +-variable size. Here is how `open2' would look then: +- +- int open2 (char *str1, char *str2, int flags, int mode) +- { +- char name[strlen (str1) + strlen (str2) + 1]; +- stpcpy (stpcpy (name, str1), str2); +- return open (name, flags, mode); +- } +- +- But `alloca' is not always equivalent to a variable-sized array, for +-several reasons: +- +- * A variable size array's space is freed at the end of the scope of +- the name of the array. The space allocated with `alloca' remains +- until the end of the function. +- +- * It is possible to use `alloca' within a loop, allocating an +- additional block on each iteration. This is impossible with +- variable-sized arrays. +- +- *Note:* If you mix use of `alloca' and variable-sized arrays within +-one function, exiting a scope in which a variable-sized array was +-declared frees all blocks allocated with `alloca' during the execution +-of that scope. +- +- +-File: libc.info, Node: Resizing the Data Segment, Prev: Locking Pages, Up: Memory +- +-Resizing the Data Segment +-========================= +- +- The symbols in this section are declared in `unistd.h'. +- +- You will not normally use the functions in this section, because the +-functions described in *Note Memory Allocation:: are easier to use. +-Those are interfaces to a GNU C Library memory allocator that uses the +-functions below itself. The functions below are simple interfaces to +-system calls. +- +- - Function: int brk (void *ADDR) +- `brk' sets the high end of the calling process' data segment to +- ADDR. +- +- The address of the end of a segment is defined to be the address +- of the last byte in the segment plus 1. +- +- The function has no effect if ADDR is lower than the low end of +- the data segment. (This is considered success, by the way). +- +- The function fails if it would cause the data segment to overlap +- another segment or exceed the process' data storage limit (*note +- Limits on Resources::). +- +- The function is named for a common historical case where data +- storage and the stack are in the same segment. Data storage +- allocation grows upward from the bottom of the segment while the +- stack grows downward toward it from the top of the segment and the +- curtain between them is called the "break". +- +- The return value is zero on success. On failure, the return value +- is `-1' and `errno' is set accordingly. The following `errno' +- values are specific to this function: +- +- `ENOMEM' +- The request would cause the data segment to overlap another +- segment or exceed the process' data storage limit. +- +- +- - Function: int sbrk (ptrdiff_t DELTA) +- This function is the same as `brk' except that you specify the new +- end of the data segment as an offset DELTA from the current end +- and on success the return value is the address of the resulting +- end of the data segment instead of zero. +- +- This means you can use `sbrk(0)' to find out what the current end +- of the data segment is. +- +- +- +-File: libc.info, Node: Locking Pages, Next: Resizing the Data Segment, Prev: Memory Allocation, Up: Memory +- +-Locking Pages +-============= +- +- 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 +-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 +-"locking" a page. +- +- The functions in this chapter lock and unlock the calling process' +-pages. +- +-* Menu: +- +-* Why Lock Pages:: Reasons to read this section. +-* Locked Memory Details:: Everything you need to know locked +- memory +-* Page Lock Functions:: Here's how to do it. +- +- +-File: libc.info, Node: Why Lock Pages, Next: Locked Memory Details, Up: Locking Pages +- +-Why Lock Pages +--------------- +- +- Because page faults cause paged out pages to be paged in +-transparently, a process rarely needs to be concerned about locking +-pages. However, there are two reasons people sometimes are: +- +- * Speed. A page fault is transparent only insofar as the process is +- not sensitive to how long it takes to do a simple memory access. +- Time-critical processes, especially realtime processes, may not be +- able to wait or may not be able to tolerate variance in execution +- speed. +- +- A process that needs to lock pages for this reason probably also +- needs priority among other processes for use of the CPU. *Note +- Priority::. +- +- In some cases, the programmer knows better than the system's demand +- paging allocator which pages should remain in real memory to +- optimize system performance. In this case, locking pages can help. +- +- * Privacy. If you keep secrets in virtual memory and that virtual +- memory gets paged out, that increases the chance that the secrets +- will get out. If a password gets written out to disk swap space, +- for example, it might still be there long after virtual and real +- memory have been wiped clean. +- +- +- Be aware that when you lock a page, that's one fewer page frame that +-can be used to back other virtual memory (by the same or other +-processes), which can mean more page faults, which means the system +-runs more slowly. In fact, if you lock enough memory, some programs +-may not be able to run at all for lack of real memory. +- +- +-File: libc.info, Node: Locked Memory Details, Next: Page Lock Functions, Prev: Why Lock Pages, Up: Locking Pages +- +-Locked Memory Details +---------------------- +- +- 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 so that it has to be unlocked twice before it is truly unlocked. +-It is either locked or it isn't. +- +- A memory lock persists until the process that owns the memory +-explicitly unlocks it. (But process termination and exec cause the +-virtual memory to cease to exist, which you might say means it isn't +-locked any more). +- +- Memory locks are not inherited by child processes. (But note that +-on a modern Unix system, immediately after a fork, the parent's and the +-child's virtual address space are backed by the same real page frames, +-so the child enjoys the parent's locks). *Note Creating a Process::. +- +- Because of its ability to impact other processes, only the superuser +-can lock a page. Any process can unlock its own page. +- +- The system sets limits on the amount of memory a process can have +-locked and the amount of real memory it can have dedicated to it. +-*Note Limits on Resources::. +- +- In Linux, locked pages aren't as locked as you might think. Two +-virtual pages that are not shared memory can nonetheless be backed by +-the same real frame. The kernel does this in the name of efficiency +-when it knows both virtual pages contain identical data, and does it +-even if one or both of the virtual pages are locked. +- +- But when a process modifies one of those pages, the kernel must get +-it a separate frame and fill it with the page's data. This is known as +-a "copy-on-write page fault". It takes a small amount of time and in a +-pathological case, getting that frame may require I/O. +- +- To make sure this doesn't happen to your program, don't just lock the +-pages. Write to them as well, unless you know you won't write to them +-ever. And to make sure you have pre-allocated frames for your stack, +-enter a scope that declares a C automatic variable larger than the +-maximum stack size you will need, set it to something, then return from +-its scope. +- +- +-File: libc.info, Node: Page Lock Functions, Prev: Locked Memory Details, Up: Locking Pages +- +-Functions To Lock And Unlock Pages +----------------------------------- +- +- The symbols in this section are declared in `sys/mman.h'. These +-functions are defined by POSIX.1b, but their availability depends on +-your kernel. If your kernel doesn't allow these functions, they exist +-but always fail. They _are_ available with a Linux kernel. +- +- *Portability Note:* POSIX.1b requires that when the `mlock' and +-`munlock' functions are available, the file `unistd.h' define the macro +-`_POSIX_MEMLOCK_RANGE' and the file `limits.h' define the macro +-`PAGESIZE' to be the size of a memory page in bytes. It requires that +-when the `mlockall' and `munlockall' functions are available, the +-`unistd.h' file define the macro `_POSIX_MEMLOCK'. The GNU C library +-conforms to this requirement. +- +- - Function: int mlock (const void *ADDR, size_t LEN) +- `mlock' locks a range of the calling process' virtual pages. +- +- The range of memory starts at address ADDR and is LEN bytes long. +- Actually, since you must lock whole pages, it is the range of +- pages that include any part of the specified range. +- +- When the function returns successfully, each of those pages is +- backed by (connected to) a real frame (is resident) and is marked +- to stay that way. This means the function may cause page-ins and +- have to wait for them. +- +- When the function fails, it does not affect the lock status of any +- pages. +- +- The return value is zero if the function succeeds. Otherwise, it +- is `-1' and `errno' is set accordingly. `errno' values specific +- to this function are: +- +- `ENOMEM' +- * At least some of the specified address range does not +- exist in the calling process' virtual address space. +- +- * The locking would cause the process to exceed its locked +- page limit. +- +- `EPERM' +- The calling process is not superuser. +- +- `EINVAL' +- LEN is not positive. +- +- `ENOSYS' +- The kernel does not provide `mlock' capability. +- +- You can lock _all_ a process' memory with `mlockall'. You unlock +- memory with `munlock' or `munlockall'. +- +- To avoid all page faults in a C program, you have to use +- `mlockall', because some of the memory a program uses is hidden +- from the C code, e.g. the stack and automatic variables, and you +- wouldn't know what address to tell `mlock'. +- +- +- - Function: int munlock (const void *ADDR, size_t LEN) +- `mlock' unlocks a range of the calling process' virtual pages. +- +- `munlock' is the inverse of `mlock' and functions completely +- analogously to `mlock', except that there is no `EPERM' failure. +- +- +- - Function: int mlockall (int FLAGS) +- `mlockall' locks all the pages in a process' virtual memory address +- space, and/or any that are added to it in the future. This +- includes the pages of the code, data and stack segment, as well as +- shared libraries, user space kernel data, shared memory, and +- memory mapped files. +- +- FLAGS is a string of single bit flags represented by the following +- macros. They tell `mlockall' which of its functions you want. All +- other bits must be zero. +- +- `MCL_CURRENT' +- Lock all pages which currently exist in the calling process' +- virtual address space. +- +- `MCL_FUTURE' +- Set a mode such that any pages added to the process' virtual +- address space in the future will be locked from birth. This +- mode does not affect future address spaces owned by the same +- process so exec, which replaces a process' address space, +- wipes out `MCL_FUTURE'. *Note Executing a File::. +- +- When the function returns successfully, and you specified +- `MCL_CURRENT', all of the process' pages are backed by (connected +- to) real frames (they are resident) and are marked to stay that +- way. This means the function may cause page-ins and have to wait +- for them. +- +- When the process is in `MCL_FUTURE' mode because it successfully +- executed this function and specified `MCL_CURRENT', any system call +- by the process that requires space be added to its virtual address +- space fails with `errno' = `ENOMEM' if locking the additional space +- would cause the process to exceed its locked page limit. In the +- case that the address space addition that can't be accommodated is +- stack expansion, the stack expansion fails and the kernel sends a +- `SIGSEGV' signal to the process. +- +- When the function fails, it does not affect the lock status of any +- pages or the future locking mode. +- +- The return value is zero if the function succeeds. Otherwise, it +- is `-1' and `errno' is set accordingly. `errno' values specific +- to this function are: +- +- `ENOMEM' +- * At least some of the specified address range does not +- exist in the calling process' virtual address space. +- +- * The locking would cause the process to exceed its locked +- page limit. +- +- `EPERM' +- The calling process is not superuser. +- +- `EINVAL' +- Undefined bits in FLAGS are not zero. +- +- `ENOSYS' +- The kernel does not provide `mlockall' capability. +- +- You can lock just specific pages with `mlock'. You unlock pages +- with `munlockall' and `munlock'. +- +- +- - Function: int munlockall (void) +- `munlockall' unlocks every page in the calling process' virtual +- address space and turn off `MCL_FUTURE' future locking mode. +- +- The return value is zero if the function succeeds. Otherwise, it +- is `-1' and `errno' is set accordingly. The only way this +- function can fail is for generic reasons that all functions and +- system calls can fail, so there are no specific `errno' values. +- +- +- +-File: libc.info, Node: Character Handling, Next: String and Array Utilities, Prev: Memory, Up: Top +- +-Character Handling +-****************** +- +- Programs that work with characters and strings often need to +-classify a character--is it alphabetic, is it a digit, is it +-whitespace, and so on--and perform case conversion operations on +-characters. The functions in the header file `ctype.h' are provided +-for this purpose. +- +- Since the choice of locale and character set can alter the +-classifications of particular character codes, all of these functions +-are affected by the current locale. (More precisely, they are affected +-by the locale currently selected for character classification--the +-`LC_CTYPE' category; see *Note Locale Categories::.) +- +- The ISO C standard specifies two different sets of functions. The +-one set works on `char' type characters, the other one on `wchar_t' +-wide characters (*note Extended Char Intro::). +- +-* Menu: +- +-* Classification of Characters:: Testing whether characters are +- letters, digits, punctuation, etc. +- +-* Case Conversion:: Case mapping, and the like. +-* Classification of Wide Characters:: Character class determination for +- wide characters. +-* Using Wide Char Classes:: Notes on using the wide character +- classes. +-* Wide Character Case Conversion:: Mapping of wide characters. +- +- +-File: libc.info, Node: Classification of Characters, Next: Case Conversion, Up: Character Handling +- +-Classification of Characters +-============================ +- +- This section explains the library functions for classifying +-characters. For example, `isalpha' is the function to test for an +-alphabetic character. It takes one argument, the character to test, +-and returns a nonzero integer if the character is alphabetic, and zero +-otherwise. You would use it like this: +- +- if (isalpha (c)) +- printf ("The character `%c' is alphabetic.\n", c); +- +- Each of the functions in this section tests for membership in a +-particular class of characters; each has a name starting with `is'. +-Each of them takes one argument, which is a character to test, and +-returns an `int' which is treated as a boolean value. The character +-argument is passed as an `int', and it may be the constant value `EOF' +-instead of a real character. +- +- The attributes of any given character can vary between locales. +-*Note Locales::, for more information on locales. +- +- These functions are declared in the header file `ctype.h'. +- +- - Function: int islower (int C) +- Returns true if C is a lower-case letter. The letter need not be +- from the Latin alphabet, any alphabet representable is valid. +- +- - Function: int isupper (int C) +- Returns true if C is an upper-case letter. The letter need not be +- from the Latin alphabet, any alphabet representable is valid. +- +- - Function: int isalpha (int C) +- Returns true if C is an alphabetic character (a letter). If +- `islower' or `isupper' is true of a character, then `isalpha' is +- also true. +- +- In some locales, there may be additional characters for which +- `isalpha' is true--letters which are neither upper case nor lower +- case. But in the standard `"C"' locale, there are no such +- additional characters. +- +- - Function: int isdigit (int C) +- Returns true if C is a decimal digit (`0' through `9'). +- +- - Function: int isalnum (int C) +- Returns true if C is an alphanumeric character (a letter or +- number); in other words, if either `isalpha' or `isdigit' is true +- of a character, then `isalnum' is also true. +- +- - Function: int isxdigit (int C) +- Returns true if C is a hexadecimal digit. Hexadecimal digits +- include the normal decimal digits `0' through `9' and the letters +- `A' through `F' and `a' through `f'. +- +- - Function: int ispunct (int C) +- Returns true if C is a punctuation character. This means any +- printing character that is not alphanumeric or a space character. +- +- - Function: int isspace (int C) +- Returns true if C is a "whitespace" character. In the standard +- `"C"' locale, `isspace' returns true for only the standard +- whitespace characters: +- +- `' '' +- space +- +- `'\f'' +- formfeed +- +- `'\n'' +- newline +- +- `'\r'' +- carriage return +- +- `'\t'' +- horizontal tab +- +- `'\v'' +- vertical tab +- +- - Function: int isblank (int C) +- Returns true if C is a blank character; that is, a space or a tab. +- This function is a GNU extension. +- +- - Function: int isgraph (int C) +- Returns true if C is a graphic character; that is, a character +- that has a glyph associated with it. The whitespace characters +- are not considered graphic. +- +- - Function: int isprint (int C) +- Returns true if C is a printing character. Printing characters +- include all the graphic characters, plus the space (` ') character. +- +- - Function: int iscntrl (int C) +- Returns true if C is a control character (that is, a character that +- is not a printing character). +- +- - Function: int isascii (int C) +- Returns true if C is a 7-bit `unsigned char' value that fits into +- the US/UK ASCII character set. This function is a BSD extension +- and is also an SVID extension. +- +- +-File: libc.info, Node: Case Conversion, Next: Classification of Wide Characters, Prev: Classification of Characters, Up: Character Handling +- +-Case Conversion +-=============== +- +- This section explains the library functions for performing +-conversions such as case mappings on characters. For example, `toupper' +-converts any character to upper case if possible. If the character +-can't be converted, `toupper' returns it unchanged. +- +- These functions take one argument of type `int', which is the +-character to convert, and return the converted character as an `int'. +-If the conversion is not applicable to the argument given, the argument +-is returned unchanged. +- +- *Compatibility Note:* In pre-ISO C dialects, instead of returning +-the argument unchanged, these functions may fail when the argument is +-not suitable for the conversion. Thus for portability, you may need to +-write `islower(c) ? toupper(c) : c' rather than just `toupper(c)'. +- +- These functions are declared in the header file `ctype.h'. +- +- - Function: int tolower (int C) +- If C is an upper-case letter, `tolower' returns the corresponding +- lower-case letter. If C is not an upper-case letter, C is +- returned unchanged. +- +- - Function: int toupper (int C) +- If C is a lower-case letter, `toupper' returns the corresponding +- upper-case letter. Otherwise C is returned unchanged. +- +- - Function: int toascii (int C) +- This function converts C to a 7-bit `unsigned char' value that +- fits into the US/UK ASCII character set, by clearing the high-order +- bits. This function is a BSD extension and is also an SVID +- extension. +- +- - Function: int _tolower (int C) +- This is identical to `tolower', and is provided for compatibility +- with the SVID. *Note SVID::. +- +- - Function: int _toupper (int C) +- This is identical to `toupper', and is provided for compatibility +- with the SVID. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-50 glibc-2.3.2-200304020432/manual/libc.info-50 +--- glibc-2.3.2/manual/libc.info-50 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-50 Thu Jan 1 01:00:00 1970 +@@ -1,1150 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Basic Thread Operations, Next: Thread Attributes, Up: POSIX Threads +- +-Basic Thread Operations +-======================= +- +- These functions are the thread equivalents of `fork', `exit', and +-`wait'. +- +- - Function: int pthread_create (pthread_t * THREAD, pthread_attr_t * +- ATTR, void * (*START_ROUTINE)(void *), void * ARG) +- `pthread_create' creates a new thread of control that executes +- concurrently with the calling thread. The new thread calls the +- function START_ROUTINE, passing it ARG as first argument. The new +- thread terminates either explicitly, by calling `pthread_exit', or +- implicitly, by returning from the START_ROUTINE function. The +- latter case is equivalent to calling `pthread_exit' with the result +- returned by START_ROUTINE as exit code. +- +- The ATTR argument specifies thread attributes to be applied to the +- new thread. *Note Thread Attributes::, for details. The ATTR +- argument can also be `NULL', in which case default attributes are +- used: the created thread is joinable (not detached) and has an +- ordinary (not realtime) scheduling policy. +- +- On success, the identifier of the newly created thread is stored +- in the location pointed by the THREAD argument, and a 0 is +- returned. On error, a non-zero error code is returned. +- +- This function may return the following errors: +- `EAGAIN' +- Not enough system resources to create a process for the new +- thread, or more than `PTHREAD_THREADS_MAX' threads are +- already active. +- +- - Function: void pthread_exit (void *RETVAL) +- `pthread_exit' terminates the execution of the calling thread. All +- cleanup handlers (*note Cleanup Handlers::) that have been set for +- the calling thread with `pthread_cleanup_push' are executed in +- reverse order (the most recently pushed handler is executed +- first). Finalization functions for thread-specific data are then +- called for all keys that have non-`NULL' values associated with +- them in the calling thread (*note Thread-Specific Data::). +- Finally, execution of the calling thread is stopped. +- +- The RETVAL argument is the return value of the thread. It can be +- retrieved from another thread using `pthread_join'. +- +- The `pthread_exit' function never returns. +- +- - Function: int pthread_cancel (pthread_t THREAD) +- `pthread_cancel' sends a cancellation request to the thread denoted +- by the THREAD argument. If there is no such thread, +- `pthread_cancel' fails and returns `ESRCH'. Otherwise it returns +- 0. *Note Cancellation::, for details. +- +- - Function: int pthread_join (pthread_t TH, void **thread_RETURN) +- `pthread_join' suspends the execution of the calling thread until +- the thread identified by TH terminates, either by calling +- `pthread_exit' or by being canceled. +- +- If THREAD_RETURN is not `NULL', the return value of TH is stored +- in the location pointed to by THREAD_RETURN. The return value of +- TH is either the argument it gave to `pthread_exit', or +- `PTHREAD_CANCELED' if TH was canceled. +- +- The joined thread `th' must be in the joinable state: it must not +- have been detached using `pthread_detach' or the +- `PTHREAD_CREATE_DETACHED' attribute to `pthread_create'. +- +- When a joinable thread terminates, its memory resources (thread +- descriptor and stack) are not deallocated until another thread +- performs `pthread_join' on it. Therefore, `pthread_join' must be +- called once for each joinable thread created to avoid memory leaks. +- +- At most one thread can wait for the termination of a given thread. +- Calling `pthread_join' on a thread TH on which another thread is +- already waiting for termination returns an error. +- +- `pthread_join' is a cancellation point. If a thread is canceled +- while suspended in `pthread_join', the thread execution resumes +- immediately and the cancellation is executed without waiting for +- the TH thread to terminate. If cancellation occurs during +- `pthread_join', the TH thread remains not joined. +- +- On success, the return value of TH is stored in the location +- pointed to by THREAD_RETURN, and 0 is returned. On error, one of +- the following values is returned: +- `ESRCH' +- No thread could be found corresponding to that specified by +- TH. +- +- `EINVAL' +- The TH thread has been detached, or another thread is already +- waiting on termination of TH. +- +- `EDEADLK' +- The TH argument refers to the calling thread. +- +- +-File: libc.info, Node: Thread Attributes, Next: Cancellation, Prev: Basic Thread Operations, Up: POSIX Threads +- +-Thread Attributes +-================= +- +- Threads have a number of attributes that may be set at creation time. +-This is done by filling a thread attribute object ATTR of type +-`pthread_attr_t', then passing it as second argument to +-`pthread_create'. Passing `NULL' is equivalent to passing a thread +-attribute object with all attributes set to their default values. +- +- Attribute objects are consulted only when creating a new thread. The +-same attribute object can be used for creating several threads. +-Modifying an attribute object after a call to `pthread_create' does not +-change the attributes of the thread previously created. +- +- - Function: int pthread_attr_init (pthread_attr_t *ATTR) +- `pthread_attr_init' initializes the thread attribute object ATTR +- and fills it with default values for the attributes. (The default +- values are listed below for each attribute.) +- +- Each attribute ATTRNAME (see below for a list of all attributes) +- can be individually set using the function +- `pthread_attr_setATTRNAME' and retrieved using the function +- `pthread_attr_getATTRNAME'. +- +- - Function: int pthread_attr_destroy (pthread_attr_t *ATTR) +- `pthread_attr_destroy' destroys the attribute object pointed to by +- ATTR releasing any resources associated with it. ATTR is left in +- an undefined state, and you must not use it again in a call to any +- pthreads function until it has been reinitialized. +- +- - Function: int pthread_attr_setattr (pthread_attr_t *OBJ, int VALUE) +- Set attribute ATTR to VALUE in the attribute object pointed to by +- OBJ. See below for a list of possible attributes and the values +- they can take. +- +- On success, these functions return 0. If VALUE is not meaningful +- for the ATTR being modified, they will return the error code +- `EINVAL'. Some of the functions have other failure modes; see +- below. +- +- - Function: int pthread_attr_getattr (const pthread_attr_t *OBJ, int +- *VALUE) +- Store the current setting of ATTR in OBJ into the variable pointed +- to by VALUE. +- +- These functions always return 0. +- +- The following thread attributes are supported: +-`detachstate' +- Choose whether the thread is created in the joinable state (value +- `PTHREAD_CREATE_JOINABLE') or in the detached state +- (`PTHREAD_CREATE_DETACHED'). The default is +- `PTHREAD_CREATE_JOINABLE'. +- +- In the joinable state, another thread can synchronize on the thread +- termination and recover its termination code using `pthread_join', +- but some of the thread resources are kept allocated after the +- thread terminates, and reclaimed only when another thread performs +- `pthread_join' on that thread. +- +- In the detached state, the thread resources are immediately freed +- when it terminates, but `pthread_join' cannot be used to +- synchronize on the thread termination. +- +- A thread created in the joinable state can later be put in the +- detached thread using `pthread_detach'. +- +-`schedpolicy' +- Select the scheduling policy for the thread: one of `SCHED_OTHER' +- (regular, non-realtime scheduling), `SCHED_RR' (realtime, +- round-robin) or `SCHED_FIFO' (realtime, first-in first-out). The +- default is `SCHED_OTHER'. +- +- The realtime scheduling policies `SCHED_RR' and `SCHED_FIFO' are +- available only to processes with superuser privileges. +- `pthread_attr_setschedparam' will fail and return `ENOTSUP' if you +- try to set a realtime policy when you are unprivileged. +- +- The scheduling policy of a thread can be changed after creation +- with `pthread_setschedparam'. +- +-`schedparam' +- Change the scheduling parameter (the scheduling priority) for the +- thread. The default is 0. +- +- This attribute is not significant if the scheduling policy is +- `SCHED_OTHER'; it only matters for the realtime policies +- `SCHED_RR' and `SCHED_FIFO'. +- +- The scheduling priority of a thread can be changed after creation +- with `pthread_setschedparam'. +- +-`inheritsched' +- Choose whether the scheduling policy and scheduling parameter for +- the newly created thread are determined by the values of the +- SCHEDPOLICY and SCHEDPARAM attributes (value +- `PTHREAD_EXPLICIT_SCHED') or are inherited from the parent thread +- (value `PTHREAD_INHERIT_SCHED'). The default is +- `PTHREAD_EXPLICIT_SCHED'. +- +-`scope' +- Choose the scheduling contention scope for the created thread. The +- default is `PTHREAD_SCOPE_SYSTEM', meaning that the threads contend +- for CPU time with all processes running on the machine. In +- particular, thread priorities are interpreted relative to the +- priorities of all other processes on the machine. The other +- possibility, `PTHREAD_SCOPE_PROCESS', means that scheduling +- contention occurs only between the threads of the running process: +- thread priorities are interpreted relative to the priorities of +- the other threads of the process, regardless of the priorities of +- other processes. +- +- `PTHREAD_SCOPE_PROCESS' is not supported in LinuxThreads. If you +- try to set the scope to this value, `pthread_attr_setscope' will +- fail and return `ENOTSUP'. +- +-`stackaddr' +- Provide an address for an application managed stack. The size of +- the stack must be at least `PTHREAD_STACK_MIN'. +- +-`stacksize' +- Change the size of the stack created for the thread. The value +- defines the minimum stack size, in bytes. +- +- If the value exceeds the system's maximum stack size, or is smaller +- than `PTHREAD_STACK_MIN', `pthread_attr_setstacksize' will fail +- and return `EINVAL'. +- +-`stack' +- Provide both the address and size of an application managed stack +- to use for the new thread. The base of the memory area is +- STACKADDR with the size of the memory area, STACKSIZE, measured in +- bytes. +- +- If the value of STACKSIZE is less than `PTHREAD_STACK_MIN', or +- greater than the system's maximum stack size, or if the value of +- STACKADDR lacks the proper alignment, `pthread_attr_setstack' will +- fail and return `EINVAL'. +- +-`guardsize' +- Change the minimum size in bytes of the guard area for the thread's +- stack. The default size is a single page. If this value is set, +- it will be rounded up to the nearest page size. If the value is +- set to 0, a guard area will not be created for this thread. The +- space allocated for the guard area is used to catch stack +- overflow. Therefore, when allocating large structures on the +- stack, a larger guard area may be required to catch a stack +- overflow. +- +- If the caller is managing their own stacks (if the `stackaddr' +- attribute has been set), then the `guardsize' attribute is ignored. +- +- If the value exceeds the `stacksize', `pthread_atrr_setguardsize' +- will fail and return `EINVAL'. +- +- +-File: libc.info, Node: Cancellation, Next: Cleanup Handlers, Prev: Thread Attributes, Up: POSIX Threads +- +-Cancellation +-============ +- +- Cancellation is the mechanism by which a thread can terminate the +-execution of another thread. More precisely, a thread can send a +-cancellation request to another thread. Depending on its settings, the +-target thread can then either ignore the request, honor it immediately, +-or defer it till it reaches a cancellation point. When threads are +-first created by `pthread_create', they always defer cancellation +-requests. +- +- When a thread eventually honors a cancellation request, it behaves +-as if `pthread_exit(PTHREAD_CANCELED)' was called. All cleanup handlers +-are executed in reverse order, finalization functions for +-thread-specific data are called, and finally the thread stops executing. +-If the canceled thread was joinable, the return value +-`PTHREAD_CANCELED' is provided to whichever thread calls PTHREAD_JOIN +-on it. See `pthread_exit' for more information. +- +- Cancellation points are the points where the thread checks for +-pending cancellation requests and performs them. The POSIX threads +-functions `pthread_join', `pthread_cond_wait', +-`pthread_cond_timedwait', `pthread_testcancel', `sem_wait', and +-`sigwait' are cancellation points. In addition, these system calls are +-cancellation points: +- +-accept open sendmsg +-close pause sendto +-connect read system +-fcntl recv tcdrain +-fsync recvfrom wait +-lseek recvmsg waitpid +-msync send write +-nanosleep +- +-All library functions that call these functions (such as `printf') are +-also cancellation points. +- +- - Function: int pthread_setcancelstate (int STATE, int *OLDSTATE) +- `pthread_setcancelstate' changes the cancellation state for the +- calling thread - that is, whether cancellation requests are +- ignored or not. The STATE argument is the new cancellation state: +- either `PTHREAD_CANCEL_ENABLE' to enable cancellation, or +- `PTHREAD_CANCEL_DISABLE' to disable cancellation (cancellation +- requests are ignored). +- +- If OLDSTATE is not `NULL', the previous cancellation state is +- stored in the location pointed to by OLDSTATE, and can thus be +- restored later by another call to `pthread_setcancelstate'. +- +- If the STATE argument is not `PTHREAD_CANCEL_ENABLE' or +- `PTHREAD_CANCEL_DISABLE', `pthread_setcancelstate' fails and +- returns `EINVAL'. Otherwise it returns 0. +- +- - Function: int pthread_setcanceltype (int TYPE, int *OLDTYPE) +- `pthread_setcanceltype' changes the type of responses to +- cancellation requests for the calling thread: asynchronous +- (immediate) or deferred. The TYPE argument is the new +- cancellation type: either `PTHREAD_CANCEL_ASYNCHRONOUS' to cancel +- the calling thread as soon as the cancellation request is +- received, or `PTHREAD_CANCEL_DEFERRED' to keep the cancellation +- request pending until the next cancellation point. If OLDTYPE is +- not `NULL', the previous cancellation state is stored in the +- location pointed to by OLDTYPE, and can thus be restored later by +- another call to `pthread_setcanceltype'. +- +- If the TYPE argument is not `PTHREAD_CANCEL_DEFERRED' or +- `PTHREAD_CANCEL_ASYNCHRONOUS', `pthread_setcanceltype' fails and +- returns `EINVAL'. Otherwise it returns 0. +- +- - Function: void pthread_testcancel (VOID) +- `pthread_testcancel' does nothing except testing for pending +- cancellation and executing it. Its purpose is to introduce explicit +- checks for cancellation in long sequences of code that do not call +- cancellation point functions otherwise. +- +- +-File: libc.info, Node: Cleanup Handlers, Next: Mutexes, Prev: Cancellation, Up: POSIX Threads +- +-Cleanup Handlers +-================ +- +- Cleanup handlers are functions that get called when a thread +-terminates, either by calling `pthread_exit' or because of +-cancellation. Cleanup handlers are installed and removed following a +-stack-like discipline. +- +- The purpose of cleanup handlers is to free the resources that a +-thread may hold at the time it terminates. In particular, if a thread +-exits or is canceled while it owns a locked mutex, the mutex will +-remain locked forever and prevent other threads from executing +-normally. The best way to avoid this is, just before locking the mutex, +-to install a cleanup handler whose effect is to unlock the mutex. +-Cleanup handlers can be used similarly to free blocks allocated with +-`malloc' or close file descriptors on thread termination. +- +- Here is how to lock a mutex MUT in such a way that it will be +-unlocked if the thread is canceled while MUT is locked: +- +- pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut); +- pthread_mutex_lock(&mut); +- /* do some work */ +- pthread_mutex_unlock(&mut); +- pthread_cleanup_pop(0); +- +- Equivalently, the last two lines can be replaced by +- +- pthread_cleanup_pop(1); +- +- Notice that the code above is safe only in deferred cancellation mode +-(see `pthread_setcanceltype'). In asynchronous cancellation mode, a +-cancellation can occur between `pthread_cleanup_push' and +-`pthread_mutex_lock', or between `pthread_mutex_unlock' and +-`pthread_cleanup_pop', resulting in both cases in the thread trying to +-unlock a mutex not locked by the current thread. This is the main +-reason why asynchronous cancellation is difficult to use. +- +- If the code above must also work in asynchronous cancellation mode, +-then it must switch to deferred mode for locking and unlocking the +-mutex: +- +- pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype); +- pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut); +- pthread_mutex_lock(&mut); +- /* do some work */ +- pthread_cleanup_pop(1); +- pthread_setcanceltype(oldtype, NULL); +- +- The code above can be rewritten in a more compact and efficient way, +-using the non-portable functions `pthread_cleanup_push_defer_np' and +-`pthread_cleanup_pop_restore_np': +- +- pthread_cleanup_push_defer_np(pthread_mutex_unlock, (void *) &mut); +- pthread_mutex_lock(&mut); +- /* do some work */ +- pthread_cleanup_pop_restore_np(1); +- +- - Function: void pthread_cleanup_push (void (*ROUTINE) (void *), void +- *ARG) +- `pthread_cleanup_push' installs the ROUTINE function with argument +- ARG as a cleanup handler. From this point on to the matching +- `pthread_cleanup_pop', the function ROUTINE will be called with +- arguments ARG when the thread terminates, either through +- `pthread_exit' or by cancellation. If several cleanup handlers are +- active at that point, they are called in LIFO order: the most +- recently installed handler is called first. +- +- - Function: void pthread_cleanup_pop (int EXECUTE) +- `pthread_cleanup_pop' removes the most recently installed cleanup +- handler. If the EXECUTE argument is not 0, it also executes the +- handler, by calling the ROUTINE function with arguments ARG. If +- the EXECUTE argument is 0, the handler is only removed but not +- executed. +- +- Matching pairs of `pthread_cleanup_push' and `pthread_cleanup_pop' +-must occur in the same function, at the same level of block nesting. +-Actually, `pthread_cleanup_push' and `pthread_cleanup_pop' are macros, +-and the expansion of `pthread_cleanup_push' introduces an open brace +-`{' with the matching closing brace `}' being introduced by the +-expansion of the matching `pthread_cleanup_pop'. +- +- - Function: void pthread_cleanup_push_defer_np (void (*ROUTINE) (void +- *), void *ARG) +- `pthread_cleanup_push_defer_np' is a non-portable extension that +- combines `pthread_cleanup_push' and `pthread_setcanceltype'. It +- pushes a cleanup handler just as `pthread_cleanup_push' does, but +- also saves the current cancellation type and sets it to deferred +- cancellation. This ensures that the cleanup mechanism is effective +- even if the thread was initially in asynchronous cancellation mode. +- +- - Function: void pthread_cleanup_pop_restore_np (int EXECUTE) +- `pthread_cleanup_pop_restore_np' pops a cleanup handler introduced +- by `pthread_cleanup_push_defer_np', and restores the cancellation +- type to its value at the time `pthread_cleanup_push_defer_np' was +- called. +- +- `pthread_cleanup_push_defer_np' and `pthread_cleanup_pop_restore_np' +-must occur in matching pairs, at the same level of block nesting. +- +- The sequence +- +- pthread_cleanup_push_defer_np(routine, arg); +- ... +- pthread_cleanup_pop_defer_np(execute); +- +-is functionally equivalent to (but more compact and efficient than) +- +- { +- int oldtype; +- pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype); +- pthread_cleanup_push(routine, arg); +- ... +- pthread_cleanup_pop(execute); +- pthread_setcanceltype(oldtype, NULL); +- } +- +- +-File: libc.info, Node: Mutexes, Next: Condition Variables, Prev: Cleanup Handlers, Up: POSIX Threads +- +-Mutexes +-======= +- +- A mutex is a MUTual EXclusion device, and is useful for protecting +-shared data structures from concurrent modifications, and implementing +-critical sections and monitors. +- +- A mutex has two possible states: unlocked (not owned by any thread), +-and locked (owned by one thread). A mutex can never be owned by two +-different threads simultaneously. A thread attempting to lock a mutex +-that is already locked by another thread is suspended until the owning +-thread unlocks the mutex first. +- +- None of the mutex functions is a cancellation point, not even +-`pthread_mutex_lock', in spite of the fact that it can suspend a thread +-for arbitrary durations. This way, the status of mutexes at +-cancellation points is predictable, allowing cancellation handlers to +-unlock precisely those mutexes that need to be unlocked before the +-thread stops executing. Consequently, threads using deferred +-cancellation should never hold a mutex for extended periods of time. +- +- It is not safe to call mutex functions from a signal handler. In +-particular, calling `pthread_mutex_lock' or `pthread_mutex_unlock' from +-a signal handler may deadlock the calling thread. +- +- - Function: int pthread_mutex_init (pthread_mutex_t *MUTEX, const +- pthread_mutexattr_t *MUTEXATTR) +- `pthread_mutex_init' initializes the mutex object pointed to by +- MUTEX according to the mutex attributes specified in MUTEXATTR. +- If MUTEXATTR is `NULL', default attributes are used instead. +- +- The LinuxThreads implementation supports only one mutex attribute, +- the MUTEX TYPE, which is either "fast", "recursive", or "error +- checking". The type of a mutex determines whether it can be locked +- again by a thread that already owns it. The default type is +- "fast". +- +- Variables of type `pthread_mutex_t' can also be initialized +- statically, using the constants `PTHREAD_MUTEX_INITIALIZER' (for +- timed mutexes), `PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP' (for +- recursive mutexes), `PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP' (for +- fast mutexes(, and `PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP' (for +- error checking mutexes). +- +- `pthread_mutex_init' always returns 0. +- +- - Function: int pthread_mutex_lock (pthread_mutex_t *mutex)) +- `pthread_mutex_lock' locks the given mutex. If the mutex is +- currently unlocked, it becomes locked and owned by the calling +- thread, and `pthread_mutex_lock' returns immediately. If the mutex +- is already locked by another thread, `pthread_mutex_lock' suspends +- the calling thread until the mutex is unlocked. +- +- If the mutex is already locked by the calling thread, the behavior +- of `pthread_mutex_lock' depends on the type of the mutex. If the +- mutex is of the "fast" type, the calling thread is suspended. It +- will remain suspended forever, because no other thread can unlock +- the mutex. If the mutex is of the "error checking" type, +- `pthread_mutex_lock' returns immediately with the error code +- `EDEADLK'. If the mutex is of the "recursive" type, +- `pthread_mutex_lock' succeeds and returns immediately, recording +- the number of times the calling thread has locked the mutex. An +- equal number of `pthread_mutex_unlock' operations must be +- performed before the mutex returns to the unlocked state. +- +- - Function: int pthread_mutex_trylock (pthread_mutex_t *MUTEX) +- `pthread_mutex_trylock' behaves identically to +- `pthread_mutex_lock', except that it does not block the calling +- thread if the mutex is already locked by another thread (or by the +- calling thread in the case of a "fast" mutex). Instead, +- `pthread_mutex_trylock' returns immediately with the error code +- `EBUSY'. +- +- - Function: int pthread_mutex_timedlock (pthread_mutex_t *MUTEX, const +- struct timespec *ABSTIME) +- The `pthread_mutex_timedlock' is similar to the +- `pthread_mutex_lock' function but instead of blocking for in +- indefinite time if the mutex is locked by another thread, it +- returns when the time specified in ABSTIME is reached. +- +- This function can only be used on standard ("timed") and "error +- checking" mutexes. It behaves just like `pthread_mutex_lock' for +- all other types. +- +- If the mutex is successfully locked, the function returns zero. +- If the time specified in ABSTIME is reached without the mutex +- being locked, `ETIMEDOUT' is returned. +- +- This function was introduced in the POSIX.1d revision of the POSIX +- standard. +- +- - Function: int pthread_mutex_unlock (pthread_mutex_t *MUTEX) +- `pthread_mutex_unlock' unlocks the given mutex. The mutex is +- assumed to be locked and owned by the calling thread on entrance to +- `pthread_mutex_unlock'. If the mutex is of the "fast" type, +- `pthread_mutex_unlock' always returns it to the unlocked state. If +- it is of the "recursive" type, it decrements the locking count of +- the mutex (number of `pthread_mutex_lock' operations performed on +- it by the calling thread), and only when this count reaches zero +- is the mutex actually unlocked. +- +- On "error checking" mutexes, `pthread_mutex_unlock' actually +- checks at run-time that the mutex is locked on entrance, and that +- it was locked by the same thread that is now calling +- `pthread_mutex_unlock'. If these conditions are not met, +- `pthread_mutex_unlock' returns `EPERM', and the mutex remains +- unchanged. "Fast" and "recursive" mutexes perform no such checks, +- thus allowing a locked mutex to be unlocked by a thread other than +- its owner. This is non-portable behavior and must not be relied +- upon. +- +- - Function: int pthread_mutex_destroy (pthread_mutex_t *MUTEX) +- `pthread_mutex_destroy' destroys a mutex object, freeing the +- resources it might hold. The mutex must be unlocked on entrance. +- In the LinuxThreads implementation, no resources are associated +- with mutex objects, thus `pthread_mutex_destroy' actually does +- nothing except checking that the mutex is unlocked. +- +- If the mutex is locked by some thread, `pthread_mutex_destroy' +- returns `EBUSY'. Otherwise it returns 0. +- +- If any of the above functions (except `pthread_mutex_init') is +-applied to an uninitialized mutex, they will simply return `EINVAL' and +-do nothing. +- +- A shared global variable X can be protected by a mutex as follows: +- +- int x; +- pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; +- +- All accesses and modifications to X should be bracketed by calls to +-`pthread_mutex_lock' and `pthread_mutex_unlock' as follows: +- +- pthread_mutex_lock(&mut); +- /* operate on x */ +- pthread_mutex_unlock(&mut); +- +- Mutex attributes can be specified at mutex creation time, by passing +-a mutex attribute object as second argument to `pthread_mutex_init'. +-Passing `NULL' is equivalent to passing a mutex attribute object with +-all attributes set to their default values. +- +- - Function: int pthread_mutexattr_init (pthread_mutexattr_t *ATTR) +- `pthread_mutexattr_init' initializes the mutex attribute object +- ATTR and fills it with default values for the attributes. +- +- This function always returns 0. +- +- - Function: int pthread_mutexattr_destroy (pthread_mutexattr_t *ATTR) +- `pthread_mutexattr_destroy' destroys a mutex attribute object, +- which must not be reused until it is reinitialized. +- `pthread_mutexattr_destroy' does nothing in the LinuxThreads +- implementation. +- +- This function always returns 0. +- +- LinuxThreads supports only one mutex attribute: the mutex type, +-which is either `PTHREAD_MUTEX_ADAPTIVE_NP' for "fast" mutexes, +-`PTHREAD_MUTEX_RECURSIVE_NP' for "recursive" mutexes, +-`PTHREAD_MUTEX_TIMED_NP' for "timed" mutexes, or +-`PTHREAD_MUTEX_ERRORCHECK_NP' for "error checking" mutexes. As the +-`NP' suffix indicates, this is a non-portable extension to the POSIX +-standard and should not be employed in portable programs. +- +- The mutex type determines what happens if a thread attempts to lock a +-mutex it already owns with `pthread_mutex_lock'. If the mutex is of the +-"fast" type, `pthread_mutex_lock' simply suspends the calling thread +-forever. If the mutex is of the "error checking" type, +-`pthread_mutex_lock' returns immediately with the error code `EDEADLK'. +-If the mutex is of the "recursive" type, the call to +-`pthread_mutex_lock' returns immediately with a success return code. +-The number of times the thread owning the mutex has locked it is +-recorded in the mutex. The owning thread must call +-`pthread_mutex_unlock' the same number of times before the mutex +-returns to the unlocked state. +- +- The default mutex type is "timed", that is, `PTHREAD_MUTEX_TIMED_NP'. +- +- - Function: int pthread_mutexattr_settype (pthread_mutexattr_t *ATTR, +- int TYPE) +- `pthread_mutexattr_settype' sets the mutex type attribute in ATTR +- to the value specified by TYPE. +- +- If TYPE is not `PTHREAD_MUTEX_ADAPTIVE_NP', +- `PTHREAD_MUTEX_RECURSIVE_NP', `PTHREAD_MUTEX_TIMED_NP', or +- `PTHREAD_MUTEX_ERRORCHECK_NP', this function will return `EINVAL' +- and leave ATTR unchanged. +- +- The standard Unix98 identifiers `PTHREAD_MUTEX_DEFAULT', +- `PTHREAD_MUTEX_NORMAL', `PTHREAD_MUTEX_RECURSIVE', and +- `PTHREAD_MUTEX_ERRORCHECK' are also permitted. +- +- +- - Function: int pthread_mutexattr_gettype (const pthread_mutexattr_t +- *ATTR, int *TYPE) +- `pthread_mutexattr_gettype' retrieves the current value of the +- mutex type attribute in ATTR and stores it in the location pointed +- to by TYPE. +- +- This function always returns 0. +- +- +-File: libc.info, Node: Condition Variables, Next: POSIX Semaphores, Prev: Mutexes, Up: POSIX Threads +- +-Condition Variables +-=================== +- +- A condition (short for "condition variable") is a synchronization +-device that allows threads to suspend execution until some predicate on +-shared data is satisfied. The basic operations on conditions are: signal +-the condition (when the predicate becomes true), and wait for the +-condition, suspending the thread execution until another thread signals +-the condition. +- +- A condition variable must always be associated with a mutex, to avoid +-the race condition where a thread prepares to wait on a condition +-variable and another thread signals the condition just before the first +-thread actually waits on it. +- +- - Function: int pthread_cond_init (pthread_cond_t *COND, +- pthread_condattr_t *cond_ATTR) +- `pthread_cond_init' initializes the condition variable COND, using +- the condition attributes specified in COND_ATTR, or default +- attributes if COND_ATTR is `NULL'. The LinuxThreads implementation +- supports no attributes for conditions, hence the COND_ATTR +- parameter is actually ignored. +- +- Variables of type `pthread_cond_t' can also be initialized +- statically, using the constant `PTHREAD_COND_INITIALIZER'. +- +- This function always returns 0. +- +- - Function: int pthread_cond_signal (pthread_cond_t *COND) +- `pthread_cond_signal' restarts one of the threads that are waiting +- on the condition variable COND. If no threads are waiting on COND, +- nothing happens. If several threads are waiting on COND, exactly +- one is restarted, but it is not specified which. +- +- This function always returns 0. +- +- - Function: int pthread_cond_broadcast (pthread_cond_t *COND) +- `pthread_cond_broadcast' restarts all the threads that are waiting +- on the condition variable COND. Nothing happens if no threads are +- waiting on COND. +- +- This function always returns 0. +- +- - Function: int pthread_cond_wait (pthread_cond_t *COND, +- pthread_mutex_t *MUTEX) +- `pthread_cond_wait' atomically unlocks the MUTEX (as per +- `pthread_unlock_mutex') and waits for the condition variable COND +- to be signaled. The thread execution is suspended and does not +- consume any CPU time until the condition variable is signaled. The +- MUTEX must be locked by the calling thread on entrance to +- `pthread_cond_wait'. Before returning to the calling thread, +- `pthread_cond_wait' re-acquires MUTEX (as per +- `pthread_lock_mutex'). +- +- Unlocking the mutex and suspending on the condition variable is +- done atomically. Thus, if all threads always acquire the mutex +- before signaling the condition, this guarantees that the condition +- cannot be signaled (and thus ignored) between the time a thread +- locks the mutex and the time it waits on the condition variable. +- +- This function always returns 0. +- +- - Function: int pthread_cond_timedwait (pthread_cond_t *COND, +- pthread_mutex_t *MUTEX, const struct timespec *ABSTIME) +- `pthread_cond_timedwait' atomically unlocks MUTEX and waits on +- COND, as `pthread_cond_wait' does, but it also bounds the duration +- of the wait. If COND has not been signaled before time ABSTIME, +- the mutex MUTEX is re-acquired and `pthread_cond_timedwait' +- returns the error code `ETIMEDOUT'. The wait can also be +- interrupted by a signal; in that case `pthread_cond_timedwait' +- returns `EINTR'. +- +- The ABSTIME parameter specifies an absolute time, with the same +- origin as `time' and `gettimeofday': an ABSTIME of 0 corresponds +- to 00:00:00 GMT, January 1, 1970. +- +- - Function: int pthread_cond_destroy (pthread_cond_t *COND) +- `pthread_cond_destroy' destroys the condition variable COND, +- freeing the resources it might hold. If any threads are waiting +- on the condition variable, `pthread_cond_destroy' leaves COND +- untouched and returns `EBUSY'. Otherwise it returns 0, and COND +- must not be used again until it is reinitialized. +- +- In the LinuxThreads implementation, no resources are associated +- with condition variables, so `pthread_cond_destroy' actually does +- nothing. +- +- `pthread_cond_wait' and `pthread_cond_timedwait' are cancellation +-points. If a thread is canceled while suspended in one of these +-functions, the thread immediately resumes execution, relocks the mutex +-specified by MUTEX, and finally executes the cancellation. +-Consequently, cleanup handlers are assured that MUTEX is locked when +-they are called. +- +- It is not safe to call the condition variable functions from a signal +-handler. In particular, calling `pthread_cond_signal' or +-`pthread_cond_broadcast' from a signal handler may deadlock the calling +-thread. +- +- Consider two shared variables X and Y, protected by the mutex MUT, +-and a condition variable COND that is to be signaled whenever X becomes +-greater than Y. +- +- int x,y; +- pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; +- pthread_cond_t cond = PTHREAD_COND_INITIALIZER; +- +- Waiting until X is greater than Y is performed as follows: +- +- pthread_mutex_lock(&mut); +- while (x <= y) { +- pthread_cond_wait(&cond, &mut); +- } +- /* operate on x and y */ +- pthread_mutex_unlock(&mut); +- +- Modifications on X and Y that may cause X to become greater than Y +-should signal the condition if needed: +- +- pthread_mutex_lock(&mut); +- /* modify x and y */ +- if (x > y) pthread_cond_broadcast(&cond); +- pthread_mutex_unlock(&mut); +- +- If it can be proved that at most one waiting thread needs to be waken +-up (for instance, if there are only two threads communicating through X +-and Y), `pthread_cond_signal' can be used as a slightly more efficient +-alternative to `pthread_cond_broadcast'. In doubt, use +-`pthread_cond_broadcast'. +- +- To wait for X to becomes greater than Y with a timeout of 5 seconds, +-do: +- +- struct timeval now; +- struct timespec timeout; +- int retcode; +- +- pthread_mutex_lock(&mut); +- gettimeofday(&now); +- timeout.tv_sec = now.tv_sec + 5; +- timeout.tv_nsec = now.tv_usec * 1000; +- retcode = 0; +- while (x <= y && retcode != ETIMEDOUT) { +- retcode = pthread_cond_timedwait(&cond, &mut, &timeout); +- } +- if (retcode == ETIMEDOUT) { +- /* timeout occurred */ +- } else { +- /* operate on x and y */ +- } +- pthread_mutex_unlock(&mut); +- +- Condition attributes can be specified at condition creation time, by +-passing a condition attribute object as second argument to +-`pthread_cond_init'. Passing `NULL' is equivalent to passing a +-condition attribute object with all attributes set to their default +-values. +- +- The LinuxThreads implementation supports no attributes for +-conditions. The functions on condition attributes are included only for +-compliance with the POSIX standard. +- +- - Function: int pthread_condattr_init (pthread_condattr_t *ATTR) +- - Function: int pthread_condattr_destroy (pthread_condattr_t *ATTR) +- `pthread_condattr_init' initializes the condition attribute object +- ATTR and fills it with default values for the attributes. +- `pthread_condattr_destroy' destroys the condition attribute object +- ATTR. +- +- Both functions do nothing in the LinuxThreads implementation. +- +- `pthread_condattr_init' and `pthread_condattr_destroy' always +- return 0. +- +- +-File: libc.info, Node: POSIX Semaphores, Next: Thread-Specific Data, Prev: Condition Variables, Up: POSIX Threads +- +-POSIX Semaphores +-================ +- +- Semaphores are counters for resources shared between threads. The +-basic operations on semaphores are: increment the counter atomically, +-and wait until the counter is non-null and decrement it atomically. +- +- Semaphores have a maximum value past which they cannot be +-incremented. The macro `SEM_VALUE_MAX' is defined to be this maximum +-value. In the GNU C library, `SEM_VALUE_MAX' is equal to `INT_MAX' +-(*note Range of Type::), but it may be much smaller on other systems. +- +- The pthreads library implements POSIX 1003.1b semaphores. These +-should not be confused with System V semaphores (`ipc', `semctl' and +-`semop'). +- +- All the semaphore functions and macros are defined in `semaphore.h'. +- +- - Function: int sem_init (sem_t *SEM, int PSHARED, unsigned int VALUE) +- `sem_init' initializes the semaphore object pointed to by SEM. The +- count associated with the semaphore is set initially to VALUE. The +- PSHARED argument indicates whether the semaphore is local to the +- current process (PSHARED is zero) or is to be shared between +- several processes (PSHARED is not zero). +- +- On success `sem_init' returns 0. On failure it returns -1 and sets +- ERRNO to one of the following values: +- +- `EINVAL' +- VALUE exceeds the maximal counter value `SEM_VALUE_MAX' +- +- `ENOSYS' +- PSHARED is not zero. LinuxThreads currently does not support +- process-shared semaphores. (This will eventually change.) +- +- - Function: int sem_destroy (sem_t * SEM) +- `sem_destroy' destroys a semaphore object, freeing the resources it +- might hold. If any threads are waiting on the semaphore when +- `sem_destroy' is called, it fails and sets ERRNO to `EBUSY'. +- +- In the LinuxThreads implementation, no resources are associated +- with semaphore objects, thus `sem_destroy' actually does nothing +- except checking that no thread is waiting on the semaphore. This +- will change when process-shared semaphores are implemented. +- +- - Function: int sem_wait (sem_t * SEM) +- `sem_wait' suspends the calling thread until the semaphore pointed +- to by SEM has non-zero count. It then atomically decreases the +- semaphore count. +- +- `sem_wait' is a cancellation point. It always returns 0. +- +- - Function: int sem_trywait (sem_t * SEM) +- `sem_trywait' is a non-blocking variant of `sem_wait'. If the +- semaphore pointed to by SEM has non-zero count, the count is +- atomically decreased and `sem_trywait' immediately returns 0. If +- the semaphore count is zero, `sem_trywait' immediately returns -1 +- and sets errno to `EAGAIN'. +- +- - Function: int sem_post (sem_t * SEM) +- `sem_post' atomically increases the count of the semaphore pointed +- to by SEM. This function never blocks. +- +- On processors supporting atomic compare-and-swap (Intel 486, +- Pentium and later, Alpha, PowerPC, MIPS II, Motorola 68k, +- Ultrasparc), the `sem_post' function is can safely be called from +- signal handlers. This is the only thread synchronization function +- provided by POSIX threads that is async-signal safe. On the Intel +- 386 and earlier Sparc chips, the current LinuxThreads +- implementation of `sem_post' is not async-signal safe, because the +- hardware does not support the required atomic operations. +- +- `sem_post' always succeeds and returns 0, unless the semaphore +- count would exceed `SEM_VALUE_MAX' after being incremented. In +- that case `sem_post' returns -1 and sets ERRNO to `EINVAL'. The +- semaphore count is left unchanged. +- +- - Function: int sem_getvalue (sem_t * SEM, int * SVAL) +- `sem_getvalue' stores in the location pointed to by SVAL the +- current count of the semaphore SEM. It always returns 0. +- +- +-File: libc.info, Node: Thread-Specific Data, Next: Threads and Signal Handling, Prev: POSIX Semaphores, Up: POSIX Threads +- +-Thread-Specific Data +-==================== +- +- Programs often need global or static variables that have different +-values in different threads. Since threads share one memory space, this +-cannot be achieved with regular variables. Thread-specific data is the +-POSIX threads answer to this need. +- +- Each thread possesses a private memory block, the thread-specific +-data area, or TSD area for short. This area is indexed by TSD keys. The +-TSD area associates values of type `void *' to TSD keys. TSD keys are +-common to all threads, but the value associated with a given TSD key can +-be different in each thread. +- +- For concreteness, the TSD areas can be viewed as arrays of `void *' +-pointers, TSD keys as integer indices into these arrays, and the value +-of a TSD key as the value of the corresponding array element in the +-calling thread. +- +- When a thread is created, its TSD area initially associates `NULL' +-with all keys. +- +- - Function: int pthread_key_create (pthread_key_t *KEY, void +- (*destr_function) (void *)) +- `pthread_key_create' allocates a new TSD key. The key is stored in +- the location pointed to by KEY. There is a limit of +- `PTHREAD_KEYS_MAX' on the number of keys allocated at a given +- time. The value initially associated with the returned key is +- `NULL' in all currently executing threads. +- +- The DESTR_FUNCTION argument, if not `NULL', specifies a destructor +- function associated with the key. When a thread terminates via +- `pthread_exit' or by cancellation, DESTR_FUNCTION is called on the +- value associated with the key in that thread. The DESTR_FUNCTION +- is not called if a key is deleted with `pthread_key_delete' or a +- value is changed with `pthread_setspecific'. The order in which +- destructor functions are called at thread termination time is +- unspecified. +- +- Before the destructor function is called, the `NULL' value is +- associated with the key in the current thread. A destructor +- function might, however, re-associate non-`NULL' values to that +- key or some other key. To deal with this, if after all the +- destructors have been called for all non-`NULL' values, there are +- still some non-`NULL' values with associated destructors, then the +- process is repeated. The LinuxThreads implementation stops the +- process after `PTHREAD_DESTRUCTOR_ITERATIONS' iterations, even if +- some non-`NULL' values with associated descriptors remain. Other +- implementations may loop indefinitely. +- +- `pthread_key_create' returns 0 unless `PTHREAD_KEYS_MAX' keys have +- already been allocated, in which case it fails and returns +- `EAGAIN'. +- +- - Function: int pthread_key_delete (pthread_key_t KEY) +- `pthread_key_delete' deallocates a TSD key. It does not check +- whether non-`NULL' values are associated with that key in the +- currently executing threads, nor call the destructor function +- associated with the key. +- +- If there is no such key KEY, it returns `EINVAL'. Otherwise it +- returns 0. +- +- - Function: int pthread_setspecific (pthread_key_t KEY, const void +- *POINTER) +- `pthread_setspecific' changes the value associated with KEY in the +- calling thread, storing the given POINTER instead. +- +- If there is no such key KEY, it returns `EINVAL'. Otherwise it +- returns 0. +- +- - Function: void * pthread_getspecific (pthread_key_t KEY) +- `pthread_getspecific' returns the value currently associated with +- KEY in the calling thread. +- +- If there is no such key KEY, it returns `NULL'. +- +- The following code fragment allocates a thread-specific array of 100 +-characters, with automatic reclaimation at thread exit: +- +- /* Key for the thread-specific buffer */ +- static pthread_key_t buffer_key; +- +- /* Once-only initialisation of the key */ +- static pthread_once_t buffer_key_once = PTHREAD_ONCE_INIT; +- +- /* Allocate the thread-specific buffer */ +- void buffer_alloc(void) +- { +- pthread_once(&buffer_key_once, buffer_key_alloc); +- pthread_setspecific(buffer_key, malloc(100)); +- } +- +- /* Return the thread-specific buffer */ +- char * get_buffer(void) +- { +- return (char *) pthread_getspecific(buffer_key); +- } +- +- /* Allocate the key */ +- static void buffer_key_alloc() +- { +- pthread_key_create(&buffer_key, buffer_destroy); +- } +- +- /* Free the thread-specific buffer */ +- static void buffer_destroy(void * buf) +- { +- free(buf); +- } +- +- +-File: libc.info, Node: Threads and Signal Handling, Next: Threads and Fork, Prev: Thread-Specific Data, Up: POSIX Threads +- +-Threads and Signal Handling +-=========================== +- +- - Function: int pthread_sigmask (int HOW, const sigset_t *NEWMASK, +- sigset_t *OLDMASK) +- `pthread_sigmask' changes the signal mask for the calling thread as +- described by the HOW and NEWMASK arguments. If OLDMASK is not +- `NULL', the previous signal mask is stored in the location pointed +- to by OLDMASK. +- +- The meaning of the HOW and NEWMASK arguments is the same as for +- `sigprocmask'. If HOW is `SIG_SETMASK', the signal mask is set to +- NEWMASK. If HOW is `SIG_BLOCK', the signals specified to NEWMASK +- are added to the current signal mask. If HOW is `SIG_UNBLOCK', +- the signals specified to NEWMASK are removed from the current +- signal mask. +- +- Recall that signal masks are set on a per-thread basis, but signal +- actions and signal handlers, as set with `sigaction', are shared +- between all threads. +- +- The `pthread_sigmask' function returns 0 on success, and one of the +- following error codes on error: +- `EINVAL' +- HOW is not one of `SIG_SETMASK', `SIG_BLOCK', or `SIG_UNBLOCK' +- +- `EFAULT' +- NEWMASK or OLDMASK point to invalid addresses +- +- - Function: int pthread_kill (pthread_t THREAD, int SIGNO) +- `pthread_kill' sends signal number SIGNO to the thread THREAD. +- The signal is delivered and handled as described in *Note Signal +- Handling::. +- +- `pthread_kill' returns 0 on success, one of the following error +- codes on error: +- `EINVAL' +- SIGNO is not a valid signal number +- +- `ESRCH' +- The thread THREAD does not exist (e.g. it has already +- terminated) +- +- - Function: int sigwait (const sigset_t *SET, int *SIG) +- `sigwait' suspends the calling thread until one of the signals in +- SET is delivered to the calling thread. It then stores the number +- of the signal received in the location pointed to by SIG and +- returns. The signals in SET must be blocked and not ignored on +- entrance to `sigwait'. If the delivered signal has a signal handler +- function attached, that function is _not_ called. +- +- `sigwait' is a cancellation point. It always returns 0. +- +- For `sigwait' to work reliably, the signals being waited for must be +-blocked in all threads, not only in the calling thread, since otherwise +-the POSIX semantics for signal delivery do not guarantee that it's the +-thread doing the `sigwait' that will receive the signal. The best way +-to achieve this is block those signals before any threads are created, +-and never unblock them in the program other than by calling `sigwait'. +- +- Signal handling in LinuxThreads departs significantly from the POSIX +-standard. According to the standard, "asynchronous" (external) signals +-are addressed to the whole process (the collection of all threads), +-which then delivers them to one particular thread. The thread that +-actually receives the signal is any thread that does not currently block +-the signal. +- +- In LinuxThreads, each thread is actually a kernel process with its +-own PID, so external signals are always directed to one particular +-thread. If, for instance, another thread is blocked in `sigwait' on +-that signal, it will not be restarted. +- +- The LinuxThreads implementation of `sigwait' installs dummy signal +-handlers for the signals in SET for the duration of the wait. Since +-signal handlers are shared between all threads, other threads must not +-attach their own signal handlers to these signals, or alternatively +-they should all block these signals (which is recommended anyway). +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-51 glibc-2.3.2-200304020432/manual/libc.info-51 +--- glibc-2.3.2/manual/libc.info-51 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-51 Thu Jan 1 01:00:00 1970 +@@ -1,1113 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Threads and Fork, Next: Streams and Fork, Prev: Threads and Signal Handling, Up: POSIX Threads +- +-Threads and Fork +-================ +- +- It's not intuitively obvious what should happen when a +-multi-threaded POSIX process calls `fork'. Not only are the semantics +-tricky, but you may need to write code that does the right thing at +-fork time even if that code doesn't use the `fork' function. Moreover, +-you need to be aware of interaction between `fork' and some library +-features like `pthread_once' and stdio streams. +- +- When `fork' is called by one of the threads of a process, it creates +-a new process which is copy of the calling process. Effectively, in +-addition to copying certain system objects, the function takes a +-snapshot of the memory areas of the parent process, and creates +-identical areas in the child. To make matters more complicated, with +-threads it's possible for two or more threads to concurrently call fork +-to create two or more child processes. +- +- The child process has a copy of the address space of the parent, but +-it does not inherit any of its threads. Execution of the child process +-is carried out by a new thread which returns from `fork' function with +-a return value of zero; it is the only thread in the child process. +-Because threads are not inherited across fork, issues arise. At the +-time of the call to `fork', threads in the parent process other than +-the one calling `fork' may have been executing critical regions of +-code. As a result, the child process may get a copy of objects that +-are not in a well-defined state. This potential problem affects all +-components of the program. +- +- Any program component which will continue being used in a child +-process must correctly handle its state during `fork'. For this +-purpose, the POSIX interface provides the special function +-`pthread_atfork' for installing pointers to handler functions which are +-called from within `fork'. +- +- - Function: int pthread_atfork (void (*PREPARE)(void), void +- (*PARENT)(void), void (*CHILD)(void)) +- `pthread_atfork' registers handler functions to be called just +- before and just after a new process is created with `fork'. The +- PREPARE handler will be called from the parent process, just +- before the new process is created. The PARENT handler will be +- called from the parent process, just before `fork' returns. The +- CHILD handler will be called from the child process, just before +- `fork' returns. +- +- `pthread_atfork' returns 0 on success and a non-zero error code on +- error. +- +- One or more of the three handlers PREPARE, PARENT and CHILD can be +- given as `NULL', meaning that no handler needs to be called at the +- corresponding point. +- +- `pthread_atfork' can be called several times to install several +- sets of handlers. At `fork' time, the PREPARE handlers are called +- in LIFO order (last added with `pthread_atfork', first called +- before `fork'), while the PARENT and CHILD handlers are called in +- FIFO order (first added, first called). +- +- If there is insufficient memory available to register the handlers, +- `pthread_atfork' fails and returns `ENOMEM'. Otherwise it returns +- 0. +- +- The functions `fork' and `pthread_atfork' must not be regarded as +- reentrant from the context of the handlers. That is to say, if a +- `pthread_atfork' handler invoked from within `fork' calls +- `pthread_atfork' or `fork', the behavior is undefined. +- +- Registering a triplet of handlers is an atomic operation with +- respect to fork. If new handlers are registered at about the same +- time as a fork occurs, either all three handlers will be called, +- or none of them will be called. +- +- The handlers are inherited by the child process, and there is no +- way to remove them, short of using `exec' to load a new pocess +- image. +- +- +- To understand the purpose of `pthread_atfork', recall that `fork' +-duplicates the whole memory space, including mutexes in their current +-locking state, but only the calling thread: other threads are not +-running in the child process. The mutexes are not usable after the +-`fork' and must be initialized with `pthread_mutex_init' in the child +-process. This is a limitation of the current implementation and might +-or might not be present in future versions. +- +- To avoid this, install handlers with `pthread_atfork' as follows: +-have the PREPARE handler lock the mutexes (in locking order), and the +-PARENT handler unlock the mutexes. The CHILD handler should reset the +-mutexes using `pthread_mutex_init', as well as any other +-synchronization objects such as condition variables. +- +- Locking the global mutexes before the fork ensures that all other +-threads are locked out of the critical regions of code protected by +-those mutexes. Thus when `fork' takes a snapshot of the parent's +-address space, that snapshot will copy valid, stable data. Resetting +-the synchronization objects in the child process will ensure they are +-properly cleansed of any artifacts from the threading subsystem of the +-parent process. For example, a mutex may inherit a wait queue of +-threads waiting for the lock; this wait queue makes no sense in the +-child process. Initializing the mutex takes care of this. +- +- +-File: libc.info, Node: Streams and Fork, Next: Miscellaneous Thread Functions, Prev: Threads and Fork, Up: POSIX Threads +- +-Streams and Fork +-================ +- +- The GNU standard I/O library has an internal mutex which guards the +-internal linked list of all standard C FILE objects. This mutex is +-properly taken care of during `fork' so that the child receives an +-intact copy of the list. This allows the `fopen' function, and related +-stream-creating functions, to work correctly in the child process, +-since these functions need to insert into the list. +- +- However, the individual stream locks are not completely taken care +-of. Thus unless the multithreaded application takes special +-precautions in its use of `fork', the child process might not be able +-to safely use the streams that it inherited from the parent. In +-general, for any given open stream in the parent that is to be used by +-the child process, the application must ensure that that stream is not +-in use by another thread when `fork' is called. Otherwise an +-inconsistent copy of the stream object be produced. An easy way to +-ensure this is to use `flockfile' to lock the stream prior to calling +-`fork' and then unlock it with `funlockfile' inside the parent process, +-provided that the parent's threads properly honor these locks. Nothing +-special needs to be done in the child process, since the library +-internally resets all stream locks. +- +- Note that the stream locks are not shared between the parent and +-child. For example, even if you ensure that, say, the stream `stdout' +-is properly treated and can be safely used in the child, the stream +-locks do not provide an exclusion mechanism between the parent and +-child. If both processes write to `stdout', strangely interleaved +-output may result regardless of the explicit use of `flockfile' or +-implicit locks. +- +- Also note that these provisions are a GNU extension; other systems +-might not provide any way for streams to be used in the child of a +-multithreaded process. POSIX requires that such a child process +-confines itself to calling only asynchronous safe functions, which +-excludes much of the library, including standard I/O. +- +- +-File: libc.info, Node: Miscellaneous Thread Functions, Prev: Streams and Fork, Up: POSIX Threads +- +-Miscellaneous Thread Functions +-============================== +- +- - Function: pthread_t pthread_self (VOID) +- `pthread_self' returns the thread identifier for the calling +- thread. +- +- - Function: int pthread_equal (pthread_t thread1, pthread_t thread2) +- `pthread_equal' determines if two thread identifiers refer to the +- same thread. +- +- A non-zero value is returned if THREAD1 and THREAD2 refer to the +- same thread. Otherwise, 0 is returned. +- +- - Function: int pthread_detach (pthread_t TH) +- `pthread_detach' puts the thread TH in the detached state. This +- guarantees that the memory resources consumed by TH will be freed +- immediately when TH terminates. However, this prevents other +- threads from synchronizing on the termination of TH using +- `pthread_join'. +- +- A thread can be created initially in the detached state, using the +- `detachstate' attribute to `pthread_create'. In contrast, +- `pthread_detach' applies to threads created in the joinable state, +- and which need to be put in the detached state later. +- +- After `pthread_detach' completes, subsequent attempts to perform +- `pthread_join' on TH will fail. If another thread is already +- joining the thread TH at the time `pthread_detach' is called, +- `pthread_detach' does nothing and leaves TH in the joinable state. +- +- On success, 0 is returned. On error, one of the following codes is +- returned: +- `ESRCH' +- No thread could be found corresponding to that specified by TH +- +- `EINVAL' +- The thread TH is already in the detached state +- +- - Function: void pthread_kill_other_threads_np (VOID) +- `pthread_kill_other_threads_np' is a non-portable LinuxThreads +- extension. It causes all threads in the program to terminate +- immediately, except the calling thread which proceeds normally. It +- is intended to be called just before a thread calls one of the +- `exec' functions, e.g. `execve'. +- +- Termination of the other threads is not performed through +- `pthread_cancel' and completely bypasses the cancellation +- mechanism. Hence, the current settings for cancellation state and +- cancellation type are ignored, and the cleanup handlers are not +- executed in the terminated threads. +- +- According to POSIX 1003.1c, a successful `exec*' in one of the +- threads should automatically terminate all other threads in the +- program. This behavior is not yet implemented in LinuxThreads. +- Calling `pthread_kill_other_threads_np' before `exec*' achieves +- much of the same behavior, except that if `exec*' ultimately +- fails, then all other threads are already killed. +- +- - Function: int pthread_once (pthread_once_t *once_CONTROL, void +- (*INIT_ROUTINE) (void)) +- The purpose of `pthread_once' is to ensure that a piece of +- initialization code is executed at most once. The ONCE_CONTROL +- argument points to a static or extern variable statically +- initialized to `PTHREAD_ONCE_INIT'. +- +- The first time `pthread_once' is called with a given ONCE_CONTROL +- argument, it calls INIT_ROUTINE with no argument and changes the +- value of the ONCE_CONTROL variable to record that initialization +- has been performed. Subsequent calls to `pthread_once' with the +- same `once_control' argument do nothing. +- +- If a thread is cancelled while executing INIT_ROUTINE the state of +- the ONCE_CONTROL variable is reset so that a future call to +- `pthread_once' will call the routine again. +- +- If the process forks while one or more threads are executing +- `pthread_once' initialization routines, the states of their +- respective ONCE_CONTROL variables will appear to be reset in the +- child process so that if the child calls `pthread_once', the +- routines will be executed. +- +- `pthread_once' always returns 0. +- +- - Function: int pthread_setschedparam (pthread_t target_THREAD, int +- POLICY, const struct sched_param *PARAM) +- `pthread_setschedparam' sets the scheduling parameters for the +- thread TARGET_THREAD as indicated by POLICY and PARAM. POLICY can +- be either `SCHED_OTHER' (regular, non-realtime scheduling), +- `SCHED_RR' (realtime, round-robin) or `SCHED_FIFO' (realtime, +- first-in first-out). PARAM specifies the scheduling priority for +- the two realtime policies. See `sched_setpolicy' for more +- information on scheduling policies. +- +- The realtime scheduling policies `SCHED_RR' and `SCHED_FIFO' are +- available only to processes with superuser privileges. +- +- On success, `pthread_setschedparam' returns 0. On error it returns +- one of the following codes: +- `EINVAL' +- POLICY is not one of `SCHED_OTHER', `SCHED_RR', `SCHED_FIFO', +- or the priority value specified by PARAM is not valid for the +- specified policy +- +- `EPERM' +- Realtime scheduling was requested but the calling process +- does not have sufficient privileges. +- +- `ESRCH' +- The TARGET_THREAD is invalid or has already terminated +- +- `EFAULT' +- PARAM points outside the process memory space +- +- - Function: int pthread_getschedparam (pthread_t target_THREAD, int +- *POLICY, struct sched_param *PARAM) +- `pthread_getschedparam' retrieves the scheduling policy and +- scheduling parameters for the thread TARGET_THREAD and stores them +- in the locations pointed to by POLICY and PARAM, respectively. +- +- `pthread_getschedparam' returns 0 on success, or one of the +- following error codes on failure: +- `ESRCH' +- The TARGET_THREAD is invalid or has already terminated. +- +- `EFAULT' +- POLICY or PARAM point outside the process memory space. +- +- +- - Function: int pthread_setconcurrency (int LEVEL) +- `pthread_setconcurrency' is unused in LinuxThreads due to the lack +- of a mapping of user threads to kernel threads. It exists for +- source compatibility. It does store the value LEVEL so that it +- can be returned by a subsequent call to `pthread_getconcurrency'. +- It takes no other action however. +- +- - Function: int pthread_getconcurrency () +- `pthread_getconcurrency' is unused in LinuxThreads due to the lack +- of a mapping of user threads to kernel threads. It exists for +- source compatibility. However, it will return the value that was +- set by the last call to `pthread_setconcurrency'. +- +- +-File: libc.info, Node: Language Features, Next: Library Summary, Prev: POSIX Threads, Up: Top +- +-C Language Facilities in the Library +-************************************ +- +- Some of the facilities implemented by the C library really should be +-thought of as parts of the C language itself. These facilities ought to +-be documented in the C Language Manual, not in the library manual; but +-since we don't have the language manual yet, and documentation for these +-features has been written, we are publishing it here. +- +-* Menu: +- +-* Consistency Checking:: Using `assert' to abort if +- something ``impossible'' happens. +-* Variadic Functions:: Defining functions with varying numbers +- of args. +-* Null Pointer Constant:: The macro `NULL'. +-* Important Data Types:: Data types for object sizes. +-* Data Type Measurements:: Parameters of data type representations. +- +- +-File: libc.info, Node: Consistency Checking, Next: Variadic Functions, Up: Language Features +- +-Explicitly Checking Internal Consistency +-======================================== +- +- When you're writing a program, it's often a good idea to put in +-checks at strategic places for "impossible" errors or violations of +-basic assumptions. These kinds of checks are helpful in debugging +-problems with the interfaces between different parts of the program, +-for example. +- +- The `assert' macro, defined in the header file `assert.h', provides +-a convenient way to abort the program while printing a message about +-where in the program the error was detected. +- +- Once you think your program is debugged, you can disable the error +-checks performed by the `assert' macro by recompiling with the macro +-`NDEBUG' defined. This means you don't actually have to change the +-program source code to disable these checks. +- +- But disabling these consistency checks is undesirable unless they +-make the program significantly slower. All else being equal, more error +-checking is good no matter who is running the program. A wise user +-would rather have a program crash, visibly, than have it return nonsense +-without indicating anything might be wrong. +- +- - Macro: void assert (int EXPRESSION) +- Verify the programmer's belief that EXPRESSION is nonzero at this +- point in the program. +- +- If `NDEBUG' is not defined, `assert' tests the value of +- EXPRESSION. If it is false (zero), `assert' aborts the program +- (*note Aborting a Program::) after printing a message of the form: +- +- `FILE':LINENUM: FUNCTION: Assertion `EXPRESSION' failed. +- +- on the standard error stream `stderr' (*note Standard Streams::). +- The filename and line number are taken from the C preprocessor +- macros `__FILE__' and `__LINE__' and specify where the call to +- `assert' was made. When using the GNU C compiler, the name of the +- function which calls `assert' is taken from the built-in variable +- `__PRETTY_FUNCTION__'; with older compilers, the function name and +- following colon are omitted. +- +- If the preprocessor macro `NDEBUG' is defined before `assert.h' is +- included, the `assert' macro is defined to do absolutely nothing. +- +- *Warning:* Even the argument expression EXPRESSION is not +- evaluated if `NDEBUG' is in effect. So never use `assert' with +- arguments that involve side effects. For example, `assert (++i > +- 0);' is a bad idea, because `i' will not be incremented if +- `NDEBUG' is defined. +- +- Sometimes the "impossible" condition you want to check for is an +-error return from an operating system function. Then it is useful to +-display not only where the program crashes, but also what error was +-returned. The `assert_perror' macro makes this easy. +- +- - Macro: void assert_perror (int ERRNUM) +- Similar to `assert', but verifies that ERRNUM is zero. +- +- If `NDEBUG' is not defined, `assert_perror' tests the value of +- ERRNUM. If it is nonzero, `assert_perror' aborts the program +- after printing a message of the form: +- +- `FILE':LINENUM: FUNCTION: ERROR TEXT +- +- on the standard error stream. The file name, line number, and +- function name are as for `assert'. The error text is the result of +- `strerror (ERRNUM)'. *Note Error Messages::. +- +- Like `assert', if `NDEBUG' is defined before `assert.h' is +- included, the `assert_perror' macro does absolutely nothing. It +- does not evaluate the argument, so ERRNUM should not have any side +- effects. It is best for ERRNUM to be just a simple variable +- reference; often it will be `errno'. +- +- This macro is a GNU extension. +- +- *Usage note:* The `assert' facility is designed for detecting +-_internal inconsistency_; it is not suitable for reporting invalid +-input or improper usage by the _user_ of the program. +- +- The information in the diagnostic messages printed by the `assert' +-and `assert_perror' macro is intended to help you, the programmer, +-track down the cause of a bug, but is not really useful for telling a +-user of your program why his or her input was invalid or why a command +-could not be carried out. What's more, your program should not abort +-when given invalid input, as `assert' would do--it should exit with +-nonzero status (*note Exit Status::) after printing its error messages, +-or perhaps read another command or move on to the next input file. +- +- *Note Error Messages::, for information on printing error messages +-for problems that _do not_ represent bugs in the program. +- +- +-File: libc.info, Node: Variadic Functions, Next: Null Pointer Constant, Prev: Consistency Checking, Up: Language Features +- +-Variadic Functions +-================== +- +- ISO C defines a syntax for declaring a function to take a variable +-number or type of arguments. (Such functions are referred to as +-"varargs functions" or "variadic functions".) However, the language +-itself provides no mechanism for such functions to access their +-non-required arguments; instead, you use the variable arguments macros +-defined in `stdarg.h'. +- +- This section describes how to declare variadic functions, how to +-write them, and how to call them properly. +- +- *Compatibility Note:* Many older C dialects provide a similar, but +-incompatible, mechanism for defining functions with variable numbers of +-arguments, using `varargs.h'. +- +-* Menu: +- +-* Why Variadic:: Reasons for making functions take +- variable arguments. +-* How Variadic:: How to define and call variadic functions. +-* Variadic Example:: A complete example. +- +- +-File: libc.info, Node: Why Variadic, Next: How Variadic, Up: Variadic Functions +- +-Why Variadic Functions are Used +-------------------------------- +- +- Ordinary C functions take a fixed number of arguments. When you +-define a function, you specify the data type for each argument. Every +-call to the function should supply the expected number of arguments, +-with types that can be converted to the specified ones. Thus, if the +-function `foo' is declared with `int foo (int, char *);' then you must +-call it with two arguments, a number (any kind will do) and a string +-pointer. +- +- But some functions perform operations that can meaningfully accept an +-unlimited number of arguments. +- +- In some cases a function can handle any number of values by +-operating on all of them as a block. For example, consider a function +-that allocates a one-dimensional array with `malloc' to hold a +-specified set of values. This operation makes sense for any number of +-values, as long as the length of the array corresponds to that number. +-Without facilities for variable arguments, you would have to define a +-separate function for each possible array size. +- +- The library function `printf' (*note Formatted Output::) is an +-example of another class of function where variable arguments are +-useful. This function prints its arguments (which can vary in type as +-well as number) under the control of a format template string. +- +- These are good reasons to define a "variadic" function which can +-handle as many arguments as the caller chooses to pass. +- +- Some functions such as `open' take a fixed set of arguments, but +-occasionally ignore the last few. Strict adherence to ISO C requires +-these functions to be defined as variadic; in practice, however, the GNU +-C compiler and most other C compilers let you define such a function to +-take a fixed set of arguments--the most it can ever use--and then only +-_declare_ the function as variadic (or not declare its arguments at +-all!). +- +- +-File: libc.info, Node: How Variadic, Next: Variadic Example, Prev: Why Variadic, Up: Variadic Functions +- +-How Variadic Functions are Defined and Used +-------------------------------------------- +- +- Defining and using a variadic function involves three steps: +- +- * _Define_ the function as variadic, using an ellipsis (`...') in +- the argument list, and using special macros to access the variable +- arguments. *Note Receiving Arguments::. +- +- * _Declare_ the function as variadic, using a prototype with an +- ellipsis (`...'), in all the files which call it. *Note Variadic +- Prototypes::. +- +- * _Call_ the function by writing the fixed arguments followed by the +- additional variable arguments. *Note Calling Variadics::. +- +-* Menu: +- +-* Variadic Prototypes:: How to make a prototype for a function +- with variable arguments. +-* Receiving Arguments:: Steps you must follow to access the +- optional argument values. +-* How Many Arguments:: How to decide whether there are more arguments. +-* Calling Variadics:: Things you need to know about calling +- variable arguments functions. +-* Argument Macros:: Detailed specification of the macros +- for accessing variable arguments. +-* Old Varargs:: The pre-ISO way of defining variadic functions. +- +- +-File: libc.info, Node: Variadic Prototypes, Next: Receiving Arguments, Up: How Variadic +- +-Syntax for Variable Arguments +-............................. +- +- A function that accepts a variable number of arguments must be +-declared with a prototype that says so. You write the fixed arguments +-as usual, and then tack on `...' to indicate the possibility of +-additional arguments. The syntax of ISO C requires at least one fixed +-argument before the `...'. For example, +- +- int +- func (const char *a, int b, ...) +- { +- ... +- } +- +-defines a function `func' which returns an `int' and takes two required +-arguments, a `const char *' and an `int'. These are followed by any +-number of anonymous arguments. +- +- *Portability note:* For some C compilers, the last required argument +-must not be declared `register' in the function definition. +-Furthermore, this argument's type must be "self-promoting": that is, +-the default promotions must not change its type. This rules out array +-and function types, as well as `float', `char' (whether signed or not) +-and `short int' (whether signed or not). This is actually an ISO C +-requirement. +- +- +-File: libc.info, Node: Receiving Arguments, Next: How Many Arguments, Prev: Variadic Prototypes, Up: How Variadic +- +-Receiving the Argument Values +-............................. +- +- Ordinary fixed arguments have individual names, and you can use these +-names to access their values. But optional arguments have no +-names--nothing but `...'. How can you access them? +- +- The only way to access them is sequentially, in the order they were +-written, and you must use special macros from `stdarg.h' in the +-following three step process: +- +- 1. You initialize an argument pointer variable of type `va_list' using +- `va_start'. The argument pointer when initialized points to the +- first optional argument. +- +- 2. You access the optional arguments by successive calls to `va_arg'. +- The first call to `va_arg' gives you the first optional argument, +- the next call gives you the second, and so on. +- +- You can stop at any time if you wish to ignore any remaining +- optional arguments. It is perfectly all right for a function to +- access fewer arguments than were supplied in the call, but you +- will get garbage values if you try to access too many arguments. +- +- 3. You indicate that you are finished with the argument pointer +- variable by calling `va_end'. +- +- (In practice, with most C compilers, calling `va_end' does nothing. +- This is always true in the GNU C compiler. But you might as well +- call `va_end' just in case your program is someday compiled with a +- peculiar compiler.) +- +- *Note Argument Macros::, for the full definitions of `va_start', +-`va_arg' and `va_end'. +- +- Steps 1 and 3 must be performed in the function that accepts the +-optional arguments. However, you can pass the `va_list' variable as an +-argument to another function and perform all or part of step 2 there. +- +- You can perform the entire sequence of three steps multiple times +-within a single function invocation. If you want to ignore the optional +-arguments, you can do these steps zero times. +- +- You can have more than one argument pointer variable if you like. +-You can initialize each variable with `va_start' when you wish, and +-then you can fetch arguments with each argument pointer as you wish. +-Each argument pointer variable will sequence through the same set of +-argument values, but at its own pace. +- +- *Portability note:* With some compilers, once you pass an argument +-pointer value to a subroutine, you must not keep using the same +-argument pointer value after that subroutine returns. For full +-portability, you should just pass it to `va_end'. This is actually an +-ISO C requirement, but most ANSI C compilers work happily regardless. +- +- +-File: libc.info, Node: How Many Arguments, Next: Calling Variadics, Prev: Receiving Arguments, Up: How Variadic +- +-How Many Arguments Were Supplied +-................................ +- +- There is no general way for a function to determine the number and +-type of the optional arguments it was called with. So whoever designs +-the function typically designs a convention for the caller to specify +-the number and type of arguments. It is up to you to define an +-appropriate calling convention for each variadic function, and write +-all calls accordingly. +- +- One kind of calling convention is to pass the number of optional +-arguments as one of the fixed arguments. This convention works provided +-all of the optional arguments are of the same type. +- +- A similar alternative is to have one of the required arguments be a +-bit mask, with a bit for each possible purpose for which an optional +-argument might be supplied. You would test the bits in a predefined +-sequence; if the bit is set, fetch the value of the next argument, +-otherwise use a default value. +- +- A required argument can be used as a pattern to specify both the +-number and types of the optional arguments. The format string argument +-to `printf' is one example of this (*note Formatted Output Functions::). +- +- Another possibility is to pass an "end marker" value as the last +-optional argument. For example, for a function that manipulates an +-arbitrary number of pointer arguments, a null pointer might indicate the +-end of the argument list. (This assumes that a null pointer isn't +-otherwise meaningful to the function.) The `execl' function works in +-just this way; see *Note Executing a File::. +- +- +-File: libc.info, Node: Calling Variadics, Next: Argument Macros, Prev: How Many Arguments, Up: How Variadic +- +-Calling Variadic Functions +-.......................... +- +- You don't have to do anything special to call a variadic function. +-Just put the arguments (required arguments, followed by optional ones) +-inside parentheses, separated by commas, as usual. But you must declare +-the function with a prototype and know how the argument values are +-converted. +- +- In principle, functions that are _defined_ to be variadic must also +-be _declared_ to be variadic using a function prototype whenever you +-call them. (*Note Variadic Prototypes::, for how.) This is because +-some C compilers use a different calling convention to pass the same set +-of argument values to a function depending on whether that function +-takes variable arguments or fixed arguments. +- +- In practice, the GNU C compiler always passes a given set of argument +-types in the same way regardless of whether they are optional or +-required. So, as long as the argument types are self-promoting, you can +-safely omit declaring them. Usually it is a good idea to declare the +-argument types for variadic functions, and indeed for all functions. +-But there are a few functions which it is extremely convenient not to +-have to declare as variadic--for example, `open' and `printf'. +- +- Since the prototype doesn't specify types for optional arguments, in +-a call to a variadic function the "default argument promotions" are +-performed on the optional argument values. This means the objects of +-type `char' or `short int' (whether signed or not) are promoted to +-either `int' or `unsigned int', as appropriate; and that objects of +-type `float' are promoted to type `double'. So, if the caller passes a +-`char' as an optional argument, it is promoted to an `int', and the +-function can access it with `va_arg (AP, int)'. +- +- Conversion of the required arguments is controlled by the function +-prototype in the usual way: the argument expression is converted to the +-declared argument type as if it were being assigned to a variable of +-that type. +- +- +-File: libc.info, Node: Argument Macros, Next: Old Varargs, Prev: Calling Variadics, Up: How Variadic +- +-Argument Access Macros +-...................... +- +- Here are descriptions of the macros used to retrieve variable +-arguments. These macros are defined in the header file `stdarg.h'. +- +- - Data Type: va_list +- The type `va_list' is used for argument pointer variables. +- +- - Macro: void va_start (va_list AP, LAST-REQUIRED) +- This macro initializes the argument pointer variable AP to point +- to the first of the optional arguments of the current function; +- LAST-REQUIRED must be the last required argument to the function. +- +- *Note Old Varargs::, for an alternate definition of `va_start' +- found in the header file `varargs.h'. +- +- - Macro: TYPE va_arg (va_list AP, TYPE) +- The `va_arg' macro returns the value of the next optional argument, +- and modifies the value of AP to point to the subsequent argument. +- Thus, successive uses of `va_arg' return successive optional +- arguments. +- +- The type of the value returned by `va_arg' is TYPE as specified in +- the call. TYPE must be a self-promoting type (not `char' or +- `short int' or `float') that matches the type of the actual +- argument. +- +- - Macro: void va_end (va_list AP) +- This ends the use of AP. After a `va_end' call, further `va_arg' +- calls with the same AP may not work. You should invoke `va_end' +- before returning from the function in which `va_start' was invoked +- with the same AP argument. +- +- In the GNU C library, `va_end' does nothing, and you need not ever +- use it except for reasons of portability. +- +- +- Sometimes it is necessary to parse the list of parameters more than +-once or one wants to remember a certain position in the parameter list. +-To do this, one will have to make a copy of the current value of the +-argument. But `va_list' is an opaque type and one cannot necessarily +-assign the value of one variable of type `va_list' to another variable +-of the same type. +- +- - Macro: void __va_copy (va_list DEST, va_list SRC) +- The `__va_copy' macro allows copying of objects of type `va_list' +- even if this is not an integral type. The argument pointer in +- DEST is initialized to point to the same argument as the pointer +- in SRC. +- +- This macro is a GNU extension but it will hopefully also be +- available in the next update of the ISO C standard. +- +- If you want to use `__va_copy' you should always be prepared for the +-possibility that this macro will not be available. On architectures +-where a simple assignment is invalid, hopefully `__va_copy' _will_ be +-available, so one should always write something like this: +- +- { +- va_list ap, save; +- ... +- #ifdef __va_copy +- __va_copy (save, ap); +- #else +- save = ap; +- #endif +- ... +- } +- +- +-File: libc.info, Node: Variadic Example, Prev: How Variadic, Up: Variadic Functions +- +-Example of a Variadic Function +------------------------------- +- +- Here is a complete sample function that accepts a variable number of +-arguments. The first argument to the function is the count of remaining +-arguments, which are added up and the result returned. While trivial, +-this function is sufficient to illustrate how to use the variable +-arguments facility. +- +- #include +- #include +- +- int +- add_em_up (int count,...) +- { +- va_list ap; +- int i, sum; +- +- va_start (ap, count); /* Initialize the argument list. */ +- +- sum = 0; +- for (i = 0; i < count; i++) +- sum += va_arg (ap, int); /* Get the next argument value. */ +- +- va_end (ap); /* Clean up. */ +- return sum; +- } +- +- int +- main (void) +- { +- /* This call prints 16. */ +- printf ("%d\n", add_em_up (3, 5, 5, 6)); +- +- /* This call prints 55. */ +- printf ("%d\n", add_em_up (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)); +- +- return 0; +- } +- +- +-File: libc.info, Node: Old Varargs, Prev: Argument Macros, Up: How Variadic +- +-Old-Style Variadic Functions +-............................ +- +- Before ISO C, programmers used a slightly different facility for +-writing variadic functions. The GNU C compiler still supports it; +-currently, it is more portable than the ISO C facility, since support +-for ISO C is still not universal. The header file which defines the +-old-fashioned variadic facility is called `varargs.h'. +- +- Using `varargs.h' is almost the same as using `stdarg.h'. There is +-no difference in how you call a variadic function; see *Note Calling +-Variadics::. The only difference is in how you define them. First of +-all, you must use old-style non-prototype syntax, like this: +- +- tree +- build (va_alist) +- va_dcl +- { +- +- Secondly, you must give `va_start' only one argument, like this: +- +- va_list p; +- va_start (p); +- +- These are the special macros used for defining old-style variadic +-functions: +- +- - Macro: va_alist +- This macro stands for the argument name list required in a variadic +- function. +- +- - Macro: va_dcl +- This macro declares the implicit argument or arguments for a +- variadic function. +- +- - Macro: void va_start (va_list AP) +- This macro, as defined in `varargs.h', initializes the argument +- pointer variable AP to point to the first argument of the current +- function. +- +- The other argument macros, `va_arg' and `va_end', are the same in +-`varargs.h' as in `stdarg.h'; see *Note Argument Macros::, for details. +- +- It does not work to include both `varargs.h' and `stdarg.h' in the +-same compilation; they define `va_start' in conflicting ways. +- +- +-File: libc.info, Node: Null Pointer Constant, Next: Important Data Types, Prev: Variadic Functions, Up: Language Features +- +-Null Pointer Constant +-===================== +- +- The null pointer constant is guaranteed not to point to any real +-object. You can assign it to any pointer variable since it has type +-`void *'. The preferred way to write a null pointer constant is with +-`NULL'. +- +- - Macro: void * NULL +- This is a null pointer constant. +- +- You can also use `0' or `(void *)0' as a null pointer constant, but +-using `NULL' is cleaner because it makes the purpose of the constant +-more evident. +- +- If you use the null pointer constant as a function argument, then for +-complete portability you should make sure that the function has a +-prototype declaration. Otherwise, if the target machine has two +-different pointer representations, the compiler won't know which +-representation to use for that argument. You can avoid the problem by +-explicitly casting the constant to the proper pointer type, but we +-recommend instead adding a prototype for the function you are calling. +- +- +-File: libc.info, Node: Important Data Types, Next: Data Type Measurements, Prev: Null Pointer Constant, Up: Language Features +- +-Important Data Types +-==================== +- +- The result of subtracting two pointers in C is always an integer, +-but the precise data type varies from C compiler to C compiler. +-Likewise, the data type of the result of `sizeof' also varies between +-compilers. ISO defines standard aliases for these two types, so you +-can refer to them in a portable fashion. They are defined in the +-header file `stddef.h'. +- +- - Data Type: ptrdiff_t +- This is the signed integer type of the result of subtracting two +- pointers. For example, with the declaration `char *p1, *p2;', the +- expression `p2 - p1' is of type `ptrdiff_t'. This will probably +- be one of the standard signed integer types (`short int', `int' or +- `long int'), but might be a nonstandard type that exists only for +- this purpose. +- +- - Data Type: size_t +- This is an unsigned integer type used to represent the sizes of +- objects. The result of the `sizeof' operator is of this type, and +- functions such as `malloc' (*note Unconstrained Allocation::) and +- `memcpy' (*note Copying and Concatenation::) accept arguments of +- this type to specify object sizes. +- +- *Usage Note:* `size_t' is the preferred way to declare any +- arguments or variables that hold the size of an object. +- +- In the GNU system `size_t' is equivalent to either `unsigned int' or +-`unsigned long int'. These types have identical properties on the GNU +-system and, for most purposes, you can use them interchangeably. +-However, they are distinct as data types, which makes a difference in +-certain contexts. +- +- For example, when you specify the type of a function argument in a +-function prototype, it makes a difference which one you use. If the +-system header files declare `malloc' with an argument of type `size_t' +-and you declare `malloc' with an argument of type `unsigned int', you +-will get a compilation error if `size_t' happens to be `unsigned long +-int' on your system. To avoid any possibility of error, when a +-function argument or value is supposed to have type `size_t', never +-declare its type in any other way. +- +- *Compatibility Note:* Implementations of C before the advent of +-ISO C generally used `unsigned int' for representing object sizes and +-`int' for pointer subtraction results. They did not necessarily define +-either `size_t' or `ptrdiff_t'. Unix systems did define `size_t', in +-`sys/types.h', but the definition was usually a signed type. +- +- +-File: libc.info, Node: Data Type Measurements, Prev: Important Data Types, Up: Language Features +- +-Data Type Measurements +-====================== +- +- Most of the time, if you choose the proper C data type for each +-object in your program, you need not be concerned with just how it is +-represented or how many bits it uses. When you do need such +-information, the C language itself does not provide a way to get it. +-The header files `limits.h' and `float.h' contain macros which give you +-this information in full detail. +- +-* Menu: +- +-* Width of Type:: How many bits does an integer type hold? +-* Range of Type:: What are the largest and smallest values +- that an integer type can hold? +-* Floating Type Macros:: Parameters that measure the floating point types. +-* Structure Measurement:: Getting measurements on structure types. +- +- +-File: libc.info, Node: Width of Type, Next: Range of Type, Up: Data Type Measurements +- +-Computing the Width of an Integer Data Type +-------------------------------------------- +- +- The most common reason that a program needs to know how many bits +-are in an integer type is for using an array of `long int' as a bit +-vector. You can access the bit at index N with +- +- vector[N / LONGBITS] & (1 << (N % LONGBITS)) +- +-provided you define `LONGBITS' as the number of bits in a `long int'. +- +- There is no operator in the C language that can give you the number +-of bits in an integer data type. But you can compute it from the macro +-`CHAR_BIT', defined in the header file `limits.h'. +- +-`CHAR_BIT' +- This is the number of bits in a `char'--eight, on most systems. +- The value has type `int'. +- +- You can compute the number of bits in any data type TYPE like this: +- +- sizeof (TYPE) * CHAR_BIT +- +- +-File: libc.info, Node: Range of Type, Next: Floating Type Macros, Prev: Width of Type, Up: Data Type Measurements +- +-Range of an Integer Type +------------------------- +- +- Suppose you need to store an integer value which can range from zero +-to one million. Which is the smallest type you can use? There is no +-general rule; it depends on the C compiler and target machine. You can +-use the `MIN' and `MAX' macros in `limits.h' to determine which type +-will work. +- +- Each signed integer type has a pair of macros which give the smallest +-and largest values that it can hold. Each unsigned integer type has one +-such macro, for the maximum value; the minimum value is, of course, +-zero. +- +- The values of these macros are all integer constant expressions. The +-`MAX' and `MIN' macros for `char' and `short int' types have values of +-type `int'. The `MAX' and `MIN' macros for the other types have values +-of the same type described by the macro--thus, `ULONG_MAX' has type +-`unsigned long int'. +- +-`SCHAR_MIN' +- This is the minimum value that can be represented by a +- `signed char'. +- +-`SCHAR_MAX' +-`UCHAR_MAX' +- These are the maximum values that can be represented by a +- `signed char' and `unsigned char', respectively. +- +-`CHAR_MIN' +- This is the minimum value that can be represented by a `char'. +- It's equal to `SCHAR_MIN' if `char' is signed, or zero otherwise. +- +-`CHAR_MAX' +- This is the maximum value that can be represented by a `char'. +- It's equal to `SCHAR_MAX' if `char' is signed, or `UCHAR_MAX' +- otherwise. +- +-`SHRT_MIN' +- This is the minimum value that can be represented by a +- `signed short int'. On most machines that the GNU C library runs +- on, `short' integers are 16-bit quantities. +- +-`SHRT_MAX' +-`USHRT_MAX' +- These are the maximum values that can be represented by a +- `signed short int' and `unsigned short int', respectively. +- +-`INT_MIN' +- This is the minimum value that can be represented by a +- `signed int'. On most machines that the GNU C system runs on, an +- `int' is a 32-bit quantity. +- +-`INT_MAX' +-`UINT_MAX' +- These are the maximum values that can be represented by, +- respectively, the type `signed int' and the type `unsigned int'. +- +-`LONG_MIN' +- This is the minimum value that can be represented by a +- `signed long int'. On most machines that the GNU C system runs +- on, `long' integers are 32-bit quantities, the same size as `int'. +- +-`LONG_MAX' +-`ULONG_MAX' +- These are the maximum values that can be represented by a +- `signed long int' and `unsigned long int', respectively. +- +-`LONG_LONG_MIN' +- This is the minimum value that can be represented by a +- `signed long long int'. On most machines that the GNU C system +- runs on, `long long' integers are 64-bit quantities. +- +-`LONG_LONG_MAX' +-`ULONG_LONG_MAX' +- These are the maximum values that can be represented by a `signed +- long long int' and `unsigned long long int', respectively. +- +-`WCHAR_MAX' +- This is the maximum value that can be represented by a `wchar_t'. +- *Note Extended Char Intro::. +- +- The header file `limits.h' also defines some additional constants +-that parameterize various operating system and file system limits. +-These constants are described in *Note System Configuration::. +- +- +-File: libc.info, Node: Floating Type Macros, Next: Structure Measurement, Prev: Range of Type, Up: Data Type Measurements +- +-Floating Type Macros +--------------------- +- +- The specific representation of floating point numbers varies from +-machine to machine. Because floating point numbers are represented +-internally as approximate quantities, algorithms for manipulating +-floating point data often need to take account of the precise details of +-the machine's floating point representation. +- +- Some of the functions in the C library itself need this information; +-for example, the algorithms for printing and reading floating point +-numbers (*note I/O on Streams::) and for calculating trigonometric and +-irrational functions (*note Mathematics::) use it to avoid round-off +-error and loss of accuracy. User programs that implement numerical +-analysis techniques also often need this information in order to +-minimize or compute error bounds. +- +- The header file `float.h' describes the format used by your machine. +- +-* Menu: +- +-* Floating Point Concepts:: Definitions of terminology. +-* Floating Point Parameters:: Details of specific macros. +-* IEEE Floating Point:: The measurements for one common +- representation. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-52 glibc-2.3.2-200304020432/manual/libc.info-52 +--- glibc-2.3.2/manual/libc.info-52 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-52 Thu Jan 1 01:00:00 1970 +@@ -1,356 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Floating Point Concepts, Next: Floating Point Parameters, Up: Floating Type Macros +- +-Floating Point Representation Concepts +-...................................... +- +- This section introduces the terminology for describing floating point +-representations. +- +- You are probably already familiar with most of these concepts in +-terms of scientific or exponential notation for floating point numbers. +-For example, the number `123456.0' could be expressed in exponential +-notation as `1.23456e+05', a shorthand notation indicating that the +-mantissa `1.23456' is multiplied by the base `10' raised to power `5'. +- +- More formally, the internal representation of a floating point number +-can be characterized in terms of the following parameters: +- +- * The "sign" is either `-1' or `1'. +- +- * The "base" or "radix" for exponentiation, an integer greater than +- `1'. This is a constant for a particular representation. +- +- * The "exponent" to which the base is raised. The upper and lower +- bounds of the exponent value are constants for a particular +- representation. +- +- Sometimes, in the actual bits representing the floating point +- number, the exponent is "biased" by adding a constant to it, to +- make it always be represented as an unsigned quantity. This is +- only important if you have some reason to pick apart the bit +- fields making up the floating point number by hand, which is +- something for which the GNU library provides no support. So this +- is ignored in the discussion that follows. +- +- * The "mantissa" or "significand" is an unsigned integer which is a +- part of each floating point number. +- +- * The "precision" of the mantissa. If the base of the representation +- is B, then the precision is the number of base-B digits in the +- mantissa. This is a constant for a particular representation. +- +- Many floating point representations have an implicit "hidden bit" +- in the mantissa. This is a bit which is present virtually in the +- mantissa, but not stored in memory because its value is always 1 +- in a normalized number. The precision figure (see above) includes +- any hidden bits. +- +- Again, the GNU library provides no facilities for dealing with such +- low-level aspects of the representation. +- +- The mantissa of a floating point number represents an implicit +-fraction whose denominator is the base raised to the power of the +-precision. Since the largest representable mantissa is one less than +-this denominator, the value of the fraction is always strictly less +-than `1'. The mathematical value of a floating point number is then +-the product of this fraction, the sign, and the base raised to the +-exponent. +- +- We say that the floating point number is "normalized" if the +-fraction is at least `1/B', where B is the base. In other words, the +-mantissa would be too large to fit if it were multiplied by the base. +-Non-normalized numbers are sometimes called "denormal"; they contain +-less precision than the representation normally can hold. +- +- If the number is not normalized, then you can subtract `1' from the +-exponent while multiplying the mantissa by the base, and get another +-floating point number with the same value. "Normalization" consists of +-doing this repeatedly until the number is normalized. Two distinct +-normalized floating point numbers cannot be equal in value. +- +- (There is an exception to this rule: if the mantissa is zero, it is +-considered normalized. Another exception happens on certain machines +-where the exponent is as small as the representation can hold. Then it +-is impossible to subtract `1' from the exponent, so a number may be +-normalized even if its fraction is less than `1/B'.) +- +- +-File: libc.info, Node: Floating Point Parameters, Next: IEEE Floating Point, Prev: Floating Point Concepts, Up: Floating Type Macros +- +-Floating Point Parameters +-......................... +- +- These macro definitions can be accessed by including the header file +-`float.h' in your program. +- +- Macro names starting with `FLT_' refer to the `float' type, while +-names beginning with `DBL_' refer to the `double' type and names +-beginning with `LDBL_' refer to the `long double' type. (If GCC does +-not support `long double' as a distinct data type on a target machine +-then the values for the `LDBL_' constants are equal to the +-corresponding constants for the `double' type.) +- +- Of these macros, only `FLT_RADIX' is guaranteed to be a constant +-expression. The other macros listed here cannot be reliably used in +-places that require constant expressions, such as `#if' preprocessing +-directives or in the dimensions of static arrays. +- +- Although the ISO C standard specifies minimum and maximum values for +-most of these parameters, the GNU C implementation uses whatever values +-describe the floating point representation of the target machine. So in +-principle GNU C actually satisfies the ISO C requirements only if the +-target machine is suitable. In practice, all the machines currently +-supported are suitable. +- +-`FLT_ROUNDS' +- This value characterizes the rounding mode for floating point +- addition. The following values indicate standard rounding modes: +- +- `-1' +- The mode is indeterminable. +- +- `0' +- Rounding is towards zero. +- +- `1' +- Rounding is to the nearest number. +- +- `2' +- Rounding is towards positive infinity. +- +- `3' +- Rounding is towards negative infinity. +- +- Any other value represents a machine-dependent nonstandard rounding +- mode. +- +- On most machines, the value is `1', in accordance with the IEEE +- standard for floating point. +- +- Here is a table showing how certain values round for each possible +- value of `FLT_ROUNDS', if the other aspects of the representation +- match the IEEE single-precision standard. +- +- 0 1 2 3 +- 1.00000003 1.0 1.0 1.00000012 1.0 +- 1.00000007 1.0 1.00000012 1.00000012 1.0 +- -1.00000003 -1.0 -1.0 -1.0 -1.00000012 +- -1.00000007 -1.0 -1.00000012 -1.0 -1.00000012 +- +-`FLT_RADIX' +- This is the value of the base, or radix, of the exponent +- representation. This is guaranteed to be a constant expression, +- unlike the other macros described in this section. The value is 2 +- on all machines we know of except the IBM 360 and derivatives. +- +-`FLT_MANT_DIG' +- This is the number of base-`FLT_RADIX' digits in the floating point +- mantissa for the `float' data type. The following expression +- yields `1.0' (even though mathematically it should not) due to the +- limited number of mantissa digits: +- +- float radix = FLT_RADIX; +- +- 1.0f + 1.0f / radix / radix / ... / radix +- +- where `radix' appears `FLT_MANT_DIG' times. +- +-`DBL_MANT_DIG' +-`LDBL_MANT_DIG' +- This is the number of base-`FLT_RADIX' digits in the floating point +- mantissa for the data types `double' and `long double', +- respectively. +- +-`FLT_DIG' +- This is the number of decimal digits of precision for the `float' +- data type. Technically, if P and B are the precision and base +- (respectively) for the representation, then the decimal precision +- Q is the maximum number of decimal digits such that any floating +- point number with Q base 10 digits can be rounded to a floating +- point number with P base B digits and back again, without change +- to the Q decimal digits. +- +- The value of this macro is supposed to be at least `6', to satisfy +- ISO C. +- +-`DBL_DIG' +-`LDBL_DIG' +- These are similar to `FLT_DIG', but for the data types `double' +- and `long double', respectively. The values of these macros are +- supposed to be at least `10'. +- +-`FLT_MIN_EXP' +- This is the smallest possible exponent value for type `float'. +- More precisely, is the minimum negative integer such that the value +- `FLT_RADIX' raised to this power minus 1 can be represented as a +- normalized floating point number of type `float'. +- +-`DBL_MIN_EXP' +-`LDBL_MIN_EXP' +- These are similar to `FLT_MIN_EXP', but for the data types +- `double' and `long double', respectively. +- +-`FLT_MIN_10_EXP' +- This is the minimum negative integer such that `10' raised to this +- power minus 1 can be represented as a normalized floating point +- number of type `float'. This is supposed to be `-37' or even less. +- +-`DBL_MIN_10_EXP' +-`LDBL_MIN_10_EXP' +- These are similar to `FLT_MIN_10_EXP', but for the data types +- `double' and `long double', respectively. +- +-`FLT_MAX_EXP' +- This is the largest possible exponent value for type `float'. More +- precisely, this is the maximum positive integer such that value +- `FLT_RADIX' raised to this power minus 1 can be represented as a +- floating point number of type `float'. +- +-`DBL_MAX_EXP' +-`LDBL_MAX_EXP' +- These are similar to `FLT_MAX_EXP', but for the data types +- `double' and `long double', respectively. +- +-`FLT_MAX_10_EXP' +- This is the maximum positive integer such that `10' raised to this +- power minus 1 can be represented as a normalized floating point +- number of type `float'. This is supposed to be at least `37'. +- +-`DBL_MAX_10_EXP' +-`LDBL_MAX_10_EXP' +- These are similar to `FLT_MAX_10_EXP', but for the data types +- `double' and `long double', respectively. +- +-`FLT_MAX' +- The value of this macro is the maximum number representable in type +- `float'. It is supposed to be at least `1E+37'. The value has +- type `float'. +- +- The smallest representable number is `- FLT_MAX'. +- +-`DBL_MAX' +-`LDBL_MAX' +- These are similar to `FLT_MAX', but for the data types `double' +- and `long double', respectively. The type of the macro's value is +- the same as the type it describes. +- +-`FLT_MIN' +- The value of this macro is the minimum normalized positive floating +- point number that is representable in type `float'. It is supposed +- to be no more than `1E-37'. +- +-`DBL_MIN' +-`LDBL_MIN' +- These are similar to `FLT_MIN', but for the data types `double' +- and `long double', respectively. The type of the macro's value is +- the same as the type it describes. +- +-`FLT_EPSILON' +- This is the minimum positive floating point number of type `float' +- such that `1.0 + FLT_EPSILON != 1.0' is true. It's supposed to be +- no greater than `1E-5'. +- +-`DBL_EPSILON' +-`LDBL_EPSILON' +- These are similar to `FLT_EPSILON', but for the data types +- `double' and `long double', respectively. The type of the macro's +- value is the same as the type it describes. The values are not +- supposed to be greater than `1E-9'. +- +- +-File: libc.info, Node: IEEE Floating Point, Prev: Floating Point Parameters, Up: Floating Type Macros +- +-IEEE Floating Point +-................... +- +- Here is an example showing how the floating type measurements come +-out for the most common floating point representation, specified by the +-`IEEE Standard for Binary Floating Point Arithmetic (ANSI/IEEE Std +-754-1985)'. Nearly all computers designed since the 1980s use this +-format. +- +- The IEEE single-precision float representation uses a base of 2. +-There is a sign bit, a mantissa with 23 bits plus one hidden bit (so +-the total precision is 24 base-2 digits), and an 8-bit exponent that +-can represent values in the range -125 to 128, inclusive. +- +- So, for an implementation that uses this representation for the +-`float' data type, appropriate values for the corresponding parameters +-are: +- +- FLT_RADIX 2 +- FLT_MANT_DIG 24 +- FLT_DIG 6 +- FLT_MIN_EXP -125 +- FLT_MIN_10_EXP -37 +- FLT_MAX_EXP 128 +- FLT_MAX_10_EXP +38 +- FLT_MIN 1.17549435E-38F +- FLT_MAX 3.40282347E+38F +- FLT_EPSILON 1.19209290E-07F +- +- Here are the values for the `double' data type: +- +- DBL_MANT_DIG 53 +- DBL_DIG 15 +- DBL_MIN_EXP -1021 +- DBL_MIN_10_EXP -307 +- DBL_MAX_EXP 1024 +- DBL_MAX_10_EXP 308 +- DBL_MAX 1.7976931348623157E+308 +- DBL_MIN 2.2250738585072014E-308 +- DBL_EPSILON 2.2204460492503131E-016 +- +- +-File: libc.info, Node: Structure Measurement, Prev: Floating Type Macros, Up: Data Type Measurements +- +-Structure Field Offset Measurement +----------------------------------- +- +- You can use `offsetof' to measure the location within a structure +-type of a particular structure member. +- +- - Macro: size_t offsetof (TYPE, MEMBER) +- This expands to a integer constant expression that is the offset +- of the structure member named MEMBER in a the structure type TYPE. +- For example, `offsetof (struct s, elem)' is the offset, in bytes, +- of the member `elem' in a `struct s'. +- +- This macro won't work if MEMBER is a bit field; you get an error +- from the C compiler in that case. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-53 glibc-2.3.2-200304020432/manual/libc.info-53 +--- glibc-2.3.2/manual/libc.info-53 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-53 Thu Jan 1 01:00:00 1970 +@@ -1,7051 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Library Summary, Next: Installation, Prev: Language Features, Up: Top +- +-Summary of Library Facilities +-***************************** +- +- This appendix is a complete list of the facilities declared within +-the header files supplied with the GNU C library. Each entry also +-lists the standard or other source from which each facility is derived, +-and tells you where in the manual you can find more information about +-how to use it. +- +-`long int a64l (const char *STRING)' +- `stdlib.h' (XPG): *Note Encode Binary Data::. +- +-`void abort (void)' +- `stdlib.h' (ISO): *Note Aborting a Program::. +- +-`int abs (int NUMBER)' +- `stdlib.h' (ISO): *Note Absolute Value::. +- +-`int accept (int SOCKET, struct sockaddr *ADDR, socklen_t *LENGTH_PTR)' +- `sys/socket.h' (BSD): *Note Accepting Connections::. +- +-`int access (const char *FILENAME, int HOW)' +- `unistd.h' (POSIX.1): *Note Testing File Access::. +- +-`ACCOUNTING' +- `utmp.h' (SVID): *Note Manipulating the Database::. +- +-`double acos (double X)' +- `math.h' (ISO): *Note Inverse Trig Functions::. +- +-`float acosf (float X)' +- `math.h' (ISO): *Note Inverse Trig Functions::. +- +-`double acosh (double X)' +- `math.h' (ISO): *Note Hyperbolic Functions::. +- +-`float acoshf (float X)' +- `math.h' (ISO): *Note Hyperbolic Functions::. +- +-`long double acoshl (long double X)' +- `math.h' (ISO): *Note Hyperbolic Functions::. +- +-`long double acosl (long double X)' +- `math.h' (ISO): *Note Inverse Trig Functions::. +- +-`int addmntent (FILE *STREAM, const struct mntent *MNT)' +- `mntent.h' (BSD): *Note mtab::. +- +-`int adjtime (const struct timeval *DELTA, struct timeval *OLDDELTA)' +- `sys/time.h' (BSD): *Note High-Resolution Calendar::. +- +-`int adjtimex (struct timex *TIMEX)' +- `sys/timex.h' (GNU): *Note High-Resolution Calendar::. +- +-`AF_FILE' +- `sys/socket.h' (GNU): *Note Address Formats::. +- +-`AF_INET' +- `sys/socket.h' (BSD): *Note Address Formats::. +- +-`AF_INET6' +- `sys/socket.h' (IPv6 Basic API): *Note Address Formats::. +- +-`AF_LOCAL' +- `sys/socket.h' (POSIX): *Note Address Formats::. +- +-`AF_UNIX' +- `sys/socket.h' (BSD, Unix98): *Note Address Formats::. +- +-`AF_UNSPEC' +- `sys/socket.h' (BSD): *Note Address Formats::. +- +-`int aio_cancel (int FILDES, struct aiocb *AIOCBP)' +- `aio.h' (POSIX.1b): *Note Cancel AIO Operations::. +- +-`int aio_cancel64 (int FILDES, struct aiocb64 *AIOCBP)' +- `aio.h' (Unix98): *Note Cancel AIO Operations::. +- +-`int aio_error (const struct aiocb *AIOCBP)' +- `aio.h' (POSIX.1b): *Note Status of AIO Operations::. +- +-`int aio_error64 (const struct aiocb64 *AIOCBP)' +- `aio.h' (Unix98): *Note Status of AIO Operations::. +- +-`int aio_fsync (int OP, struct aiocb *AIOCBP)' +- `aio.h' (POSIX.1b): *Note Synchronizing AIO Operations::. +- +-`int aio_fsync64 (int OP, struct aiocb64 *AIOCBP)' +- `aio.h' (Unix98): *Note Synchronizing AIO Operations::. +- +-`void aio_init (const struct aioinit *INIT)' +- `aio.h' (GNU): *Note Configuration of AIO::. +- +-`int aio_read (struct aiocb *AIOCBP)' +- `aio.h' (POSIX.1b): *Note Asynchronous Reads/Writes::. +- +-`int aio_read64 (struct aiocb *AIOCBP)' +- `aio.h' (Unix98): *Note Asynchronous Reads/Writes::. +- +-`ssize_t aio_return (const struct aiocb *AIOCBP)' +- `aio.h' (POSIX.1b): *Note Status of AIO Operations::. +- +-`int aio_return64 (const struct aiocb64 *AIOCBP)' +- `aio.h' (Unix98): *Note Status of AIO Operations::. +- +-`int aio_suspend (const struct aiocb *const LIST[], int NENT, const struct timespec *TIMEOUT)' +- `aio.h' (POSIX.1b): *Note Synchronizing AIO Operations::. +- +-`int aio_suspend64 (const struct aiocb64 *const LIST[], int NENT, const struct timespec *TIMEOUT)' +- `aio.h' (Unix98): *Note Synchronizing AIO Operations::. +- +-`int aio_write (struct aiocb *AIOCBP)' +- `aio.h' (POSIX.1b): *Note Asynchronous Reads/Writes::. +- +-`int aio_write64 (struct aiocb *AIOCBP)' +- `aio.h' (Unix98): *Note Asynchronous Reads/Writes::. +- +-`unsigned int alarm (unsigned int SECONDS)' +- `unistd.h' (POSIX.1): *Note Setting an Alarm::. +- +-`void * alloca (size_t SIZE);' +- `stdlib.h' (GNU, BSD): *Note Variable Size Automatic::. +- +-`int alphasort (const void *A, const void *B)' +- `dirent.h' (BSD/SVID): *Note Scanning Directory Content::. +- +-`int alphasort64 (const void *A, const void *B)' +- `dirent.h' (GNU): *Note Scanning Directory Content::. +- +-`tcflag_t ALTWERASE' +- `termios.h' (BSD): *Note Local Modes::. +- +-`int ARG_MAX' +- `limits.h' (POSIX.1): *Note General Limits::. +- +-`error_t argp_err_exit_status' +- `argp.h' (GNU): *Note Argp Global Variables::. +- +-`void argp_error (const struct argp_state *STATE, const char *FMT, ...)' +- `argp.h' (GNU): *Note Argp Helper Functions::. +- +-`int ARGP_ERR_UNKNOWN' +- `argp.h' (GNU): *Note Argp Parser Functions::. +- +-`void argp_failure (const struct argp_state *STATE, int STATUS, int ERRNUM, const char *FMT, ...)' +- `argp.h' (GNU): *Note Argp Helper Functions::. +- +-`void argp_help (const struct argp *ARGP, FILE *STREAM, unsigned FLAGS, char *NAME)' +- `argp.h' (GNU): *Note Argp Help::. +- +-`ARGP_IN_ORDER' +- `argp.h' (GNU): *Note Argp Flags::. +- +-`ARGP_KEY_ARG' +- `argp.h' (GNU): *Note Argp Special Keys::. +- +-`ARGP_KEY_ARGS' +- `argp.h' (GNU): *Note Argp Special Keys::. +- +-`ARGP_KEY_END' +- `argp.h' (GNU): *Note Argp Special Keys::. +- +-`ARGP_KEY_ERROR' +- `argp.h' (GNU): *Note Argp Special Keys::. +- +-`ARGP_KEY_FINI' +- `argp.h' (GNU): *Note Argp Special Keys::. +- +-`ARGP_KEY_HELP_ARGS_DOC' +- `argp.h' (GNU): *Note Argp Help Filter Keys::. +- +-`ARGP_KEY_HELP_DUP_ARGS_NOTE' +- `argp.h' (GNU): *Note Argp Help Filter Keys::. +- +-`ARGP_KEY_HELP_EXTRA' +- `argp.h' (GNU): *Note Argp Help Filter Keys::. +- +-`ARGP_KEY_HELP_HEADER' +- `argp.h' (GNU): *Note Argp Help Filter Keys::. +- +-`ARGP_KEY_HELP_POST_DOC' +- `argp.h' (GNU): *Note Argp Help Filter Keys::. +- +-`ARGP_KEY_HELP_PRE_DOC' +- `argp.h' (GNU): *Note Argp Help Filter Keys::. +- +-`ARGP_KEY_INIT' +- `argp.h' (GNU): *Note Argp Special Keys::. +- +-`ARGP_KEY_NO_ARGS' +- `argp.h' (GNU): *Note Argp Special Keys::. +- +-`ARGP_KEY_SUCCESS' +- `argp.h' (GNU): *Note Argp Special Keys::. +- +-`ARGP_LONG_ONLY' +- `argp.h' (GNU): *Note Argp Flags::. +- +-`ARGP_NO_ARGS' +- `argp.h' (GNU): *Note Argp Flags::. +- +-`ARGP_NO_ERRS' +- `argp.h' (GNU): *Note Argp Flags::. +- +-`ARGP_NO_EXIT' +- `argp.h' (GNU): *Note Argp Flags::. +- +-`ARGP_NO_HELP' +- `argp.h' (GNU): *Note Argp Flags::. +- +-`error_t argp_parse (const struct argp *ARGP, int ARGC, char **ARGV, unsigned FLAGS, int *ARG_INDEX, void *INPUT)' +- `argp.h' (GNU): *Note Suboptions: Argp. +- +-`ARGP_PARSE_ARGV0' +- `argp.h' (GNU): *Note Argp Flags::. +- +-`const char * argp_program_bug_address' +- `argp.h' (GNU): *Note Argp Global Variables::. +- +-`const char * argp_program_version' +- `argp.h' (GNU): *Note Argp Global Variables::. +- +-`argp_program_version_hook' +- `argp.h' (GNU): *Note Argp Global Variables::. +- +-`ARGP_SILENT' +- `argp.h' (GNU): *Note Argp Flags::. +- +-`void argp_state_help (const struct argp_state *STATE, FILE *STREAM, unsigned FLAGS)' +- `argp.h' (GNU): *Note Argp Helper Functions::. +- +-`void argp_usage (const struct argp_state *STATE)' +- `argp.h' (GNU): *Note Argp Helper Functions::. +- +-`error_t argz_add (char **ARGZ, size_t *ARGZ_LEN, const char *STR)' +- `argz.h' (GNU): *Note Argz Functions::. +- +-`error_t argz_add_sep (char **ARGZ, size_t *ARGZ_LEN, const char *STR, int DELIM)' +- `argz.h' (GNU): *Note Argz Functions::. +- +-`error_t argz_append (char **ARGZ, size_t *ARGZ_LEN, const char *BUF, size_t BUF_LEN)' +- `argz.h' (GNU): *Note Argz Functions::. +- +-`size_t argz_count (const char *ARGZ, size_t ARG_LEN)' +- `argz.h' (GNU): *Note Argz Functions::. +- +-`error_t argz_create (char *const ARGV[], char **ARGZ, size_t *ARGZ_LEN)' +- `argz.h' (GNU): *Note Argz Functions::. +- +-`error_t argz_create_sep (const char *STRING, int SEP, char **ARGZ, size_t *ARGZ_LEN)' +- `argz.h' (GNU): *Note Argz Functions::. +- +-`error_t argz_delete (char **ARGZ, size_t *ARGZ_LEN, char *ENTRY)' +- `argz.h' (GNU): *Note Argz Functions::. +- +-`void argz_extract (char *ARGZ, size_t ARGZ_LEN, char **ARGV)' +- `argz.h' (GNU): *Note Argz Functions::. +- +-`error_t argz_insert (char **ARGZ, size_t *ARGZ_LEN, char *BEFORE, const char *ENTRY)' +- `argz.h' (GNU): *Note Argz Functions::. +- +-`char * argz_next (char *ARGZ, size_t ARGZ_LEN, const char *ENTRY)' +- `argz.h' (GNU): *Note Argz Functions::. +- +-`error_t argz_replace (char **ARGZ, size_t *ARGZ_LEN, const char *STR, const char *WITH, unsigned *REPLACE_COUNT)' +- `argz.h' (GNU): *Note Argz Functions::. +- +-`void argz_stringify (char *ARGZ, size_t LEN, int SEP)' +- `argz.h' (GNU): *Note Argz Functions::. +- +-`char * asctime (const struct tm *BROKENTIME)' +- `time.h' (ISO): *Note Formatting Calendar Time::. +- +-`char * asctime_r (const struct tm *BROKENTIME, char *BUFFER)' +- `time.h' (POSIX.1c): *Note Formatting Calendar Time::. +- +-`double asin (double X)' +- `math.h' (ISO): *Note Inverse Trig Functions::. +- +-`float asinf (float X)' +- `math.h' (ISO): *Note Inverse Trig Functions::. +- +-`double asinh (double X)' +- `math.h' (ISO): *Note Hyperbolic Functions::. +- +-`float asinhf (float X)' +- `math.h' (ISO): *Note Hyperbolic Functions::. +- +-`long double asinhl (long double X)' +- `math.h' (ISO): *Note Hyperbolic Functions::. +- +-`long double asinl (long double X)' +- `math.h' (ISO): *Note Inverse Trig Functions::. +- +-`int asprintf (char **PTR, const char *TEMPLATE, ...)' +- `stdio.h' (GNU): *Note Dynamic Output::. +- +-`void assert (int EXPRESSION)' +- `assert.h' (ISO): *Note Consistency Checking::. +- +-`void assert_perror (int ERRNUM)' +- `assert.h' (GNU): *Note Consistency Checking::. +- +-`double atan (double X)' +- `math.h' (ISO): *Note Inverse Trig Functions::. +- +-`double atan2 (double Y, double X)' +- `math.h' (ISO): *Note Inverse Trig Functions::. +- +-`float atan2f (float Y, float X)' +- `math.h' (ISO): *Note Inverse Trig Functions::. +- +-`long double atan2l (long double Y, long double X)' +- `math.h' (ISO): *Note Inverse Trig Functions::. +- +-`float atanf (float X)' +- `math.h' (ISO): *Note Inverse Trig Functions::. +- +-`double atanh (double X)' +- `math.h' (ISO): *Note Hyperbolic Functions::. +- +-`float atanhf (float X)' +- `math.h' (ISO): *Note Hyperbolic Functions::. +- +-`long double atanhl (long double X)' +- `math.h' (ISO): *Note Hyperbolic Functions::. +- +-`long double atanl (long double X)' +- `math.h' (ISO): *Note Inverse Trig Functions::. +- +-`int atexit (void (*FUNCTION) (void))' +- `stdlib.h' (ISO): *Note Cleanups on Exit::. +- +-`double atof (const char *STRING)' +- `stdlib.h' (ISO): *Note Parsing of Floats::. +- +-`int atoi (const char *STRING)' +- `stdlib.h' (ISO): *Note Parsing of Integers::. +- +-`long int atol (const char *STRING)' +- `stdlib.h' (ISO): *Note Parsing of Integers::. +- +-`long long int atoll (const char *STRING)' +- `stdlib.h' (ISO): *Note Parsing of Integers::. +- +-`B0' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`B110' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`B115200' +- `termios.h' (GNU): *Note Line Speed::. +- +-`B1200' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`B134' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`B150' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`B1800' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`B19200' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`B200' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`B230400' +- `termios.h' (GNU): *Note Line Speed::. +- +-`B2400' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`B300' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`B38400' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`B460800' +- `termios.h' (GNU): *Note Line Speed::. +- +-`B4800' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`B50' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`B57600' +- `termios.h' (GNU): *Note Line Speed::. +- +-`B600' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`B75' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`B9600' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`int backtrace (void **BUFFER, int SIZE)' +- `execinfo.h' (GNU): *Note Backtraces::. +- +-`char ** backtrace_symbols (void *const *BUFFER, int SIZE)' +- `execinfo.h' (GNU): *Note Backtraces::. +- +-`void backtrace_symbols_fd (void *const *BUFFER, int SIZE, int FD)' +- `execinfo.h' (GNU): *Note Backtraces::. +- +-`char * basename (char *PATH)' +- `libgen.h' (XPG): *Note Finding Tokens in a String::. +- +-`char * basename (const char *FILENAME)' +- `string.h' (GNU): *Note Finding Tokens in a String::. +- +-`int BC_BASE_MAX' +- `limits.h' (POSIX.2): *Note Utility Limits::. +- +-`int BC_DIM_MAX' +- `limits.h' (POSIX.2): *Note Utility Limits::. +- +-`int bcmp (const void *A1, const void *A2, size_t SIZE)' +- `string.h' (BSD): *Note String/Array Comparison::. +- +-`void bcopy (const void *FROM, void *TO, size_t SIZE)' +- `string.h' (BSD): *Note Copying and Concatenation::. +- +-`int BC_SCALE_MAX' +- `limits.h' (POSIX.2): *Note Utility Limits::. +- +-`int BC_STRING_MAX' +- `limits.h' (POSIX.2): *Note Utility Limits::. +- +-`int bind (int SOCKET, struct sockaddr *ADDR, socklen_t LENGTH)' +- `sys/socket.h' (BSD): *Note Setting Address::. +- +-`char * bindtextdomain (const char *DOMAINNAME, const char *DIRNAME)' +- `libintl.h' (GNU): *Note Locating gettext catalog::. +- +-`char * bind_textdomain_codeset (const char *DOMAINNAME, const char *CODESET)' +- `libintl.h' (GNU): *Note Charset conversion in gettext::. +- +-`blkcnt64_t' +- `sys/types.h' (Unix98): *Note Attribute Meanings::. +- +-`blkcnt_t' +- `sys/types.h' (Unix98): *Note Attribute Meanings::. +- +-`BOOT_TIME' +- `utmp.h' (SVID): *Note Manipulating the Database::. +- +-`BOOT_TIME' +- `utmpx.h' (XPG4.2): *Note XPG Functions::. +- +-`int brk (void *ADDR)' +- `unistd.h' (BSD): *Note Resizing the Data Segment::. +- +-`tcflag_t BRKINT' +- `termios.h' (POSIX.1): *Note Input Modes::. +- +-`_BSD_SOURCE' +- (GNU): *Note Feature Test Macros::. +- +-`void * bsearch (const void *KEY, const void *ARRAY, size_t COUNT, size_t SIZE, comparison_fn_t COMPARE)' +- `stdlib.h' (ISO): *Note Array Search Function::. +- +-`wint_t btowc (int C)' +- `wchar.h' (ISO): *Note Converting a Character::. +- +-`int BUFSIZ' +- `stdio.h' (ISO): *Note Controlling Buffering::. +- +-`void bzero (void *BLOCK, size_t SIZE)' +- `string.h' (BSD): *Note Copying and Concatenation::. +- +-`double cabs (complex double Z)' +- `complex.h' (ISO): *Note Absolute Value::. +- +-`float cabsf (complex float Z)' +- `complex.h' (ISO): *Note Absolute Value::. +- +-`long double cabsl (complex long double Z)' +- `complex.h' (ISO): *Note Absolute Value::. +- +-`complex double cacos (complex double Z)' +- `complex.h' (ISO): *Note Inverse Trig Functions::. +- +-`complex float cacosf (complex float Z)' +- `complex.h' (ISO): *Note Inverse Trig Functions::. +- +-`complex double cacosh (complex double Z)' +- `complex.h' (ISO): *Note Hyperbolic Functions::. +- +-`complex float cacoshf (complex float Z)' +- `complex.h' (ISO): *Note Hyperbolic Functions::. +- +-`complex long double cacoshl (complex long double Z)' +- `complex.h' (ISO): *Note Hyperbolic Functions::. +- +-`complex long double cacosl (complex long double Z)' +- `complex.h' (ISO): *Note Inverse Trig Functions::. +- +-`void * calloc (size_t COUNT, size_t ELTSIZE)' +- `malloc.h', `stdlib.h' (ISO): *Note Allocating Cleared Space::. +- +-`char * canonicalize_file_name (const char *NAME)' +- `stdlib.h' (GNU): *Note Symbolic Links::. +- +-`double carg (complex double Z)' +- `complex.h' (ISO): *Note Operations on Complex::. +- +-`float cargf (complex float Z)' +- `complex.h' (ISO): *Note Operations on Complex::. +- +-`long double cargl (complex long double Z)' +- `complex.h' (ISO): *Note Operations on Complex::. +- +-`complex double casin (complex double Z)' +- `complex.h' (ISO): *Note Inverse Trig Functions::. +- +-`complex float casinf (complex float Z)' +- `complex.h' (ISO): *Note Inverse Trig Functions::. +- +-`complex double casinh (complex double Z)' +- `complex.h' (ISO): *Note Hyperbolic Functions::. +- +-`complex float casinhf (complex float Z)' +- `complex.h' (ISO): *Note Hyperbolic Functions::. +- +-`complex long double casinhl (complex long double Z)' +- `complex.h' (ISO): *Note Hyperbolic Functions::. +- +-`complex long double casinl (complex long double Z)' +- `complex.h' (ISO): *Note Inverse Trig Functions::. +- +-`complex double catan (complex double Z)' +- `complex.h' (ISO): *Note Inverse Trig Functions::. +- +-`complex float catanf (complex float Z)' +- `complex.h' (ISO): *Note Inverse Trig Functions::. +- +-`complex double catanh (complex double Z)' +- `complex.h' (ISO): *Note Hyperbolic Functions::. +- +-`complex float catanhf (complex float Z)' +- `complex.h' (ISO): *Note Hyperbolic Functions::. +- +-`complex long double catanhl (complex long double Z)' +- `complex.h' (ISO): *Note Hyperbolic Functions::. +- +-`complex long double catanl (complex long double Z)' +- `complex.h' (ISO): *Note Inverse Trig Functions::. +- +-`nl_catd catopen (const char *CAT_NAME, int FLAG)' +- `nl_types.h' (X/Open): *Note The catgets Functions::. +- +-`int cbc_crypt (char *KEY, char *BLOCKS, unsigned LEN, unsigned MODE, char *IVEC)' +- `rpc/des_crypt.h' (SUNRPC): *Note DES Encryption::. +- +-`double cbrt (double X)' +- `math.h' (BSD): *Note Exponents and Logarithms::. +- +-`float cbrtf (float X)' +- `math.h' (BSD): *Note Exponents and Logarithms::. +- +-`long double cbrtl (long double X)' +- `math.h' (BSD): *Note Exponents and Logarithms::. +- +-`complex double ccos (complex double Z)' +- `complex.h' (ISO): *Note Trig Functions::. +- +-`complex float ccosf (complex float Z)' +- `complex.h' (ISO): *Note Trig Functions::. +- +-`complex double ccosh (complex double Z)' +- `complex.h' (ISO): *Note Hyperbolic Functions::. +- +-`complex float ccoshf (complex float Z)' +- `complex.h' (ISO): *Note Hyperbolic Functions::. +- +-`complex long double ccoshl (complex long double Z)' +- `complex.h' (ISO): *Note Hyperbolic Functions::. +- +-`complex long double ccosl (complex long double Z)' +- `complex.h' (ISO): *Note Trig Functions::. +- +-`cc_t' +- `termios.h' (POSIX.1): *Note Mode Data Types::. +- +-`tcflag_t CCTS_OFLOW' +- `termios.h' (BSD): *Note Control Modes::. +- +-`double ceil (double X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`float ceilf (float X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`long double ceill (long double X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`complex double cexp (complex double Z)' +- `complex.h' (ISO): *Note Exponents and Logarithms::. +- +-`complex float cexpf (complex float Z)' +- `complex.h' (ISO): *Note Exponents and Logarithms::. +- +-`complex long double cexpl (complex long double Z)' +- `complex.h' (ISO): *Note Exponents and Logarithms::. +- +-`speed_t cfgetispeed (const struct termios *TERMIOS-P)' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`speed_t cfgetospeed (const struct termios *TERMIOS-P)' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`void cfmakeraw (struct termios *TERMIOS-P)' +- `termios.h' (BSD): *Note Noncanonical Input::. +- +-`void cfree (void *PTR)' +- `stdlib.h' (Sun): *Note Freeing after Malloc::. +- +-`int cfsetispeed (struct termios *TERMIOS-P, speed_t SPEED)' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`int cfsetospeed (struct termios *TERMIOS-P, speed_t SPEED)' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`int cfsetspeed (struct termios *TERMIOS-P, speed_t SPEED)' +- `termios.h' (BSD): *Note Line Speed::. +- +-`CHAR_BIT' +- `limits.h' (ISO): *Note Width of Type::. +- +-`CHAR_MAX' +- `limits.h' (ISO): *Note Range of Type::. +- +-`CHAR_MIN' +- `limits.h' (ISO): *Note Range of Type::. +- +-`int chdir (const char *FILENAME)' +- `unistd.h' (POSIX.1): *Note Working Directory::. +- +-`int CHILD_MAX' +- `limits.h' (POSIX.1): *Note General Limits::. +- +-`int chmod (const char *FILENAME, mode_t MODE)' +- `sys/stat.h' (POSIX.1): *Note Setting Permissions::. +- +-`int chown (const char *FILENAME, uid_t OWNER, gid_t GROUP)' +- `unistd.h' (POSIX.1): *Note File Owner::. +- +-`tcflag_t CIGNORE' +- `termios.h' (BSD): *Note Control Modes::. +- +-`double cimag (complex double Z)' +- `complex.h' (ISO): *Note Operations on Complex::. +- +-`float cimagf (complex float Z)' +- `complex.h' (ISO): *Note Operations on Complex::. +- +-`long double cimagl (complex long double Z)' +- `complex.h' (ISO): *Note Operations on Complex::. +- +-`int clearenv (void)' +- `stdlib.h' (GNU): *Note Environment Access::. +- +-`void clearerr (FILE *STREAM)' +- `stdio.h' (ISO): *Note Error Recovery::. +- +-`void clearerr_unlocked (FILE *STREAM)' +- `stdio.h' (GNU): *Note Error Recovery::. +- +-`int CLK_TCK' +- `time.h' (POSIX.1): *Note CPU Time::. +- +-`tcflag_t CLOCAL' +- `termios.h' (POSIX.1): *Note Control Modes::. +- +-`clock_t clock (void)' +- `time.h' (ISO): *Note CPU Time::. +- +-`int CLOCKS_PER_SEC' +- `time.h' (ISO): *Note CPU Time::. +- +-`clock_t' +- `time.h' (ISO): *Note CPU Time::. +- +-`complex double clog (complex double Z)' +- `complex.h' (ISO): *Note Exponents and Logarithms::. +- +-`complex double clog10 (complex double Z)' +- `complex.h' (GNU): *Note Exponents and Logarithms::. +- +-`complex float clog10f (complex float Z)' +- `complex.h' (GNU): *Note Exponents and Logarithms::. +- +-`complex long double clog10l (complex long double Z)' +- `complex.h' (GNU): *Note Exponents and Logarithms::. +- +-`complex float clogf (complex float Z)' +- `complex.h' (ISO): *Note Exponents and Logarithms::. +- +-`complex long double clogl (complex long double Z)' +- `complex.h' (ISO): *Note Exponents and Logarithms::. +- +-`int close (int FILEDES)' +- `unistd.h' (POSIX.1): *Note Opening and Closing Files::. +- +-`int closedir (DIR *DIRSTREAM)' +- `dirent.h' (POSIX.1): *Note Reading/Closing Directory::. +- +-`void closelog (void)' +- `syslog.h' (BSD): *Note closelog::. +- +-`int COLL_WEIGHTS_MAX' +- `limits.h' (POSIX.2): *Note Utility Limits::. +- +-`size_t confstr (int PARAMETER, char *BUF, size_t LEN)' +- `unistd.h' (POSIX.2): *Note String Parameters::. +- +-`complex double conj (complex double Z)' +- `complex.h' (ISO): *Note Operations on Complex::. +- +-`complex float conjf (complex float Z)' +- `complex.h' (ISO): *Note Operations on Complex::. +- +-`complex long double conjl (complex long double Z)' +- `complex.h' (ISO): *Note Operations on Complex::. +- +-`int connect (int SOCKET, struct sockaddr *ADDR, socklen_t LENGTH)' +- `sys/socket.h' (BSD): *Note Connecting::. +- +-`cookie_close_function' +- `stdio.h' (GNU): *Note Hook Functions::. +- +-`cookie_io_functions_t' +- `stdio.h' (GNU): *Note Streams and Cookies::. +- +-`cookie_read_function' +- `stdio.h' (GNU): *Note Hook Functions::. +- +-`cookie_seek_function' +- `stdio.h' (GNU): *Note Hook Functions::. +- +-`cookie_write_function' +- `stdio.h' (GNU): *Note Hook Functions::. +- +-`double copysign (double X, double Y)' +- `math.h' (ISO): *Note FP Bit Twiddling::. +- +-`float copysignf (float X, float Y)' +- `math.h' (ISO): *Note FP Bit Twiddling::. +- +-`long double copysignl (long double X, long double Y)' +- `math.h' (ISO): *Note FP Bit Twiddling::. +- +-`double cos (double X)' +- `math.h' (ISO): *Note Trig Functions::. +- +-`float cosf (float X)' +- `math.h' (ISO): *Note Trig Functions::. +- +-`double cosh (double X)' +- `math.h' (ISO): *Note Hyperbolic Functions::. +- +-`float coshf (float X)' +- `math.h' (ISO): *Note Hyperbolic Functions::. +- +-`long double coshl (long double X)' +- `math.h' (ISO): *Note Hyperbolic Functions::. +- +-`long double cosl (long double X)' +- `math.h' (ISO): *Note Trig Functions::. +- +-`complex double cpow (complex double BASE, complex double POWER)' +- `complex.h' (ISO): *Note Exponents and Logarithms::. +- +-`complex float cpowf (complex float BASE, complex float POWER)' +- `complex.h' (ISO): *Note Exponents and Logarithms::. +- +-`complex long double cpowl (complex long double BASE, complex long double POWER)' +- `complex.h' (ISO): *Note Exponents and Logarithms::. +- +-`complex double cproj (complex double Z)' +- `complex.h' (ISO): *Note Operations on Complex::. +- +-`complex float cprojf (complex float Z)' +- `complex.h' (ISO): *Note Operations on Complex::. +- +-`complex long double cprojl (complex long double Z)' +- `complex.h' (ISO): *Note Operations on Complex::. +- +-`tcflag_t CREAD' +- `termios.h' (POSIX.1): *Note Control Modes::. +- +-`double creal (complex double Z)' +- `complex.h' (ISO): *Note Operations on Complex::. +- +-`float crealf (complex float Z)' +- `complex.h' (ISO): *Note Operations on Complex::. +- +-`long double creall (complex long double Z)' +- `complex.h' (ISO): *Note Operations on Complex::. +- +-`int creat (const char *FILENAME, mode_t MODE)' +- `fcntl.h' (POSIX.1): *Note Opening and Closing Files::. +- +-`int creat64 (const char *FILENAME, mode_t MODE)' +- `fcntl.h' (Unix98): *Note Opening and Closing Files::. +- +-`tcflag_t CRTS_IFLOW' +- `termios.h' (BSD): *Note Control Modes::. +- +-`char * crypt (const char *KEY, const char *SALT)' +- `crypt.h' (BSD, SVID): *Note crypt::. +- +-`char * crypt_r (const char *KEY, const char *SALT, struct crypt_data * DATA)' +- `crypt.h' (GNU): *Note crypt::. +- +-`tcflag_t CS5' +- `termios.h' (POSIX.1): *Note Control Modes::. +- +-`tcflag_t CS6' +- `termios.h' (POSIX.1): *Note Control Modes::. +- +-`tcflag_t CS7' +- `termios.h' (POSIX.1): *Note Control Modes::. +- +-`tcflag_t CS8' +- `termios.h' (POSIX.1): *Note Control Modes::. +- +-`complex double csin (complex double Z)' +- `complex.h' (ISO): *Note Trig Functions::. +- +-`complex float csinf (complex float Z)' +- `complex.h' (ISO): *Note Trig Functions::. +- +-`complex double csinh (complex double Z)' +- `complex.h' (ISO): *Note Hyperbolic Functions::. +- +-`complex float csinhf (complex float Z)' +- `complex.h' (ISO): *Note Hyperbolic Functions::. +- +-`complex long double csinhl (complex long double Z)' +- `complex.h' (ISO): *Note Hyperbolic Functions::. +- +-`complex long double csinl (complex long double Z)' +- `complex.h' (ISO): *Note Trig Functions::. +- +-`tcflag_t CSIZE' +- `termios.h' (POSIX.1): *Note Control Modes::. +- +-`_CS_LFS64_CFLAGS' +- `unistd.h' (Unix98): *Note String Parameters::. +- +-`_CS_LFS64_LDFLAGS' +- `unistd.h' (Unix98): *Note String Parameters::. +- +-`_CS_LFS64_LIBS' +- `unistd.h' (Unix98): *Note String Parameters::. +- +-`_CS_LFS64_LINTFLAGS' +- `unistd.h' (Unix98): *Note String Parameters::. +- +-`_CS_LFS_CFLAGS' +- `unistd.h' (Unix98): *Note String Parameters::. +- +-`_CS_LFS_LDFLAGS' +- `unistd.h' (Unix98): *Note String Parameters::. +- +-`_CS_LFS_LIBS' +- `unistd.h' (Unix98): *Note String Parameters::. +- +-`_CS_LFS_LINTFLAGS' +- `unistd.h' (Unix98): *Note String Parameters::. +- +-`_CS_PATH' +- `unistd.h' (POSIX.2): *Note String Parameters::. +- +-`complex double csqrt (complex double Z)' +- `complex.h' (ISO): *Note Exponents and Logarithms::. +- +-`complex float csqrtf (complex float Z)' +- `complex.h' (ISO): *Note Exponents and Logarithms::. +- +-`complex long double csqrtl (complex long double Z)' +- `complex.h' (ISO): *Note Exponents and Logarithms::. +- +-`tcflag_t CSTOPB' +- `termios.h' (POSIX.1): *Note Control Modes::. +- +-`complex double ctan (complex double Z)' +- `complex.h' (ISO): *Note Trig Functions::. +- +-`complex float ctanf (complex float Z)' +- `complex.h' (ISO): *Note Trig Functions::. +- +-`complex double ctanh (complex double Z)' +- `complex.h' (ISO): *Note Hyperbolic Functions::. +- +-`complex float ctanhf (complex float Z)' +- `complex.h' (ISO): *Note Hyperbolic Functions::. +- +-`complex long double ctanhl (complex long double Z)' +- `complex.h' (ISO): *Note Hyperbolic Functions::. +- +-`complex long double ctanl (complex long double Z)' +- `complex.h' (ISO): *Note Trig Functions::. +- +-`char * ctermid (char *STRING)' +- `stdio.h' (POSIX.1): *Note Identifying the Terminal::. +- +-`char * ctime (const time_t *TIME)' +- `time.h' (ISO): *Note Formatting Calendar Time::. +- +-`char * ctime_r (const time_t *TIME, char *BUFFER)' +- `time.h' (POSIX.1c): *Note Formatting Calendar Time::. +- +-`char * cuserid (char *STRING)' +- `stdio.h' (POSIX.1): *Note Who Logged In::. +- +-`int daylight' +- `time.h' (SVID): *Note Time Zone Functions::. +- +-`DBL_DIG' +- `float.h' (ISO): *Note Floating Point Parameters::. +- +-`DBL_EPSILON' +- `float.h' (ISO): *Note Floating Point Parameters::. +- +-`DBL_MANT_DIG' +- `float.h' (ISO): *Note Floating Point Parameters::. +- +-`DBL_MAX' +- `float.h' (ISO): *Note Floating Point Parameters::. +- +-`DBL_MAX_10_EXP' +- `float.h' (ISO): *Note Floating Point Parameters::. +- +-`DBL_MAX_EXP' +- `float.h' (ISO): *Note Floating Point Parameters::. +- +-`DBL_MIN' +- `float.h' (ISO): *Note Floating Point Parameters::. +- +-`DBL_MIN_10_EXP' +- `float.h' (ISO): *Note Floating Point Parameters::. +- +-`DBL_MIN_EXP' +- `float.h' (ISO): *Note Floating Point Parameters::. +- +-`char * dcgettext (const char *DOMAINNAME, const char *MSGID, int CATEGORY)' +- `libintl.h' (GNU): *Note Translation with gettext::. +- +-`char * dcngettext (const char *DOMAIN, const char *MSGID1, const char *MSGID2, unsigned long int N, int CATEGORY)' +- `libintl.h' (GNU): *Note Advanced gettext functions::. +- +-`DEAD_PROCESS' +- `utmp.h' (SVID): *Note Manipulating the Database::. +- +-`DEAD_PROCESS' +- `utmpx.h' (XPG4.2): *Note XPG Functions::. +- +-`DES_DECRYPT' +- `rpc/des_crypt.h' (SUNRPC): *Note DES Encryption::. +- +-`DES_ENCRYPT' +- `rpc/des_crypt.h' (SUNRPC): *Note DES Encryption::. +- +-`DESERR_BADPARAM' +- `rpc/des_crypt.h' (SUNRPC): *Note DES Encryption::. +- +-`DESERR_HWERROR' +- `rpc/des_crypt.h' (SUNRPC): *Note DES Encryption::. +- +-`DESERR_NOHWDEVICE' +- `rpc/des_crypt.h' (SUNRPC): *Note DES Encryption::. +- +-`DESERR_NONE' +- `rpc/des_crypt.h' (SUNRPC): *Note DES Encryption::. +- +-`int DES_FAILED (int ERR)' +- `rpc/des_crypt.h' (SUNRPC): *Note DES Encryption::. +- +-`DES_HW' +- `rpc/des_crypt.h' (SUNRPC): *Note DES Encryption::. +- +-`void des_setparity (char *KEY)' +- `rpc/des_crypt.h' (SUNRPC): *Note DES Encryption::. +- +-`DES_SW' +- `rpc/des_crypt.h' (SUNRPC): *Note DES Encryption::. +- +-`dev_t' +- `sys/types.h' (POSIX.1): *Note Attribute Meanings::. +- +-`char * dgettext (const char *DOMAINNAME, const char *MSGID)' +- `libintl.h' (GNU): *Note Translation with gettext::. +- +-`double difftime (time_t TIME1, time_t TIME0)' +- `time.h' (ISO): *Note Elapsed Time::. +- +-`DIR' +- `dirent.h' (POSIX.1): *Note Opening a Directory::. +- +-`int dirfd (DIR *DIRSTREAM)' +- `dirent.h' (GNU): *Note Opening a Directory::. +- +-`char * dirname (char *PATH)' +- `libgen.h' (XPG): *Note Finding Tokens in a String::. +- +-`div_t div (int NUMERATOR, int DENOMINATOR)' +- `stdlib.h' (ISO): *Note Integer Division::. +- +-`div_t' +- `stdlib.h' (ISO): *Note Integer Division::. +- +-`char * dngettext (const char *DOMAIN, const char *MSGID1, const char *MSGID2, unsigned long int N)' +- `libintl.h' (GNU): *Note Advanced gettext functions::. +- +-`double drand48 (void)' +- `stdlib.h' (SVID): *Note SVID Random::. +- +-`int drand48_r (struct drand48_data *BUFFER, double *RESULT)' +- `stdlib.h' (GNU): *Note SVID Random::. +- +-`double drem (double NUMERATOR, double DENOMINATOR)' +- `math.h' (BSD): *Note Remainder Functions::. +- +-`float dremf (float NUMERATOR, float DENOMINATOR)' +- `math.h' (BSD): *Note Remainder Functions::. +- +-`long double dreml (long double NUMERATOR, long double DENOMINATOR)' +- `math.h' (BSD): *Note Remainder Functions::. +- +-`mode_t DTTOIF (int DTYPE)' +- `dirent.h' (BSD): *Note Directory Entries::. +- +-`int dup (int OLD)' +- `unistd.h' (POSIX.1): *Note Duplicating Descriptors::. +- +-`int dup2 (int OLD, int NEW)' +- `unistd.h' (POSIX.1): *Note Duplicating Descriptors::. +- +-`int E2BIG' +- `errno.h' (POSIX.1: Argument list too long): *Note Error Codes::. +- +-`int EACCES' +- `errno.h' (POSIX.1: Permission denied): *Note Error Codes::. +- +-`int EADDRINUSE' +- `errno.h' (BSD: Address already in use): *Note Error Codes::. +- +-`int EADDRNOTAVAIL' +- `errno.h' (BSD: Cannot assign requested address): *Note Error +- Codes::. +- +-`int EADV' +- `errno.h' (Linux???: Advertise error): *Note Error Codes::. +- +-`int EAFNOSUPPORT' +- `errno.h' (BSD: Address family not supported by protocol): *Note +- Error Codes::. +- +-`int EAGAIN' +- `errno.h' (POSIX.1: Resource temporarily unavailable): *Note +- Error Codes::. +- +-`int EALREADY' +- `errno.h' (BSD: Operation already in progress): *Note Error +- Codes::. +- +-`int EAUTH' +- `errno.h' (BSD: Authentication error): *Note Error Codes::. +- +-`int EBACKGROUND' +- `errno.h' (GNU: Inappropriate operation for background process): +- *Note Error Codes::. +- +-`int EBADE' +- `errno.h' (Linux???: Invalid exchange): *Note Error Codes::. +- +-`int EBADF' +- `errno.h' (POSIX.1: Bad file descriptor): *Note Error Codes::. +- +-`int EBADFD' +- `errno.h' (Linux???: File descriptor in bad state): *Note Error +- Codes::. +- +-`int EBADMSG' +- `errno.h' (XOPEN: Bad message): *Note Error Codes::. +- +-`int EBADR' +- `errno.h' (Linux???: Invalid request descriptor): *Note Error +- Codes::. +- +-`int EBADRPC' +- `errno.h' (BSD: RPC struct is bad): *Note Error Codes::. +- +-`int EBADRQC' +- `errno.h' (Linux???: Invalid request code): *Note Error Codes::. +- +-`int EBADSLT' +- `errno.h' (Linux???: Invalid slot): *Note Error Codes::. +- +-`int EBFONT' +- `errno.h' (Linux???: Bad font file format): *Note Error Codes::. +- +-`int EBUSY' +- `errno.h' (POSIX.1: Device or resource busy): *Note Error Codes::. +- +-`int ECANCELED' +- `errno.h' (POSIX.1: Operation canceled): *Note Error Codes::. +- +-`int ecb_crypt (char *KEY, char *BLOCKS, unsigned LEN, unsigned MODE)' +- `rpc/des_crypt.h' (SUNRPC): *Note DES Encryption::. +- +-`int ECHILD' +- `errno.h' (POSIX.1: No child processes): *Note Error Codes::. +- +-`tcflag_t ECHO' +- `termios.h' (POSIX.1): *Note Local Modes::. +- +-`tcflag_t ECHOCTL' +- `termios.h' (BSD): *Note Local Modes::. +- +-`tcflag_t ECHOE' +- `termios.h' (POSIX.1): *Note Local Modes::. +- +-`tcflag_t ECHOK' +- `termios.h' (POSIX.1): *Note Local Modes::. +- +-`tcflag_t ECHOKE' +- `termios.h' (BSD): *Note Local Modes::. +- +-`tcflag_t ECHONL' +- `termios.h' (POSIX.1): *Note Local Modes::. +- +-`tcflag_t ECHOPRT' +- `termios.h' (BSD): *Note Local Modes::. +- +-`int ECHRNG' +- `errno.h' (Linux???: Channel number out of range): *Note Error +- Codes::. +- +-`int ECOMM' +- `errno.h' (Linux???: Communication error on send): *Note Error +- Codes::. +- +-`int ECONNABORTED' +- `errno.h' (BSD: Software caused connection abort): *Note Error +- Codes::. +- +-`int ECONNREFUSED' +- `errno.h' (BSD: Connection refused): *Note Error Codes::. +- +-`int ECONNRESET' +- `errno.h' (BSD: Connection reset by peer): *Note Error Codes::. +- +-`char * ecvt (double VALUE, int NDIGIT, int *DECPT, int *NEG)' +- `stdlib.h' (SVID, Unix98): *Note System V Number Conversion::. +- +-`char * ecvt_r (double VALUE, int NDIGIT, int *DECPT, int *NEG, char *BUF, size_t LEN)' +- `stdlib.h' (GNU): *Note System V Number Conversion::. +- +-`int ED' +- `errno.h' (GNU: ?): *Note Error Codes::. +- +-`int EDEADLK' +- `errno.h' (POSIX.1: Resource deadlock avoided): *Note Error +- Codes::. +- +-`int EDEADLOCK' +- `errno.h' (Linux???: File locking deadlock error): *Note Error +- Codes::. +- +-`int EDESTADDRREQ' +- `errno.h' (BSD: Destination address required): *Note Error +- Codes::. +- +-`int EDIED' +- `errno.h' (GNU: Translator died): *Note Error Codes::. +- +-`int EDOM' +- `errno.h' (ISO: Numerical argument out of domain): *Note Error +- Codes::. +- +-`int EDOTDOT' +- `errno.h' (Linux???: RFS specific error): *Note Error Codes::. +- +-`int EDQUOT' +- `errno.h' (BSD: Disk quota exceeded): *Note Error Codes::. +- +-`int EEXIST' +- `errno.h' (POSIX.1: File exists): *Note Error Codes::. +- +-`int EFAULT' +- `errno.h' (POSIX.1: Bad address): *Note Error Codes::. +- +-`int EFBIG' +- `errno.h' (POSIX.1: File too large): *Note Error Codes::. +- +-`int EFTYPE' +- `errno.h' (BSD: Inappropriate file type or format): *Note Error +- Codes::. +- +-`int EGRATUITOUS' +- `errno.h' (GNU: Gratuitous error): *Note Error Codes::. +- +-`int EGREGIOUS' +- `errno.h' (GNU: You really blew it this time): *Note Error +- Codes::. +- +-`int EHOSTDOWN' +- `errno.h' (BSD: Host is down): *Note Error Codes::. +- +-`int EHOSTUNREACH' +- `errno.h' (BSD: No route to host): *Note Error Codes::. +- +-`int EIDRM' +- `errno.h' (XOPEN: Identifier removed): *Note Error Codes::. +- +-`int EIEIO' +- `errno.h' (GNU: Computer bought the farm): *Note Error Codes::. +- +-`int EILSEQ' +- `errno.h' (ISO: Invalid or incomplete multibyte or wide +- character): *Note Error Codes::. +- +-`int EINPROGRESS' +- `errno.h' (BSD: Operation now in progress): *Note Error Codes::. +- +-`int EINTR' +- `errno.h' (POSIX.1: Interrupted system call): *Note Error Codes::. +- +-`int EINVAL' +- `errno.h' (POSIX.1: Invalid argument): *Note Error Codes::. +- +-`int EIO' +- `errno.h' (POSIX.1: Input/output error): *Note Error Codes::. +- +-`int EISCONN' +- `errno.h' (BSD: Transport endpoint is already connected): *Note +- Error Codes::. +- +-`int EISDIR' +- `errno.h' (POSIX.1: Is a directory): *Note Error Codes::. +- +-`int EISNAM' +- `errno.h' (Linux???: Is a named type file): *Note Error Codes::. +- +-`int EL2HLT' +- `errno.h' (Obsolete: Level 2 halted): *Note Error Codes::. +- +-`int EL2NSYNC' +- `errno.h' (Obsolete: Level 2 not synchronized): *Note Error +- Codes::. +- +-`int EL3HLT' +- `errno.h' (Obsolete: Level 3 halted): *Note Error Codes::. +- +-`int EL3RST' +- `errno.h' (Obsolete: Level 3 reset): *Note Error Codes::. +- +-`int ELIBACC' +- `errno.h' (Linux???: Can not access a needed shared library): +- *Note Error Codes::. +- +-`int ELIBBAD' +- `errno.h' (Linux???: Accessing a corrupted shared library): *Note +- Error Codes::. +- +-`int ELIBEXEC' +- `errno.h' (Linux???: Cannot exec a shared library directly): +- *Note Error Codes::. +- +-`int ELIBMAX' +- `errno.h' (Linux???: Attempting to link in too many shared +- libraries): *Note Error Codes::. +- +-`int ELIBSCN' +- `errno.h' (Linux???: .lib section in a.out corrupted): *Note +- Error Codes::. +- +-`int ELNRNG' +- `errno.h' (Linux???: Link number out of range): *Note Error +- Codes::. +- +-`int ELOOP' +- `errno.h' (BSD: Too many levels of symbolic links): *Note Error +- Codes::. +- +-`int EMEDIUMTYPE' +- `errno.h' (Linux???: Wrong medium type): *Note Error Codes::. +- +-`int EMFILE' +- `errno.h' (POSIX.1: Too many open files): *Note Error Codes::. +- +-`int EMLINK' +- `errno.h' (POSIX.1: Too many links): *Note Error Codes::. +- +-`EMPTY' +- `utmp.h' (SVID): *Note Manipulating the Database::. +- +-`EMPTY' +- `utmpx.h' (XPG4.2): *Note XPG Functions::. +- +-`int EMSGSIZE' +- `errno.h' (BSD: Message too long): *Note Error Codes::. +- +-`int EMULTIHOP' +- `errno.h' (XOPEN: Multihop attempted): *Note Error Codes::. +- +-`int ENAMETOOLONG' +- `errno.h' (POSIX.1: File name too long): *Note Error Codes::. +- +-`int ENAVAIL' +- `errno.h' (Linux???: No XENIX semaphores available): *Note Error +- Codes::. +- +-`void encrypt (char *BLOCK, int EDFLAG)' +- `crypt.h' (BSD, SVID): *Note DES Encryption::. +- +-`void encrypt_r (char *BLOCK, int EDFLAG, struct crypt_data * DATA)' +- `crypt.h' (GNU): *Note DES Encryption::. +- +-`void endfsent (void)' +- `fstab.h' (BSD): *Note fstab::. +- +-`void endgrent (void)' +- `grp.h' (SVID, BSD): *Note Scanning All Groups::. +- +-`void endhostent (void)' +- `netdb.h' (BSD): *Note Host Names::. +- +-`int endmntent (FILE *STREAM)' +- `mntent.h' (BSD): *Note mtab::. +- +-`void endnetent (void)' +- `netdb.h' (BSD): *Note Networks Database::. +- +-`void endnetgrent (void)' +- `netdb.h' (BSD): *Note Lookup Netgroup::. +- +-`void endprotoent (void)' +- `netdb.h' (BSD): *Note Protocols Database::. +- +-`void endpwent (void)' +- `pwd.h' (SVID, BSD): *Note Scanning All Users::. +- +-`void endservent (void)' +- `netdb.h' (BSD): *Note Services Database::. +- +-`void endutent (void)' +- `utmp.h' (SVID): *Note Manipulating the Database::. +- +-`void endutxent (void)' +- `utmpx.h' (XPG4.2): *Note XPG Functions::. +- +-`int ENEEDAUTH' +- `errno.h' (BSD: Need authenticator): *Note Error Codes::. +- +-`int ENETDOWN' +- `errno.h' (BSD: Network is down): *Note Error Codes::. +- +-`int ENETRESET' +- `errno.h' (BSD: Network dropped connection on reset): *Note Error +- Codes::. +- +-`int ENETUNREACH' +- `errno.h' (BSD: Network is unreachable): *Note Error Codes::. +- +-`int ENFILE' +- `errno.h' (POSIX.1: Too many open files in system): *Note Error +- Codes::. +- +-`int ENOANO' +- `errno.h' (Linux???: No anode): *Note Error Codes::. +- +-`int ENOBUFS' +- `errno.h' (BSD: No buffer space available): *Note Error Codes::. +- +-`int ENOCSI' +- `errno.h' (Linux???: No CSI structure available): *Note Error +- Codes::. +- +-`int ENODATA' +- `errno.h' (XOPEN: No data available): *Note Error Codes::. +- +-`int ENODEV' +- `errno.h' (POSIX.1: No such device): *Note Error Codes::. +- +-`int ENOENT' +- `errno.h' (POSIX.1: No such file or directory): *Note Error +- Codes::. +- +-`int ENOEXEC' +- `errno.h' (POSIX.1: Exec format error): *Note Error Codes::. +- +-`int ENOLCK' +- `errno.h' (POSIX.1: No locks available): *Note Error Codes::. +- +-`int ENOLINK' +- `errno.h' (XOPEN: Link has been severed): *Note Error Codes::. +- +-`int ENOMEDIUM' +- `errno.h' (Linux???: No medium found): *Note Error Codes::. +- +-`int ENOMEM' +- `errno.h' (POSIX.1: Cannot allocate memory): *Note Error Codes::. +- +-`int ENOMSG' +- `errno.h' (XOPEN: No message of desired type): *Note Error +- Codes::. +- +-`int ENONET' +- `errno.h' (Linux???: Machine is not on the network): *Note Error +- Codes::. +- +-`int ENOPKG' +- `errno.h' (Linux???: Package not installed): *Note Error Codes::. +- +-`int ENOPROTOOPT' +- `errno.h' (BSD: Protocol not available): *Note Error Codes::. +- +-`int ENOSPC' +- `errno.h' (POSIX.1: No space left on device): *Note Error Codes::. +- +-`int ENOSR' +- `errno.h' (XOPEN: Out of streams resources): *Note Error Codes::. +- +-`int ENOSTR' +- `errno.h' (XOPEN: Device not a stream): *Note Error Codes::. +- +-`int ENOSYS' +- `errno.h' (POSIX.1: Function not implemented): *Note Error +- Codes::. +- +-`int ENOTBLK' +- `errno.h' (BSD: Block device required): *Note Error Codes::. +- +-`int ENOTCONN' +- `errno.h' (BSD: Transport endpoint is not connected): *Note Error +- Codes::. +- +-`int ENOTDIR' +- `errno.h' (POSIX.1: Not a directory): *Note Error Codes::. +- +-`int ENOTEMPTY' +- `errno.h' (POSIX.1: Directory not empty): *Note Error Codes::. +- +-`int ENOTNAM' +- `errno.h' (Linux???: Not a XENIX named type file): *Note Error +- Codes::. +- +-`int ENOTSOCK' +- `errno.h' (BSD: Socket operation on non-socket): *Note Error +- Codes::. +- +-`int ENOTSUP' +- `errno.h' (POSIX.1: Not supported): *Note Error Codes::. +- +-`int ENOTTY' +- `errno.h' (POSIX.1: Inappropriate ioctl for device): *Note Error +- Codes::. +- +-`int ENOTUNIQ' +- `errno.h' (Linux???: Name not unique on network): *Note Error +- Codes::. +- +-`char ** environ' +- `unistd.h' (POSIX.1): *Note Environment Access::. +- +-`error_t envz_add (char **ENVZ, size_t *ENVZ_LEN, const char *NAME, const char *VALUE)' +- `envz.h' (GNU): *Note Envz Functions::. +- +-`char * envz_entry (const char *ENVZ, size_t ENVZ_LEN, const char *NAME)' +- `envz.h' (GNU): *Note Envz Functions::. +- +-`char * envz_get (const char *ENVZ, size_t ENVZ_LEN, const char *NAME)' +- `envz.h' (GNU): *Note Envz Functions::. +- +-`error_t envz_merge (char **ENVZ, size_t *ENVZ_LEN, const char *ENVZ2, size_t ENVZ2_LEN, int OVERRIDE)' +- `envz.h' (GNU): *Note Envz Functions::. +- +-`void envz_strip (char **ENVZ, size_t *ENVZ_LEN)' +- `envz.h' (GNU): *Note Envz Functions::. +- +-`int ENXIO' +- `errno.h' (POSIX.1: No such device or address): *Note Error +- Codes::. +- +-`int EOF' +- `stdio.h' (ISO): *Note EOF and Errors::. +- +-`int EOPNOTSUPP' +- `errno.h' (BSD: Operation not supported): *Note Error Codes::. +- +-`int EOVERFLOW' +- `errno.h' (XOPEN: Value too large for defined data type): *Note +- Error Codes::. +- +-`int EPERM' +- `errno.h' (POSIX.1: Operation not permitted): *Note Error Codes::. +- +-`int EPFNOSUPPORT' +- `errno.h' (BSD: Protocol family not supported): *Note Error +- Codes::. +- +-`int EPIPE' +- `errno.h' (POSIX.1: Broken pipe): *Note Error Codes::. +- +-`int EPROCLIM' +- `errno.h' (BSD: Too many processes): *Note Error Codes::. +- +-`int EPROCUNAVAIL' +- `errno.h' (BSD: RPC bad procedure for program): *Note Error +- Codes::. +- +-`int EPROGMISMATCH' +- `errno.h' (BSD: RPC program version wrong): *Note Error Codes::. +- +-`int EPROGUNAVAIL' +- `errno.h' (BSD: RPC program not available): *Note Error Codes::. +- +-`int EPROTO' +- `errno.h' (XOPEN: Protocol error): *Note Error Codes::. +- +-`int EPROTONOSUPPORT' +- `errno.h' (BSD: Protocol not supported): *Note Error Codes::. +- +-`int EPROTOTYPE' +- `errno.h' (BSD: Protocol wrong type for socket): *Note Error +- Codes::. +- +-`int EQUIV_CLASS_MAX' +- `limits.h' (POSIX.2): *Note Utility Limits::. +- +-`double erand48 (unsigned short int XSUBI[3])' +- `stdlib.h' (SVID): *Note SVID Random::. +- +-`int erand48_r (unsigned short int XSUBI[3], struct drand48_data *BUFFER, double *RESULT)' +- `stdlib.h' (GNU): *Note SVID Random::. +- +-`int ERANGE' +- `errno.h' (ISO: Numerical result out of range): *Note Error +- Codes::. +- +-`int EREMCHG' +- `errno.h' (Linux???: Remote address changed): *Note Error Codes::. +- +-`int EREMOTE' +- `errno.h' (BSD: Object is remote): *Note Error Codes::. +- +-`int EREMOTEIO' +- `errno.h' (Linux???: Remote I/O error): *Note Error Codes::. +- +-`int ERESTART' +- `errno.h' (Linux???: Interrupted system call should be restarted): +- *Note Error Codes::. +- +-`double erf (double X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`double erfc (double X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`float erfcf (float X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`long double erfcl (long double X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`float erff (float X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`long double erfl (long double X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`int EROFS' +- `errno.h' (POSIX.1: Read-only file system): *Note Error Codes::. +- +-`int ERPCMISMATCH' +- `errno.h' (BSD: RPC version wrong): *Note Error Codes::. +- +-`void err (int STATUS, const char *FORMAT, ...)' +- `err.h' (BSD): *Note Error Messages::. +- +-`volatile int errno' +- `errno.h' (ISO): *Note Checking for Errors::. +- +-`void error (int STATUS, int ERRNUM, const char *FORMAT, ...)' +- `error.h' (GNU): *Note Error Messages::. +- +-`void error_at_line (int STATUS, int ERRNUM, const char *FNAME, unsigned int LINENO, const char *FORMAT, ...)' +- `error.h' (GNU): *Note Error Messages::. +- +-`unsigned int error_message_count' +- `error.h' (GNU): *Note Error Messages::. +- +-`int error_one_per_line' +- `error.h' (GNU): *Note Error Messages::. +- +-`void (* error_print_progname ) (void)' +- `error.h' (GNU): *Note Error Messages::. +- +-`void errx (int STATUS, const char *FORMAT, ...)' +- `err.h' (BSD): *Note Error Messages::. +- +-`int ESHUTDOWN' +- `errno.h' (BSD: Cannot send after transport endpoint shutdown): +- *Note Error Codes::. +- +-`int ESOCKTNOSUPPORT' +- `errno.h' (BSD: Socket type not supported): *Note Error Codes::. +- +-`int ESPIPE' +- `errno.h' (POSIX.1: Illegal seek): *Note Error Codes::. +- +-`int ESRCH' +- `errno.h' (POSIX.1: No such process): *Note Error Codes::. +- +-`int ESRMNT' +- `errno.h' (Linux???: Srmount error): *Note Error Codes::. +- +-`int ESTALE' +- `errno.h' (BSD: Stale NFS file handle): *Note Error Codes::. +- +-`int ESTRPIPE' +- `errno.h' (Linux???: Streams pipe error): *Note Error Codes::. +- +-`int ETIME' +- `errno.h' (XOPEN: Timer expired): *Note Error Codes::. +- +-`int ETIMEDOUT' +- `errno.h' (BSD: Connection timed out): *Note Error Codes::. +- +-`int ETOOMANYREFS' +- `errno.h' (BSD: Too many references: cannot splice): *Note Error +- Codes::. +- +-`int ETXTBSY' +- `errno.h' (BSD: Text file busy): *Note Error Codes::. +- +-`int EUCLEAN' +- `errno.h' (Linux???: Structure needs cleaning): *Note Error +- Codes::. +- +-`int EUNATCH' +- `errno.h' (Linux???: Protocol driver not attached): *Note Error +- Codes::. +- +-`int EUSERS' +- `errno.h' (BSD: Too many users): *Note Error Codes::. +- +-`int EWOULDBLOCK' +- `errno.h' (BSD: Operation would block): *Note Error Codes::. +- +-`int EXDEV' +- `errno.h' (POSIX.1: Invalid cross-device link): *Note Error +- Codes::. +- +-`int execl (const char *FILENAME, const char *ARG0, ...)' +- `unistd.h' (POSIX.1): *Note Executing a File::. +- +-`int execle (const char *FILENAME, const char *ARG0, char *const ENV[], ...)' +- `unistd.h' (POSIX.1): *Note Executing a File::. +- +-`int execlp (const char *FILENAME, const char *ARG0, ...)' +- `unistd.h' (POSIX.1): *Note Executing a File::. +- +-`int execv (const char *FILENAME, char *const ARGV[])' +- `unistd.h' (POSIX.1): *Note Executing a File::. +- +-`int execve (const char *FILENAME, char *const ARGV[], char *const ENV[])' +- `unistd.h' (POSIX.1): *Note Executing a File::. +- +-`int execvp (const char *FILENAME, char *const ARGV[])' +- `unistd.h' (POSIX.1): *Note Executing a File::. +- +-`int EXFULL' +- `errno.h' (Linux???: Exchange full): *Note Error Codes::. +- +-`void _Exit (int STATUS)' +- `stdlib.h' (ISO): *Note Termination Internals::. +- +-`void _exit (int STATUS)' +- `unistd.h' (POSIX.1): *Note Termination Internals::. +- +-`void exit (int STATUS)' +- `stdlib.h' (ISO): *Note Normal Termination::. +- +-`int EXIT_FAILURE' +- `stdlib.h' (ISO): *Note Exit Status::. +- +-`int EXIT_SUCCESS' +- `stdlib.h' (ISO): *Note Exit Status::. +- +-`double exp (double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`double exp10 (double X)' +- `math.h' (GNU): *Note Exponents and Logarithms::. +- +-`float exp10f (float X)' +- `math.h' (GNU): *Note Exponents and Logarithms::. +- +-`long double exp10l (long double X)' +- `math.h' (GNU): *Note Exponents and Logarithms::. +- +-`double exp2 (double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`float exp2f (float X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`long double exp2l (long double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`float expf (float X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`long double expl (long double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`double expm1 (double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`float expm1f (float X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`long double expm1l (long double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`int EXPR_NEST_MAX' +- `limits.h' (POSIX.2): *Note Utility Limits::. +- +-`double fabs (double NUMBER)' +- `math.h' (ISO): *Note Absolute Value::. +- +-`float fabsf (float NUMBER)' +- `math.h' (ISO): *Note Absolute Value::. +- +-`long double fabsl (long double NUMBER)' +- `math.h' (ISO): *Note Absolute Value::. +- +-`size_t __fbufsize (FILE *STREAM)' +- `stdio_ext.h' (GNU): *Note Controlling Buffering::. +- +-`int fchdir (int FILEDES)' +- `unistd.h' (XPG): *Note Working Directory::. +- +-`int fchmod (int FILEDES, int MODE)' +- `sys/stat.h' (BSD): *Note Setting Permissions::. +- +-`int fchown (int FILEDES, int OWNER, int GROUP)' +- `unistd.h' (BSD): *Note File Owner::. +- +-`int fclean (FILE *STREAM)' +- `stdio.h' (GNU): *Note Cleaning Streams::. +- +-`int fclose (FILE *STREAM)' +- `stdio.h' (ISO): *Note Closing Streams::. +- +-`int fcloseall (void)' +- `stdio.h' (GNU): *Note Closing Streams::. +- +-`int fcntl (int FILEDES, int COMMAND, ...)' +- `fcntl.h' (POSIX.1): *Note Control Operations::. +- +-`char * fcvt (double VALUE, int NDIGIT, int *DECPT, int *NEG)' +- `stdlib.h' (SVID, Unix98): *Note System V Number Conversion::. +- +-`char * fcvt_r (double VALUE, int NDIGIT, int *DECPT, int *NEG, char *BUF, size_t LEN)' +- `stdlib.h' (SVID, Unix98): *Note System V Number Conversion::. +- +-`int fdatasync (int FILDES)' +- `unistd.h' (POSIX): *Note Synchronizing I/O::. +- +-`int FD_CLOEXEC' +- `fcntl.h' (POSIX.1): *Note Descriptor Flags::. +- +-`void FD_CLR (int FILEDES, fd_set *SET)' +- `sys/types.h' (BSD): *Note Waiting for I/O::. +- +-`double fdim (double X, double Y)' +- `math.h' (ISO): *Note Misc FP Arithmetic::. +- +-`float fdimf (float X, float Y)' +- `math.h' (ISO): *Note Misc FP Arithmetic::. +- +-`long double fdiml (long double X, long double Y)' +- `math.h' (ISO): *Note Misc FP Arithmetic::. +- +-`int FD_ISSET (int FILEDES, fd_set *SET)' +- `sys/types.h' (BSD): *Note Waiting for I/O::. +- +-`FILE * fdopen (int FILEDES, const char *OPENTYPE)' +- `stdio.h' (POSIX.1): *Note Descriptors and Streams::. +- +-`void FD_SET (int FILEDES, fd_set *SET)' +- `sys/types.h' (BSD): *Note Waiting for I/O::. +- +-`fd_set' +- `sys/types.h' (BSD): *Note Waiting for I/O::. +- +-`int FD_SETSIZE' +- `sys/types.h' (BSD): *Note Waiting for I/O::. +- +-`int F_DUPFD' +- `fcntl.h' (POSIX.1): *Note Duplicating Descriptors::. +- +-`void FD_ZERO (fd_set *SET)' +- `sys/types.h' (BSD): *Note Waiting for I/O::. +- +-`int feclearexcept (int EXCEPTS)' +- `fenv.h' (ISO): *Note Status bit operations::. +- +-`int fedisableexcept (int EXCEPTS)' +- `fenv.h' (GNU): *Note Control Functions::. +- +-`FE_DIVBYZERO' +- `fenv.h' (ISO): *Note Status bit operations::. +- +-`FE_DOWNWARD' +- `fenv.h' (ISO): *Note Rounding::. +- +-`int feenableexcept (int EXCEPTS)' +- `fenv.h' (GNU): *Note Control Functions::. +- +-`int fegetenv (fenv_t *ENVP)' +- `fenv.h' (ISO): *Note Control Functions::. +- +-`int fegetexcept (int EXCEPTS)' +- `fenv.h' (GNU): *Note Control Functions::. +- +-`int fegetexceptflag (fexcept_t *FLAGP, int EXCEPTS)' +- `fenv.h' (ISO): *Note Status bit operations::. +- +-`int fegetround (void)' +- `fenv.h' (ISO): *Note Rounding::. +- +-`int feholdexcept (fenv_t *ENVP)' +- `fenv.h' (ISO): *Note Control Functions::. +- +-`FE_INEXACT' +- `fenv.h' (ISO): *Note Status bit operations::. +- +-`FE_INVALID' +- `fenv.h' (ISO): *Note Status bit operations::. +- +-`int feof (FILE *STREAM)' +- `stdio.h' (ISO): *Note EOF and Errors::. +- +-`int feof_unlocked (FILE *STREAM)' +- `stdio.h' (GNU): *Note EOF and Errors::. +- +-`FE_OVERFLOW' +- `fenv.h' (ISO): *Note Status bit operations::. +- +-`int feraiseexcept (int EXCEPTS)' +- `fenv.h' (ISO): *Note Status bit operations::. +- +-`int ferror (FILE *STREAM)' +- `stdio.h' (ISO): *Note EOF and Errors::. +- +-`int ferror_unlocked (FILE *STREAM)' +- `stdio.h' (GNU): *Note EOF and Errors::. +- +-`int fesetenv (const fenv_t *ENVP)' +- `fenv.h' (ISO): *Note Control Functions::. +- +-`int fesetexceptflag (const fexcept_t *FLAGP, int' +- `fenv.h' (ISO): *Note Status bit operations::. +- +-`int fesetround (int ROUND)' +- `fenv.h' (ISO): *Note Rounding::. +- +-`int fetestexcept (int EXCEPTS)' +- `fenv.h' (ISO): *Note Status bit operations::. +- +-`FE_TONEAREST' +- `fenv.h' (ISO): *Note Rounding::. +- +-`FE_TOWARDZERO' +- `fenv.h' (ISO): *Note Rounding::. +- +-`FE_UNDERFLOW' +- `fenv.h' (ISO): *Note Status bit operations::. +- +-`int feupdateenv (const fenv_t *ENVP)' +- `fenv.h' (ISO): *Note Control Functions::. +- +-`FE_UPWARD' +- `fenv.h' (ISO): *Note Rounding::. +- +-`int fflush (FILE *STREAM)' +- `stdio.h' (ISO): *Note Flushing Buffers::. +- +-`int fflush_unlocked (FILE *STREAM)' +- `stdio.h' (POSIX): *Note Flushing Buffers::. +- +-`int fgetc (FILE *STREAM)' +- `stdio.h' (ISO): *Note Character Input::. +- +-`int fgetc_unlocked (FILE *STREAM)' +- `stdio.h' (POSIX): *Note Character Input::. +- +-`int F_GETFD' +- `fcntl.h' (POSIX.1): *Note Descriptor Flags::. +- +-`int F_GETFL' +- `fcntl.h' (POSIX.1): *Note Getting File Status Flags::. +- +-`struct group * fgetgrent (FILE *STREAM)' +- `grp.h' (SVID): *Note Scanning All Groups::. +- +-`int fgetgrent_r (FILE *STREAM, struct group *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct group **RESULT)' +- `grp.h' (GNU): *Note Scanning All Groups::. +- +-`int F_GETLK' +- `fcntl.h' (POSIX.1): *Note File Locks::. +- +-`int F_GETOWN' +- `fcntl.h' (BSD): *Note Interrupt Input::. +- +-`int fgetpos (FILE *STREAM, fpos_t *POSITION)' +- `stdio.h' (ISO): *Note Portable Positioning::. +- +-`int fgetpos64 (FILE *STREAM, fpos64_t *POSITION)' +- `stdio.h' (Unix98): *Note Portable Positioning::. +- +-`struct passwd * fgetpwent (FILE *STREAM)' +- `pwd.h' (SVID): *Note Scanning All Users::. +- +-`int fgetpwent_r (FILE *STREAM, struct passwd *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct passwd **RESULT)' +- `pwd.h' (GNU): *Note Scanning All Users::. +- +-`char * fgets (char *S, int COUNT, FILE *STREAM)' +- `stdio.h' (ISO): *Note Line Input::. +- +-`char * fgets_unlocked (char *S, int COUNT, FILE *STREAM)' +- `stdio.h' (GNU): *Note Line Input::. +- +-`wint_t fgetwc (FILE *STREAM)' +- `wchar.h' (ISO): *Note Character Input::. +- +-`wint_t fgetwc_unlocked (FILE *STREAM)' +- `wchar.h' (GNU): *Note Character Input::. +- +-`wchar_t * fgetws (wchar_t *WS, int COUNT, FILE *STREAM)' +- `wchar.h' (ISO): *Note Line Input::. +- +-`wchar_t * fgetws_unlocked (wchar_t *WS, int COUNT, FILE *STREAM)' +- `wchar.h' (GNU): *Note Line Input::. +- +-`FILE' +- `stdio.h' (ISO): *Note Streams::. +- +-`int FILENAME_MAX' +- `stdio.h' (ISO): *Note Limits for Files::. +- +-`int fileno (FILE *STREAM)' +- `stdio.h' (POSIX.1): *Note Descriptors and Streams::. +- +-`int fileno_unlocked (FILE *STREAM)' +- `stdio.h' (GNU): *Note Descriptors and Streams::. +- +-`int finite (double X)' +- `math.h' (BSD): *Note Floating Point Classes::. +- +-`int finitef (float X)' +- `math.h' (BSD): *Note Floating Point Classes::. +- +-`int finitel (long double X)' +- `math.h' (BSD): *Note Floating Point Classes::. +- +-`int __flbf (FILE *STREAM)' +- `stdio_ext.h' (GNU): *Note Controlling Buffering::. +- +-`void flockfile (FILE *STREAM)' +- `stdio.h' (POSIX): *Note Streams and Threads::. +- +-`double floor (double X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`float floorf (float X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`long double floorl (long double X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`FLT_DIG' +- `float.h' (ISO): *Note Floating Point Parameters::. +- +-`FLT_EPSILON' +- `float.h' (ISO): *Note Floating Point Parameters::. +- +-`FLT_MANT_DIG' +- `float.h' (ISO): *Note Floating Point Parameters::. +- +-`FLT_MAX' +- `float.h' (ISO): *Note Floating Point Parameters::. +- +-`FLT_MAX_10_EXP' +- `float.h' (ISO): *Note Floating Point Parameters::. +- +-`FLT_MAX_EXP' +- `float.h' (ISO): *Note Floating Point Parameters::. +- +-`FLT_MIN' +- `float.h' (ISO): *Note Floating Point Parameters::. +- +-`FLT_MIN_10_EXP' +- `float.h' (ISO): *Note Floating Point Parameters::. +- +-`FLT_MIN_EXP' +- `float.h' (ISO): *Note Floating Point Parameters::. +- +-`FLT_RADIX' +- `float.h' (ISO): *Note Floating Point Parameters::. +- +-`FLT_ROUNDS' +- `float.h' (ISO): *Note Floating Point Parameters::. +- +-`void _flushlbf (void)' +- `stdio_ext.h' (GNU): *Note Flushing Buffers::. +- +-`tcflag_t FLUSHO' +- `termios.h' (BSD): *Note Local Modes::. +- +-`double fma (double X, double Y, double Z)' +- `math.h' (ISO): *Note Misc FP Arithmetic::. +- +-`float fmaf (float X, float Y, float Z)' +- `math.h' (ISO): *Note Misc FP Arithmetic::. +- +-`long double fmal (long double X, long double Y, long double Z)' +- `math.h' (ISO): *Note Misc FP Arithmetic::. +- +-`double fmax (double X, double Y)' +- `math.h' (ISO): *Note Misc FP Arithmetic::. +- +-`float fmaxf (float X, float Y)' +- `math.h' (ISO): *Note Misc FP Arithmetic::. +- +-`long double fmaxl (long double X, long double Y)' +- `math.h' (ISO): *Note Misc FP Arithmetic::. +- +-`FILE * fmemopen (void *BUF, size_t SIZE, const char *OPENTYPE)' +- `stdio.h' (GNU): *Note String Streams::. +- +-`double fmin (double X, double Y)' +- `math.h' (ISO): *Note Misc FP Arithmetic::. +- +-`float fminf (float X, float Y)' +- `math.h' (ISO): *Note Misc FP Arithmetic::. +- +-`long double fminl (long double X, long double Y)' +- `math.h' (ISO): *Note Misc FP Arithmetic::. +- +-`double fmod (double NUMERATOR, double DENOMINATOR)' +- `math.h' (ISO): *Note Remainder Functions::. +- +-`float fmodf (float NUMERATOR, float DENOMINATOR)' +- `math.h' (ISO): *Note Remainder Functions::. +- +-`long double fmodl (long double NUMERATOR, long double DENOMINATOR)' +- `math.h' (ISO): *Note Remainder Functions::. +- +-`int fmtmsg (long int CLASSIFICATION, const char *LABEL, int SEVERITY, const char *TEXT, const char *ACTION, const char *TAG)' +- `fmtmsg.h' (XPG): *Note Printing Formatted Messages::. +- +-`int fnmatch (const char *PATTERN, const char *STRING, int FLAGS)' +- `fnmatch.h' (POSIX.2): *Note Wildcard Matching::. +- +-`FNM_CASEFOLD' +- `fnmatch.h' (GNU): *Note Wildcard Matching::. +- +-`FNM_EXTMATCH' +- `fnmatch.h' (GNU): *Note Wildcard Matching::. +- +-`FNM_FILE_NAME' +- `fnmatch.h' (GNU): *Note Wildcard Matching::. +- +-`FNM_LEADING_DIR' +- `fnmatch.h' (GNU): *Note Wildcard Matching::. +- +-`FNM_NOESCAPE' +- `fnmatch.h' (POSIX.2): *Note Wildcard Matching::. +- +-`FNM_PATHNAME' +- `fnmatch.h' (POSIX.2): *Note Wildcard Matching::. +- +-`FNM_PERIOD' +- `fnmatch.h' (POSIX.2): *Note Wildcard Matching::. +- +-`int F_OK' +- `unistd.h' (POSIX.1): *Note Testing File Access::. +- +-`FILE * fopen (const char *FILENAME, const char *OPENTYPE)' +- `stdio.h' (ISO): *Note Opening Streams::. +- +-`FILE * fopen64 (const char *FILENAME, const char *OPENTYPE)' +- `stdio.h' (Unix98): *Note Opening Streams::. +- +-`FILE * fopencookie (void *COOKIE, const char *OPENTYPE, cookie_io_functions_t IO-FUNCTIONS)' +- `stdio.h' (GNU): *Note Streams and Cookies::. +- +-`int FOPEN_MAX' +- `stdio.h' (ISO): *Note Opening Streams::. +- +-`pid_t fork (void)' +- `unistd.h' (POSIX.1): *Note Creating a Process::. +- +-`int forkpty (int *AMASTER, char *NAME, struct termios *TERMP, struct winsize *WINP)' +- `pty.h' (BSD): *Note Pseudo-Terminal Pairs::. +- +-`long int fpathconf (int FILEDES, int PARAMETER)' +- `unistd.h' (POSIX.1): *Note Pathconf::. +- +-`int fpclassify (_float-type_ X)' +- `math.h' (ISO): *Note Floating Point Classes::. +- +-`FPE_DECOVF_TRAP' +- `signal.h' (BSD): *Note Program Error Signals::. +- +-`FPE_FLTDIV_FAULT' +- `signal.h' (BSD): *Note Program Error Signals::. +- +-`FPE_FLTDIV_TRAP' +- `signal.h' (BSD): *Note Program Error Signals::. +- +-`FPE_FLTOVF_FAULT' +- `signal.h' (BSD): *Note Program Error Signals::. +- +-`FPE_FLTOVF_TRAP' +- `signal.h' (BSD): *Note Program Error Signals::. +- +-`FPE_FLTUND_FAULT' +- `signal.h' (BSD): *Note Program Error Signals::. +- +-`FPE_FLTUND_TRAP' +- `signal.h' (BSD): *Note Program Error Signals::. +- +-`FPE_INTDIV_TRAP' +- `signal.h' (BSD): *Note Program Error Signals::. +- +-`FPE_INTOVF_TRAP' +- `signal.h' (BSD): *Note Program Error Signals::. +- +-`size_t __fpending (FILE *STREAM) The `__fpending'' +- `stdio_ext.h' (GNU): *Note Controlling Buffering::. +- +-`FPE_SUBRNG_TRAP' +- `signal.h' (BSD): *Note Program Error Signals::. +- +-`int FP_ILOGB0' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`int FP_ILOGBNAN' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`fpos64_t' +- `stdio.h' (Unix98): *Note Portable Positioning::. +- +-`fpos_t' +- `stdio.h' (ISO): *Note Portable Positioning::. +- +-`int fprintf (FILE *STREAM, const char *TEMPLATE, ...)' +- `stdio.h' (ISO): *Note Formatted Output Functions::. +- +-`void __fpurge (FILE *STREAM)' +- `stdio_ext.h' (GNU): *Note Flushing Buffers::. +- +-`int fputc (int C, FILE *STREAM)' +- `stdio.h' (ISO): *Note Simple Output::. +- +-`int fputc_unlocked (int C, FILE *STREAM)' +- `stdio.h' (POSIX): *Note Simple Output::. +- +-`int fputs (const char *S, FILE *STREAM)' +- `stdio.h' (ISO): *Note Simple Output::. +- +-`int fputs_unlocked (const char *S, FILE *STREAM)' +- `stdio.h' (GNU): *Note Simple Output::. +- +-`wint_t fputwc (wchar_t WC, FILE *STREAM)' +- `wchar.h' (ISO): *Note Simple Output::. +- +-`wint_t fputwc_unlocked (wint_t WC, FILE *STREAM)' +- `wchar.h' (POSIX): *Note Simple Output::. +- +-`int fputws (const wchar_t *WS, FILE *STREAM)' +- `wchar.h' (ISO): *Note Simple Output::. +- +-`int fputws_unlocked (const wchar_t *WS, FILE *STREAM)' +- `wchar.h' (GNU): *Note Simple Output::. +- +-`F_RDLCK' +- `fcntl.h' (POSIX.1): *Note File Locks::. +- +-`size_t fread (void *DATA, size_t SIZE, size_t COUNT, FILE *STREAM)' +- `stdio.h' (ISO): *Note Block Input/Output::. +- +-`int __freadable (FILE *STREAM)' +- `stdio_ext.h' (GNU): *Note Opening Streams::. +- +-`int __freading (FILE *STREAM)' +- `stdio_ext.h' (GNU): *Note Opening Streams::. +- +-`size_t fread_unlocked (void *DATA, size_t SIZE, size_t COUNT, FILE *STREAM)' +- `stdio.h' (GNU): *Note Block Input/Output::. +- +-`void free (void *PTR)' +- `malloc.h', `stdlib.h' (ISO): *Note Freeing after Malloc::. +- +-`__free_hook' +- `malloc.h' (GNU): *Note Hooks for Malloc::. +- +-`FILE * freopen (const char *FILENAME, const char *OPENTYPE, FILE *STREAM)' +- `stdio.h' (ISO): *Note Opening Streams::. +- +-`FILE * freopen64 (const char *FILENAME, const char *OPENTYPE, FILE *STREAM)' +- `stdio.h' (Unix98): *Note Opening Streams::. +- +-`double frexp (double VALUE, int *EXPONENT)' +- `math.h' (ISO): *Note Normalization Functions::. +- +-`float frexpf (float VALUE, int *EXPONENT)' +- `math.h' (ISO): *Note Normalization Functions::. +- +-`long double frexpl (long double VALUE, int *EXPONENT)' +- `math.h' (ISO): *Note Normalization Functions::. +- +-`int fscanf (FILE *STREAM, const char *TEMPLATE, ...)' +- `stdio.h' (ISO): *Note Formatted Input Functions::. +- +-`int fseek (FILE *STREAM, long int OFFSET, int WHENCE)' +- `stdio.h' (ISO): *Note File Positioning::. +- +-`int fseeko (FILE *STREAM, off_t OFFSET, int WHENCE)' +- `stdio.h' (Unix98): *Note File Positioning::. +- +-`int fseeko64 (FILE *STREAM, off64_t OFFSET, int WHENCE)' +- `stdio.h' (Unix98): *Note File Positioning::. +- +-`int F_SETFD' +- `fcntl.h' (POSIX.1): *Note Descriptor Flags::. +- +-`int F_SETFL' +- `fcntl.h' (POSIX.1): *Note Getting File Status Flags::. +- +-`int F_SETLK' +- `fcntl.h' (POSIX.1): *Note File Locks::. +- +-`int F_SETLKW' +- `fcntl.h' (POSIX.1): *Note File Locks::. +- +-`int __fsetlocking (FILE *STREAM, int TYPE)' +- `stdio_ext.h' (GNU): *Note Streams and Threads::. +- +-`int F_SETOWN' +- `fcntl.h' (BSD): *Note Interrupt Input::. +- +-`int fsetpos (FILE *STREAM, const fpos_t *POSITION)' +- `stdio.h' (ISO): *Note Portable Positioning::. +- +-`int fsetpos64 (FILE *STREAM, const fpos64_t *POSITION)' +- `stdio.h' (Unix98): *Note Portable Positioning::. +- +-`int fstat (int FILEDES, struct stat *BUF)' +- `sys/stat.h' (POSIX.1): *Note Reading Attributes::. +- +-`int fstat64 (int FILEDES, struct stat64 *BUF)' +- `sys/stat.h' (Unix98): *Note Reading Attributes::. +- +-`int fsync (int FILDES)' +- `unistd.h' (POSIX): *Note Synchronizing I/O::. +- +-`long int ftell (FILE *STREAM)' +- `stdio.h' (ISO): *Note File Positioning::. +- +-`off_t ftello (FILE *STREAM)' +- `stdio.h' (Unix98): *Note File Positioning::. +- +-`off64_t ftello64 (FILE *STREAM)' +- `stdio.h' (Unix98): *Note File Positioning::. +- +-`int ftruncate (int FD, off_t LENGTH)' +- `unistd.h' (POSIX): *Note File Size::. +- +-`int ftruncate64 (int ID, off64_t LENGTH)' +- `unistd.h' (Unix98): *Note File Size::. +- +-`int ftrylockfile (FILE *STREAM)' +- `stdio.h' (POSIX): *Note Streams and Threads::. +- +-`int ftw (const char *FILENAME, __ftw_func_t FUNC, int DESCRIPTORS)' +- `ftw.h' (SVID): *Note Working with Directory Trees::. +- +-`int ftw64 (const char *FILENAME, __ftw64_func_t FUNC, int DESCRIPTORS)' +- `ftw.h' (Unix98): *Note Working with Directory Trees::. +- +-`__ftw64_func_t' +- `ftw.h' (GNU): *Note Working with Directory Trees::. +- +-`__ftw_func_t' +- `ftw.h' (GNU): *Note Working with Directory Trees::. +- +-`F_UNLCK' +- `fcntl.h' (POSIX.1): *Note File Locks::. +- +-`void funlockfile (FILE *STREAM)' +- `stdio.h' (POSIX): *Note Streams and Threads::. +- +-`int futimes (int *FD, struct timeval TVP[2])' +- `sys/time.h' (BSD): *Note File Times::. +- +-`int fwide (FILE *STREAM, int MODE)' +- `wchar.h' (ISO): *Note Streams and I18N::. +- +-`int fwprintf (FILE *STREAM, const wchar_t *TEMPLATE, ...)' +- `wchar.h' (ISO): *Note Formatted Output Functions::. +- +-`int __fwritable (FILE *STREAM)' +- `stdio_ext.h' (GNU): *Note Opening Streams::. +- +-`size_t fwrite (const void *DATA, size_t SIZE, size_t COUNT, FILE *STREAM)' +- `stdio.h' (ISO): *Note Block Input/Output::. +- +-`size_t fwrite_unlocked (const void *DATA, size_t SIZE, size_t COUNT, FILE *STREAM)' +- `stdio.h' (GNU): *Note Block Input/Output::. +- +-`int __fwriting (FILE *STREAM)' +- `stdio_ext.h' (GNU): *Note Opening Streams::. +- +-`F_WRLCK' +- `fcntl.h' (POSIX.1): *Note File Locks::. +- +-`int fwscanf (FILE *STREAM, const wchar_t *TEMPLATE, ...)' +- `wchar.h' (ISO): *Note Formatted Input Functions::. +- +-`double gamma (double X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`float gammaf (float X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`long double gammal (long double X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`void (*__gconv_end_fct) (struct gconv_step *)' +- `gconv.h' (GNU): *Note glibc iconv Implementation::. +- +-`int (*__gconv_fct) (struct __gconv_step *, struct __gconv_step_data *, const char **, const char *, size_t *, int)' +- `gconv.h' (GNU): *Note glibc iconv Implementation::. +- +-`int (*__gconv_init_fct) (struct __gconv_step *)' +- `gconv.h' (GNU): *Note glibc iconv Implementation::. +- +-`char * gcvt (double VALUE, int NDIGIT, char *BUF)' +- `stdlib.h' (SVID, Unix98): *Note System V Number Conversion::. +- +-`long int get_avphys_pages (void)' +- `sys/sysinfo.h' (GNU): *Note Query Memory Parameters::. +- +-`int getc (FILE *STREAM)' +- `stdio.h' (ISO): *Note Character Input::. +- +-`int getchar (void)' +- `stdio.h' (ISO): *Note Character Input::. +- +-`int getchar_unlocked (void)' +- `stdio.h' (POSIX): *Note Character Input::. +- +-`int getcontext (ucontext_t *UCP)' +- `ucontext.h' (SVID): *Note System V contexts::. +- +-`int getc_unlocked (FILE *STREAM)' +- `stdio.h' (POSIX): *Note Character Input::. +- +-`char * get_current_dir_name (void)' +- `unistd.h' (GNU): *Note Working Directory::. +- +-`char * getcwd (char *BUFFER, size_t SIZE)' +- `unistd.h' (POSIX.1): *Note Working Directory::. +- +-`struct tm * getdate (const char *STRING)' +- `time.h' (Unix98): *Note General Time String Parsing::. +- +-`getdate_err' +- `time.h' (Unix98): *Note General Time String Parsing::. +- +-`int getdate_r (const char *STRING, struct tm *TP)' +- `time.h' (GNU): *Note General Time String Parsing::. +- +-`ssize_t getdelim (char **LINEPTR, size_t *N, int DELIMITER, FILE *STREAM)' +- `stdio.h' (GNU): *Note Line Input::. +- +-`int getdomainnname (char *NAME, size_t LENGTH)' +- `unistd.h' (???): *Note Host Identification::. +- +-`gid_t getegid (void)' +- `unistd.h' (POSIX.1): *Note Reading Persona::. +- +-`char * getenv (const char *NAME)' +- `stdlib.h' (ISO): *Note Environment Access::. +- +-`uid_t geteuid (void)' +- `unistd.h' (POSIX.1): *Note Reading Persona::. +- +-`struct fstab * getfsent (void)' +- `fstab.h' (BSD): *Note fstab::. +- +-`struct fstab * getfsfile (const char *NAME)' +- `fstab.h' (BSD): *Note fstab::. +- +-`struct fstab * getfsspec (const char *NAME)' +- `fstab.h' (BSD): *Note fstab::. +- +-`gid_t getgid (void)' +- `unistd.h' (POSIX.1): *Note Reading Persona::. +- +-`struct group * getgrent (void)' +- `grp.h' (SVID, BSD): *Note Scanning All Groups::. +- +-`int getgrent_r (struct group *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct group **RESULT)' +- `grp.h' (GNU): *Note Scanning All Groups::. +- +-`struct group * getgrgid (gid_t GID)' +- `grp.h' (POSIX.1): *Note Lookup Group::. +- +-`int getgrgid_r (gid_t GID, struct group *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct group **RESULT)' +- `grp.h' (POSIX.1c): *Note Lookup Group::. +- +-`struct group * getgrnam (const char *NAME)' +- `grp.h' (SVID, BSD): *Note Lookup Group::. +- +-`int getgrnam_r (const char *NAME, struct group *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct group **RESULT)' +- `grp.h' (POSIX.1c): *Note Lookup Group::. +- +-`int getgrouplist (const char *USER, gid_t GROUP, gid_t *GROUPS, int *NGROUPS)' +- `grp.h' (BSD): *Note Setting Groups::. +- +-`int getgroups (int COUNT, gid_t *GROUPS)' +- `unistd.h' (POSIX.1): *Note Reading Persona::. +- +-`struct hostent * gethostbyaddr (const char *ADDR, size_t LENGTH, int FORMAT)' +- `netdb.h' (BSD): *Note Host Names::. +- +-`int gethostbyaddr_r (const char *ADDR, size_t LENGTH, int FORMAT, struct hostent *restrict RESULT_BUF, char *restrict BUF, size_t BUFLEN, struct hostent **restrict RESULT, int *restrict H_ERRNOP)' +- `netdb.h' (GNU): *Note Host Names::. +- +-`struct hostent * gethostbyname (const char *NAME)' +- `netdb.h' (BSD): *Note Host Names::. +- +-`struct hostent * gethostbyname2 (const char *NAME, int AF)' +- `netdb.h' (IPv6 Basic API): *Note Host Names::. +- +-`int gethostbyname2_r (const char *NAME, int AF, struct hostent *restrict RESULT_BUF, char *restrict BUF, size_t BUFLEN, struct hostent **restrict RESULT, int *restrict H_ERRNOP)' +- `netdb.h' (GNU): *Note Host Names::. +- +-`int gethostbyname_r (const char *restrict NAME, struct hostent *restrict RESULT_BUF, char *restrict BUF, size_t BUFLEN, struct hostent **restrict RESULT, int *restrict H_ERRNOP)' +- `netdb.h' (GNU): *Note Host Names::. +- +-`struct hostent * gethostent (void)' +- `netdb.h' (BSD): *Note Host Names::. +- +-`long int gethostid (void)' +- `unistd.h' (BSD): *Note Host Identification::. +- +-`int gethostname (char *NAME, size_t SIZE)' +- `unistd.h' (BSD): *Note Host Identification::. +- +-`int getitimer (int WHICH, struct itimerval *OLD)' +- `sys/time.h' (BSD): *Note Setting an Alarm::. +- +-`ssize_t getline (char **LINEPTR, size_t *N, FILE *STREAM)' +- `stdio.h' (GNU): *Note Line Input::. +- +-`int getloadavg (double LOADAVG[], int NELEM)' +- `stdlib.h' (BSD): *Note Processor Resources::. +- +-`char * getlogin (void)' +- `unistd.h' (POSIX.1): *Note Who Logged In::. +- +-`struct mntent * getmntent (FILE *STREAM)' +- `mntent.h' (BSD): *Note mtab::. +- +-`struct mntent * getmntent_r (FILE *STREAM, struct mentent *RESULT, char *BUFFER, int BUFSIZE)' +- `mntent.h' (BSD): *Note mtab::. +- +-`struct netent * getnetbyaddr (unsigned long int NET, int TYPE)' +- `netdb.h' (BSD): *Note Networks Database::. +- +-`struct netent * getnetbyname (const char *NAME)' +- `netdb.h' (BSD): *Note Networks Database::. +- +-`struct netent * getnetent (void)' +- `netdb.h' (BSD): *Note Networks Database::. +- +-`int getnetgrent (char **HOSTP, char **USERP, char **DOMAINP)' +- `netdb.h' (BSD): *Note Lookup Netgroup::. +- +-`int getnetgrent_r (char **HOSTP, char **USERP, char **DOMAINP, char *BUFFER, int BUFLEN)' +- `netdb.h' (GNU): *Note Lookup Netgroup::. +- +-`int get_nprocs (void)' +- `sys/sysinfo.h' (GNU): *Note Processor Resources::. +- +-`int get_nprocs_conf (void)' +- `sys/sysinfo.h' (GNU): *Note Processor Resources::. +- +-`int getopt (int ARGC, char **ARGV, const char *OPTIONS)' +- `unistd.h' (POSIX.2): *Note Using Getopt::. +- +-`int getopt_long (int ARGC, char *const *ARGV, const char *SHORTOPTS, const struct option *LONGOPTS, int *INDEXPTR)' +- `getopt.h' (GNU): *Note Getopt Long Options::. +- +-`int getopt_long_only (int ARGC, char *const *ARGV, const char *SHORTOPTS, const struct option *LONGOPTS, int *INDEXPTR)' +- `getopt.h' (GNU): *Note Getopt Long Options::. +- +-`int getpagesize (void)' +- `unistd.h' (BSD): *Note Query Memory Parameters::. +- +-`char * getpass (const char *PROMPT)' +- `unistd.h' (BSD): *Note getpass::. +- +-`int getpeername (int SOCKET, struct sockaddr *ADDR, socklen_t *LENGTH-PTR)' +- `sys/socket.h' (BSD): *Note Who is Connected::. +- +-`int getpgid (pid_t PID)' +- `unistd.h' (SVID): *Note Process Group Functions::. +- +-`pid_t getpgrp (pid_t PID)' +- `unistd.h' (BSD): *Note Process Group Functions::. +- +-`pid_t getpgrp (void)' +- `unistd.h' (POSIX.1): *Note Process Group Functions::. +- +-`long int get_phys_pages (void)' +- `sys/sysinfo.h' (GNU): *Note Query Memory Parameters::. +- +-`pid_t getpid (void)' +- `unistd.h' (POSIX.1): *Note Process Identification::. +- +-`pid_t getppid (void)' +- `unistd.h' (POSIX.1): *Note Process Identification::. +- +-`int getpriority (int CLASS, int ID)' +- `sys/resource.h' (BSD,POSIX): *Note Traditional Scheduling +- Functions::. +- +-`struct protoent * getprotobyname (const char *NAME)' +- `netdb.h' (BSD): *Note Protocols Database::. +- +-`struct protoent * getprotobynumber (int PROTOCOL)' +- `netdb.h' (BSD): *Note Protocols Database::. +- +-`struct protoent * getprotoent (void)' +- `netdb.h' (BSD): *Note Protocols Database::. +- +-`int getpt (void)' +- `stdlib.h' (GNU): *Note Allocation::. +- +-`struct passwd * getpwent (void)' +- `pwd.h' (POSIX.1): *Note Scanning All Users::. +- +-`int getpwent_r (struct passwd *RESULT_BUF, char *BUFFER, int BUFLEN, struct passwd **RESULT)' +- `pwd.h' (GNU): *Note Scanning All Users::. +- +-`struct passwd * getpwnam (const char *NAME)' +- `pwd.h' (POSIX.1): *Note Lookup User::. +- +-`int getpwnam_r (const char *NAME, struct passwd *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct passwd **RESULT)' +- `pwd.h' (POSIX.1c): *Note Lookup User::. +- +-`struct passwd * getpwuid (uid_t UID)' +- `pwd.h' (POSIX.1): *Note Lookup User::. +- +-`int getpwuid_r (uid_t UID, struct passwd *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct passwd **RESULT)' +- `pwd.h' (POSIX.1c): *Note Lookup User::. +- +-`int getrlimit (int RESOURCE, struct rlimit *RLP)' +- `sys/resource.h' (BSD): *Note Limits on Resources::. +- +-`int getrlimit64 (int RESOURCE, struct rlimit64 *RLP)' +- `sys/resource.h' (Unix98): *Note Limits on Resources::. +- +-`int getrusage (int PROCESSES, struct rusage *RUSAGE)' +- `sys/resource.h' (BSD): *Note Resource Usage::. +- +-`char * gets (char *S)' +- `stdio.h' (ISO): *Note Line Input::. +- +-`struct servent * getservbyname (const char *NAME, const char *PROTO)' +- `netdb.h' (BSD): *Note Services Database::. +- +-`struct servent * getservbyport (int PORT, const char *PROTO)' +- `netdb.h' (BSD): *Note Services Database::. +- +-`struct servent * getservent (void)' +- `netdb.h' (BSD): *Note Services Database::. +- +-`pid_t getsid (pid_t PID)' +- `unistd.h' (SVID): *Note Process Group Functions::. +- +-`int getsockname (int SOCKET, struct sockaddr *ADDR, socklen_t *LENGTH-PTR)' +- `sys/socket.h' (BSD): *Note Reading Address::. +- +-`int getsockopt (int SOCKET, int LEVEL, int OPTNAME, void *OPTVAL, socklen_t *OPTLEN-PTR)' +- `sys/socket.h' (BSD): *Note Socket Option Functions::. +- +-`int getsubopt (char **OPTIONP, const char* const *TOKENS, char **VALUEP)' +- `stdlib.h' (stdlib.h): *Note Suboptions Example: Suboptions. +- +-`char * gettext (const char *MSGID)' +- `libintl.h' (GNU): *Note Translation with gettext::. +- +-`int gettimeofday (struct timeval *TP, struct timezone *TZP)' +- `sys/time.h' (BSD): *Note High-Resolution Calendar::. +- +-`uid_t getuid (void)' +- `unistd.h' (POSIX.1): *Note Reading Persona::. +- +-`mode_t getumask (void)' +- `sys/stat.h' (GNU): *Note Setting Permissions::. +- +-`struct utmp * getutent (void)' +- `utmp.h' (SVID): *Note Manipulating the Database::. +- +-`int getutent_r (struct utmp *BUFFER, struct utmp **RESULT)' +- `utmp.h' (GNU): *Note Manipulating the Database::. +- +-`struct utmp * getutid (const struct utmp *ID)' +- `utmp.h' (SVID): *Note Manipulating the Database::. +- +-`int getutid_r (const struct utmp *ID, struct utmp *BUFFER, struct utmp **RESULT)' +- `utmp.h' (GNU): *Note Manipulating the Database::. +- +-`struct utmp * getutline (const struct utmp *LINE)' +- `utmp.h' (SVID): *Note Manipulating the Database::. +- +-`int getutline_r (const struct utmp *LINE, struct utmp *BUFFER, struct utmp **RESULT)' +- `utmp.h' (GNU): *Note Manipulating the Database::. +- +-`int getutmp (const struct utmpx *utmpx, struct utmp *utmp)' +- `utmp.h' (GNU): *Note XPG Functions::. +- +-`int getutmpx (const struct utmp *utmp, struct utmpx *utmpx)' +- `utmp.h' (GNU): *Note XPG Functions::. +- +-`struct utmpx * getutxent (void)' +- `utmpx.h' (XPG4.2): *Note XPG Functions::. +- +-`struct utmpx * getutxid (const struct utmpx *ID)' +- `utmpx.h' (XPG4.2): *Note XPG Functions::. +- +-`struct utmpx * getutxline (const struct utmpx *LINE)' +- `utmpx.h' (XPG4.2): *Note XPG Functions::. +- +-`int getw (FILE *STREAM)' +- `stdio.h' (SVID): *Note Character Input::. +- +-`wint_t getwc (FILE *STREAM)' +- `wchar.h' (ISO): *Note Character Input::. +- +-`wint_t getwchar (void)' +- `wchar.h' (ISO): *Note Character Input::. +- +-`wint_t getwchar_unlocked (void)' +- `wchar.h' (GNU): *Note Character Input::. +- +-`wint_t getwc_unlocked (FILE *STREAM)' +- `wchar.h' (GNU): *Note Character Input::. +- +-`char * getwd (char *BUFFER)' +- `unistd.h' (BSD): *Note Working Directory::. +- +-`gid_t' +- `sys/types.h' (POSIX.1): *Note Reading Persona::. +- +-`int glob (const char *PATTERN, int FLAGS, int (*ERRFUNC) (const char *FILENAME, int ERROR-CODE), glob_t *VECTOR-PTR)' +- `glob.h' (POSIX.2): *Note Calling Glob::. +- +-`int glob64 (const char *PATTERN, int FLAGS, int (*ERRFUNC) (const char *FILENAME, int ERROR-CODE), glob64_t *VECTOR-PTR)' +- `glob.h' (GNU): *Note Calling Glob::. +- +-`glob64_t' +- `glob.h' (GNU): *Note Calling Glob::. +- +-`GLOB_ABORTED' +- `glob.h' (POSIX.2): *Note Calling Glob::. +- +-`GLOB_ALTDIRFUNC' +- `glob.h' (GNU): *Note More Flags for Globbing::. +- +-`GLOB_APPEND' +- `glob.h' (POSIX.2): *Note Flags for Globbing::. +- +-`GLOB_BRACE' +- `glob.h' (GNU): *Note More Flags for Globbing::. +- +-`GLOB_DOOFFS' +- `glob.h' (POSIX.2): *Note Flags for Globbing::. +- +-`GLOB_ERR' +- `glob.h' (POSIX.2): *Note Flags for Globbing::. +- +-`void globfree (glob_t *PGLOB)' +- `glob.h' (POSIX.2): *Note More Flags for Globbing::. +- +-`void globfree64 (glob64_t *PGLOB)' +- `glob.h' (GNU): *Note More Flags for Globbing::. +- +-`GLOB_MAGCHAR' +- `glob.h' (GNU): *Note More Flags for Globbing::. +- +-`GLOB_MARK' +- `glob.h' (POSIX.2): *Note Flags for Globbing::. +- +-`GLOB_NOCHECK' +- `glob.h' (POSIX.2): *Note Flags for Globbing::. +- +-`GLOB_NOESCAPE' +- `glob.h' (POSIX.2): *Note Flags for Globbing::. +- +-`GLOB_NOMAGIC' +- `glob.h' (GNU): *Note More Flags for Globbing::. +- +-`GLOB_NOMATCH' +- `glob.h' (POSIX.2): *Note Calling Glob::. +- +-`GLOB_NOSORT' +- `glob.h' (POSIX.2): *Note Flags for Globbing::. +- +-`GLOB_NOSPACE' +- `glob.h' (POSIX.2): *Note Calling Glob::. +- +-`GLOB_ONLYDIR' +- `glob.h' (GNU): *Note More Flags for Globbing::. +- +-`GLOB_PERIOD' +- `glob.h' (GNU): *Note More Flags for Globbing::. +- +-`glob_t' +- `glob.h' (POSIX.2): *Note Calling Glob::. +- +-`GLOB_TILDE' +- `glob.h' (GNU): *Note More Flags for Globbing::. +- +-`GLOB_TILDE_CHECK' +- `glob.h' (GNU): *Note More Flags for Globbing::. +- +-`struct tm * gmtime (const time_t *TIME)' +- `time.h' (ISO): *Note Broken-down Time::. +- +-`struct tm * gmtime_r (const time_t *TIME, struct tm *RESULTP)' +- `time.h' (POSIX.1c): *Note Broken-down Time::. +- +-`_GNU_SOURCE' +- (GNU): *Note Feature Test Macros::. +- +-`int grantpt (int FILEDES)' +- `stdlib.h' (SVID, XPG4.2): *Note Allocation::. +- +-`int gsignal (int SIGNUM)' +- `signal.h' (SVID): *Note Signaling Yourself::. +- +-`int gtty (int FILEDES, struct sgttyb *ATTRIBUTES)' +- `sgtty.h' (BSD): *Note BSD Terminal Modes::. +- +-`char * hasmntopt (const struct mntent *MNT, const char *OPT)' +- `mntent.h' (BSD): *Note mtab::. +- +-`int hcreate (size_t NEL)' +- `search.h' (SVID): *Note Hash Search Function::. +- +-`int hcreate_r (size_t NEL, struct hsearch_data *HTAB)' +- `search.h' (GNU): *Note Hash Search Function::. +- +-`void hdestroy (void)' +- `search.h' (SVID): *Note Hash Search Function::. +- +-`void hdestroy_r (struct hsearch_data *HTAB)' +- `search.h' (GNU): *Note Hash Search Function::. +- +-`HOST_NOT_FOUND' +- `netdb.h' (BSD): *Note Host Names::. +- +-`ENTRY * hsearch (ENTRY ITEM, ACTION ACTION)' +- `search.h' (SVID): *Note Hash Search Function::. +- +-`int hsearch_r (ENTRY ITEM, ACTION ACTION, ENTRY **RETVAL, struct hsearch_data *HTAB)' +- `search.h' (GNU): *Note Hash Search Function::. +- +-`uint32_t htonl (uint32_t HOSTLONG)' +- `netinet/in.h' (BSD): *Note Byte Order::. +- +-`uint16_t htons (uint16_t HOSTSHORT)' +- `netinet/in.h' (BSD): *Note Byte Order::. +- +-`double HUGE_VAL' +- `math.h' (ISO): *Note Math Error Reporting::. +- +-`float HUGE_VALF' +- `math.h' (ISO): *Note Math Error Reporting::. +- +-`long double HUGE_VALL' +- `math.h' (ISO): *Note Math Error Reporting::. +- +-`tcflag_t HUPCL' +- `termios.h' (POSIX.1): *Note Control Modes::. +- +-`double hypot (double X, double Y)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`float hypotf (float X, float Y)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`long double hypotl (long double X, long double Y)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`tcflag_t ICANON' +- `termios.h' (POSIX.1): *Note Local Modes::. +- +-`size_t iconv (iconv_t CD, char **INBUF, size_t *INBYTESLEFT, char **OUTBUF, size_t *OUTBYTESLEFT)' +- `iconv.h' (XPG2): *Note Generic Conversion Interface::. +- +-`int iconv_close (iconv_t CD)' +- `iconv.h' (XPG2): *Note Generic Conversion Interface::. +- +-`iconv_t iconv_open (const char *TOCODE, const char *FROMCODE)' +- `iconv.h' (XPG2): *Note Generic Conversion Interface::. +- +-`iconv_t' +- `iconv.h' (XPG2): *Note Generic Conversion Interface::. +- +-`tcflag_t ICRNL' +- `termios.h' (POSIX.1): *Note Input Modes::. +- +-`tcflag_t IEXTEN' +- `termios.h' (POSIX.1): *Note Local Modes::. +- +-`void if_freenameindex (struct if_nameindex *ptr)' +- `net/if.h' (IPv6 basic API): *Note Interface Naming::. +- +-`char * if_indextoname (unsigned int ifindex, char *ifname)' +- `net/if.h' (IPv6 basic API): *Note Interface Naming::. +- +-`struct if_nameindex * if_nameindex (void)' +- `net/if.h' (IPv6 basic API): *Note Interface Naming::. +- +-`unsigned int if_nametoindex (const char *ifname)' +- `net/if.h' (IPv6 basic API): *Note Interface Naming::. +- +-`size_t IFNAMSIZ' +- `net/if.h' (net/if.h): *Note Interface Naming::. +- +-`int IFTODT (mode_t MODE)' +- `dirent.h' (BSD): *Note Directory Entries::. +- +-`tcflag_t IGNBRK' +- `termios.h' (POSIX.1): *Note Input Modes::. +- +-`tcflag_t IGNCR' +- `termios.h' (POSIX.1): *Note Input Modes::. +- +-`tcflag_t IGNPAR' +- `termios.h' (POSIX.1): *Note Input Modes::. +- +-`int ilogb (double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`int ilogbf (float X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`int ilogbl (long double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`intmax_t imaxabs (intmax_t NUMBER)' +- `inttypes.h' (ISO): *Note Absolute Value::. +- +-`tcflag_t IMAXBEL' +- `termios.h' (BSD): *Note Input Modes::. +- +-`imaxdiv_t imaxdiv (intmax_t NUMERATOR, intmax_t DENOMINATOR)' +- `inttypes.h' (ISO): *Note Integer Division::. +- +-`imaxdiv_t' +- `inttypes.h' (ISO): *Note Integer Division::. +- +-`struct in6_addr in6addr_any' +- `netinet/in.h' (IPv6 basic API): *Note Host Address Data Type::. +- +-`struct in6_addr in6addr_loopback' +- `netinet/in.h' (IPv6 basic API): *Note Host Address Data Type::. +- +-`uint32_t INADDR_ANY' +- `netinet/in.h' (BSD): *Note Host Address Data Type::. +- +-`uint32_t INADDR_BROADCAST' +- `netinet/in.h' (BSD): *Note Host Address Data Type::. +- +-`uint32_t INADDR_LOOPBACK' +- `netinet/in.h' (BSD): *Note Host Address Data Type::. +- +-`uint32_t INADDR_NONE' +- `netinet/in.h' (BSD): *Note Host Address Data Type::. +- +-`char * index (const char *STRING, int C)' +- `string.h' (BSD): *Note Search Functions::. +- +-`uint32_t inet_addr (const char *NAME)' +- `arpa/inet.h' (BSD): *Note Host Address Functions::. +- +-`int inet_aton (const char *NAME, struct in_addr *ADDR)' +- `arpa/inet.h' (BSD): *Note Host Address Functions::. +- +-`uint32_t inet_lnaof (struct in_addr ADDR)' +- `arpa/inet.h' (BSD): *Note Host Address Functions::. +- +-`struct in_addr inet_makeaddr (uint32_t NET, uint32_t LOCAL)' +- `arpa/inet.h' (BSD): *Note Host Address Functions::. +- +-`uint32_t inet_netof (struct in_addr ADDR)' +- `arpa/inet.h' (BSD): *Note Host Address Functions::. +- +-`uint32_t inet_network (const char *NAME)' +- `arpa/inet.h' (BSD): *Note Host Address Functions::. +- +-`char * inet_ntoa (struct in_addr ADDR)' +- `arpa/inet.h' (BSD): *Note Host Address Functions::. +- +-`const char * inet_ntop (int AF, const void *CP, char *BUF, size_t LEN)' +- `arpa/inet.h' (IPv6 basic API): *Note Host Address Functions::. +- +-`int inet_pton (int AF, const char *CP, void *BUF)' +- `arpa/inet.h' (IPv6 basic API): *Note Host Address Functions::. +- +-`float INFINITY' +- `math.h' (ISO): *Note Infinity and NaN::. +- +-`int initgroups (const char *USER, gid_t GROUP)' +- `grp.h' (BSD): *Note Setting Groups::. +- +-`INIT_PROCESS' +- `utmp.h' (SVID): *Note Manipulating the Database::. +- +-`INIT_PROCESS' +- `utmpx.h' (XPG4.2): *Note XPG Functions::. +- +-`void * initstate (unsigned int SEED, void *STATE, size_t SIZE)' +- `stdlib.h' (BSD): *Note BSD Random::. +- +-`int initstate_r (unsigned int SEED, char *restrict STATEBUF, size_t STATELEN, struct random_data *restrict BUF)' +- `stdlib.h' (GNU): *Note BSD Random::. +- +-`tcflag_t INLCR' +- `termios.h' (POSIX.1): *Note Input Modes::. +- +-`int innetgr (const char *NETGROUP, const char *HOST, const char *USER, const char *DOMAIN)' +- `netdb.h' (BSD): *Note Netgroup Membership::. +- +-`ino64_t' +- `sys/types.h' (Unix98): *Note Attribute Meanings::. +- +-`ino_t' +- `sys/types.h' (POSIX.1): *Note Attribute Meanings::. +- +-`tcflag_t INPCK' +- `termios.h' (POSIX.1): *Note Input Modes::. +- +-`INT_MAX' +- `limits.h' (ISO): *Note Range of Type::. +- +-`INT_MIN' +- `limits.h' (ISO): *Note Range of Type::. +- +-`int ioctl (int FILEDES, int COMMAND, ...)' +- `sys/ioctl.h' (BSD): *Note IOCTLs::. +- +-`int _IOFBF' +- `stdio.h' (ISO): *Note Controlling Buffering::. +- +-`int _IOLBF' +- `stdio.h' (ISO): *Note Controlling Buffering::. +- +-`int _IONBF' +- `stdio.h' (ISO): *Note Controlling Buffering::. +- +-`int IPPORT_RESERVED' +- `netinet/in.h' (BSD): *Note Ports::. +- +-`int IPPORT_USERRESERVED' +- `netinet/in.h' (BSD): *Note Ports::. +- +-`int isalnum (int C)' +- `ctype.h' (ISO): *Note Classification of Characters::. +- +-`int isalpha (int C)' +- `ctype.h' (ISO): *Note Classification of Characters::. +- +-`int isascii (int C)' +- `ctype.h' (SVID, BSD): *Note Classification of Characters::. +- +-`int isatty (int FILEDES)' +- `unistd.h' (POSIX.1): *Note Is It a Terminal::. +- +-`int isblank (int C)' +- `ctype.h' (GNU): *Note Classification of Characters::. +- +-`int iscntrl (int C)' +- `ctype.h' (ISO): *Note Classification of Characters::. +- +-`int isdigit (int C)' +- `ctype.h' (ISO): *Note Classification of Characters::. +- +-`int isfinite (_float-type_ X)' +- `math.h' (ISO): *Note Floating Point Classes::. +- +-`int isgraph (int C)' +- `ctype.h' (ISO): *Note Classification of Characters::. +- +-`int isgreater (_real-floating_ X, _real-floating_ Y)' +- `math.h' (ISO): *Note FP Comparison Functions::. +- +-`int isgreaterequal (_real-floating_ X, _real-floating_ Y)' +- `math.h' (ISO): *Note FP Comparison Functions::. +- +-`tcflag_t ISIG' +- `termios.h' (POSIX.1): *Note Local Modes::. +- +-`int isinf (double X)' +- `math.h' (BSD): *Note Floating Point Classes::. +- +-`int isinff (float X)' +- `math.h' (BSD): *Note Floating Point Classes::. +- +-`int isinfl (long double X)' +- `math.h' (BSD): *Note Floating Point Classes::. +- +-`int isless (_real-floating_ X, _real-floating_ Y)' +- `math.h' (ISO): *Note FP Comparison Functions::. +- +-`int islessequal (_real-floating_ X, _real-floating_ Y)' +- `math.h' (ISO): *Note FP Comparison Functions::. +- +-`int islessgreater (_real-floating_ X, _real-floating_ Y)' +- `math.h' (ISO): *Note FP Comparison Functions::. +- +-`int islower (int C)' +- `ctype.h' (ISO): *Note Classification of Characters::. +- +-`int isnan (_float-type_ X)' +- `math.h' (ISO): *Note Floating Point Classes::. +- +-`int isnan (double X)' +- `math.h' (BSD): *Note Floating Point Classes::. +- +-`int isnanf (float X)' +- `math.h' (BSD): *Note Floating Point Classes::. +- +-`int isnanl (long double X)' +- `math.h' (BSD): *Note Floating Point Classes::. +- +-`int isnormal (_float-type_ X)' +- `math.h' (ISO): *Note Floating Point Classes::. +- +-`_ISOC99_SOURCE' +- (GNU): *Note Feature Test Macros::. +- +-`int isprint (int C)' +- `ctype.h' (ISO): *Note Classification of Characters::. +- +-`int ispunct (int C)' +- `ctype.h' (ISO): *Note Classification of Characters::. +- +-`int isspace (int C)' +- `ctype.h' (ISO): *Note Classification of Characters::. +- +-`tcflag_t ISTRIP' +- `termios.h' (POSIX.1): *Note Input Modes::. +- +-`int isunordered (_real-floating_ X, _real-floating_ Y)' +- `math.h' (ISO): *Note FP Comparison Functions::. +- +-`int isupper (int C)' +- `ctype.h' (ISO): *Note Classification of Characters::. +- +-`int iswalnum (wint_t WC)' +- `wctype.h' (ISO): *Note Classification of Wide Characters::. +- +-`int iswalpha (wint_t WC)' +- `wctype.h' (ISO): *Note Classification of Wide Characters::. +- +-`int iswblank (wint_t WC)' +- `wctype.h' (GNU): *Note Classification of Wide Characters::. +- +-`int iswcntrl (wint_t WC)' +- `wctype.h' (ISO): *Note Classification of Wide Characters::. +- +-`int iswctype (wint_t WC, wctype_t DESC)' +- `wctype.h' (ISO): *Note Classification of Wide Characters::. +- +-`int iswdigit (wint_t WC)' +- `wctype.h' (ISO): *Note Classification of Wide Characters::. +- +-`int iswgraph (wint_t WC)' +- `wctype.h' (ISO): *Note Classification of Wide Characters::. +- +-`int iswlower (wint_t WC)' +- `ctype.h' (ISO): *Note Classification of Wide Characters::. +- +-`int iswprint (wint_t WC)' +- `wctype.h' (ISO): *Note Classification of Wide Characters::. +- +-`int iswpunct (wint_t WC)' +- `wctype.h' (ISO): *Note Classification of Wide Characters::. +- +-`int iswspace (wint_t WC)' +- `wctype.h' (ISO): *Note Classification of Wide Characters::. +- +-`int iswupper (wint_t WC)' +- `wctype.h' (ISO): *Note Classification of Wide Characters::. +- +-`int iswxdigit (wint_t WC)' +- `wctype.h' (ISO): *Note Classification of Wide Characters::. +- +-`int isxdigit (int C)' +- `ctype.h' (ISO): *Note Classification of Characters::. +- +-`ITIMER_PROF' +- `sys/time.h' (BSD): *Note Setting an Alarm::. +- +-`ITIMER_REAL' +- `sys/time.h' (BSD): *Note Setting an Alarm::. +- +-`ITIMER_VIRTUAL' +- `sys/time.h' (BSD): *Note Setting an Alarm::. +- +-`tcflag_t IXANY' +- `termios.h' (BSD): *Note Input Modes::. +- +-`tcflag_t IXOFF' +- `termios.h' (POSIX.1): *Note Input Modes::. +- +-`tcflag_t IXON' +- `termios.h' (POSIX.1): *Note Input Modes::. +- +-`double j0 (double X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`float j0f (float X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`long double j0l (long double X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`double j1 (double X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`float j1f (float X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`long double j1l (long double X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`jmp_buf' +- `setjmp.h' (ISO): *Note Non-Local Details::. +- +-`double jn (int n, double X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`float jnf (int n, float X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`long double jnl (int n, long double X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`long int jrand48 (unsigned short int XSUBI[3])' +- `stdlib.h' (SVID): *Note SVID Random::. +- +-`int jrand48_r (unsigned short int XSUBI[3], struct drand48_data *BUFFER, long int *RESULT)' +- `stdlib.h' (GNU): *Note SVID Random::. +- +-`int kill (pid_t PID, int SIGNUM)' +- `signal.h' (POSIX.1): *Note Signaling Another Process::. +- +-`int killpg (int PGID, int SIGNUM)' +- `signal.h' (BSD): *Note Signaling Another Process::. +- +-`char * l64a (long int N)' +- `stdlib.h' (XPG): *Note Encode Binary Data::. +- +-`long int labs (long int NUMBER)' +- `stdlib.h' (ISO): *Note Absolute Value::. +- +-`LANG' +- `locale.h' (ISO): *Note Locale Categories::. +- +-`LC_ALL' +- `locale.h' (ISO): *Note Locale Categories::. +- +-`LC_COLLATE' +- `locale.h' (ISO): *Note Locale Categories::. +- +-`LC_CTYPE' +- `locale.h' (ISO): *Note Locale Categories::. +- +-`LC_MESSAGES' +- `locale.h' (XOPEN): *Note Locale Categories::. +- +-`LC_MONETARY' +- `locale.h' (ISO): *Note Locale Categories::. +- +-`LC_NUMERIC' +- `locale.h' (ISO): *Note Locale Categories::. +- +-`void lcong48 (unsigned short int PARAM[7])' +- `stdlib.h' (SVID): *Note SVID Random::. +- +-`int lcong48_r (unsigned short int PARAM[7], struct drand48_data *BUFFER)' +- `stdlib.h' (GNU): *Note SVID Random::. +- +-`int L_ctermid' +- `stdio.h' (POSIX.1): *Note Identifying the Terminal::. +- +-`LC_TIME' +- `locale.h' (ISO): *Note Locale Categories::. +- +-`int L_cuserid' +- `stdio.h' (POSIX.1): *Note Who Logged In::. +- +-`double ldexp (double VALUE, int EXPONENT)' +- `math.h' (ISO): *Note Normalization Functions::. +- +-`float ldexpf (float VALUE, int EXPONENT)' +- `math.h' (ISO): *Note Normalization Functions::. +- +-`long double ldexpl (long double VALUE, int EXPONENT)' +- `math.h' (ISO): *Note Normalization Functions::. +- +-`ldiv_t ldiv (long int NUMERATOR, long int DENOMINATOR)' +- `stdlib.h' (ISO): *Note Integer Division::. +- +-`ldiv_t' +- `stdlib.h' (ISO): *Note Integer Division::. +- +-`void * lfind (const void *KEY, void *BASE, size_t *NMEMB, size_t SIZE, comparison_fn_t COMPAR)' +- `search.h' (SVID): *Note Array Search Function::. +- +-`double lgamma (double X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`float lgammaf (float X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`float lgammaf_r (float X, int *SIGNP)' +- `math.h' (XPG): *Note Special Functions::. +- +-`long double lgammal (long double X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`long double lgammal_r (long double X, int *SIGNP)' +- `math.h' (XPG): *Note Special Functions::. +- +-`double lgamma_r (double X, int *SIGNP)' +- `math.h' (XPG): *Note Special Functions::. +- +-`L_INCR' +- `sys/file.h' (BSD): *Note File Positioning::. +- +-`int LINE_MAX' +- `limits.h' (POSIX.2): *Note Utility Limits::. +- +-`int link (const char *OLDNAME, const char *NEWNAME)' +- `unistd.h' (POSIX.1): *Note Hard Links::. +- +-`int LINK_MAX' +- `limits.h' (POSIX.1): *Note Limits for Files::. +- +-`int lio_listio (int MODE, struct aiocb *const LIST[], int NENT, struct sigevent *SIG)' +- `aio.h' (POSIX.1b): *Note Asynchronous Reads/Writes::. +- +-`int lio_listio64 (int MODE, struct aiocb *const LIST, int NENT, struct sigevent *SIG)' +- `aio.h' (Unix98): *Note Asynchronous Reads/Writes::. +- +-`int listen (int SOCKET, unsigned int N)' +- `sys/socket.h' (BSD): *Note Listening::. +- +-`long long int llabs (long long int NUMBER)' +- `stdlib.h' (ISO): *Note Absolute Value::. +- +-`lldiv_t lldiv (long long int NUMERATOR, long long int DENOMINATOR)' +- `stdlib.h' (ISO): *Note Integer Division::. +- +-`lldiv_t' +- `stdlib.h' (ISO): *Note Integer Division::. +- +-`long long int llrint (double X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`long long int llrintf (float X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`long long int llrintl (long double X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`long long int llround (double X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`long long int llroundf (float X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`long long int llroundl (long double X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`struct lconv * localeconv (void)' +- `locale.h' (ISO): *Note The Lame Way to Locale Data::. +- +-`struct tm * localtime (const time_t *TIME)' +- `time.h' (ISO): *Note Broken-down Time::. +- +-`struct tm * localtime_r (const time_t *TIME, struct tm *RESULTP)' +- `time.h' (POSIX.1c): *Note Broken-down Time::. +- +-`double log (double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`double log10 (double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`float log10f (float X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`long double log10l (long double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`double log1p (double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`float log1pf (float X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`long double log1pl (long double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`double log2 (double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`float log2f (float X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`long double log2l (long double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`double logb (double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`float logbf (float X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`long double logbl (long double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`float logf (float X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`void login (const struct utmp *ENTRY)' +- `utmp.h' (BSD): *Note Logging In and Out::. +- +-`LOGIN_PROCESS' +- `utmp.h' (SVID): *Note Manipulating the Database::. +- +-`LOGIN_PROCESS' +- `utmpx.h' (XPG4.2): *Note XPG Functions::. +- +-`int login_tty (int FILEDES)' +- `utmp.h' (BSD): *Note Logging In and Out::. +- +-`long double logl (long double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`int logout (const char *UT_LINE)' +- `utmp.h' (BSD): *Note Logging In and Out::. +- +-`void logwtmp (const char *UT_LINE, const char *UT_NAME, const char *UT_HOST)' +- `utmp.h' (BSD): *Note Logging In and Out::. +- +-`void longjmp (jmp_buf STATE, int VALUE)' +- `setjmp.h' (ISO): *Note Non-Local Details::. +- +-`LONG_LONG_MAX' +- `limits.h' (GNU): *Note Range of Type::. +- +-`LONG_LONG_MIN' +- `limits.h' (GNU): *Note Range of Type::. +- +-`LONG_MAX' +- `limits.h' (ISO): *Note Range of Type::. +- +-`LONG_MIN' +- `limits.h' (ISO): *Note Range of Type::. +- +-`long int lrand48 (void)' +- `stdlib.h' (SVID): *Note SVID Random::. +- +-`int lrand48_r (struct drand48_data *BUFFER, double *RESULT)' +- `stdlib.h' (GNU): *Note SVID Random::. +- +-`long int lrint (double X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`long int lrintf (float X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`long int lrintl (long double X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`long int lround (double X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`long int lroundf (float X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`long int lroundl (long double X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`void * lsearch (const void *KEY, void *BASE, size_t *NMEMB, size_t SIZE, comparison_fn_t COMPAR)' +- `search.h' (SVID): *Note Array Search Function::. +- +-`off_t lseek (int FILEDES, off_t OFFSET, int WHENCE)' +- `unistd.h' (POSIX.1): *Note File Position Primitive::. +- +-`off64_t lseek64 (int FILEDES, off64_t OFFSET, int WHENCE)' +- `unistd.h' (Unix98): *Note File Position Primitive::. +- +-`L_SET' +- `sys/file.h' (BSD): *Note File Positioning::. +- +-`int lstat (const char *FILENAME, struct stat *BUF)' +- `sys/stat.h' (BSD): *Note Reading Attributes::. +- +-`int lstat64 (const char *FILENAME, struct stat64 *BUF)' +- `sys/stat.h' (Unix98): *Note Reading Attributes::. +- +-`int L_tmpnam' +- `stdio.h' (ISO): *Note Temporary Files::. +- +-`int lutimes (const char *FILENAME, struct timeval TVP[2])' +- `sys/time.h' (BSD): *Note File Times::. +- +-`L_XTND' +- `sys/file.h' (BSD): *Note File Positioning::. +- +-`int madvise (void *ADDR, size_t LENGTH, int ADVICE)' +- `sys/mman.h' (POSIX): *Note Memory-mapped I/O::. +- +-`void makecontext (ucontext_t *UCP, void (*FUNC) (void), int ARGC, ...)' +- `ucontext.h' (SVID): *Note System V contexts::. +- +-`struct mallinfo mallinfo (void)' +- `malloc.h' (SVID): *Note Statistics of Malloc::. +- +-`void * malloc (size_t SIZE)' +- `malloc.h', `stdlib.h' (ISO): *Note Basic Allocation::. +- +-`__malloc_hook' +- `malloc.h' (GNU): *Note Hooks for Malloc::. +- +-`__malloc_initialize_hook' +- `malloc.h' (GNU): *Note Hooks for Malloc::. +- +-`int MAX_CANON' +- `limits.h' (POSIX.1): *Note Limits for Files::. +- +-`int MAX_INPUT' +- `limits.h' (POSIX.1): *Note Limits for Files::. +- +-`int MAXNAMLEN' +- `dirent.h' (BSD): *Note Limits for Files::. +- +-`int MAXSYMLINKS' +- `sys/param.h' (BSD): *Note Symbolic Links::. +- +-`int MB_CUR_MAX' +- `stdlib.h' (ISO): *Note Selecting the Conversion::. +- +-`int mblen (const char *STRING, size_t SIZE)' +- `stdlib.h' (ISO): *Note Non-reentrant Character Conversion::. +- +-`int MB_LEN_MAX' +- `limits.h' (ISO): *Note Selecting the Conversion::. +- +-`size_t mbrlen (const char *restrict S, size_t N, mbstate_t *PS)' +- `wchar.h' (ISO): *Note Converting a Character::. +- +-`size_t mbrtowc (wchar_t *restrict PWC, const char *restrict S, size_t N, mbstate_t *restrict PS)' +- `wchar.h' (ISO): *Note Converting a Character::. +- +-`int mbsinit (const mbstate_t *PS)' +- `wchar.h' (ISO): *Note Keeping the state::. +- +-`size_t mbsnrtowcs (wchar_t *restrict DST, const char **restrict SRC, size_t NMC, size_t LEN, mbstate_t *restrict PS)' +- `wchar.h' (GNU): *Note Converting Strings::. +- +-`size_t mbsrtowcs (wchar_t *restrict DST, const char **restrict SRC, size_t LEN, mbstate_t *restrict PS)' +- `wchar.h' (ISO): *Note Converting Strings::. +- +-`mbstate_t' +- `wchar.h' (ISO): *Note Keeping the state::. +- +-`size_t mbstowcs (wchar_t *WSTRING, const char *STRING, size_t SIZE)' +- `stdlib.h' (ISO): *Note Non-reentrant String Conversion::. +- +-`int mbtowc (wchar_t *restrict RESULT, const char *restrict STRING, size_t SIZE)' +- `stdlib.h' (ISO): *Note Non-reentrant Character Conversion::. +- +-`int mcheck (void (*ABORTFN) (enum mcheck_status STATUS))' +- `mcheck.h' (GNU): *Note Heap Consistency Checking::. +- +-`tcflag_t MDMBUF' +- `termios.h' (BSD): *Note Control Modes::. +- +-`void * memalign (size_t BOUNDARY, size_t SIZE)' +- `malloc.h' (BSD): *Note Aligned Memory Blocks::. +- +-`__memalign_hook' +- `malloc.h' (GNU): *Note Hooks for Malloc::. +- +-`void * memccpy (void *restrict TO, const void *restrict FROM, int C, size_t SIZE)' +- `string.h' (SVID): *Note Copying and Concatenation::. +- +-`void * memchr (const void *BLOCK, int C, size_t SIZE)' +- `string.h' (ISO): *Note Search Functions::. +- +-`int memcmp (const void *A1, const void *A2, size_t SIZE)' +- `string.h' (ISO): *Note String/Array Comparison::. +- +-`void * memcpy (void *restrict TO, const void *restrict FROM, size_t SIZE)' +- `string.h' (ISO): *Note Copying and Concatenation::. +- +-`void * memfrob (void *MEM, size_t LENGTH)' +- `string.h' (GNU): *Note Trivial Encryption::. +- +-`void * memmem (const void *HAYSTACK, size_t HAYSTACK-LEN, +- const void *NEEDLE, size_t NEEDLE-LEN)' +- `string.h' (GNU): *Note Search Functions::. +- +-`void * memmove (void *TO, const void *FROM, size_t SIZE)' +- `string.h' (ISO): *Note Copying and Concatenation::. +- +-`void * mempcpy (void *restrict TO, const void *restrict FROM, size_t SIZE)' +- `string.h' (GNU): *Note Copying and Concatenation::. +- +-`void * memrchr (const void *BLOCK, int C, size_t SIZE)' +- `string.h' (GNU): *Note Search Functions::. +- +-`void * memset (void *BLOCK, int C, size_t SIZE)' +- `string.h' (ISO): *Note Copying and Concatenation::. +- +-`int mkdir (const char *FILENAME, mode_t MODE)' +- `sys/stat.h' (POSIX.1): *Note Creating Directories::. +- +-`char * mkdtemp (char *TEMPLATE)' +- `stdlib.h' (BSD): *Note Temporary Files::. +- +-`int mkfifo (const char *FILENAME, mode_t MODE)' +- `sys/stat.h' (POSIX.1): *Note FIFO Special Files::. +- +-`int mknod (const char *FILENAME, int MODE, int DEV)' +- `sys/stat.h' (BSD): *Note Making Special Files::. +- +-`int mkstemp (char *TEMPLATE)' +- `stdlib.h' (BSD): *Note Temporary Files::. +- +-`char * mktemp (char *TEMPLATE)' +- `stdlib.h' (Unix): *Note Temporary Files::. +- +-`time_t mktime (struct tm *BROKENTIME)' +- `time.h' (ISO): *Note Broken-down Time::. +- +-`int mlock (const void *ADDR, size_t LEN)' +- `sys/mman.h' (POSIX.1b): *Note Page Lock Functions::. +- +-`int mlockall (int FLAGS)' +- `sys/mman.h' (POSIX.1b): *Note Page Lock Functions::. +- +-`void * mmap (void *ADDRESS, size_t LENGTH,int PROTECT, int FLAGS, int FILEDES, off_t OFFSET)' +- `sys/mman.h' (POSIX): *Note Memory-mapped I/O::. +- +-`void * mmap64 (void *ADDRESS, size_t LENGTH,int PROTECT, int FLAGS, int FILEDES, off64_t OFFSET)' +- `sys/mman.h' (LFS): *Note Memory-mapped I/O::. +- +-`mode_t' +- `sys/types.h' (POSIX.1): *Note Attribute Meanings::. +- +-`double modf (double VALUE, double *INTEGER-PART)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`float modff (float VALUE, float *INTEGER-PART)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`long double modfl (long double VALUE, long double *INTEGER-PART)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`int mount (const char *SPECIAL_FILE, const char *DIR, const char *FSTYPE, unsigned long int OPTIONS, const void *DATA)' +- `sys/mount.h' (SVID, BSD): *Note Mount-Unmount-Remount::. +- +-`long int mrand48 (void)' +- `stdlib.h' (SVID): *Note SVID Random::. +- +-`int mrand48_r (struct drand48_data *BUFFER, double *RESULT)' +- `stdlib.h' (GNU): *Note SVID Random::. +- +-`void * mremap (void *ADDRESS, size_t LENGTH, size_t NEW_LENGTH, int FLAG)' +- `sys/mman.h' (GNU): *Note Memory-mapped I/O::. +- +-`int MSG_DONTROUTE' +- `sys/socket.h' (BSD): *Note Socket Data Options::. +- +-`int MSG_OOB' +- `sys/socket.h' (BSD): *Note Socket Data Options::. +- +-`int MSG_PEEK' +- `sys/socket.h' (BSD): *Note Socket Data Options::. +- +-`int msync (void *ADDRESS, size_t LENGTH, int FLAGS)' +- `sys/mman.h' (POSIX): *Note Memory-mapped I/O::. +- +-`void mtrace (void)' +- `mcheck.h' (GNU): *Note Tracing malloc::. +- +-`int munlock (const void *ADDR, size_t LEN)' +- `sys/mman.h' (POSIX.1b): *Note Page Lock Functions::. +- +-`int munlockall (void)' +- `sys/mman.h' (POSIX.1b): *Note Page Lock Functions::. +- +-`int munmap (void *ADDR, size_t LENGTH)' +- `sys/mman.h' (POSIX): *Note Memory-mapped I/O::. +- +-`void muntrace (void)' +- `mcheck.h' (GNU): *Note Tracing malloc::. +- +-`int NAME_MAX' +- `limits.h' (POSIX.1): *Note Limits for Files::. +- +-`float NAN' +- `math.h' (GNU): *Note Infinity and NaN::. +- +-`double nan (const char *TAGP)' +- `math.h' (ISO): *Note FP Bit Twiddling::. +- +-`float nanf (const char *TAGP)' +- `math.h' (ISO): *Note FP Bit Twiddling::. +- +-`long double nanl (const char *TAGP)' +- `math.h' (ISO): *Note FP Bit Twiddling::. +- +-`int nanosleep (const struct timespec *REQUESTED_TIME, struct timespec *REMAINING)' +- `time.h' (POSIX.1): *Note Sleeping::. +- +-`int NCCS' +- `termios.h' (POSIX.1): *Note Mode Data Types::. +- +-`double nearbyint (double X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`float nearbyintf (float X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`long double nearbyintl (long double X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`NEW_TIME' +- `utmp.h' (SVID): *Note Manipulating the Database::. +- +-`NEW_TIME' +- `utmpx.h' (XPG4.2): *Note XPG Functions::. +- +-`double nextafter (double X, double Y)' +- `math.h' (ISO): *Note FP Bit Twiddling::. +- +-`float nextafterf (float X, float Y)' +- `math.h' (ISO): *Note FP Bit Twiddling::. +- +-`long double nextafterl (long double X, long double Y)' +- `math.h' (ISO): *Note FP Bit Twiddling::. +- +-`double nexttoward (double X, long double Y)' +- `math.h' (ISO): *Note FP Bit Twiddling::. +- +-`float nexttowardf (float X, long double Y)' +- `math.h' (ISO): *Note FP Bit Twiddling::. +- +-`long double nexttowardl (long double X, long double Y)' +- `math.h' (ISO): *Note FP Bit Twiddling::. +- +-`int nftw (const char *FILENAME, __nftw_func_t FUNC, int DESCRIPTORS, int FLAG)' +- `ftw.h' (XPG4.2): *Note Working with Directory Trees::. +- +-`int nftw64 (const char *FILENAME, __nftw64_func_t FUNC, int DESCRIPTORS, int FLAG)' +- `ftw.h' (Unix98): *Note Working with Directory Trees::. +- +-`__nftw64_func_t' +- `ftw.h' (GNU): *Note Working with Directory Trees::. +- +-`__nftw_func_t' +- `ftw.h' (GNU): *Note Working with Directory Trees::. +- +-`char * ngettext (const char *MSGID1, const char *MSGID2, unsigned long int N)' +- `libintl.h' (GNU): *Note Advanced gettext functions::. +- +-`int NGROUPS_MAX' +- `limits.h' (POSIX.1): *Note General Limits::. +- +-`int nice (int INCREMENT)' +- `unistd.h' (BSD): *Note Traditional Scheduling Functions::. +- +-`nlink_t' +- `sys/types.h' (POSIX.1): *Note Attribute Meanings::. +- +-`char * nl_langinfo (nl_item ITEM)' +- `langinfo.h' (XOPEN): *Note The Elegant and Fast Way::. +- +-`NO_ADDRESS' +- `netdb.h' (BSD): *Note Host Names::. +- +-`tcflag_t NOFLSH' +- `termios.h' (POSIX.1): *Note Local Modes::. +- +-`tcflag_t NOKERNINFO' +- `termios.h' (BSD): *Note Local Modes::. +- +-`NO_RECOVERY' +- `netdb.h' (BSD): *Note Host Names::. +- +-`long int nrand48 (unsigned short int XSUBI[3])' +- `stdlib.h' (SVID): *Note SVID Random::. +- +-`int nrand48_r (unsigned short int XSUBI[3], struct drand48_data *BUFFER, long int *RESULT)' +- `stdlib.h' (GNU): *Note SVID Random::. +- +-`int NSIG' +- `signal.h' (BSD): *Note Standard Signals::. +- +-`uint32_t ntohl (uint32_t NETLONG)' +- `netinet/in.h' (BSD): *Note Byte Order::. +- +-`uint16_t ntohs (uint16_t NETSHORT)' +- `netinet/in.h' (BSD): *Note Byte Order::. +- +-`int ntp_adjtime (struct timex *TPTR)' +- `sys/timex.h' (GNU): *Note High Accuracy Clock::. +- +-`int ntp_gettime (struct ntptimeval *TPTR)' +- `sys/timex.h' (GNU): *Note High Accuracy Clock::. +- +-`void * NULL' +- `stddef.h' (ISO): *Note Null Pointer Constant::. +- +-`int O_ACCMODE' +- `fcntl.h' (POSIX.1): *Note Access Modes::. +- +-`int O_APPEND' +- `fcntl.h' (POSIX.1): *Note Operating Modes::. +- +-`int O_ASYNC' +- `fcntl.h' (BSD): *Note Operating Modes::. +- +-`void obstack_1grow (struct obstack *OBSTACK-PTR, char C)' +- `obstack.h' (GNU): *Note Growing Objects::. +- +-`void obstack_1grow_fast (struct obstack *OBSTACK-PTR, char C)' +- `obstack.h' (GNU): *Note Extra Fast Growing::. +- +-`int obstack_alignment_mask (struct obstack *OBSTACK-PTR)' +- `obstack.h' (GNU): *Note Obstacks Data Alignment::. +- +-`void * obstack_alloc (struct obstack *OBSTACK-PTR, int SIZE)' +- `obstack.h' (GNU): *Note Allocation in an Obstack::. +- +-`obstack_alloc_failed_handler' +- `obstack.h' (GNU): *Note Preparing for Obstacks::. +- +-`void * obstack_base (struct obstack *OBSTACK-PTR)' +- `obstack.h' (GNU): *Note Status of an Obstack::. +- +-`void obstack_blank (struct obstack *OBSTACK-PTR, int SIZE)' +- `obstack.h' (GNU): *Note Growing Objects::. +- +-`void obstack_blank_fast (struct obstack *OBSTACK-PTR, int SIZE)' +- `obstack.h' (GNU): *Note Extra Fast Growing::. +- +-`int obstack_chunk_size (struct obstack *OBSTACK-PTR)' +- `obstack.h' (GNU): *Note Obstack Chunks::. +- +-`void * obstack_copy (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)' +- `obstack.h' (GNU): *Note Allocation in an Obstack::. +- +-`void * obstack_copy0 (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)' +- `obstack.h' (GNU): *Note Allocation in an Obstack::. +- +-`void * obstack_finish (struct obstack *OBSTACK-PTR)' +- `obstack.h' (GNU): *Note Growing Objects::. +- +-`void obstack_free (struct obstack *OBSTACK-PTR, void *OBJECT)' +- `obstack.h' (GNU): *Note Freeing Obstack Objects::. +- +-`void obstack_grow (struct obstack *OBSTACK-PTR, void *DATA, int SIZE)' +- `obstack.h' (GNU): *Note Growing Objects::. +- +-`void obstack_grow0 (struct obstack *OBSTACK-PTR, void *DATA, int SIZE)' +- `obstack.h' (GNU): *Note Growing Objects::. +- +-`int obstack_init (struct obstack *OBSTACK-PTR)' +- `obstack.h' (GNU): *Note Preparing for Obstacks::. +- +-`void obstack_int_grow (struct obstack *OBSTACK-PTR, int DATA)' +- `obstack.h' (GNU): *Note Growing Objects::. +- +-`void obstack_int_grow_fast (struct obstack *OBSTACK-PTR, int DATA)' +- `obstack.h' (GNU): *Note Extra Fast Growing::. +- +-`void * obstack_next_free (struct obstack *OBSTACK-PTR)' +- `obstack.h' (GNU): *Note Status of an Obstack::. +- +-`int obstack_object_size (struct obstack *OBSTACK-PTR)' +- `obstack.h' (GNU): *Note Growing Objects::. +- +-`int obstack_object_size (struct obstack *OBSTACK-PTR)' +- `obstack.h' (GNU): *Note Status of an Obstack::. +- +-`int obstack_printf (struct obstack *OBSTACK, const char *TEMPLATE, ...)' +- `stdio.h' (GNU): *Note Dynamic Output::. +- +-`void obstack_ptr_grow (struct obstack *OBSTACK-PTR, void *DATA)' +- `obstack.h' (GNU): *Note Growing Objects::. +- +-`void obstack_ptr_grow_fast (struct obstack *OBSTACK-PTR, void *DATA)' +- `obstack.h' (GNU): *Note Extra Fast Growing::. +- +-`int obstack_room (struct obstack *OBSTACK-PTR)' +- `obstack.h' (GNU): *Note Extra Fast Growing::. +- +-`int obstack_vprintf (struct obstack *OBSTACK, const char *TEMPLATE, va_list AP)' +- `stdio.h' (GNU): *Note Variable Arguments Output::. +- +-`int O_CREAT' +- `fcntl.h' (POSIX.1): *Note Open-time Flags::. +- +-`int O_EXCL' +- `fcntl.h' (POSIX.1): *Note Open-time Flags::. +- +-`int O_EXEC' +- `fcntl.h' (GNU): *Note Access Modes::. +- +-`int O_EXLOCK' +- `fcntl.h' (BSD): *Note Open-time Flags::. +- +-`off64_t' +- `sys/types.h' (Unix98): *Note File Position Primitive::. +- +-`size_t offsetof (TYPE, MEMBER)' +- `stddef.h' (ISO): *Note Structure Measurement::. +- +-`off_t' +- `sys/types.h' (POSIX.1): *Note File Position Primitive::. +- +-`int O_FSYNC' +- `fcntl.h' (BSD): *Note Operating Modes::. +- +-`int O_IGNORE_CTTY' +- `fcntl.h' (GNU): *Note Open-time Flags::. +- +-`OLD_TIME' +- `utmp.h' (SVID): *Note Manipulating the Database::. +- +-`OLD_TIME' +- `utmpx.h' (XPG4.2): *Note XPG Functions::. +- +-`int O_NDELAY' +- `fcntl.h' (BSD): *Note Operating Modes::. +- +-`int on_exit (void (*FUNCTION)(int STATUS, void *ARG), void *ARG)' +- `stdlib.h' (SunOS): *Note Cleanups on Exit::. +- +-`tcflag_t ONLCR' +- `termios.h' (BSD): *Note Output Modes::. +- +-`int O_NOATIME' +- `fcntl.h' (GNU): *Note Operating Modes::. +- +-`int O_NOCTTY' +- `fcntl.h' (POSIX.1): *Note Open-time Flags::. +- +-`tcflag_t ONOEOT' +- `termios.h' (BSD): *Note Output Modes::. +- +-`int O_NOLINK' +- `fcntl.h' (GNU): *Note Open-time Flags::. +- +-`int O_NONBLOCK' +- `fcntl.h' (POSIX.1): *Note Open-time Flags::. +- +-`int O_NONBLOCK' +- `fcntl.h' (POSIX.1): *Note Operating Modes::. +- +-`int O_NOTRANS' +- `fcntl.h' (GNU): *Note Open-time Flags::. +- +-`int open (const char *FILENAME, int FLAGS[, mode_t MODE])' +- `fcntl.h' (POSIX.1): *Note Opening and Closing Files::. +- +-`int open64 (const char *FILENAME, int FLAGS[, mode_t MODE])' +- `fcntl.h' (Unix98): *Note Opening and Closing Files::. +- +-`DIR * opendir (const char *DIRNAME)' +- `dirent.h' (POSIX.1): *Note Opening a Directory::. +- +-`void openlog (const char *IDENT, int OPTION, int FACILITY)' +- `syslog.h' (BSD): *Note openlog::. +- +-`int OPEN_MAX' +- `limits.h' (POSIX.1): *Note General Limits::. +- +-`FILE * open_memstream (char **PTR, size_t *SIZELOC)' +- `stdio.h' (GNU): *Note String Streams::. +- +-`FILE * open_obstack_stream (struct obstack *OBSTACK)' +- `stdio.h' (GNU): *Note Obstack Streams::. +- +-`int openpty (int *AMASTER, int *ASLAVE, char *NAME, struct termios *TERMP, struct winsize *WINP)' +- `pty.h' (BSD): *Note Pseudo-Terminal Pairs::. +- +-`tcflag_t OPOST' +- `termios.h' (POSIX.1): *Note Output Modes::. +- +-`char * optarg' +- `unistd.h' (POSIX.2): *Note Using Getopt::. +- +-`int opterr' +- `unistd.h' (POSIX.2): *Note Using Getopt::. +- +-`int optind' +- `unistd.h' (POSIX.2): *Note Using Getopt::. +- +-`OPTION_ALIAS' +- `argp.h' (GNU): *Note Argp Option Flags::. +- +-`OPTION_ARG_OPTIONAL' +- `argp.h' (GNU): *Note Argp Option Flags::. +- +-`OPTION_DOC' +- `argp.h' (GNU): *Note Argp Option Flags::. +- +-`OPTION_HIDDEN' +- `argp.h' (GNU): *Note Argp Option Flags::. +- +-`OPTION_NO_USAGE' +- `argp.h' (GNU): *Note Argp Option Flags::. +- +-`int optopt' +- `unistd.h' (POSIX.2): *Note Using Getopt::. +- +-`int O_RDONLY' +- `fcntl.h' (POSIX.1): *Note Access Modes::. +- +-`int O_RDWR' +- `fcntl.h' (POSIX.1): *Note Access Modes::. +- +-`int O_READ' +- `fcntl.h' (GNU): *Note Access Modes::. +- +-`int O_SHLOCK' +- `fcntl.h' (BSD): *Note Open-time Flags::. +- +-`int O_SYNC' +- `fcntl.h' (BSD): *Note Operating Modes::. +- +-`int O_TRUNC' +- `fcntl.h' (POSIX.1): *Note Open-time Flags::. +- +-`int O_WRITE' +- `fcntl.h' (GNU): *Note Access Modes::. +- +-`int O_WRONLY' +- `fcntl.h' (POSIX.1): *Note Access Modes::. +- +-`tcflag_t OXTABS' +- `termios.h' (BSD): *Note Output Modes::. +- +-`PA_CHAR' +- `printf.h' (GNU): *Note Parsing a Template String::. +- +-`PA_DOUBLE' +- `printf.h' (GNU): *Note Parsing a Template String::. +- +-`PA_FLAG_LONG' +- `printf.h' (GNU): *Note Parsing a Template String::. +- +-`PA_FLAG_LONG_DOUBLE' +- `printf.h' (GNU): *Note Parsing a Template String::. +- +-`PA_FLAG_LONG_LONG' +- `printf.h' (GNU): *Note Parsing a Template String::. +- +-`int PA_FLAG_MASK' +- `printf.h' (GNU): *Note Parsing a Template String::. +- +-`PA_FLAG_PTR' +- `printf.h' (GNU): *Note Parsing a Template String::. +- +-`PA_FLAG_SHORT' +- `printf.h' (GNU): *Note Parsing a Template String::. +- +-`PA_FLOAT' +- `printf.h' (GNU): *Note Parsing a Template String::. +- +-`PA_INT' +- `printf.h' (GNU): *Note Parsing a Template String::. +- +-`PA_LAST' +- `printf.h' (GNU): *Note Parsing a Template String::. +- +-`PA_POINTER' +- `printf.h' (GNU): *Note Parsing a Template String::. +- +-`tcflag_t PARENB' +- `termios.h' (POSIX.1): *Note Control Modes::. +- +-`tcflag_t PARMRK' +- `termios.h' (POSIX.1): *Note Input Modes::. +- +-`tcflag_t PARODD' +- `termios.h' (POSIX.1): *Note Control Modes::. +- +-`size_t parse_printf_format (const char *TEMPLATE, size_t N, int *ARGTYPES)' +- `printf.h' (GNU): *Note Parsing a Template String::. +- +-`PA_STRING' +- `printf.h' (GNU): *Note Parsing a Template String::. +- +-`long int pathconf (const char *FILENAME, int PARAMETER)' +- `unistd.h' (POSIX.1): *Note Pathconf::. +- +-`int PATH_MAX' +- `limits.h' (POSIX.1): *Note Limits for Files::. +- +-`int pause ()' +- `unistd.h' (POSIX.1): *Note Using Pause::. +- +-`_PC_ASYNC_IO' +- `unistd.h' (POSIX.1): *Note Pathconf::. +- +-`_PC_CHOWN_RESTRICTED' +- `unistd.h' (POSIX.1): *Note Pathconf::. +- +-`_PC_FILESIZEBITS' +- `unistd.h' (LFS): *Note Pathconf::. +- +-`_PC_LINK_MAX' +- `unistd.h' (POSIX.1): *Note Pathconf::. +- +-`int pclose (FILE *STREAM)' +- `stdio.h' (POSIX.2, SVID, BSD): *Note Pipe to a Subprocess::. +- +-`_PC_MAX_CANON' +- `unistd.h' (POSIX.1): *Note Pathconf::. +- +-`_PC_MAX_INPUT' +- `unistd.h' (POSIX.1): *Note Pathconf::. +- +-`_PC_NAME_MAX' +- `unistd.h' (POSIX.1): *Note Pathconf::. +- +-`_PC_NO_TRUNC' +- `unistd.h' (POSIX.1): *Note Pathconf::. +- +-`_PC_PATH_MAX' +- `unistd.h' (POSIX.1): *Note Pathconf::. +- +-`_PC_PIPE_BUF' +- `unistd.h' (POSIX.1): *Note Pathconf::. +- +-`_PC_PRIO_IO' +- `unistd.h' (POSIX.1): *Note Pathconf::. +- +-`_PC_REC_INCR_XFER_SIZE' +- `unistd.h' (POSIX.1): *Note Pathconf::. +- +-`_PC_REC_MAX_XFER_SIZE' +- `unistd.h' (POSIX.1): *Note Pathconf::. +- +-`_PC_REC_MIN_XFER_SIZE' +- `unistd.h' (POSIX.1): *Note Pathconf::. +- +-`_PC_REC_XFER_ALIGN' +- `unistd.h' (POSIX.1): *Note Pathconf::. +- +-`_PC_SOCK_MAXBUF' +- `unistd.h' (POSIX.1g): *Note Pathconf::. +- +-`_PC_SYNC_IO' +- `unistd.h' (POSIX.1): *Note Pathconf::. +- +-`_PC_VDISABLE' +- `unistd.h' (POSIX.1): *Note Pathconf::. +- +-`tcflag_t PENDIN' +- `termios.h' (BSD): *Note Local Modes::. +- +-`void perror (const char *MESSAGE)' +- `stdio.h' (ISO): *Note Error Messages::. +- +-`int PF_FILE' +- `sys/socket.h' (GNU): *Note Local Namespace Details::. +- +-`int PF_INET' +- `sys/socket.h' (BSD): *Note Internet Namespace::. +- +-`int PF_INET6' +- `sys/socket.h' (X/Open): *Note Internet Namespace::. +- +-`int PF_LOCAL' +- `sys/socket.h' (POSIX): *Note Local Namespace Details::. +- +-`int PF_UNIX' +- `sys/socket.h' (BSD): *Note Local Namespace Details::. +- +-`pid_t' +- `sys/types.h' (POSIX.1): *Note Process Identification::. +- +-`int pipe (int FILEDES[2])' +- `unistd.h' (POSIX.1): *Note Creating a Pipe::. +- +-`int PIPE_BUF' +- `limits.h' (POSIX.1): *Note Limits for Files::. +- +-`FILE * popen (const char *COMMAND, const char *MODE)' +- `stdio.h' (POSIX.2, SVID, BSD): *Note Pipe to a Subprocess::. +- +-`_POSIX2_BC_BASE_MAX' +- `limits.h' (POSIX.2): *Note Utility Minimums::. +- +-`_POSIX2_BC_DIM_MAX' +- `limits.h' (POSIX.2): *Note Utility Minimums::. +- +-`_POSIX2_BC_SCALE_MAX' +- `limits.h' (POSIX.2): *Note Utility Minimums::. +- +-`_POSIX2_BC_STRING_MAX' +- `limits.h' (POSIX.2): *Note Utility Minimums::. +- +-`int _POSIX2_C_DEV' +- `unistd.h' (POSIX.2): *Note System Options::. +- +-`_POSIX2_COLL_WEIGHTS_MAX' +- `limits.h' (POSIX.2): *Note Utility Minimums::. +- +-`long int _POSIX2_C_VERSION' +- `unistd.h' (POSIX.2): *Note Version Supported::. +- +-`_POSIX2_EQUIV_CLASS_MAX' +- `limits.h' (POSIX.2): *Note Utility Minimums::. +- +-`_POSIX2_EXPR_NEST_MAX' +- `limits.h' (POSIX.2): *Note Utility Minimums::. +- +-`int _POSIX2_FORT_DEV' +- `unistd.h' (POSIX.2): *Note System Options::. +- +-`int _POSIX2_FORT_RUN' +- `unistd.h' (POSIX.2): *Note System Options::. +- +-`_POSIX2_LINE_MAX' +- `limits.h' (POSIX.2): *Note Utility Minimums::. +- +-`int _POSIX2_LOCALEDEF' +- `unistd.h' (POSIX.2): *Note System Options::. +- +-`_POSIX2_RE_DUP_MAX' +- `limits.h' (POSIX.2): *Note Minimums::. +- +-`int _POSIX2_SW_DEV' +- `unistd.h' (POSIX.2): *Note System Options::. +- +-`_POSIX_AIO_LISTIO_MAX' +- `limits.h' (POSIX.1): *Note Minimums::. +- +-`_POSIX_AIO_MAX' +- `limits.h' (POSIX.1): *Note Minimums::. +- +-`_POSIX_ARG_MAX' +- `limits.h' (POSIX.1): *Note Minimums::. +- +-`_POSIX_CHILD_MAX' +- `limits.h' (POSIX.1): *Note Minimums::. +- +-`int _POSIX_CHOWN_RESTRICTED' +- `unistd.h' (POSIX.1): *Note Options for Files::. +- +-`_POSIX_C_SOURCE' +- (POSIX.2): *Note Feature Test Macros::. +- +-`int _POSIX_JOB_CONTROL' +- `unistd.h' (POSIX.1): *Note System Options::. +- +-`_POSIX_LINK_MAX' +- `limits.h' (POSIX.1): *Note File Minimums::. +- +-`_POSIX_MAX_CANON' +- `limits.h' (POSIX.1): *Note File Minimums::. +- +-`_POSIX_MAX_INPUT' +- `limits.h' (POSIX.1): *Note File Minimums::. +- +-`int posix_memalign (void **MEMPTR, size_t ALIGNMENT, size_t SIZE)' +- `stdlib.h' (POSIX): *Note Aligned Memory Blocks::. +- +-`_POSIX_NAME_MAX' +- `limits.h' (POSIX.1): *Note File Minimums::. +- +-`_POSIX_NGROUPS_MAX' +- `limits.h' (POSIX.1): *Note Minimums::. +- +-`int _POSIX_NO_TRUNC' +- `unistd.h' (POSIX.1): *Note Options for Files::. +- +-`_POSIX_OPEN_MAX' +- `limits.h' (POSIX.1): *Note Minimums::. +- +-`_POSIX_PATH_MAX' +- `limits.h' (POSIX.1): *Note File Minimums::. +- +-`_POSIX_PIPE_BUF' +- `limits.h' (POSIX.1): *Note File Minimums::. +- +-`POSIX_REC_INCR_XFER_SIZE' +- `limits.h' (POSIX.1): *Note File Minimums::. +- +-`POSIX_REC_MAX_XFER_SIZE' +- `limits.h' (POSIX.1): *Note File Minimums::. +- +-`POSIX_REC_MIN_XFER_SIZE' +- `limits.h' (POSIX.1): *Note File Minimums::. +- +-`POSIX_REC_XFER_ALIGN' +- `limits.h' (POSIX.1): *Note File Minimums::. +- +-`int _POSIX_SAVED_IDS' +- `unistd.h' (POSIX.1): *Note System Options::. +- +-`_POSIX_SOURCE' +- (POSIX.1): *Note Feature Test Macros::. +- +-`_POSIX_SSIZE_MAX' +- `limits.h' (POSIX.1): *Note Minimums::. +- +-`_POSIX_STREAM_MAX' +- `limits.h' (POSIX.1): *Note Minimums::. +- +-`_POSIX_TZNAME_MAX' +- `limits.h' (POSIX.1): *Note Minimums::. +- +-`unsigned char _POSIX_VDISABLE' +- `unistd.h' (POSIX.1): *Note Options for Files::. +- +-`long int _POSIX_VERSION' +- `unistd.h' (POSIX.1): *Note Version Supported::. +- +-`double pow (double BASE, double POWER)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`double pow10 (double X)' +- `math.h' (GNU): *Note Exponents and Logarithms::. +- +-`float pow10f (float X)' +- `math.h' (GNU): *Note Exponents and Logarithms::. +- +-`long double pow10l (long double X)' +- `math.h' (GNU): *Note Exponents and Logarithms::. +- +-`float powf (float BASE, float POWER)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`long double powl (long double BASE, long double POWER)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`ssize_t pread (int FILEDES, void *BUFFER, size_t SIZE, off_t OFFSET)' +- `unistd.h' (Unix98): *Note I/O Primitives::. +- +-`ssize_t pread64 (int FILEDES, void *BUFFER, size_t SIZE, off64_t OFFSET)' +- `unistd.h' (Unix98): *Note I/O Primitives::. +- +-`int printf (const char *TEMPLATE, ...)' +- `stdio.h' (ISO): *Note Formatted Output Functions::. +- +-`printf_arginfo_function' +- `printf.h' (GNU): *Note Defining the Output Handler::. +- +-`printf_function' +- `printf.h' (GNU): *Note Defining the Output Handler::. +- +-`int printf_size (FILE *FP, const struct printf_info *INFO, const void *const *ARGS)' +- `printf.h' (GNU): *Note Predefined Printf Handlers::. +- +-`int printf_size_info (const struct printf_info *INFO, size_t N, int *ARGTYPES)' +- `printf.h' (GNU): *Note Predefined Printf Handlers::. +- +-`PRIO_MAX' +- `sys/resource.h' (BSD): *Note Traditional Scheduling Functions::. +- +-`PRIO_MIN' +- `sys/resource.h' (BSD): *Note Traditional Scheduling Functions::. +- +-`PRIO_PGRP' +- `sys/resource.h' (BSD): *Note Traditional Scheduling Functions::. +- +-`PRIO_PROCESS' +- `sys/resource.h' (BSD): *Note Traditional Scheduling Functions::. +- +-`PRIO_USER' +- `sys/resource.h' (BSD): *Note Traditional Scheduling Functions::. +- +-`char * program_invocation_name' +- `errno.h' (GNU): *Note Error Messages::. +- +-`char * program_invocation_short_name' +- `errno.h' (GNU): *Note Error Messages::. +- +-`void psignal (int SIGNUM, const char *MESSAGE)' +- `signal.h' (BSD): *Note Signal Messages::. +- +-`int pthread_atfork (void (*PREPARE)(void), void (*PARENT)(void), void (*CHILD)(void))' +- `pthread.h' (POSIX): *Note Threads and Fork::. +- +-`int pthread_attr_destroy (pthread_attr_t *ATTR)' +- `pthread.h' (POSIX): *Note Thread Attributes::. +- +-`int pthread_attr_getattr (const pthread_attr_t *OBJ, int *VALUE)' +- `pthread.h' (POSIX): *Note Thread Attributes::. +- +-`int pthread_attr_init (pthread_attr_t *ATTR)' +- `pthread.h' (POSIX): *Note Thread Attributes::. +- +-`int pthread_attr_setattr (pthread_attr_t *OBJ, int VALUE)' +- `pthread.h' (POSIX): *Note Thread Attributes::. +- +-`int pthread_cancel (pthread_t THREAD)' +- `pthread.h' (POSIX): *Note Basic Thread Operations::. +- +-`void pthread_cleanup_pop (int EXECUTE)' +- `pthread.h' (POSIX): *Note Cleanup Handlers::. +- +-`void pthread_cleanup_pop_restore_np (int EXECUTE)' +- `pthread.h' (GNU): *Note Cleanup Handlers::. +- +-`void pthread_cleanup_push (void (*ROUTINE) (void *), void *ARG)' +- `pthread.h' (POSIX): *Note Cleanup Handlers::. +- +-`void pthread_cleanup_push_defer_np (void (*ROUTINE) (void *), void *ARG)' +- `pthread.h' (GNU): *Note Cleanup Handlers::. +- +-`int pthread_condattr_init (pthread_condattr_t *ATTR)' +- `pthread.h' (POSIX): *Note Condition Variables::. +- +-`int pthread_cond_broadcast (pthread_cond_t *COND)' +- `pthread.h' (POSIX): *Note Condition Variables::. +- +-`int pthread_cond_destroy (pthread_cond_t *COND)' +- `pthread.h' (POSIX): *Note Condition Variables::. +- +-`int pthread_cond_init (pthread_cond_t *COND, pthread_condattr_t *cond_ATTR)' +- `pthread.h' (POSIX): *Note Condition Variables::. +- +-`int pthread_cond_signal (pthread_cond_t *COND)' +- `pthread.h' (POSIX): *Note Condition Variables::. +- +-`int pthread_cond_timedwait (pthread_cond_t *COND, pthread_mutex_t *MUTEX, const struct timespec *ABSTIME)' +- `pthread.h' (POSIX): *Note Condition Variables::. +- +-`int pthread_cond_wait (pthread_cond_t *COND, pthread_mutex_t *MUTEX)' +- `pthread.h' (POSIX): *Note Condition Variables::. +- +-`int pthread_create (pthread_t * THREAD, pthread_attr_t * ATTR, void * (*START_ROUTINE)(void *), void * ARG)' +- `pthread.h' (POSIX): *Note Basic Thread Operations::. +- +-`int pthread_detach (pthread_t TH)' +- `pthread.h' (POSIX): *Note Miscellaneous Thread Functions::. +- +-`int pthread_equal (pthread_t thread1, pthread_t thread2)' +- `pthread.h' (POSIX): *Note Miscellaneous Thread Functions::. +- +-`void pthread_exit (void *RETVAL)' +- `pthread.h' (POSIX): *Note Basic Thread Operations::. +- +-`int pthread_getconcurrency ()' +- `pthread.h' (POSIX): *Note Miscellaneous Thread Functions::. +- +-`int pthread_getschedparam (pthread_t target_THREAD, int *POLICY, struct sched_param *PARAM)' +- `pthread.h' (POSIX): *Note Miscellaneous Thread Functions::. +- +-`void * pthread_getspecific (pthread_key_t KEY)' +- `pthread.h' (POSIX): *Note Thread-Specific Data::. +- +-`int pthread_join (pthread_t TH, void **thread_RETURN)' +- `pthread.h' (POSIX): *Note Basic Thread Operations::. +- +-`int pthread_key_create (pthread_key_t *KEY, void (*destr_function) (void *))' +- `pthread.h' (POSIX): *Note Thread-Specific Data::. +- +-`int pthread_key_delete (pthread_key_t KEY)' +- `pthread.h' (POSIX): *Note Thread-Specific Data::. +- +-`int pthread_kill (pthread_t THREAD, int SIGNO)' +- `pthread.h' (POSIX): *Note Threads and Signal Handling::. +- +-`void pthread_kill_other_threads_np (VOID)' +- `pthread.h' (GNU): *Note Miscellaneous Thread Functions::. +- +-`int pthread_mutexattr_destroy (pthread_mutexattr_t *ATTR)' +- `pthread.h' (POSIX): *Note Mutexes::. +- +-`int pthread_mutexattr_gettype (const pthread_mutexattr_t *ATTR, int *TYPE)' +- `pthread.h' (POSIX): *Note Mutexes::. +- +-`int pthread_mutexattr_init (pthread_mutexattr_t *ATTR)' +- `pthread.h' (POSIX): *Note Mutexes::. +- +-`int pthread_mutexattr_settype (pthread_mutexattr_t *ATTR, int TYPE)' +- `pthread.h' (POSIX): *Note Mutexes::. +- +-`int pthread_mutex_destroy (pthread_mutex_t *MUTEX)' +- `pthread.h' (POSIX): *Note Mutexes::. +- +-`int pthread_mutex_init (pthread_mutex_t *MUTEX, const pthread_mutexattr_t *MUTEXATTR)' +- `pthread.h' (POSIX): *Note Mutexes::. +- +-`int pthread_mutex_lock (pthread_mutex_t *mutex))' +- `pthread.h' (POSIX): *Note Mutexes::. +- +-`int pthread_mutex_timedlock (pthread_mutex_t *MUTEX, const struct timespec *ABSTIME)' +- `pthread.h' (POSIX): *Note Mutexes::. +- +-`int pthread_mutex_trylock (pthread_mutex_t *MUTEX)' +- `pthread.h' (POSIX): *Note Mutexes::. +- +-`int pthread_mutex_unlock (pthread_mutex_t *MUTEX)' +- `pthread.h' (POSIX): *Note Mutexes::. +- +-`int pthread_once (pthread_once_t *once_CONTROL, void (*INIT_ROUTINE) (void))' +- `pthread.h' (POSIX): *Note Miscellaneous Thread Functions::. +- +-`pthread_t pthread_self (VOID)' +- `pthread.h' (POSIX): *Note Miscellaneous Thread Functions::. +- +-`int pthread_setcancelstate (int STATE, int *OLDSTATE)' +- `pthread.h' (POSIX): *Note Cancellation::. +- +-`int pthread_setcanceltype (int TYPE, int *OLDTYPE)' +- `pthread.h' (POSIX): *Note Cancellation::. +- +-`int pthread_setconcurrency (int LEVEL)' +- `pthread.h' (POSIX): *Note Miscellaneous Thread Functions::. +- +-`int pthread_setschedparam (pthread_t target_THREAD, int POLICY, const struct sched_param *PARAM)' +- `pthread.h' (POSIX): *Note Miscellaneous Thread Functions::. +- +-`int pthread_setspecific (pthread_key_t KEY, const void *POINTER)' +- `pthread.h' (POSIX): *Note Thread-Specific Data::. +- +-`int pthread_sigmask (int HOW, const sigset_t *NEWMASK, sigset_t *OLDMASK)' +- `pthread.h' (POSIX): *Note Threads and Signal Handling::. +- +-`void pthread_testcancel (VOID)' +- `pthread.h' (POSIX): *Note Cancellation::. +- +-`char * P_tmpdir' +- `stdio.h' (SVID): *Note Temporary Files::. +- +-`ptrdiff_t' +- `stddef.h' (ISO): *Note Important Data Types::. +- +-`char * ptsname (int FILEDES)' +- `stdlib.h' (SVID, XPG4.2): *Note Allocation::. +- +-`int ptsname_r (int FILEDES, char *BUF, size_t LEN)' +- `stdlib.h' (GNU): *Note Allocation::. +- +-`int putc (int C, FILE *STREAM)' +- `stdio.h' (ISO): *Note Simple Output::. +- +-`int putchar (int C)' +- `stdio.h' (ISO): *Note Simple Output::. +- +-`int putchar_unlocked (int C)' +- `stdio.h' (POSIX): *Note Simple Output::. +- +-`int putc_unlocked (int C, FILE *STREAM)' +- `stdio.h' (POSIX): *Note Simple Output::. +- +-`int putenv (char *STRING)' +- `stdlib.h' (SVID): *Note Environment Access::. +- +-`int putpwent (const struct passwd *P, FILE *STREAM)' +- `pwd.h' (SVID): *Note Writing a User Entry::. +- +-`int puts (const char *S)' +- `stdio.h' (ISO): *Note Simple Output::. +- +-`struct utmp * pututline (const struct utmp *UTMP)' +- `utmp.h' (SVID): *Note Manipulating the Database::. +- +-`struct utmpx * pututxline (const struct utmpx *UTMP)' +- `utmpx.h' (XPG4.2): *Note XPG Functions::. +- +-`int putw (int W, FILE *STREAM)' +- `stdio.h' (SVID): *Note Simple Output::. +- +-`wint_t putwc (wchar_t WC, FILE *STREAM)' +- `wchar.h' (ISO): *Note Simple Output::. +- +-`wint_t putwchar (wchar_t WC)' +- `wchar.h' (ISO): *Note Simple Output::. +- +-`wint_t putwchar_unlocked (wchar_t WC)' +- `wchar.h' (GNU): *Note Simple Output::. +- +-`wint_t putwc_unlocked (wchar_t WC, FILE *STREAM)' +- `wchar.h' (GNU): *Note Simple Output::. +- +-`ssize_t pwrite (int FILEDES, const void *BUFFER, size_t SIZE, off_t OFFSET)' +- `unistd.h' (Unix98): *Note I/O Primitives::. +- +-`ssize_t pwrite64 (int FILEDES, const void *BUFFER, size_t SIZE, off64_t OFFSET)' +- `unistd.h' (Unix98): *Note I/O Primitives::. +- +-`char * qecvt (long double VALUE, int NDIGIT, int *DECPT, int *NEG)' +- `stdlib.h' (GNU): *Note System V Number Conversion::. +- +-`char * qecvt_r (long double VALUE, int NDIGIT, int *DECPT, int *NEG, char *BUF, size_t LEN)' +- `stdlib.h' (GNU): *Note System V Number Conversion::. +- +-`char * qfcvt (long double VALUE, int NDIGIT, int *DECPT, int *NEG)' +- `stdlib.h' (GNU): *Note System V Number Conversion::. +- +-`char * qfcvt_r (long double VALUE, int NDIGIT, int *DECPT, int *NEG, char *BUF, size_t LEN)' +- `stdlib.h' (GNU): *Note System V Number Conversion::. +- +-`char * qgcvt (long double VALUE, int NDIGIT, char *BUF)' +- `stdlib.h' (GNU): *Note System V Number Conversion::. +- +-`void qsort (void *ARRAY, size_t COUNT, size_t SIZE, comparison_fn_t COMPARE)' +- `stdlib.h' (ISO): *Note Array Sort Function::. +- +-`int raise (int SIGNUM)' +- `signal.h' (ISO): *Note Signaling Yourself::. +- +-`int rand (void)' +- `stdlib.h' (ISO): *Note ISO Random::. +- +-`int RAND_MAX' +- `stdlib.h' (ISO): *Note ISO Random::. +- +-`long int random (void)' +- `stdlib.h' (BSD): *Note BSD Random::. +- +-`int random_r (struct random_data *restrict BUF, int32_t *restrict RESULT)' +- `stdlib.h' (GNU): *Note BSD Random::. +- +-`int rand_r (unsigned int *SEED)' +- `stdlib.h' (POSIX.1): *Note ISO Random::. +- +-`void * rawmemchr (const void *BLOCK, int C)' +- `string.h' (GNU): *Note Search Functions::. +- +-`ssize_t read (int FILEDES, void *BUFFER, size_t SIZE)' +- `unistd.h' (POSIX.1): *Note I/O Primitives::. +- +-`struct dirent * readdir (DIR *DIRSTREAM)' +- `dirent.h' (POSIX.1): *Note Reading/Closing Directory::. +- +-`struct dirent64 * readdir64 (DIR *DIRSTREAM)' +- `dirent.h' (LFS): *Note Reading/Closing Directory::. +- +-`int readdir64_r (DIR *DIRSTREAM, struct dirent64 *ENTRY, struct dirent64 **RESULT)' +- `dirent.h' (LFS): *Note Reading/Closing Directory::. +- +-`int readdir_r (DIR *DIRSTREAM, struct dirent *ENTRY, struct dirent **RESULT)' +- `dirent.h' (GNU): *Note Reading/Closing Directory::. +- +-`int readlink (const char *FILENAME, char *BUFFER, size_t SIZE)' +- `unistd.h' (BSD): *Note Symbolic Links::. +- +-`ssize_t readv (int FILEDES, const struct iovec *VECTOR, int COUNT)' +- `sys/uio.h' (BSD): *Note Scatter-Gather::. +- +-`void * realloc (void *PTR, size_t NEWSIZE)' +- `malloc.h', `stdlib.h' (ISO): *Note Changing Block Size::. +- +-`__realloc_hook' +- `malloc.h' (GNU): *Note Hooks for Malloc::. +- +-`char * realpath (const char *restrict NAME, char *restrict RESOLVED)' +- `stdlib.h' (XPG): *Note Symbolic Links::. +- +-`int recv (int SOCKET, void *BUFFER, size_t SIZE, int FLAGS)' +- `sys/socket.h' (BSD): *Note Receiving Data::. +- +-`int recvfrom (int SOCKET, void *BUFFER, size_t SIZE, int FLAGS, struct sockaddr *ADDR, socklen_t *LENGTH-PTR)' +- `sys/socket.h' (BSD): *Note Receiving Datagrams::. +- +-`int recvmsg (int SOCKET, struct msghdr *MESSAGE, int FLAGS)' +- `sys/socket.h' (BSD): *Note Receiving Datagrams::. +- +-`int RE_DUP_MAX' +- `limits.h' (POSIX.2): *Note General Limits::. +- +-`_REENTRANT' +- (GNU): *Note Feature Test Macros::. +- +-`REG_BADBR' +- `regex.h' (POSIX.2): *Note POSIX Regexp Compilation::. +- +-`REG_BADPAT' +- `regex.h' (POSIX.2): *Note POSIX Regexp Compilation::. +- +-`REG_BADRPT' +- `regex.h' (POSIX.2): *Note POSIX Regexp Compilation::. +- +-`int regcomp (regex_t *COMPILED, const char *PATTERN, int CFLAGS)' +- `regex.h' (POSIX.2): *Note POSIX Regexp Compilation::. +- +-`REG_EBRACE' +- `regex.h' (POSIX.2): *Note POSIX Regexp Compilation::. +- +-`REG_EBRACK' +- `regex.h' (POSIX.2): *Note POSIX Regexp Compilation::. +- +-`REG_ECOLLATE' +- `regex.h' (POSIX.2): *Note POSIX Regexp Compilation::. +- +-`REG_ECTYPE' +- `regex.h' (POSIX.2): *Note POSIX Regexp Compilation::. +- +-`REG_EESCAPE' +- `regex.h' (POSIX.2): *Note POSIX Regexp Compilation::. +- +-`REG_EPAREN' +- `regex.h' (POSIX.2): *Note POSIX Regexp Compilation::. +- +-`REG_ERANGE' +- `regex.h' (POSIX.2): *Note POSIX Regexp Compilation::. +- +-`size_t regerror (int ERRCODE, regex_t *COMPILED, char *BUFFER, size_t LENGTH)' +- `regex.h' (POSIX.2): *Note Regexp Cleanup::. +- +-`REG_ESPACE' +- `regex.h' (POSIX.2): *Note Matching POSIX Regexps::. +- +-`REG_ESPACE' +- `regex.h' (POSIX.2): *Note POSIX Regexp Compilation::. +- +-`REG_ESUBREG' +- `regex.h' (POSIX.2): *Note POSIX Regexp Compilation::. +- +-`int regexec (regex_t *COMPILED, char *STRING, size_t NMATCH, regmatch_t MATCHPTR [], int EFLAGS)' +- `regex.h' (POSIX.2): *Note Matching POSIX Regexps::. +- +-`regex_t' +- `regex.h' (POSIX.2): *Note POSIX Regexp Compilation::. +- +-`REG_EXTENDED' +- `regex.h' (POSIX.2): *Note Flags for POSIX Regexps::. +- +-`void regfree (regex_t *COMPILED)' +- `regex.h' (POSIX.2): *Note Regexp Cleanup::. +- +-`REG_ICASE' +- `regex.h' (POSIX.2): *Note Flags for POSIX Regexps::. +- +-`int register_printf_function (int SPEC, printf_function HANDLER-FUNCTION, printf_arginfo_function ARGINFO-FUNCTION)' +- `printf.h' (GNU): *Note Registering New Conversions::. +- +-`regmatch_t' +- `regex.h' (POSIX.2): *Note Regexp Subexpressions::. +- +-`REG_NEWLINE' +- `regex.h' (POSIX.2): *Note Flags for POSIX Regexps::. +- +-`REG_NOMATCH' +- `regex.h' (POSIX.2): *Note Matching POSIX Regexps::. +- +-`REG_NOSUB' +- `regex.h' (POSIX.2): *Note Flags for POSIX Regexps::. +- +-`REG_NOTBOL' +- `regex.h' (POSIX.2): *Note Matching POSIX Regexps::. +- +-`REG_NOTEOL' +- `regex.h' (POSIX.2): *Note Matching POSIX Regexps::. +- +-`regoff_t' +- `regex.h' (POSIX.2): *Note Regexp Subexpressions::. +- +-`double remainder (double NUMERATOR, double DENOMINATOR)' +- `math.h' (BSD): *Note Remainder Functions::. +- +-`float remainderf (float NUMERATOR, float DENOMINATOR)' +- `math.h' (BSD): *Note Remainder Functions::. +- +-`long double remainderl (long double NUMERATOR, long double DENOMINATOR)' +- `math.h' (BSD): *Note Remainder Functions::. +- +-`int remove (const char *FILENAME)' +- `stdio.h' (ISO): *Note Deleting Files::. +- +-`int rename (const char *OLDNAME, const char *NEWNAME)' +- `stdio.h' (ISO): *Note Renaming Files::. +- +-`void rewind (FILE *STREAM)' +- `stdio.h' (ISO): *Note File Positioning::. +- +-`void rewinddir (DIR *DIRSTREAM)' +- `dirent.h' (POSIX.1): *Note Random Access Directory::. +- +-`char * rindex (const char *STRING, int C)' +- `string.h' (BSD): *Note Search Functions::. +- +-`double rint (double X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`float rintf (float X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`long double rintl (long double X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`int RLIM_INFINITY' +- `sys/resource.h' (BSD): *Note Limits on Resources::. +- +-`RLIMIT_AS' +- `sys/resource.h' (Unix98): *Note Limits on Resources::. +- +-`RLIMIT_CORE' +- `sys/resource.h' (BSD): *Note Limits on Resources::. +- +-`RLIMIT_CPU' +- `sys/resource.h' (BSD): *Note Limits on Resources::. +- +-`RLIMIT_DATA' +- `sys/resource.h' (BSD): *Note Limits on Resources::. +- +-`RLIMIT_FSIZE' +- `sys/resource.h' (BSD): *Note Limits on Resources::. +- +-`RLIMIT_MEMLOCK' +- `sys/resource.h' (BSD): *Note Limits on Resources::. +- +-`RLIMIT_NOFILE' +- `sys/resource.h' (BSD): *Note Limits on Resources::. +- +-`RLIMIT_NPROC' +- `sys/resource.h' (BSD): *Note Limits on Resources::. +- +-`RLIMIT_RSS' +- `sys/resource.h' (BSD): *Note Limits on Resources::. +- +-`RLIMIT_STACK' +- `sys/resource.h' (BSD): *Note Limits on Resources::. +- +-`RLIM_NLIMITS' +- `sys/resource.h' (BSD): *Note Limits on Resources::. +- +-`int rmdir (const char *FILENAME)' +- `unistd.h' (POSIX.1): *Note Deleting Files::. +- +-`int R_OK' +- `unistd.h' (POSIX.1): *Note Testing File Access::. +- +-`double round (double X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`float roundf (float X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`long double roundl (long double X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`int rpmatch (const char *RESPONSE)' +- `stdlib.h' (stdlib.h): *Note Yes-or-No Questions::. +- +-`RUN_LVL' +- `utmp.h' (SVID): *Note Manipulating the Database::. +- +-`RUN_LVL' +- `utmpx.h' (XPG4.2): *Note XPG Functions::. +- +-`RUSAGE_CHILDREN' +- `sys/resource.h' (BSD): *Note Resource Usage::. +- +-`RUSAGE_SELF' +- `sys/resource.h' (BSD): *Note Resource Usage::. +- +-`int SA_NOCLDSTOP' +- `signal.h' (POSIX.1): *Note Flags for Sigaction::. +- +-`int SA_ONSTACK' +- `signal.h' (BSD): *Note Flags for Sigaction::. +- +-`int SA_RESTART' +- `signal.h' (BSD): *Note Flags for Sigaction::. +- +-`int sbrk (ptrdiff_t DELTA)' +- `unistd.h' (BSD): *Note Resizing the Data Segment::. +- +-`_SC_2_C_DEV' +- `unistd.h' (POSIX.2): *Note Constants for Sysconf::. +- +-`_SC_2_FORT_DEV' +- `unistd.h' (POSIX.2): *Note Constants for Sysconf::. +- +-`_SC_2_FORT_RUN' +- `unistd.h' (POSIX.2): *Note Constants for Sysconf::. +- +-`_SC_2_LOCALEDEF' +- `unistd.h' (POSIX.2): *Note Constants for Sysconf::. +- +-`_SC_2_SW_DEV' +- `unistd.h' (POSIX.2): *Note Constants for Sysconf::. +- +-`_SC_2_VERSION' +- `unistd.h' (POSIX.2): *Note Constants for Sysconf::. +- +-`_SC_AIO_LISTIO_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_AIO_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_AIO_PRIO_DELTA_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`double scalb (double VALUE, int EXPONENT)' +- `math.h' (BSD): *Note Normalization Functions::. +- +-`float scalbf (float VALUE, int EXPONENT)' +- `math.h' (BSD): *Note Normalization Functions::. +- +-`long double scalbl (long double VALUE, int EXPONENT)' +- `math.h' (BSD): *Note Normalization Functions::. +- +-`long long int scalbln (double X, long int n)' +- `math.h' (BSD): *Note Normalization Functions::. +- +-`long long int scalblnf (float X, long int n)' +- `math.h' (BSD): *Note Normalization Functions::. +- +-`long long int scalblnl (long double X, long int n)' +- `math.h' (BSD): *Note Normalization Functions::. +- +-`long long int scalbn (double X, int n)' +- `math.h' (BSD): *Note Normalization Functions::. +- +-`long long int scalbnf (float X, int n)' +- `math.h' (BSD): *Note Normalization Functions::. +- +-`long long int scalbnl (long double X, int n)' +- `math.h' (BSD): *Note Normalization Functions::. +- +-`int scandir (const char *DIR, struct dirent ***NAMELIST, int (*SELECTOR) (const struct dirent *), int (*CMP) (const void *, const void *))' +- `dirent.h' (BSD/SVID): *Note Scanning Directory Content::. +- +-`int scandir64 (const char *DIR, struct dirent64 ***NAMELIST, int (*SELECTOR) (const struct dirent64 *), int (*CMP) (const void *, const void *))' +- `dirent.h' (GNU): *Note Scanning Directory Content::. +- +-`int scanf (const char *TEMPLATE, ...)' +- `stdio.h' (ISO): *Note Formatted Input Functions::. +- +-`_SC_ARG_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_ASYNCHRONOUS_IO' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_ATEXIT_MAX' +- `unistd.h' (GNU): *Note Constants for Sysconf::. +- +-`_SC_AVPHYS_PAGES' +- `unistd.h' (GNU): *Note Constants for Sysconf::. +- +-`_SC_BC_BASE_MAX' +- `unistd.h' (POSIX.2): *Note Constants for Sysconf::. +- +-`_SC_BC_DIM_MAX' +- `unistd.h' (POSIX.2): *Note Constants for Sysconf::. +- +-`_SC_BC_SCALE_MAX' +- `unistd.h' (POSIX.2): *Note Constants for Sysconf::. +- +-`_SC_BC_STRING_MAX' +- `unistd.h' (POSIX.2): *Note Constants for Sysconf::. +- +-`_SC_CHAR_BIT' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_CHARCLASS_NAME_MAX' +- `unistd.h' (GNU): *Note Constants for Sysconf::. +- +-`_SC_CHAR_MAX' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_CHAR_MIN' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_CHILD_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_CLK_TCK' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_COLL_WEIGHTS_MAX' +- `unistd.h' (POSIX.2): *Note Constants for Sysconf::. +- +-`_SC_DELAYTIMER_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_EQUIV_CLASS_MAX' +- `unistd.h' (POSIX.2): *Note Constants for Sysconf::. +- +-`_SC_EXPR_NEST_MAX' +- `unistd.h' (POSIX.2): *Note Constants for Sysconf::. +- +-`_SC_FSYNC' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_GETGR_R_SIZE_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_GETPW_R_SIZE_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`SCHAR_MAX' +- `limits.h' (ISO): *Note Range of Type::. +- +-`SCHAR_MIN' +- `limits.h' (ISO): *Note Range of Type::. +- +-`int sched_getparam (pid_t PID, const struct sched_param *PARAM)' +- `sched.h' (POSIX): *Note Basic Scheduling Functions::. +- +-`int sched_get_priority_max (int *POLICY);' +- `sched.h' (POSIX): *Note Basic Scheduling Functions::. +- +-`int sched_get_priority_min (int *POLICY);' +- `sched.h' (POSIX): *Note Basic Scheduling Functions::. +- +-`int sched_getscheduler (pid_t PID)' +- `sched.h' (POSIX): *Note Basic Scheduling Functions::. +- +-`int sched_rr_get_interval (pid_t PID, struct timespec *INTERVAL)' +- `sched.h' (POSIX): *Note Basic Scheduling Functions::. +- +-`int sched_setparam (pid_t PID, const struct sched_param *PARAM)' +- `sched.h' (POSIX): *Note Basic Scheduling Functions::. +- +-`int sched_setscheduler (pid_t PID, int POLICY, const struct sched_param *PARAM)' +- `sched.h' (POSIX): *Note Basic Scheduling Functions::. +- +-`int sched_yield (void)' +- `sched.h' (POSIX): *Note Basic Scheduling Functions::. +- +-`_SC_INT_MAX' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_INT_MIN' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_JOB_CONTROL' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_LINE_MAX' +- `unistd.h' (POSIX.2): *Note Constants for Sysconf::. +- +-`_SC_LOGIN_NAME_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_LONG_BIT' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_MAPPED_FILES' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_MB_LEN_MAX' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_MEMLOCK' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_MEMLOCK_RANGE' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_MEMORY_PROTECTION' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_MESSAGE_PASSING' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_MQ_OPEN_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_MQ_PRIO_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_NGROUPS_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_NL_ARGMAX' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_NL_LANGMAX' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_NL_MSGMAX' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_NL_NMAX' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_NL_SETMAX' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_NL_TEXTMAX' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_NPROCESSORS_CONF' +- `unistd.h' (GNU): *Note Constants for Sysconf::. +- +-`_SC_NPROCESSORS_ONLN' +- `unistd.h' (GNU): *Note Constants for Sysconf::. +- +-`_SC_NZERO' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_OPEN_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_PAGESIZE' +- `unistd.h' (GNU): *Note Constants for Sysconf::. +- +-`_SC_PHYS_PAGES' +- `unistd.h' (GNU): *Note Constants for Sysconf::. +- +-`_SC_PII' +- `unistd.h' (POSIX.1g): *Note Constants for Sysconf::. +- +-`_SC_PII_INTERNET' +- `unistd.h' (POSIX.1g): *Note Constants for Sysconf::. +- +-`_SC_PII_INTERNET_DGRAM' +- `unistd.h' (POSIX.1g): *Note Constants for Sysconf::. +- +-`_SC_PII_INTERNET_STREAM' +- `unistd.h' (POSIX.1g): *Note Constants for Sysconf::. +- +-`_SC_PII_OSI' +- `unistd.h' (POSIX.1g): *Note Constants for Sysconf::. +- +-`_SC_PII_OSI_CLTS' +- `unistd.h' (POSIX.1g): *Note Constants for Sysconf::. +- +-`_SC_PII_OSI_COTS' +- `unistd.h' (POSIX.1g): *Note Constants for Sysconf::. +- +-`_SC_PII_OSI_M' +- `unistd.h' (POSIX.1g): *Note Constants for Sysconf::. +- +-`_SC_PII_SOCKET' +- `unistd.h' (POSIX.1g): *Note Constants for Sysconf::. +- +-`_SC_PII_XTI' +- `unistd.h' (POSIX.1g): *Note Constants for Sysconf::. +- +-`_SC_PRIORITIZED_IO' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_PRIORITY_SCHEDULING' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_REALTIME_SIGNALS' +- `unistdh.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_RTSIG_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_SAVED_IDS' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_SCHAR_MAX' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_SCHAR_MIN' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_SELECT' +- `unistd.h' (POSIX.1g): *Note Constants for Sysconf::. +- +-`_SC_SEMAPHORES' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_SEM_NSEMS_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_SEM_VALUE_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_SHARED_MEMORY_OBJECTS' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_SHRT_MAX' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_SHRT_MIN' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_SIGQUEUE_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`SC_SSIZE_MAX' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_STREAM_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_SYNCHRONIZED_IO' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_THREAD_ATTR_STACKADDR' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_THREAD_ATTR_STACKSIZE' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_THREAD_DESTRUCTOR_ITERATIONS' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_THREAD_KEYS_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_THREAD_PRIO_INHERIT' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_THREAD_PRIO_PROTECT' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_THREAD_PRIORITY_SCHEDULING' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_THREAD_PROCESS_SHARED' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_THREADS' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_THREAD_SAFE_FUNCTIONS' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_THREAD_STACK_MIN' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_THREAD_THREADS_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_TIMER_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_TIMERS' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_T_IOV_MAX' +- `unistd.h' (POSIX.1g): *Note Constants for Sysconf::. +- +-`_SC_TTY_NAME_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_TZNAME_MAX' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_UCHAR_MAX' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_UINT_MAX' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_UIO_MAXIOV' +- `unistd.h' (POSIX.1g): *Note Constants for Sysconf::. +- +-`_SC_ULONG_MAX' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_USHRT_MAX' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_VERSION' +- `unistd.h' (POSIX.1): *Note Constants for Sysconf::. +- +-`_SC_VERSION' +- `unistd.h' (POSIX.2): *Note Constants for Sysconf::. +- +-`_SC_WORD_BIT' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_XOPEN_CRYPT' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_XOPEN_ENH_I18N' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_XOPEN_LEGACY' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_XOPEN_REALTIME' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_XOPEN_REALTIME_THREADS' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_XOPEN_SHM' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_XOPEN_UNIX' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_XOPEN_VERSION' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_XOPEN_XCU_VERSION' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_XOPEN_XPG2' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_XOPEN_XPG3' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`_SC_XOPEN_XPG4' +- `unistd.h' (X/Open): *Note Constants for Sysconf::. +- +-`unsigned short int * seed48 (unsigned short int SEED16V[3])' +- `stdlib.h' (SVID): *Note SVID Random::. +- +-`int seed48_r (unsigned short int SEED16V[3], struct drand48_data *BUFFER)' +- `stdlib.h' (GNU): *Note SVID Random::. +- +-`int SEEK_CUR' +- `stdio.h' (ISO): *Note File Positioning::. +- +-`void seekdir (DIR *DIRSTREAM, off_t POS)' +- `dirent.h' (BSD): *Note Random Access Directory::. +- +-`int SEEK_END' +- `stdio.h' (ISO): *Note File Positioning::. +- +-`int SEEK_SET' +- `stdio.h' (ISO): *Note File Positioning::. +- +-`int select (int NFDS, fd_set *READ-FDS, fd_set *WRITE-FDS, fd_set *EXCEPT-FDS, struct timeval *TIMEOUT)' +- `sys/types.h' (BSD): *Note Waiting for I/O::. +- +-`int sem_destroy (sem_t * SEM)' +- `semaphore.h' (POSIX): *Note POSIX Semaphores::. +- +-`int sem_getvalue (sem_t * SEM, int * SVAL)' +- `semaphore.h' (POSIX): *Note POSIX Semaphores::. +- +-`int sem_init (sem_t *SEM, int PSHARED, unsigned int VALUE)' +- `semaphore.h' (POSIX): *Note POSIX Semaphores::. +- +-`int sem_post (sem_t * SEM)' +- `semaphore.h' (POSIX): *Note POSIX Semaphores::. +- +-`int sem_trywait (sem_t * SEM)' +- `semaphore.h' (POSIX): *Note POSIX Semaphores::. +- +-`int sem_wait (sem_t * SEM)' +- `semaphore.h' (POSIX): *Note POSIX Semaphores::. +- +-`int send (int SOCKET, void *BUFFER, size_t SIZE, int FLAGS)' +- `sys/socket.h' (BSD): *Note Sending Data::. +- +-`int sendmsg (int SOCKET, const struct msghdr *MESSAGE, int FLAGS)' +- `sys/socket.h' (BSD): *Note Receiving Datagrams::. +- +-`int sendto (int SOCKET, void *BUFFER. size_t SIZE, int FLAGS, struct sockaddr *ADDR, socklen_t LENGTH)' +- `sys/socket.h' (BSD): *Note Sending Datagrams::. +- +-`void setbuf (FILE *STREAM, char *BUF)' +- `stdio.h' (ISO): *Note Controlling Buffering::. +- +-`void setbuffer (FILE *STREAM, char *BUF, size_t SIZE)' +- `stdio.h' (BSD): *Note Controlling Buffering::. +- +-`int setcontext (const ucontext_t *UCP)' +- `ucontext.h' (SVID): *Note System V contexts::. +- +-`int setdomainname (const char *NAME, size_t LENGTH)' +- `unistd.h' (???): *Note Host Identification::. +- +-`int setegid (gid_t NEWGID)' +- `unistd.h' (POSIX.1): *Note Setting Groups::. +- +-`int setenv (const char *NAME, const char *VALUE, int REPLACE)' +- `stdlib.h' (BSD): *Note Environment Access::. +- +-`int seteuid (uid_t NEWEUID)' +- `unistd.h' (POSIX.1): *Note Setting User ID::. +- +-`int setfsent (void)' +- `fstab.h' (BSD): *Note fstab::. +- +-`int setgid (gid_t NEWGID)' +- `unistd.h' (POSIX.1): *Note Setting Groups::. +- +-`void setgrent (void)' +- `grp.h' (SVID, BSD): *Note Scanning All Groups::. +- +-`int setgroups (size_t COUNT, gid_t *GROUPS)' +- `grp.h' (BSD): *Note Setting Groups::. +- +-`void sethostent (int STAYOPEN)' +- `netdb.h' (BSD): *Note Host Names::. +- +-`int sethostid (long int ID)' +- `unistd.h' (BSD): *Note Host Identification::. +- +-`int sethostname (const char *NAME, size_t LENGTH)' +- `unistd.h' (BSD): *Note Host Identification::. +- +-`int setitimer (int WHICH, struct itimerval *NEW, struct itimerval *OLD)' +- `sys/time.h' (BSD): *Note Setting an Alarm::. +- +-`int setjmp (jmp_buf STATE)' +- `setjmp.h' (ISO): *Note Non-Local Details::. +- +-`void setkey (const char *KEY)' +- `crypt.h' (BSD, SVID): *Note DES Encryption::. +- +-`void setkey_r (const char *KEY, struct crypt_data * DATA)' +- `crypt.h' (GNU): *Note DES Encryption::. +- +-`void setlinebuf (FILE *STREAM)' +- `stdio.h' (BSD): *Note Controlling Buffering::. +- +-`char * setlocale (int CATEGORY, const char *LOCALE)' +- `locale.h' (ISO): *Note Setting the Locale::. +- +-`int setlogmask (int MASK)' +- `syslog.h' (BSD): *Note setlogmask::. +- +-`FILE * setmntent (const char *FILE, const char *MODE)' +- `mntent.h' (BSD): *Note mtab::. +- +-`void setnetent (int STAYOPEN)' +- `netdb.h' (BSD): *Note Networks Database::. +- +-`int setnetgrent (const char *NETGROUP)' +- `netdb.h' (BSD): *Note Lookup Netgroup::. +- +-`int setpgid (pid_t PID, pid_t PGID)' +- `unistd.h' (POSIX.1): *Note Process Group Functions::. +- +-`int setpgrp (pid_t PID, pid_t PGID)' +- `unistd.h' (BSD): *Note Process Group Functions::. +- +-`int setpriority (int CLASS, int ID, int NICEVAL)' +- `sys/resource.h' (BSD,POSIX): *Note Traditional Scheduling +- Functions::. +- +-`void setprotoent (int STAYOPEN)' +- `netdb.h' (BSD): *Note Protocols Database::. +- +-`void setpwent (void)' +- `pwd.h' (SVID, BSD): *Note Scanning All Users::. +- +-`int setregid (gid_t RGID, gid_t EGID)' +- `unistd.h' (BSD): *Note Setting Groups::. +- +-`int setreuid (uid_t RUID, uid_t EUID)' +- `unistd.h' (BSD): *Note Setting User ID::. +- +-`int setrlimit (int RESOURCE, const struct rlimit *RLP)' +- `sys/resource.h' (BSD): *Note Limits on Resources::. +- +-`int setrlimit64 (int RESOURCE, const struct rlimit64 *RLP)' +- `sys/resource.h' (Unix98): *Note Limits on Resources::. +- +-`void setservent (int STAYOPEN)' +- `netdb.h' (BSD): *Note Services Database::. +- +-`pid_t setsid (void)' +- `unistd.h' (POSIX.1): *Note Process Group Functions::. +- +-`int setsockopt (int SOCKET, int LEVEL, int OPTNAME, void *OPTVAL, socklen_t OPTLEN)' +- `sys/socket.h' (BSD): *Note Socket Option Functions::. +- +-`void * setstate (void *STATE)' +- `stdlib.h' (BSD): *Note BSD Random::. +- +-`int setstate_r (char *restrict STATEBUF, struct random_data *restrict BUF)' +- `stdlib.h' (GNU): *Note BSD Random::. +- +-`int settimeofday (const struct timeval *TP, const struct timezone *TZP)' +- `sys/time.h' (BSD): *Note High-Resolution Calendar::. +- +-`int setuid (uid_t NEWUID)' +- `unistd.h' (POSIX.1): *Note Setting User ID::. +- +-`void setutent (void)' +- `utmp.h' (SVID): *Note Manipulating the Database::. +- +-`void setutxent (void)' +- `utmpx.h' (XPG4.2): *Note XPG Functions::. +- +-`int setvbuf (FILE *STREAM, char *BUF, int MODE, size_t SIZE)' +- `stdio.h' (ISO): *Note Controlling Buffering::. +- +-`SHRT_MAX' +- `limits.h' (ISO): *Note Range of Type::. +- +-`SHRT_MIN' +- `limits.h' (ISO): *Note Range of Type::. +- +-`int shutdown (int SOCKET, int HOW)' +- `sys/socket.h' (BSD): *Note Closing a Socket::. +- +-`S_IEXEC' +- `sys/stat.h' (BSD): *Note Permission Bits::. +- +-`S_IFBLK' +- `sys/stat.h' (BSD): *Note Testing File Type::. +- +-`S_IFCHR' +- `sys/stat.h' (BSD): *Note Testing File Type::. +- +-`S_IFDIR' +- `sys/stat.h' (BSD): *Note Testing File Type::. +- +-`S_IFIFO' +- `sys/stat.h' (BSD): *Note Testing File Type::. +- +-`S_IFLNK' +- `sys/stat.h' (BSD): *Note Testing File Type::. +- +-`int S_IFMT' +- `sys/stat.h' (BSD): *Note Testing File Type::. +- +-`S_IFREG' +- `sys/stat.h' (BSD): *Note Testing File Type::. +- +-`S_IFSOCK' +- `sys/stat.h' (BSD): *Note Testing File Type::. +- +-`int SIGABRT' +- `signal.h' (ISO): *Note Program Error Signals::. +- +-`int sigaction (int SIGNUM, const struct sigaction *restrict ACTION, struct sigaction *restrict OLD-ACTION)' +- `signal.h' (POSIX.1): *Note Advanced Signal Handling::. +- +-`int sigaddset (sigset_t *SET, int SIGNUM)' +- `signal.h' (POSIX.1): *Note Signal Sets::. +- +-`int SIGALRM' +- `signal.h' (POSIX.1): *Note Alarm Signals::. +- +-`int sigaltstack (const stack_t *restrict STACK, stack_t *restrict OLDSTACK)' +- `signal.h' (XPG): *Note Signal Stack::. +- +-`sig_atomic_t' +- `signal.h' (ISO): *Note Atomic Types::. +- +-`SIG_BLOCK' +- `signal.h' (POSIX.1): *Note Process Signal Mask::. +- +-`int sigblock (int MASK)' +- `signal.h' (BSD): *Note Blocking in BSD::. +- +-`int SIGBUS' +- `signal.h' (BSD): *Note Program Error Signals::. +- +-`int SIGCHLD' +- `signal.h' (POSIX.1): *Note Job Control Signals::. +- +-`int SIGCLD' +- `signal.h' (SVID): *Note Job Control Signals::. +- +-`int SIGCONT' +- `signal.h' (POSIX.1): *Note Job Control Signals::. +- +-`int sigdelset (sigset_t *SET, int SIGNUM)' +- `signal.h' (POSIX.1): *Note Signal Sets::. +- +-`int sigemptyset (sigset_t *SET)' +- `signal.h' (POSIX.1): *Note Signal Sets::. +- +-`int SIGEMT' +- `signal.h' (BSD): *Note Program Error Signals::. +- +-`sighandler_t SIG_ERR' +- `signal.h' (ISO): *Note Basic Signal Handling::. +- +-`int sigfillset (sigset_t *SET)' +- `signal.h' (POSIX.1): *Note Signal Sets::. +- +-`int SIGFPE' +- `signal.h' (ISO): *Note Program Error Signals::. +- +-`sighandler_t' +- `signal.h' (GNU): *Note Basic Signal Handling::. +- +-`int SIGHUP' +- `signal.h' (POSIX.1): *Note Termination Signals::. +- +-`int SIGILL' +- `signal.h' (ISO): *Note Program Error Signals::. +- +-`int SIGINFO' +- `signal.h' (BSD): *Note Miscellaneous Signals::. +- +-`int SIGINT' +- `signal.h' (ISO): *Note Termination Signals::. +- +-`int siginterrupt (int SIGNUM, int FAILFLAG)' +- `signal.h' (BSD): *Note BSD Handler::. +- +-`int SIGIO' +- `signal.h' (BSD): *Note Asynchronous I/O Signals::. +- +-`int SIGIOT' +- `signal.h' (Unix): *Note Program Error Signals::. +- +-`int sigismember (const sigset_t *SET, int SIGNUM)' +- `signal.h' (POSIX.1): *Note Signal Sets::. +- +-`sigjmp_buf' +- `setjmp.h' (POSIX.1): *Note Non-Local Exits and Signals::. +- +-`int SIGKILL' +- `signal.h' (POSIX.1): *Note Termination Signals::. +- +-`void siglongjmp (sigjmp_buf STATE, int VALUE)' +- `setjmp.h' (POSIX.1): *Note Non-Local Exits and Signals::. +- +-`int SIGLOST' +- `signal.h' (GNU): *Note Operation Error Signals::. +- +-`int sigmask (int SIGNUM)' +- `signal.h' (BSD): *Note Blocking in BSD::. +- +-`sighandler_t signal (int SIGNUM, sighandler_t ACTION)' +- `signal.h' (ISO): *Note Basic Signal Handling::. +- +-`int signbit (_float-type_ X)' +- `math.h' (ISO): *Note FP Bit Twiddling::. +- +-`long long int significand (double X)' +- `math.h' (BSD): *Note Normalization Functions::. +- +-`long long int significandf (float X)' +- `math.h' (BSD): *Note Normalization Functions::. +- +-`long long int significandl (long double X)' +- `math.h' (BSD): *Note Normalization Functions::. +- +-`int sigpause (int MASK)' +- `signal.h' (BSD): *Note Blocking in BSD::. +- +-`int sigpending (sigset_t *SET)' +- `signal.h' (POSIX.1): *Note Checking for Pending Signals::. +- +-`int SIGPIPE' +- `signal.h' (POSIX.1): *Note Operation Error Signals::. +- +-`int SIGPOLL' +- `signal.h' (SVID): *Note Asynchronous I/O Signals::. +- +-`int sigprocmask (int HOW, const sigset_t *restrict SET, sigset_t *restrict OLDSET)' +- `signal.h' (POSIX.1): *Note Process Signal Mask::. +- +-`int SIGPROF' +- `signal.h' (BSD): *Note Alarm Signals::. +- +-`int SIGQUIT' +- `signal.h' (POSIX.1): *Note Termination Signals::. +- +-`int SIGSEGV' +- `signal.h' (ISO): *Note Program Error Signals::. +- +-`int sigsetjmp (sigjmp_buf STATE, int SAVESIGS)' +- `setjmp.h' (POSIX.1): *Note Non-Local Exits and Signals::. +- +-`SIG_SETMASK' +- `signal.h' (POSIX.1): *Note Process Signal Mask::. +- +-`int sigsetmask (int MASK)' +- `signal.h' (BSD): *Note Blocking in BSD::. +- +-`sigset_t' +- `signal.h' (POSIX.1): *Note Signal Sets::. +- +-`int sigstack (const struct sigstack *STACK, struct sigstack *OLDSTACK)' +- `signal.h' (BSD): *Note Signal Stack::. +- +-`int SIGSTOP' +- `signal.h' (POSIX.1): *Note Job Control Signals::. +- +-`int sigsuspend (const sigset_t *SET)' +- `signal.h' (POSIX.1): *Note Sigsuspend::. +- +-`int SIGSYS' +- `signal.h' (Unix): *Note Program Error Signals::. +- +-`int SIGTERM' +- `signal.h' (ISO): *Note Termination Signals::. +- +-`int SIGTRAP' +- `signal.h' (BSD): *Note Program Error Signals::. +- +-`int SIGTSTP' +- `signal.h' (POSIX.1): *Note Job Control Signals::. +- +-`int SIGTTIN' +- `signal.h' (POSIX.1): *Note Job Control Signals::. +- +-`int SIGTTOU' +- `signal.h' (POSIX.1): *Note Job Control Signals::. +- +-`SIG_UNBLOCK' +- `signal.h' (POSIX.1): *Note Process Signal Mask::. +- +-`int SIGURG' +- `signal.h' (BSD): *Note Asynchronous I/O Signals::. +- +-`int SIGUSR1' +- `signal.h' (POSIX.1): *Note Miscellaneous Signals::. +- +-`int SIGUSR2' +- `signal.h' (POSIX.1): *Note Miscellaneous Signals::. +- +-`int sigvec (int SIGNUM, const struct sigvec *ACTION,struct sigvec *OLD-ACTION)' +- `signal.h' (BSD): *Note BSD Handler::. +- +-`int SIGVTALRM' +- `signal.h' (BSD): *Note Alarm Signals::. +- +-`int sigwait (const sigset_t *SET, int *SIG)' +- `pthread.h' (POSIX): *Note Threads and Signal Handling::. +- +-`int SIGWINCH' +- `signal.h' (BSD): *Note Miscellaneous Signals::. +- +-`int SIGXCPU' +- `signal.h' (BSD): *Note Operation Error Signals::. +- +-`int SIGXFSZ' +- `signal.h' (BSD): *Note Operation Error Signals::. +- +-`double sin (double X)' +- `math.h' (ISO): *Note Trig Functions::. +- +-`void sincos (double X, double *SINX, double *COSX)' +- `math.h' (GNU): *Note Trig Functions::. +- +-`void sincosf (float X, float *SINX, float *COSX)' +- `math.h' (GNU): *Note Trig Functions::. +- +-`void sincosl (long double X, long double *SINX, long double *COSX)' +- `math.h' (GNU): *Note Trig Functions::. +- +-`float sinf (float X)' +- `math.h' (ISO): *Note Trig Functions::. +- +-`double sinh (double X)' +- `math.h' (ISO): *Note Hyperbolic Functions::. +- +-`float sinhf (float X)' +- `math.h' (ISO): *Note Hyperbolic Functions::. +- +-`long double sinhl (long double X)' +- `math.h' (ISO): *Note Hyperbolic Functions::. +- +-`long double sinl (long double X)' +- `math.h' (ISO): *Note Trig Functions::. +- +-`S_IREAD' +- `sys/stat.h' (BSD): *Note Permission Bits::. +- +-`S_IRGRP' +- `sys/stat.h' (POSIX.1): *Note Permission Bits::. +- +-`S_IROTH' +- `sys/stat.h' (POSIX.1): *Note Permission Bits::. +- +-`S_IRUSR' +- `sys/stat.h' (POSIX.1): *Note Permission Bits::. +- +-`S_IRWXG' +- `sys/stat.h' (POSIX.1): *Note Permission Bits::. +- +-`S_IRWXO' +- `sys/stat.h' (POSIX.1): *Note Permission Bits::. +- +-`S_IRWXU' +- `sys/stat.h' (POSIX.1): *Note Permission Bits::. +- +-`int S_ISBLK (mode_t M)' +- `sys/stat.h' (POSIX): *Note Testing File Type::. +- +-`int S_ISCHR (mode_t M)' +- `sys/stat.h' (POSIX): *Note Testing File Type::. +- +-`int S_ISDIR (mode_t M)' +- `sys/stat.h' (POSIX): *Note Testing File Type::. +- +-`int S_ISFIFO (mode_t M)' +- `sys/stat.h' (POSIX): *Note Testing File Type::. +- +-`S_ISGID' +- `sys/stat.h' (POSIX): *Note Permission Bits::. +- +-`int S_ISLNK (mode_t M)' +- `sys/stat.h' (GNU): *Note Testing File Type::. +- +-`int S_ISREG (mode_t M)' +- `sys/stat.h' (POSIX): *Note Testing File Type::. +- +-`int S_ISSOCK (mode_t M)' +- `sys/stat.h' (GNU): *Note Testing File Type::. +- +-`S_ISUID' +- `sys/stat.h' (POSIX): *Note Permission Bits::. +- +-`S_ISVTX' +- `sys/stat.h' (BSD): *Note Permission Bits::. +- +-`S_IWGRP' +- `sys/stat.h' (POSIX.1): *Note Permission Bits::. +- +-`S_IWOTH' +- `sys/stat.h' (POSIX.1): *Note Permission Bits::. +- +-`S_IWRITE' +- `sys/stat.h' (BSD): *Note Permission Bits::. +- +-`S_IWUSR' +- `sys/stat.h' (POSIX.1): *Note Permission Bits::. +- +-`S_IXGRP' +- `sys/stat.h' (POSIX.1): *Note Permission Bits::. +- +-`S_IXOTH' +- `sys/stat.h' (POSIX.1): *Note Permission Bits::. +- +-`S_IXUSR' +- `sys/stat.h' (POSIX.1): *Note Permission Bits::. +- +-`size_t' +- `stddef.h' (ISO): *Note Important Data Types::. +- +-`unsigned int sleep (unsigned int SECONDS)' +- `unistd.h' (POSIX.1): *Note Sleeping::. +- +-`int snprintf (char *S, size_t SIZE, const char *TEMPLATE, ...)' +- `stdio.h' (GNU): *Note Formatted Output Functions::. +- +-`SO_BROADCAST' +- `sys/socket.h' (BSD): *Note Socket-Level Options::. +- +-`int SOCK_DGRAM' +- `sys/socket.h' (BSD): *Note Communication Styles::. +- +-`int socket (int NAMESPACE, int STYLE, int PROTOCOL)' +- `sys/socket.h' (BSD): *Note Creating a Socket::. +- +-`int socketpair (int NAMESPACE, int STYLE, int PROTOCOL, int FILEDES[2])' +- `sys/socket.h' (BSD): *Note Socket Pairs::. +- +-`int SOCK_RAW' +- `sys/socket.h' (BSD): *Note Communication Styles::. +- +-`int SOCK_RDM' +- `sys/socket.h' (BSD): *Note Communication Styles::. +- +-`int SOCK_SEQPACKET' +- `sys/socket.h' (BSD): *Note Communication Styles::. +- +-`int SOCK_STREAM' +- `sys/socket.h' (BSD): *Note Communication Styles::. +- +-`SO_DEBUG' +- `sys/socket.h' (BSD): *Note Socket-Level Options::. +- +-`SO_DONTROUTE' +- `sys/socket.h' (BSD): *Note Socket-Level Options::. +- +-`SO_ERROR' +- `sys/socket.h' (BSD): *Note Socket-Level Options::. +- +-`SO_KEEPALIVE' +- `sys/socket.h' (BSD): *Note Socket-Level Options::. +- +-`SO_LINGER' +- `sys/socket.h' (BSD): *Note Socket-Level Options::. +- +-`int SOL_SOCKET' +- `sys/socket.h' (BSD): *Note Socket-Level Options::. +- +-`SO_OOBINLINE' +- `sys/socket.h' (BSD): *Note Socket-Level Options::. +- +-`SO_RCVBUF' +- `sys/socket.h' (BSD): *Note Socket-Level Options::. +- +-`SO_REUSEADDR' +- `sys/socket.h' (BSD): *Note Socket-Level Options::. +- +-`SO_SNDBUF' +- `sys/socket.h' (BSD): *Note Socket-Level Options::. +- +-`SO_STYLE' +- `sys/socket.h' (GNU): *Note Socket-Level Options::. +- +-`SO_TYPE' +- `sys/socket.h' (BSD): *Note Socket-Level Options::. +- +-`speed_t' +- `termios.h' (POSIX.1): *Note Line Speed::. +- +-`int sprintf (char *S, const char *TEMPLATE, ...)' +- `stdio.h' (ISO): *Note Formatted Output Functions::. +- +-`double sqrt (double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`float sqrtf (float X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`long double sqrtl (long double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`void srand (unsigned int SEED)' +- `stdlib.h' (ISO): *Note ISO Random::. +- +-`void srand48 (long int SEEDVAL)' +- `stdlib.h' (SVID): *Note SVID Random::. +- +-`int srand48_r (long int SEEDVAL, struct drand48_data *BUFFER)' +- `stdlib.h' (GNU): *Note SVID Random::. +- +-`void srandom (unsigned int SEED)' +- `stdlib.h' (BSD): *Note BSD Random::. +- +-`int srandom_r (unsigned int SEED, struct random_data *BUF)' +- `stdlib.h' (GNU): *Note BSD Random::. +- +-`int sscanf (const char *S, const char *TEMPLATE, ...)' +- `stdio.h' (ISO): *Note Formatted Input Functions::. +- +-`sighandler_t ssignal (int SIGNUM, sighandler_t ACTION)' +- `signal.h' (SVID): *Note Basic Signal Handling::. +- +-`int SSIZE_MAX' +- `limits.h' (POSIX.1): *Note General Limits::. +- +-`ssize_t' +- `unistd.h' (POSIX.1): *Note I/O Primitives::. +- +-`stack_t' +- `signal.h' (XPG): *Note Signal Stack::. +- +-`int stat (const char *FILENAME, struct stat *BUF)' +- `sys/stat.h' (POSIX.1): *Note Reading Attributes::. +- +-`int stat64 (const char *FILENAME, struct stat64 *BUF)' +- `sys/stat.h' (Unix98): *Note Reading Attributes::. +- +-`FILE * stderr' +- `stdio.h' (ISO): *Note Standard Streams::. +- +-`STDERR_FILENO' +- `unistd.h' (POSIX.1): *Note Descriptors and Streams::. +- +-`FILE * stdin' +- `stdio.h' (ISO): *Note Standard Streams::. +- +-`STDIN_FILENO' +- `unistd.h' (POSIX.1): *Note Descriptors and Streams::. +- +-`FILE * stdout' +- `stdio.h' (ISO): *Note Standard Streams::. +- +-`STDOUT_FILENO' +- `unistd.h' (POSIX.1): *Note Descriptors and Streams::. +- +-`int stime (time_t *NEWTIME)' +- `time.h' (SVID, XPG): *Note Simple Calendar Time::. +- +-`char * stpcpy (char *restrict TO, const char *restrict FROM)' +- `string.h' (Unknown origin): *Note Copying and Concatenation::. +- +-`char * stpncpy (char *restrict TO, const char *restrict FROM, size_t SIZE)' +- `string.h' (GNU): *Note Copying and Concatenation::. +- +-`int strcasecmp (const char *S1, const char *S2)' +- `string.h' (BSD): *Note String/Array Comparison::. +- +-`char * strcasestr (const char *HAYSTACK, const char *NEEDLE)' +- `string.h' (GNU): *Note Search Functions::. +- +-`char * strcat (char *restrict TO, const char *restrict FROM)' +- `string.h' (ISO): *Note Copying and Concatenation::. +- +-`char * strchr (const char *STRING, int C)' +- `string.h' (ISO): *Note Search Functions::. +- +-`char * strchrnul (const char *STRING, int C)' +- `string.h' (GNU): *Note Search Functions::. +- +-`int strcmp (const char *S1, const char *S2)' +- `string.h' (ISO): *Note String/Array Comparison::. +- +-`int strcoll (const char *S1, const char *S2)' +- `string.h' (ISO): *Note Collation Functions::. +- +-`char * strcpy (char *restrict TO, const char *restrict FROM)' +- `string.h' (ISO): *Note Copying and Concatenation::. +- +-`size_t strcspn (const char *STRING, const char *STOPSET)' +- `string.h' (ISO): *Note Search Functions::. +- +-`char * strdup (const char *S)' +- `string.h' (SVID): *Note Copying and Concatenation::. +- +-`char * strdupa (const char *S)' +- `string.h' (GNU): *Note Copying and Concatenation::. +- +-`int STREAM_MAX' +- `limits.h' (POSIX.1): *Note General Limits::. +- +-`char * strerror (int ERRNUM)' +- `string.h' (ISO): *Note Error Messages::. +- +-`char * strerror_r (int ERRNUM, char *BUF, size_t N)' +- `string.h' (GNU): *Note Error Messages::. +- +-`char * strfry (char *STRING)' +- `string.h' (GNU): *Note strfry::. +- +-`size_t strftime (char *S, size_t SIZE, const char *TEMPLATE, const struct tm *BROKENTIME)' +- `time.h' (ISO): *Note Formatting Calendar Time::. +- +-`size_t strlen (const char *S)' +- `string.h' (ISO): *Note String Length::. +- +-`int strncasecmp (const char *S1, const char *S2, size_t N)' +- `string.h' (BSD): *Note String/Array Comparison::. +- +-`char * strncat (char *restrict TO, const char *restrict FROM, size_t SIZE)' +- `string.h' (ISO): *Note Copying and Concatenation::. +- +-`int strncmp (const char *S1, const char *S2, size_t SIZE)' +- `string.h' (ISO): *Note String/Array Comparison::. +- +-`char * strncpy (char *restrict TO, const char *restrict FROM, size_t SIZE)' +- `string.h' (ISO): *Note Copying and Concatenation::. +- +-`char * strndup (const char *S, size_t SIZE)' +- `string.h' (GNU): *Note Copying and Concatenation::. +- +-`char * strndupa (const char *S, size_t SIZE)' +- `string.h' (GNU): *Note Copying and Concatenation::. +- +-`size_t strnlen (const char *S, size_t MAXLEN)' +- `string.h' (GNU): *Note String Length::. +- +-`char * strpbrk (const char *STRING, const char *STOPSET)' +- `string.h' (ISO): *Note Search Functions::. +- +-`char * strptime (const char *S, const char *FMT, struct tm *TP)' +- `time.h' (XPG4): *Note Low-Level Time String Parsing::. +- +-`char * strrchr (const char *STRING, int C)' +- `string.h' (ISO): *Note Search Functions::. +- +-`char * strsep (char **STRING_PTR, const char *DELIMITER)' +- `string.h' (BSD): *Note Finding Tokens in a String::. +- +-`char * strsignal (int SIGNUM)' +- `string.h' (GNU): *Note Signal Messages::. +- +-`size_t strspn (const char *STRING, const char *SKIPSET)' +- `string.h' (ISO): *Note Search Functions::. +- +-`char * strstr (const char *HAYSTACK, const char *NEEDLE)' +- `string.h' (ISO): *Note Search Functions::. +- +-`double strtod (const char *restrict STRING, char **restrict TAILPTR)' +- `stdlib.h' (ISO): *Note Parsing of Floats::. +- +-`float strtof (const char *STRING, char **TAILPTR)' +- `stdlib.h' (ISO): *Note Parsing of Floats::. +- +-`intmax_t strtoimax (const char *restrict STRING, char **restrict TAILPTR, int BASE)' +- `inttypes.h' (ISO): *Note Parsing of Integers::. +- +-`char * strtok (char *restrict NEWSTRING, const char *restrict DELIMITERS)' +- `string.h' (ISO): *Note Finding Tokens in a String::. +- +-`char * strtok_r (char *NEWSTRING, const char *DELIMITERS, char **SAVE_PTR)' +- `string.h' (POSIX): *Note Finding Tokens in a String::. +- +-`long int strtol (const char *restrict STRING, char **restrict TAILPTR, int BASE)' +- `stdlib.h' (ISO): *Note Parsing of Integers::. +- +-`long double strtold (const char *STRING, char **TAILPTR)' +- `stdlib.h' (ISO): *Note Parsing of Floats::. +- +-`long long int strtoll (const char *restrict STRING, char **restrict TAILPTR, int BASE)' +- `stdlib.h' (ISO): *Note Parsing of Integers::. +- +-`long long int strtoq (const char *restrict STRING, char **restrict TAILPTR, int BASE)' +- `stdlib.h' (BSD): *Note Parsing of Integers::. +- +-`unsigned long int strtoul (const char *retrict STRING, char **restrict TAILPTR, int BASE)' +- `stdlib.h' (ISO): *Note Parsing of Integers::. +- +-`unsigned long long int strtoull (const char *restrict STRING, char **restrict TAILPTR, int BASE)' +- `stdlib.h' (ISO): *Note Parsing of Integers::. +- +-`uintmax_t strtoumax (const char *restrict STRING, char **restrict TAILPTR, int BASE)' +- `inttypes.h' (ISO): *Note Parsing of Integers::. +- +-`unsigned long long int strtouq (const char *restrict STRING, char **restrict TAILPTR, int BASE)' +- `stdlib.h' (BSD): *Note Parsing of Integers::. +- +-`struct aiocb' +- `aio.h' (POSIX.1b): *Note Asynchronous I/O::. +- +-`struct aiocb64' +- `aio.h' (POSIX.1b): *Note Asynchronous I/O::. +- +-`struct aioinit' +- `aio.h' (GNU): *Note Configuration of AIO::. +- +-`struct argp' +- `argp.h' (GNU): *Note Argp Parsers::. +- +-`struct argp_child' +- `argp.h' (GNU): *Note Argp Children::. +- +-`struct argp_option' +- `argp.h' (GNU): *Note Argp Option Vectors::. +- +-`struct argp_state' +- `argp.h' (GNU): *Note Argp Parsing State::. +- +-`struct dirent' +- `dirent.h' (POSIX.1): *Note Directory Entries::. +- +-`struct exit_status' +- `utmp.h' (SVID): *Note Manipulating the Database::. +- +-`struct flock' +- `fcntl.h' (POSIX.1): *Note File Locks::. +- +-`struct fstab' +- `fstab.h' (BSD): *Note fstab::. +- +-`struct FTW' +- `ftw.h' (XPG4.2): *Note Working with Directory Trees::. +- +-`struct __gconv_step' +- `gconv.h' (GNU): *Note glibc iconv Implementation::. +- +-`struct __gconv_step_data' +- `gconv.h' (GNU): *Note glibc iconv Implementation::. +- +-`struct group' +- `grp.h' (POSIX.1): *Note Group Data Structure::. +- +-`struct hostent' +- `netdb.h' (BSD): *Note Host Names::. +- +-`struct if_nameindex' +- `net/if.h' (IPv6 basic API): *Note Interface Naming::. +- +-`struct in6_addr' +- `netinet/in.h' (IPv6 basic API): *Note Host Address Data Type::. +- +-`struct in_addr' +- `netinet/in.h' (BSD): *Note Host Address Data Type::. +- +-`struct iovec' +- `sys/uio.h' (BSD): *Note Scatter-Gather::. +- +-`struct itimerval' +- `sys/time.h' (BSD): *Note Setting an Alarm::. +- +-`struct lconv' +- `locale.h' (ISO): *Note The Lame Way to Locale Data::. +- +-`struct linger' +- `sys/socket.h' (BSD): *Note Socket-Level Options::. +- +-`struct mallinfo' +- `malloc.h' (GNU): *Note Statistics of Malloc::. +- +-`struct mntent' +- `mntent.h' (BSD): *Note mtab::. +- +-`struct msghdr' +- `sys/socket.h' (BSD): *Note Receiving Datagrams::. +- +-`struct netent' +- `netdb.h' (BSD): *Note Networks Database::. +- +-`struct obstack' +- `obstack.h' (GNU): *Note Creating Obstacks::. +- +-`struct option' +- `getopt.h' (GNU): *Note Getopt Long Options::. +- +-`struct passwd' +- `pwd.h' (POSIX.1): *Note User Data Structure::. +- +-`struct printf_info' +- `printf.h' (GNU): *Note Conversion Specifier Options::. +- +-`struct protoent' +- `netdb.h' (BSD): *Note Protocols Database::. +- +-`struct random_data' +- `stdlib.h' (GNU): *Note BSD Random::. +- +-`struct rlimit' +- `sys/resource.h' (BSD): *Note Limits on Resources::. +- +-`struct rlimit64' +- `sys/resource.h' (Unix98): *Note Limits on Resources::. +- +-`struct rusage' +- `sys/resource.h' (BSD): *Note Resource Usage::. +- +-`struct sched_param' +- `sched.h' (POSIX): *Note Basic Scheduling Functions::. +- +-`struct servent' +- `netdb.h' (BSD): *Note Services Database::. +- +-`struct sgttyb' +- `termios.h' (BSD): *Note BSD Terminal Modes::. +- +-`struct sigaction' +- `signal.h' (POSIX.1): *Note Advanced Signal Handling::. +- +-`struct sigstack' +- `signal.h' (BSD): *Note Signal Stack::. +- +-`struct sigvec' +- `signal.h' (BSD): *Note BSD Handler::. +- +-`struct sockaddr' +- `sys/socket.h' (BSD): *Note Address Formats::. +- +-`struct sockaddr_in' +- `netinet/in.h' (BSD): *Note Internet Address Formats::. +- +-`struct sockaddr_un' +- `sys/un.h' (BSD): *Note Local Namespace Details::. +- +-`struct stat' +- `sys/stat.h' (POSIX.1): *Note Attribute Meanings::. +- +-`struct stat64' +- `sys/stat.h' (LFS): *Note Attribute Meanings::. +- +-`struct termios' +- `termios.h' (POSIX.1): *Note Mode Data Types::. +- +-`struct timespec' +- `sys/time.h' (POSIX.1): *Note Elapsed Time::. +- +-`struct timeval' +- `sys/time.h' (BSD): *Note Elapsed Time::. +- +-`struct timezone' +- `sys/time.h' (BSD): *Note High-Resolution Calendar::. +- +-`struct tm' +- `time.h' (ISO): *Note Broken-down Time::. +- +-`struct tms' +- `sys/times.h' (POSIX.1): *Note Processor Time::. +- +-`struct utimbuf' +- `time.h' (POSIX.1): *Note File Times::. +- +-`struct utsname' +- `sys/utsname.h' (POSIX.1): *Note Platform Type::. +- +-`int strverscmp (const char *S1, const char *S2)' +- `string.h' (GNU): *Note String/Array Comparison::. +- +-`size_t strxfrm (char *restrict TO, const char *restrict FROM, size_t SIZE)' +- `string.h' (ISO): *Note Collation Functions::. +- +-`int stty (int FILEDES, struct sgttyb * attributes)' +- `sgtty.h' (BSD): *Note BSD Terminal Modes::. +- +-`int S_TYPEISMQ (struct stat *S)' +- `sys/stat.h' (POSIX): *Note Testing File Type::. +- +-`int S_TYPEISSEM (struct stat *S)' +- `sys/stat.h' (POSIX): *Note Testing File Type::. +- +-`int S_TYPEISSHM (struct stat *S)' +- `sys/stat.h' (POSIX): *Note Testing File Type::. +- +-`int SUN_LEN (_struct sockaddr_un *_ PTR)' +- `sys/un.h' (BSD): *Note Local Namespace Details::. +- +-`_SVID_SOURCE' +- (GNU): *Note Feature Test Macros::. +- +-`int SV_INTERRUPT' +- `signal.h' (BSD): *Note BSD Handler::. +- +-`int SV_ONSTACK' +- `signal.h' (BSD): *Note BSD Handler::. +- +-`int SV_RESETHAND' +- `signal.h' (Sun): *Note BSD Handler::. +- +-`int swapcontext (ucontext_t *restrict OUCP, const ucontext_t *restrict UCP)' +- `ucontext.h' (SVID): *Note System V contexts::. +- +-`int swprintf (wchar_t *S, size_t SIZE, const wchar_t *TEMPLATE, ...)' +- `wchar.h' (GNU): *Note Formatted Output Functions::. +- +-`int swscanf (const wchar_t *WS, const char *TEMPLATE, ...)' +- `wchar.h' (ISO): *Note Formatted Input Functions::. +- +-`int symlink (const char *OLDNAME, const char *NEWNAME)' +- `unistd.h' (BSD): *Note Symbolic Links::. +- +-`SYMLINK_MAX' +- `limits.h' (POSIX.1): *Note File Minimums::. +- +-`int sync (void)' +- `unistd.h' (X/Open): *Note Synchronizing I/O::. +- +-`long int syscall (long int SYSNO, ...)' +- `unistd.h' (???): *Note System Calls::. +- +-`long int sysconf (int PARAMETER)' +- `unistd.h' (POSIX.1): *Note Sysconf Definition::. +- +-`int sysctl (int *NAMES, int NLEN, void *OLDVAL,' +- `sysctl.h' (BSD): *Note System Parameters::. +- +-`void syslog (int FACILITY_PRIORITY, char *FORMAT, ...)' +- `syslog.h' (BSD): *Note syslog; vsyslog::. +- +-`int system (const char *COMMAND)' +- `stdlib.h' (ISO): *Note Running a Command::. +- +-`sighandler_t sysv_signal (int SIGNUM, sighandler_t ACTION)' +- `signal.h' (GNU): *Note Basic Signal Handling::. +- +-`double tan (double X)' +- `math.h' (ISO): *Note Trig Functions::. +- +-`float tanf (float X)' +- `math.h' (ISO): *Note Trig Functions::. +- +-`double tanh (double X)' +- `math.h' (ISO): *Note Hyperbolic Functions::. +- +-`float tanhf (float X)' +- `math.h' (ISO): *Note Hyperbolic Functions::. +- +-`long double tanhl (long double X)' +- `math.h' (ISO): *Note Hyperbolic Functions::. +- +-`long double tanl (long double X)' +- `math.h' (ISO): *Note Trig Functions::. +- +-`int tcdrain (int FILEDES)' +- `termios.h' (POSIX.1): *Note Line Control::. +- +-`tcflag_t' +- `termios.h' (POSIX.1): *Note Mode Data Types::. +- +-`int tcflow (int FILEDES, int ACTION)' +- `termios.h' (POSIX.1): *Note Line Control::. +- +-`int tcflush (int FILEDES, int QUEUE)' +- `termios.h' (POSIX.1): *Note Line Control::. +- +-`int tcgetattr (int FILEDES, struct termios *TERMIOS-P)' +- `termios.h' (POSIX.1): *Note Mode Functions::. +- +-`pid_t tcgetpgrp (int FILEDES)' +- `unistd.h' (POSIX.1): *Note Terminal Access Functions::. +- +-`pid_t tcgetsid (int FILDES)' +- `termios.h' (Unix98): *Note Terminal Access Functions::. +- +-`TCSADRAIN' +- `termios.h' (POSIX.1): *Note Mode Functions::. +- +-`TCSAFLUSH' +- `termios.h' (POSIX.1): *Note Mode Functions::. +- +-`TCSANOW' +- `termios.h' (POSIX.1): *Note Mode Functions::. +- +-`TCSASOFT' +- `termios.h' (BSD): *Note Mode Functions::. +- +-`int tcsendbreak (int FILEDES, int DURATION)' +- `termios.h' (POSIX.1): *Note Line Control::. +- +-`int tcsetattr (int FILEDES, int WHEN, const struct termios *TERMIOS-P)' +- `termios.h' (POSIX.1): *Note Mode Functions::. +- +-`int tcsetpgrp (int FILEDES, pid_t PGID)' +- `unistd.h' (POSIX.1): *Note Terminal Access Functions::. +- +-`void * tdelete (const void *KEY, void **ROOTP, comparison_fn_t COMPAR)' +- `search.h' (SVID): *Note Tree Search Function::. +- +-`void tdestroy (void *VROOT, __free_fn_t FREEFCT)' +- `search.h' (GNU): *Note Tree Search Function::. +- +-`off_t telldir (DIR *DIRSTREAM)' +- `dirent.h' (BSD): *Note Random Access Directory::. +- +-`TEMP_FAILURE_RETRY (EXPRESSION)' +- `unistd.h' (GNU): *Note Interrupted Primitives::. +- +-`char * tempnam (const char *DIR, const char *PREFIX)' +- `stdio.h' (SVID): *Note Temporary Files::. +- +-`char * textdomain (const char *DOMAINNAME)' +- `libintl.h' (GNU): *Note Locating gettext catalog::. +- +-`void * tfind (const void *KEY, void *const *ROOTP, comparison_fn_t COMPAR)' +- `search.h' (SVID): *Note Tree Search Function::. +- +-`double tgamma (double X)' +- `math.h' (XPG, ISO): *Note Special Functions::. +- +-`float tgammaf (float X)' +- `math.h' (XPG, ISO): *Note Special Functions::. +- +-`long double tgammal (long double X)' +- `math.h' (XPG, ISO): *Note Special Functions::. +- +-`time_t time (time_t *RESULT)' +- `time.h' (ISO): *Note Simple Calendar Time::. +- +-`time_t timegm (struct tm *BROKENTIME)' +- `time.h' (???): *Note Broken-down Time::. +- +-`time_t timelocal (struct tm *BROKENTIME)' +- `time.h' (???): *Note Broken-down Time::. +- +-`clock_t times (struct tms *BUFFER)' +- `sys/times.h' (POSIX.1): *Note Processor Time::. +- +-`time_t' +- `time.h' (ISO): *Note Simple Calendar Time::. +- +-`long int timezone' +- `time.h' (SVID): *Note Time Zone Functions::. +- +-`FILE * tmpfile (void)' +- `stdio.h' (ISO): *Note Temporary Files::. +- +-`FILE * tmpfile64 (void)' +- `stdio.h' (Unix98): *Note Temporary Files::. +- +-`int TMP_MAX' +- `stdio.h' (ISO): *Note Temporary Files::. +- +-`char * tmpnam (char *RESULT)' +- `stdio.h' (ISO): *Note Temporary Files::. +- +-`char * tmpnam_r (char *RESULT)' +- `stdio.h' (GNU): *Note Temporary Files::. +- +-`int toascii (int C)' +- `ctype.h' (SVID, BSD): *Note Case Conversion::. +- +-`int _tolower (int C)' +- `ctype.h' (SVID): *Note Case Conversion::. +- +-`int tolower (int C)' +- `ctype.h' (ISO): *Note Case Conversion::. +- +-`tcflag_t TOSTOP' +- `termios.h' (POSIX.1): *Note Local Modes::. +- +-`int _toupper (int C)' +- `ctype.h' (SVID): *Note Case Conversion::. +- +-`int toupper (int C)' +- `ctype.h' (ISO): *Note Case Conversion::. +- +-`wint_t towctrans (wint_t WC, wctrans_t DESC)' +- `wctype.h' (ISO): *Note Wide Character Case Conversion::. +- +-`wint_t towlower (wint_t WC)' +- `wctype.h' (ISO): *Note Wide Character Case Conversion::. +- +-`wint_t towupper (wint_t WC)' +- `wctype.h' (ISO): *Note Wide Character Case Conversion::. +- +-`double trunc (double X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`int truncate (const char *FILENAME, off_t LENGTH)' +- `unistd.h' (X/Open): *Note File Size::. +- +-`int truncate64 (const char *NAME, off64_t LENGTH)' +- `unistd.h' (Unix98): *Note File Size::. +- +-`float truncf (float X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`long double truncl (long double X)' +- `math.h' (ISO): *Note Rounding Functions::. +- +-`TRY_AGAIN' +- `netdb.h' (BSD): *Note Host Names::. +- +-`void * tsearch (const void *KEY, void **ROOTP, comparison_fn_t COMPAR)' +- `search.h' (SVID): *Note Tree Search Function::. +- +-`char * ttyname (int FILEDES)' +- `unistd.h' (POSIX.1): *Note Is It a Terminal::. +- +-`int ttyname_r (int FILEDES, char *BUF, size_t LEN)' +- `unistd.h' (POSIX.1): *Note Is It a Terminal::. +- +-`void twalk (const void *ROOT, __action_fn_t ACTION)' +- `search.h' (SVID): *Note Tree Search Function::. +- +-`char * tzname [2]' +- `time.h' (POSIX.1): *Note Time Zone Functions::. +- +-`int TZNAME_MAX' +- `limits.h' (POSIX.1): *Note General Limits::. +- +-`void tzset (void)' +- `time.h' (POSIX.1): *Note Time Zone Functions::. +- +-`UCHAR_MAX' +- `limits.h' (ISO): *Note Range of Type::. +- +-`ucontext_t' +- `ucontext.h' (SVID): *Note System V contexts::. +- +-`uid_t' +- `sys/types.h' (POSIX.1): *Note Reading Persona::. +- +-`UINT_MAX' +- `limits.h' (ISO): *Note Range of Type::. +- +-`int ulimit (int CMD, ...)' +- `ulimit.h' (BSD): *Note Limits on Resources::. +- +-`ULONG_LONG_MAX' +- `limits.h' (ISO): *Note Range of Type::. +- +-`ULONG_MAX' +- `limits.h' (ISO): *Note Range of Type::. +- +-`mode_t umask (mode_t MASK)' +- `sys/stat.h' (POSIX.1): *Note Setting Permissions::. +- +-`int umount (const char *FILE)' +- `sys/mount.h' (SVID, GNU): *Note Mount-Unmount-Remount::. +- +-`int umount2 (const char *FILE, int FLAGS)' +- `sys/mount.h' (GNU): *Note Mount-Unmount-Remount::. +- +-`int uname (struct utsname *INFO)' +- `sys/utsname.h' (POSIX.1): *Note Platform Type::. +- +-`int ungetc (int C, FILE *STREAM)' +- `stdio.h' (ISO): *Note How Unread::. +- +-`wint_t ungetwc (wint_t WC, FILE *STREAM)' +- `wchar.h' (ISO): *Note How Unread::. +- +-`union wait' +- `sys/wait.h' (BSD): *Note BSD Wait Functions::. +- +-`int unlink (const char *FILENAME)' +- `unistd.h' (POSIX.1): *Note Deleting Files::. +- +-`int unlockpt (int FILEDES)' +- `stdlib.h' (SVID, XPG4.2): *Note Allocation::. +- +-`int unsetenv (const char *NAME)' +- `stdlib.h' (BSD): *Note Environment Access::. +- +-`void updwtmp (const char *WTMP_FILE, const struct utmp *UTMP)' +- `utmp.h' (SVID): *Note Manipulating the Database::. +- +-`USER_PROCESS' +- `utmp.h' (SVID): *Note Manipulating the Database::. +- +-`USER_PROCESS' +- `utmpx.h' (XPG4.2): *Note XPG Functions::. +- +-`USHRT_MAX' +- `limits.h' (ISO): *Note Range of Type::. +- +-`int utime (const char *FILENAME, const struct utimbuf *TIMES)' +- `time.h' (POSIX.1): *Note File Times::. +- +-`int utimes (const char *FILENAME, struct timeval TVP[2])' +- `sys/time.h' (BSD): *Note File Times::. +- +-`int utmpname (const char *FILE)' +- `utmp.h' (SVID): *Note Manipulating the Database::. +- +-`int utmpxname (const char *FILE)' +- `utmpx.h' (XPG4.2): *Note XPG Functions::. +- +-`va_alist' +- `varargs.h' (Unix): *Note Old Varargs::. +- +-`TYPE va_arg (va_list AP, TYPE)' +- `stdarg.h' (ISO): *Note Argument Macros::. +- +-`void __va_copy (va_list DEST, va_list SRC)' +- `stdarg.h' (GNU): *Note Argument Macros::. +- +-`va_dcl' +- `varargs.h' (Unix): *Note Old Varargs::. +- +-`void va_end (va_list AP)' +- `stdarg.h' (ISO): *Note Argument Macros::. +- +-`va_list' +- `stdarg.h' (ISO): *Note Argument Macros::. +- +-`void * valloc (size_t SIZE)' +- `malloc.h', `stdlib.h' (BSD): *Note Aligned Memory Blocks::. +- +-`int vasprintf (char **PTR, const char *TEMPLATE, va_list AP)' +- `stdio.h' (GNU): *Note Variable Arguments Output::. +- +-`void va_start (va_list AP)' +- `varargs.h' (Unix): *Note Old Varargs::. +- +-`void va_start (va_list AP, LAST-REQUIRED)' +- `stdarg.h' (ISO): *Note Argument Macros::. +- +-`int VDISCARD' +- `termios.h' (BSD): *Note Other Special::. +- +-`int VDSUSP' +- `termios.h' (BSD): *Note Signal Characters::. +- +-`int VEOF' +- `termios.h' (POSIX.1): *Note Editing Characters::. +- +-`int VEOL' +- `termios.h' (POSIX.1): *Note Editing Characters::. +- +-`int VEOL2' +- `termios.h' (BSD): *Note Editing Characters::. +- +-`int VERASE' +- `termios.h' (POSIX.1): *Note Editing Characters::. +- +-`void verr (int STATUS, const char *FORMAT, va_list)' +- `err.h' (BSD): *Note Error Messages::. +- +-`void verrx (int STATUS, const char *FORMAT, va_list)' +- `err.h' (BSD): *Note Error Messages::. +- +-`int versionsort (const void *A, const void *B)' +- `dirent.h' (GNU): *Note Scanning Directory Content::. +- +-`int versionsort64 (const void *A, const void *B)' +- `dirent.h' (GNU): *Note Scanning Directory Content::. +- +-`pid_t vfork (void)' +- `unistd.h' (BSD): *Note Creating a Process::. +- +-`int vfprintf (FILE *STREAM, const char *TEMPLATE, va_list AP)' +- `stdio.h' (ISO): *Note Variable Arguments Output::. +- +-`int vfscanf (FILE *STREAM, const char *TEMPLATE, va_list AP)' +- `stdio.h' (ISO): *Note Variable Arguments Input::. +- +-`int vfwprintf (FILE *STREAM, const wchar_t *TEMPLATE, va_list AP)' +- `wchar.h' (ISO): *Note Variable Arguments Output::. +- +-`int vfwscanf (FILE *STREAM, const wchar_t *TEMPLATE, va_list AP)' +- `wchar.h' (ISO): *Note Variable Arguments Input::. +- +-`int VINTR' +- `termios.h' (POSIX.1): *Note Signal Characters::. +- +-`int VKILL' +- `termios.h' (POSIX.1): *Note Editing Characters::. +- +-`int vlimit (int RESOURCE, int LIMIT)' +- `sys/vlimit.h' (BSD): *Note Limits on Resources::. +- +-`int VLNEXT' +- `termios.h' (BSD): *Note Other Special::. +- +-`int VMIN' +- `termios.h' (POSIX.1): *Note Noncanonical Input::. +- +-`int vprintf (const char *TEMPLATE, va_list AP)' +- `stdio.h' (ISO): *Note Variable Arguments Output::. +- +-`int VQUIT' +- `termios.h' (POSIX.1): *Note Signal Characters::. +- +-`int VREPRINT' +- `termios.h' (BSD): *Note Editing Characters::. +- +-`int vscanf (const char *TEMPLATE, va_list AP)' +- `stdio.h' (ISO): *Note Variable Arguments Input::. +- +-`int vsnprintf (char *S, size_t SIZE, const char *TEMPLATE, va_list AP)' +- `stdio.h' (GNU): *Note Variable Arguments Output::. +- +-`int vsprintf (char *S, const char *TEMPLATE, va_list AP)' +- `stdio.h' (ISO): *Note Variable Arguments Output::. +- +-`int vsscanf (const char *S, const char *TEMPLATE, va_list AP)' +- `stdio.h' (ISO): *Note Variable Arguments Input::. +- +-`int VSTART' +- `termios.h' (POSIX.1): *Note Start/Stop Characters::. +- +-`int VSTATUS' +- `termios.h' (BSD): *Note Other Special::. +- +-`int VSTOP' +- `termios.h' (POSIX.1): *Note Start/Stop Characters::. +- +-`int VSUSP' +- `termios.h' (POSIX.1): *Note Signal Characters::. +- +-`int vswprintf (wchar_t *S, size_t SIZE, const wchar_t *TEMPLATE, va_list AP)' +- `wchar.h' (GNU): *Note Variable Arguments Output::. +- +-`int vswscanf (const wchar_t *S, const wchar_t *TEMPLATE, va_list AP)' +- `wchar.h' (ISO): *Note Variable Arguments Input::. +- +-`void vsyslog (int FACILITY_PRIORITY, char *FORMAT, va_list arglist)' +- `syslog.h' (BSD): *Note syslog; vsyslog::. +- +-`int VTIME' +- `termios.h' (POSIX.1): *Note Noncanonical Input::. +- +-`int vtimes (struct vtimes CURRENT, struct vtimes CHILD)' +- `vtimes.h' (vtimes.h): *Note Resource Usage::. +- +-`void vwarn (const char *FORMAT, va_list)' +- `err.h' (BSD): *Note Error Messages::. +- +-`void vwarnx (const char *FORMAT, va_list)' +- `err.h' (BSD): *Note Error Messages::. +- +-`int VWERASE' +- `termios.h' (BSD): *Note Editing Characters::. +- +-`int vwprintf (const wchar_t *TEMPLATE, va_list AP)' +- `wchar.h' (ISO): *Note Variable Arguments Output::. +- +-`int vwscanf (const wchar_t *TEMPLATE, va_list AP)' +- `wchar.h' (ISO): *Note Variable Arguments Input::. +- +-`pid_t wait (int *STATUS-PTR)' +- `sys/wait.h' (POSIX.1): *Note Process Completion::. +- +-`pid_t wait3 (union wait *STATUS-PTR, int OPTIONS, struct rusage *USAGE)' +- `sys/wait.h' (BSD): *Note BSD Wait Functions::. +- +-`pid_t wait4 (pid_t PID, int *STATUS-PTR, int OPTIONS, struct rusage *USAGE)' +- `sys/wait.h' (BSD): *Note Process Completion::. +- +-`pid_t waitpid (pid_t PID, int *STATUS-PTR, int OPTIONS)' +- `sys/wait.h' (POSIX.1): *Note Process Completion::. +- +-`void warn (const char *FORMAT, ...)' +- `err.h' (BSD): *Note Error Messages::. +- +-`void warnx (const char *FORMAT, ...)' +- `err.h' (BSD): *Note Error Messages::. +- +-`WCHAR_MAX' +- `limits.h' (GNU): *Note Range of Type::. +- +-`wint_t WCHAR_MAX' +- `wchar.h' (ISO): *Note Extended Char Intro::. +- +-`wint_t WCHAR_MIN' +- `wchar.h' (ISO): *Note Extended Char Intro::. +- +-`wchar_t' +- `stddef.h' (ISO): *Note Extended Char Intro::. +- +-`int WCOREDUMP (int STATUS)' +- `sys/wait.h' (BSD): *Note Process Completion Status::. +- +-`wchar_t * wcpcpy (wchar_t *restrict WTO, const wchar_t *restrict WFROM)' +- `wchar.h' (GNU): *Note Copying and Concatenation::. +- +-`wchar_t * wcpncpy (wchar_t *restrict WTO, const wchar_t *restrict WFROM, size_t SIZE)' +- `wchar.h' (GNU): *Note Copying and Concatenation::. +- +-`size_t wcrtomb (char *restrict S, wchar_t WC, mbstate_t *restrict PS)' +- `wchar.h' (ISO): *Note Converting a Character::. +- +-`int wcscasecmp (const wchar_t *WS1, const wchar_T *WS2)' +- `wchar.h' (GNU): *Note String/Array Comparison::. +- +-`wchar_t * wcscat (wchar_t *restrict WTO, const wchar_t *restrict WFROM)' +- `wchar.h' (ISO): *Note Copying and Concatenation::. +- +-`wchar_t * wcschr (const wchar_t *WSTRING, int WC)' +- `wchar.h' (ISO): *Note Search Functions::. +- +-`wchar_t * wcschrnul (const wchar_t *WSTRING, wchar_t WC)' +- `wchar.h' (GNU): *Note Search Functions::. +- +-`int wcscmp (const wchar_t *WS1, const wchar_t *WS2)' +- `wchar.h' (ISO): *Note String/Array Comparison::. +- +-`int wcscoll (const wchar_t *WS1, const wchar_t *WS2)' +- `wchar.h' (ISO): *Note Collation Functions::. +- +-`wchar_t * wcscpy (wchar_t *restrict WTO, const wchar_t *restrict WFROM)' +- `wchar.h' (ISO): *Note Copying and Concatenation::. +- +-`size_t wcscspn (const wchar_t *WSTRING, const wchar_t *STOPSET)' +- `wchar.h' (ISO): *Note Search Functions::. +- +-`wchar_t * wcsdup (const wchar_t *WS)' +- `wchar.h' (GNU): *Note Copying and Concatenation::. +- +-`size_t wcsftime (wchar_t *S, size_t SIZE, const wchar_t *TEMPLATE, const struct tm *BROKENTIME)' +- `time.h' (ISO/Amend1): *Note Formatting Calendar Time::. +- +-`size_t wcslen (const wchar_t *WS)' +- `wchar.h' (ISO): *Note String Length::. +- +-`int wcsncasecmp (const wchar_t *WS1, const wchar_t *S2, size_t N)' +- `wchar.h' (GNU): *Note String/Array Comparison::. +- +-`wchar_t * wcsncat (wchar_t *restrict WTO, const wchar_t *restrict WFROM, size_t SIZE)' +- `wchar.h' (ISO): *Note Copying and Concatenation::. +- +-`int wcsncmp (const wchar_t *WS1, const wchar_t *WS2, size_t SIZE)' +- `wchar.h' (ISO): *Note String/Array Comparison::. +- +-`wchar_t * wcsncpy (wchar_t *restrict WTO, const wchar_t *restrict WFROM, size_t SIZE)' +- `wchar.h' (ISO): *Note Copying and Concatenation::. +- +-`size_t wcsnlen (const wchar_t *WS, size_t MAXLEN)' +- `wchar.h' (GNU): *Note String Length::. +- +-`size_t wcsnrtombs (char *restrict DST, const wchar_t **restrict SRC, size_t NWC, size_t LEN, mbstate_t *restrict PS)' +- `wchar.h' (GNU): *Note Converting Strings::. +- +-`wchar_t * wcspbrk (const wchar_t *WSTRING, const wchar_t *STOPSET)' +- `wchar.h' (ISO): *Note Search Functions::. +- +-`wchar_t * wcsrchr (const wchar_t *WSTRING, wchar_t C)' +- `wchar.h' (ISO): *Note Search Functions::. +- +-`size_t wcsrtombs (char *restrict DST, const wchar_t **restrict SRC, size_t LEN, mbstate_t *restrict PS)' +- `wchar.h' (ISO): *Note Converting Strings::. +- +-`size_t wcsspn (const wchar_t *WSTRING, const wchar_t *SKIPSET)' +- `wchar.h' (ISO): *Note Search Functions::. +- +-`wchar_t * wcsstr (const wchar_t *HAYSTACK, const wchar_t *NEEDLE)' +- `wchar.h' (ISO): *Note Search Functions::. +- +-`double wcstod (const wchar_t *restrict STRING, wchar_t **restrict TAILPTR)' +- `wchar.h' (ISO): *Note Parsing of Floats::. +- +-`float wcstof (const wchar_t *STRING, wchar_t **TAILPTR)' +- `stdlib.h' (ISO): *Note Parsing of Floats::. +- +-`intmax_t wcstoimax (const wchar_t *restrict STRING, wchar_t **restrict TAILPTR, int BASE)' +- `wchar.h' (ISO): *Note Parsing of Integers::. +- +-`wchar_t * wcstok (wchar_t *NEWSTRING, const char *DELIMITERS)' +- `wchar.h' (ISO): *Note Finding Tokens in a String::. +- +-`long int wcstol (const wchar_t *restrict STRING, wchar_t **restrict TAILPTR, int BASE)' +- `wchar.h' (ISO): *Note Parsing of Integers::. +- +-`long double wcstold (const wchar_t *STRING, wchar_t **TAILPTR)' +- `stdlib.h' (ISO): *Note Parsing of Floats::. +- +-`long long int wcstoll (const wchar_t *restrict STRING, wchar_t **restrict TAILPTR, int BASE)' +- `wchar.h' (ISO): *Note Parsing of Integers::. +- +-`size_t wcstombs (char *STRING, const wchar_t *WSTRING, size_t SIZE)' +- `stdlib.h' (ISO): *Note Non-reentrant String Conversion::. +- +-`long long int wcstoq (const wchar_t *restrict STRING, wchar_t **restrict TAILPTR, int BASE)' +- `wchar.h' (GNU): *Note Parsing of Integers::. +- +-`unsigned long int wcstoul (const wchar_t *restrict STRING, wchar_t **restrict TAILPTR, int BASE)' +- `wchar.h' (ISO): *Note Parsing of Integers::. +- +-`unsigned long long int wcstoull (const wchar_t *restrict STRING, wchar_t **restrict TAILPTR, int BASE)' +- `wchar.h' (ISO): *Note Parsing of Integers::. +- +-`uintmax_t wcstoumax (const wchar_t *restrict STRING, wchar_t **restrict TAILPTR, int BASE)' +- `wchar.h' (ISO): *Note Parsing of Integers::. +- +-`unsigned long long int wcstouq (const wchar_t *restrict STRING, wchar_t **restrict TAILPTR, int BASE)' +- `wchar.h' (GNU): *Note Parsing of Integers::. +- +-`wchar_t * wcswcs (const wchar_t *HAYSTACK, const wchar_t *NEEDLE)' +- `wchar.h' (XPG): *Note Search Functions::. +- +-`size_t wcsxfrm (wchar_t *restrict WTO, const wchar_t *WFROM, size_t SIZE)' +- `wchar.h' (ISO): *Note Collation Functions::. +- +-`int wctob (wint_t C)' +- `wchar.h' (ISO): *Note Converting a Character::. +- +-`int wctomb (char *STRING, wchar_t WCHAR)' +- `stdlib.h' (ISO): *Note Non-reentrant Character Conversion::. +- +-`wctrans_t wctrans (const char *PROPERTY)' +- `wctype.h' (ISO): *Note Wide Character Case Conversion::. +- +-`wctrans_t' +- `wctype.h' (ISO): *Note Wide Character Case Conversion::. +- +-`wctype_t wctype (const char *PROPERTY)' +- `wctype.h' (ISO): *Note Classification of Wide Characters::. +- +-`wctype_t' +- `wctype.h' (ISO): *Note Classification of Wide Characters::. +- +-`int WEOF' +- `wchar.h' (ISO): *Note EOF and Errors::. +- +-`wint_t WEOF' +- `wchar.h' (ISO): *Note Extended Char Intro::. +- +-`int WEXITSTATUS (int STATUS)' +- `sys/wait.h' (POSIX.1): *Note Process Completion Status::. +- +-`int WIFEXITED (int STATUS)' +- `sys/wait.h' (POSIX.1): *Note Process Completion Status::. +- +-`int WIFSIGNALED (int STATUS)' +- `sys/wait.h' (POSIX.1): *Note Process Completion Status::. +- +-`int WIFSTOPPED (int STATUS)' +- `sys/wait.h' (POSIX.1): *Note Process Completion Status::. +- +-`wint_t' +- `wchar.h' (ISO): *Note Extended Char Intro::. +- +-`wchar_t * wmemchr (const wchar_t *BLOCK, wchar_t WC, size_t SIZE)' +- `wchar.h' (ISO): *Note Search Functions::. +- +-`int wmemcmp (const wchar_t *A1, const wchar_t *A2, size_t SIZE)' +- `wcjar.h' (ISO): *Note String/Array Comparison::. +- +-`wchar_t * wmemcpy (wchar_t *restrict WTO, const wchar_t *restruct WFROM, size_t SIZE)' +- `wchar.h' (ISO): *Note Copying and Concatenation::. +- +-`wchar_t * wmemmove (wchar *WTO, const wchar_t *WFROM, size_t SIZE)' +- `wchar.h' (ISO): *Note Copying and Concatenation::. +- +-`wchar_t * wmempcpy (wchar_t *restrict WTO, const wchar_t *restrict WFROM, size_t SIZE)' +- `wchar.h' (GNU): *Note Copying and Concatenation::. +- +-`wchar_t * wmemset (wchar_t *BLOCK, wchar_t WC, size_t SIZE)' +- `wchar.h' (ISO): *Note Copying and Concatenation::. +- +-`int W_OK' +- `unistd.h' (POSIX.1): *Note Testing File Access::. +- +-`int wordexp (const char *WORDS, wordexp_t *WORD-VECTOR-PTR, int FLAGS)' +- `wordexp.h' (POSIX.2): *Note Calling Wordexp::. +- +-`wordexp_t' +- `wordexp.h' (POSIX.2): *Note Calling Wordexp::. +- +-`void wordfree (wordexp_t *WORD-VECTOR-PTR)' +- `wordexp.h' (POSIX.2): *Note Calling Wordexp::. +- +-`int wprintf (const wchar_t *TEMPLATE, ...)' +- `wchar.h' (ISO): *Note Formatted Output Functions::. +- +-`WRDE_APPEND' +- `wordexp.h' (POSIX.2): *Note Flags for Wordexp::. +- +-`WRDE_BADCHAR' +- `wordexp.h' (POSIX.2): *Note Calling Wordexp::. +- +-`WRDE_BADVAL' +- `wordexp.h' (POSIX.2): *Note Calling Wordexp::. +- +-`WRDE_CMDSUB' +- `wordexp.h' (POSIX.2): *Note Calling Wordexp::. +- +-`WRDE_DOOFFS' +- `wordexp.h' (POSIX.2): *Note Flags for Wordexp::. +- +-`WRDE_NOCMD' +- `wordexp.h' (POSIX.2): *Note Flags for Wordexp::. +- +-`WRDE_NOSPACE' +- `wordexp.h' (POSIX.2): *Note Calling Wordexp::. +- +-`WRDE_REUSE' +- `wordexp.h' (POSIX.2): *Note Flags for Wordexp::. +- +-`WRDE_SHOWERR' +- `wordexp.h' (POSIX.2): *Note Flags for Wordexp::. +- +-`WRDE_SYNTAX' +- `wordexp.h' (POSIX.2): *Note Calling Wordexp::. +- +-`WRDE_UNDEF' +- `wordexp.h' (POSIX.2): *Note Flags for Wordexp::. +- +-`ssize_t write (int FILEDES, const void *BUFFER, size_t SIZE)' +- `unistd.h' (POSIX.1): *Note I/O Primitives::. +- +-`ssize_t writev (int FILEDES, const struct iovec *VECTOR, int COUNT)' +- `sys/uio.h' (BSD): *Note Scatter-Gather::. +- +-`int wscanf (const wchar_t *TEMPLATE, ...)' +- `wchar.h' (ISO): *Note Formatted Input Functions::. +- +-`int WSTOPSIG (int STATUS)' +- `sys/wait.h' (POSIX.1): *Note Process Completion Status::. +- +-`int WTERMSIG (int STATUS)' +- `sys/wait.h' (POSIX.1): *Note Process Completion Status::. +- +-`int X_OK' +- `unistd.h' (POSIX.1): *Note Testing File Access::. +- +-`_XOPEN_SOURCE' +- (X/Open): *Note Feature Test Macros::. +- +-`_XOPEN_SOURCE_EXTENDED' +- (X/Open): *Note Feature Test Macros::. +- +-`double y0 (double X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`float y0f (float X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`long double y0l (long double X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`double y1 (double X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`float y1f (float X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`long double y1l (long double X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`double yn (int n, double X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`float ynf (int n, float X)' +- `math.h' (SVID): *Note Special Functions::. +- +-`long double ynl (int n, long double X)' +- `math.h' (SVID): *Note Special Functions::. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-54 glibc-2.3.2-200304020432/manual/libc.info-54 +--- glibc-2.3.2/manual/libc.info-54 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-54 Thu Jan 1 01:00:00 1970 +@@ -1,1037 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Installation, Next: Maintenance, Prev: Library Summary, Up: Top +- +-Installing the GNU C Library +-**************************** +- +- Before you do anything else, you should read the file `FAQ' located +-at the top level of the source tree. This file answers common questions +-and describes problems you may experience with compilation and +-installation. It is updated more frequently than this manual. +- +- Features can be added to GNU Libc via "add-on" bundles. These are +-separate tar files, which you unpack into the top level of the source +-tree. Then you give `configure' the `--enable-add-ons' option to +-activate them, and they will be compiled into the library. As of the +-2.2 release, one important component of glibc is distributed as +-"official" add-ons: the linuxthreads add-on. Unless you are doing an +-unusual installation, you should get this. +- +- Support for POSIX threads is maintained by someone else, so it's in a +-separate package. It is only available for GNU/Linux systems, but this +-will change in the future. Get it from the same place you got the main +-bundle; the file is `glibc-linuxthreads-VERSION.tar.gz'. +- +- You will need recent versions of several GNU tools: definitely GCC +-and GNU Make, and possibly others. *Note Tools for Compilation::, +-below. +- +-* Menu: +- +-* Configuring and compiling:: How to compile and test GNU libc. +-* Running make install:: How to install it once you've got it +- compiled. +-* Tools for Compilation:: You'll need these first. +-* Supported Configurations:: What it runs on, what it doesn't. +-* Linux:: Specific advice for GNU/Linux systems. +-* Reporting Bugs:: So they'll get fixed. +- +- +-File: libc.info, Node: Configuring and compiling, Next: Running make install, Up: Installation +- +-Configuring and compiling GNU Libc +-================================== +- +- GNU libc can be compiled in the source directory, but we strongly +-advise building it in a separate build directory. For example, if you +-have unpacked the glibc sources in `/src/gnu/glibc-2.3', create a +-directory `/src/gnu/glibc-build' to put the object files in. This +-allows removing the whole build directory in case an error occurs, +-which is the safest way to get a fresh start and should always be done. +- +- From your object directory, run the shell script `configure' located +-at the top level of the source tree. In the scenario above, you'd type +- +- $ ../glibc-2.3/configure ARGS... +- +- Please note that even if you're building in a separate build +-directory, the compilation needs to modify a few files in the source +-directory, especially some files in the manual subdirectory. +- +-`configure' takes many options, but you can get away with knowing only +-two: `--prefix' and `--enable-add-ons'. The `--prefix' option tells +-`configure' where you want glibc installed. This defaults to +-`/usr/local'. The `--enable-add-ons' option tells `configure' to use +-all the add-on bundles it finds in the source directory. Since +-important functionality is provided in add-ons, you should always +-specify this option. +- +- It may also be useful to set the CC and CFLAGS variables in the +-environment when running `configure'. CC selects the C compiler that +-will be used, and CFLAGS sets optimization options for the compiler. +- +- The following list describes all of the available options for +-`configure': +- +-`--prefix=DIRECTORY' +- Install machine-independent data files in subdirectories of +- `DIRECTORY'. The default is to install in `/usr/local'. +- +-`--exec-prefix=DIRECTORY' +- Install the library and other machine-dependent files in +- subdirectories of `DIRECTORY'. The default is to the `--prefix' +- directory if that option is specified, or `/usr/local' otherwise. +- +-`--with-headers=DIRECTORY' +- Look for kernel header files in DIRECTORY, not `/usr/include'. +- Glibc needs information from the kernel's private header files. +- Glibc will normally look in `/usr/include' for them, but if you +- specify this option, it will look in DIRECTORY instead. +- +- This option is primarily of use on a system where the headers in +- `/usr/include' come from an older version of glibc. Conflicts can +- occasionally happen in this case. Note that Linux libc5 qualifies +- as an older version of glibc. You can also use this option if you +- want to compile glibc with a newer set of kernel headers than the +- ones found in `/usr/include'. +- +-`--enable-add-ons[=LIST]' +- Enable add-on packages in your source tree. If this option is +- specified with no list, it enables all the add-on packages it +- finds. If you do not wish to use some add-on packages that you +- have present in your source tree, give this option a list of the +- add-ons that you _do_ want used, like this: +- `--enable-add-ons=linuxthreads' +- +-`--enable-kernel=VERSION' +- This option is currently only useful on GNU/Linux systems. The +- VERSION parameter should have the form X.Y.Z and describes the +- smallest version of the Linux kernel the generated library is +- expected to support. The higher the VERSION number is, the less +- compatibility code is added, and the faster the code gets. +- +-`--with-binutils=DIRECTORY' +- Use the binutils (assembler and linker) in `DIRECTORY', not the +- ones the C compiler would default to. You can use this option if +- the default binutils on your system cannot deal with all the +- constructs in the GNU C library. In that case, `configure' will +- detect the problem and suppress these constructs, so that the +- library will still be usable, but functionality may be lost--for +- example, you can't build a shared libc with old binutils. +- +-`--without-fp' +- Use this option if your computer lacks hardware floating-point +- support and your operating system does not emulate an FPU. +- +- these +- +-`--disable-shared' +- Don't build shared libraries even if it is possible. Not all +- systems support shared libraries; you need ELF support and +- (currently) the GNU linker. +- +-`--disable-profile' +- Don't build libraries with profiling information. You may want to +- use this option if you don't plan to do profiling. +- +-`--enable-omitfp' +- Use maximum optimization for the normal (static and shared) +- libraries, and compile separate static libraries with debugging +- information and no optimization. We recommend not doing this. +- The extra optimization doesn't gain you much, it may provoke +- compiler bugs, and you won't be able to trace bugs through the C +- library. +- +-`--disable-versioning' +- Don't compile the shared libraries with symbol version information. +- Doing this will make the resulting library incompatible with old +- binaries, so it's not recommended. +- +-`--enable-static-nss' +- Compile static versions of the NSS (Name Service Switch) libraries. +- This is not recommended because it defeats the purpose of NSS; a +- program linked statically with the NSS libraries cannot be +- dynamically reconfigured to use a different name database. +- +-`--without-tls' +- By default the C library is built with support for thread-local +- storage if the used tools support it. By using `--without-tls' +- this can be prevented though there generally is no reason since it +- creates compatibility problems. +- +-`--build=BUILD-SYSTEM' +-`--host=HOST-SYSTEM' +- These options are for cross-compiling. If you specify both +- options and BUILD-SYSTEM is different from HOST-SYSTEM, `configure' +- will prepare to cross-compile glibc from BUILD-SYSTEM to be used +- on HOST-SYSTEM. You'll probably need the `--with-headers' option +- too, and you may have to override CONFIGURE's selection of the +- compiler and/or binutils. +- +- If you only specify `--host', `configure' will prepare for a +- native compile but use what you specify instead of guessing what +- your system is. This is most useful to change the CPU submodel. +- For example, if `configure' guesses your machine as +- `i586-pc-linux-gnu' but you want to compile a library for 386es, +- give `--host=i386-pc-linux-gnu' or just `--host=i386-linux' and add +- the appropriate compiler flags (`-mcpu=i386' will do the trick) to +- CFLAGS. +- +- If you specify just `--build', `configure' will get confused. +- +- To build the library and related programs, type `make'. This will +-produce a lot of output, some of which may look like errors from `make' +-but isn't. Look for error messages from `make' containing `***'. +-Those indicate that something is seriously wrong. +- +- The compilation process can take several hours. Expect at least two +-hours for the default configuration on i586 for GNU/Linux. For Hurd, +-times are much longer. Some complex modules may take a very long time +-to compile, as much as several minutes on slower machines. Do not +-panic if the compiler appears to hang. +- +- If you want to run a parallel make, simply pass the `-j' option with +-an appropriate numeric parameter to `make'. You need a recent GNU +-`make' version, though. +- +- To build and run test programs which exercise some of the library +-facilities, type `make check'. If it does not complete successfully, +-do not use the built library, and report a bug after verifying that the +-problem is not already known. *Note Reporting Bugs::, for instructions +-on reporting bugs. Note that some of the tests assume they are not +-being run by `root'. We recommend you compile and test glibc as an +-unprivileged user. +- +- Before reporting bugs make sure there is no problem with your system. +-The tests (and later installation) use some pre-existing files of the +-system such as `/etc/passwd', `/etc/nsswitch.conf' and others. These +-files must all contain correct and sensible content. +- +- To format the `GNU C Library Reference Manual' for printing, type +-`make dvi'. You need a working TeX installation to do this. The +-distribution already includes the on-line formatted version of the +-manual, as Info files. You can regenerate those with `make info', but +-it shouldn't be necessary. +- +- The library has a number of special-purpose configuration parameters +-which you can find in `Makeconfig'. These can be overwritten with the +-file `configparms'. To change them, create a `configparms' in your +-build directory and add values as appropriate for your system. The +-file is included and parsed by `make' and has to follow the conventions +-for makefiles. +- +- It is easy to configure the GNU C library for cross-compilation by +-setting a few variables in `configparms'. Set `CC' to the +-cross-compiler for the target you configured the library for; it is +-important to use this same `CC' value when running `configure', like +-this: `CC=TARGET-gcc configure TARGET'. Set `BUILD_CC' to the compiler +-to use for programs run on the build system as part of compiling the +-library. You may need to set `AR' and `RANLIB' to cross-compiling +-versions of `ar' and `ranlib' if the native tools are not configured to +-work with object files for the target you configured for. +- +- +-File: libc.info, Node: Running make install, Next: Tools for Compilation, Prev: Configuring and compiling, Up: Installation +- +-Installing the C Library +-======================== +- +- To install the library and its header files, and the Info files of +-the manual, type `env LANGUAGE=C LC_ALL=C make install'. This will +-build things, if necessary, before installing them; however, you should +-still compile everything first. If you are installing glibc as your +-primary C library, we recommend that you shut the system down to +-single-user mode first, and reboot afterward. This minimizes the risk +-of breaking things when the library changes out from underneath. +- +- If you're upgrading from Linux libc5 or some other C library, you +-need to replace the `/usr/include' with a fresh directory before +-installing it. The new `/usr/include' should contain the Linux +-headers, but nothing else. +- +- You must first build the library (`make'), optionally check it +-(`make check'), switch the include directories and then install (`make +-install'). The steps must be done in this order. Not moving the +-directory before install will result in an unusable mixture of header +-files from both libraries, but configuring, building, and checking the +-library requires the ability to compile and run programs against the old +-library. +- +- If you are upgrading from a previous installation of glibc 2.0 or +-2.1, `make install' will do the entire job. You do not need to remove +-the old includes - if you want to do so anyway you must then follow the +-order given above. +- +- You may also need to reconfigure GCC to work with the new library. +-The easiest way to do that is to figure out the compiler switches to +-make it work again (`-Wl,--dynamic-linker=/lib/ld-linux.so.2' should +-work on GNU/Linux systems) and use them to recompile gcc. You can also +-edit the specs file (`/usr/lib/gcc-lib/TARGET/VERSION/specs'), but that +-is a bit of a black art. +- +- You can install glibc somewhere other than where you configured it +-to go by setting the `install_root' variable on the command line for +-`make install'. The value of this variable is prepended to all the +-paths for installation. This is useful when setting up a chroot +-environment or preparing a binary distribution. The directory should be +-specified with an absolute file name. +- +- Glibc 2.2 includes a daemon called `nscd', which you may or may not +-want to run. `nscd' caches name service lookups; it can dramatically +-improve performance with NIS+, and may help with DNS as well. +- +- One auxiliary program, `/usr/libexec/pt_chown', is installed setuid +-`root'. This program is invoked by the `grantpt' function; it sets the +-permissions on a pseudoterminal so it can be used by the calling +-process. This means programs like `xterm' and `screen' do not have to +-be setuid to get a pty. (There may be other reasons why they need +-privileges.) If you are using a 2.1 or newer Linux kernel with the +-`devptsfs' or `devfs' filesystems providing pty slaves, you don't need +-this program; otherwise you do. The source for `pt_chown' is in +-`login/programs/pt_chown.c'. +- +- After installation you might want to configure the timezone and +-locale installation of your system. The GNU C library comes with a +-locale database which gets configured with `localedef'. For example, to +-set up a German locale with name `de_DE', simply issue the command +-`localedef -i de_DE -f ISO-8859-1 de_DE'. To configure all locales +-that are supported by glibc, you can issue from your build directory the +-command `make localedata/install-locales'. +- +- To configure the locally used timezone, set the `TZ' environment +-variable. The script `tzselect' helps you to select the right value. +-As an example, for Germany, `tzselect' would tell you to use +-`TZ='Europe/Berlin''. For a system wide installation (the given paths +-are for an installation with `--prefix=/usr'), link the timezone file +-which is in `/usr/share/zoneinfo' to the file `/etc/localtime'. For +-Germany, you might execute `ln -s /usr/share/zoneinfo/Europe/Berlin +-/etc/localtime'. +- +- +-File: libc.info, Node: Tools for Compilation, Next: Supported Configurations, Prev: Running make install, Up: Installation +- +-Recommended Tools for Compilation +-================================= +- +- We recommend installing the following GNU tools before attempting to +-build the GNU C library: +- +- * GNU `make' 3.79 or newer +- +- You need the latest version of GNU `make'. Modifying the GNU C +- Library to work with other `make' programs would be so difficult +- that we recommend you port GNU `make' instead. *Really.* We +- recommend GNU `make' version 3.79. All earlier versions have +- severe bugs or lack features. +- +- * GCC 3.2 or newer +- +- The GNU C library can only be compiled with the GNU C compiler +- family. As of the 2.3 release, GCC 3.2 or higher is required. As +- of this writing, GCC 3.2 is the compiler we advise to use. +- +- You can use whatever compiler you like to compile programs that +- use GNU libc, but be aware that both GCC 2.7 and 2.8 have bugs in +- their floating-point support that may be triggered by the math +- library. +- +- Check the FAQ for any special compiler issues on particular +- platforms. +- +- * GNU `binutils' 2.13 or later +- +- You must use GNU `binutils' (as and ld) to build the GNU C library. +- No other assembler and linker has the necessary functionality in +- the moment. +- +- * GNU `texinfo' 3.12f +- +- To correctly translate and install the Texinfo documentation you +- need this version of the `texinfo' package. Earlier versions do +- not understand all the tags used in the document, and the +- installation mechanism for the info files is not present or works +- differently. +- +- * GNU `awk' 3.0, or some other POSIX awk +- +- `Awk' is used in several places to generate files. The scripts +- should work with any POSIX-compliant `awk' implementation; `gawk' +- 3.0 and `mawk' 1.3 are known to work. +- +- * Perl 5 +- +- Perl is not required, but it is used if present to test the +- installation. We may decide to use it elsewhere in the future. +- +- * GNU `sed' 3.02 or newer +- +- `Sed' is used in several places to generate files. Most scripts +- work with any version of `sed'. The known exception is the script +- `po2test.sed' in the `intl' subdirectory which is used to generate +- `msgs.h' for the test suite. This script works correctly only +- with GNU `sed' 3.02. If you like to run the test suite, you +- should definitely upgrade `sed'. +- +- +-If you change any of the `configure.in' files you will also need +- +- * GNU `autoconf' 2.12 or higher +- +-and if you change any of the message translation files you will need +- +- * GNU `gettext' 0.10.36 or later +- +-You may also need these packages if you upgrade your source tree using +-patches, although we try to avoid this. +- +- +-File: libc.info, Node: Supported Configurations, Next: Linux, Prev: Tools for Compilation, Up: Installation +- +-Supported Configurations +-======================== +- +- The GNU C Library currently supports configurations that match the +-following patterns: +- +- alpha*-*-linux +- arm-*-linux +- cris-*-linux +- hppa-*-linux +- iX86-*-gnu +- iX86-*-linux +- ia64-*-linux +- m68k-*-linux +- mips*-*-linux +- powerpc-*-linux +- s390-*-linux +- s390x-*-linux +- sparc-*-linux +- sparc64-*-linux +- +- Former releases of this library (version 2.1 and/or 2.0) used to run +-on the following configurations: +- +- arm-*-linuxaout +- arm-*-none +- +- Very early releases (version 1.09.1 and perhaps earlier versions) +-used to run on the following configurations: +- +- alpha-dec-osf1 +- alpha-*-linuxecoff +- iX86-*-bsd4.3 +- iX86-*-isc2.2 +- iX86-*-isc3.N +- iX86-*-sco3.2 +- iX86-*-sco3.2v4 +- iX86-*-sysv +- iX86-*-sysv4 +- iX86-force_cpu386-none +- iX86-sequent-bsd +- i960-nindy960-none +- m68k-hp-bsd4.3 +- m68k-mvme135-none +- m68k-mvme136-none +- m68k-sony-newsos3 +- m68k-sony-newsos4 +- m68k-sun-sunos4.N +- mips-dec-ultrix4.N +- mips-sgi-irix4.N +- sparc-sun-solaris2.N +- sparc-sun-sunos4.N +- +- Since no one has volunteered to test and fix these configurations, +-they are not supported at the moment. They probably don't compile; +-they definitely don't work anymore. Porting the library is not hard. +-If you are interested in doing a port, please contact the glibc +-maintainers by sending electronic mail to . +- +- Valid cases of `iX86' include `i386', `i486', `i586', and `i686'. +-All of those configurations produce a library that can run on this +-processor and newer processors. The GCC compiler by default generates +-code that's optimized for the machine it's configured for and will use +-the instructions available on that machine. For example if your GCC is +-configured for `i686', gcc will optimize for `i686' and might issue +-some `i686' specific instructions. To generate code for other models, +-you have to configure for that model and give GCC the appropriate +-`-march=' and `-mcpu=' compiler switches via CFLAGS. +- +- +-File: libc.info, Node: Linux, Next: Reporting Bugs, Prev: Supported Configurations, Up: Installation +- +-Specific advice for GNU/Linux systems +-===================================== +- +- If you are installing GNU libc on a GNU/Linux system, you need to +-have the header files from a 2.2 or newer kernel around for reference. +-For some architectures, like ia64, sh and hppa, you need at least +-headers from kernel 2.3.99 (sh and hppa) or 2.4.0 (ia64). You do not +-need to use that kernel, just have its headers where glibc can access +-at them. The easiest way to do this is to unpack it in a directory +-such as `/usr/src/linux-2.2.1'. In that directory, run `make config' +-and accept all the defaults. Then run `make include/linux/version.h'. +-Finally, configure glibc with the option +-`--with-headers=/usr/src/linux-2.2.1/include'. Use the most recent +-kernel you can get your hands on. +- +- An alternate tactic is to unpack the 2.2 kernel and run `make +-config' as above; then, rename or delete `/usr/include', create a new +-`/usr/include', and make symbolic links of `/usr/include/linux' and +-`/usr/include/asm' into the kernel sources. You can then configure +-glibc with no special options. This tactic is recommended if you are +-upgrading from libc5, since you need to get rid of the old header files +-anyway. +- +- After installing GNU libc, you may need to remove or rename +-`/usr/include/linux' and `/usr/include/asm', and replace them with +-copies of `include/linux' and `include/asm-$ARCHITECTURE' taken from +-the Linux source package which supplied kernel headers for building the +-library. ARCHITECTURE will be the machine architecture for which the +-library was built, such as `i386' or `alpha'. You do not need to do +-this if you did not specify an alternate kernel header source using +-`--with-headers'. The intent here is that these directories should be +-copies of, *not* symlinks to, the kernel headers used to build the +-library. +- +- Note that `/usr/include/net' and `/usr/include/scsi' should *not* be +-symlinks into the kernel sources. GNU libc provides its own versions +-of these files. +- +- GNU/Linux expects some components of the libc installation to be in +-`/lib' and some in `/usr/lib'. This is handled automatically if you +-configure glibc with `--prefix=/usr'. If you set some other prefix or +-allow it to default to `/usr/local', then all the components are +-installed there. +- +- If you are upgrading from libc5, you need to recompile every shared +-library on your system against the new library for the sake of new code, +-but keep the old libraries around for old binaries to use. This is +-complicated and difficult. Consult the Glibc2 HOWTO at +- for details. +- +- You cannot use `nscd' with 2.0 kernels, due to bugs in the +-kernel-side thread support. `nscd' happens to hit these bugs +-particularly hard, but you might have problems with any threaded +-program. +- +- +-File: libc.info, Node: Reporting Bugs, Prev: Linux, Up: Installation +- +-Reporting Bugs +-============== +- +- There are probably bugs in the GNU C library. There are certainly +-errors and omissions in this manual. If you report them, they will get +-fixed. If you don't, no one will ever know about them and they will +-remain unfixed for all eternity, if not longer. +- +- It is a good idea to verify that the problem has not already been +-reported. Bugs are documented in two places: The file `BUGS' describes +-a number of well known bugs and the bug tracking system has a WWW +-interface at . The +-WWW interface gives you access to open and closed reports. A closed +-report normally includes a patch or a hint on solving the problem. +- +- To report a bug, first you must find it. With any luck, this will +-be the hard part. Once you've found a bug, make sure it's really a +-bug. A good way to do this is to see if the GNU C library behaves the +-same way some other C library does. If so, probably you are wrong and +-the libraries are right (but not necessarily). If not, one of the +-libraries is probably wrong. It might not be the GNU library. Many +-historical Unix C libraries permit things that we don't, such as +-closing a file twice. +- +- If you think you have found some way in which the GNU C library does +-not conform to the ISO and POSIX standards (*note Standards and +-Portability::), that is definitely a bug. Report it! +- +- Once you're sure you've found a bug, try to narrow it down to the +-smallest test case that reproduces the problem. In the case of a C +-library, you really only need to narrow it down to one library function +-call, if possible. This should not be too difficult. +- +- The final step when you have a simple test case is to report the bug. +-Do this using the `glibcbug' script. It is installed with libc, or if +-you haven't installed it, will be in your build directory. Send your +-test case, the results you got, the results you expected, and what you +-think the problem might be (if you've thought of anything). `glibcbug' +-will insert the configuration information we need to see, and ship the +-report off to . Don't send a message there directly; it +-is fed to a program that expects mail to be formatted in a particular +-way. Use the script. +- +- If you are not sure how a function should behave, and this manual +-doesn't tell you, that's a bug in the manual. Report that too! If the +-function's behavior disagrees with the manual, then either the library +-or the manual has a bug, so report the disagreement. If you find any +-errors or omissions in this manual, please report them to the Internet +-address . If you refer to specific sections +-of the manual, please include the section names for easier +-identification. +- +- +-File: libc.info, Node: Maintenance, Next: Contributors, Prev: Installation, Up: Top +- +-Library Maintenance +-******************* +- +-* Menu: +- +-* Source Layout:: How to add new functions or header files +- to the GNU C library. +-* Porting:: How to port the GNU C library to +- a new machine or operating system. +- +- +-File: libc.info, Node: Source Layout, Next: Porting, Up: Maintenance +- +-Adding New Functions +-==================== +- +- The process of building the library is driven by the makefiles, which +-make heavy use of special features of GNU `make'. The makefiles are +-very complex, and you probably don't want to try to understand them. +-But what they do is fairly straightforward, and only requires that you +-define a few variables in the right places. +- +- The library sources are divided into subdirectories, grouped by +-topic. +- +- The `string' subdirectory has all the string-manipulation functions, +-`math' has all the mathematical functions, etc. +- +- Each subdirectory contains a simple makefile, called `Makefile', +-which defines a few `make' variables and then includes the global +-makefile `Rules' with a line like: +- +- include ../Rules +- +-The basic variables that a subdirectory makefile defines are: +- +-`subdir' +- The name of the subdirectory, for example `stdio'. This variable +- *must* be defined. +- +-`headers' +- The names of the header files in this section of the library, such +- as `stdio.h'. +- +-`routines' +-`aux' +- The names of the modules (source files) in this section of the +- library. These should be simple names, such as `strlen' (rather +- than complete file names, such as `strlen.c'). Use `routines' for +- modules that define functions in the library, and `aux' for +- auxiliary modules containing things like data definitions. But the +- values of `routines' and `aux' are just concatenated, so there +- really is no practical difference. +- +-`tests' +- The names of test programs for this section of the library. These +- should be simple names, such as `tester' (rather than complete file +- names, such as `tester.c'). `make tests' will build and run all +- the test programs. If a test program needs input, put the test +- data in a file called `TEST-PROGRAM.input'; it will be given to +- the test program on its standard input. If a test program wants +- to be run with arguments, put the arguments (all on a single line) +- in a file called `TEST-PROGRAM.args'. Test programs should exit +- with zero status when the test passes, and nonzero status when the +- test indicates a bug in the library or error in building. +- +-`others' +- The names of "other" programs associated with this section of the +- library. These are programs which are not tests per se, but are +- other small programs included with the library. They are built by +- `make others'. +- +-`install-lib' +-`install-data' +-`install' +- Files to be installed by `make install'. Files listed in +- `install-lib' are installed in the directory specified by `libdir' +- in `configparms' or `Makeconfig' (*note Installation::). Files +- listed in `install-data' are installed in the directory specified +- by `datadir' in `configparms' or `Makeconfig'. Files listed in +- `install' are installed in the directory specified by `bindir' in +- `configparms' or `Makeconfig'. +- +-`distribute' +- Other files from this subdirectory which should be put into a +- distribution tar file. You need not list here the makefile itself +- or the source and header files listed in the other standard +- variables. Only define `distribute' if there are files used in an +- unusual way that should go into the distribution. +- +-`generated' +- Files which are generated by `Makefile' in this subdirectory. +- These files will be removed by `make clean', and they will never +- go into a distribution. +- +-`extra-objs' +- Extra object files which are built by `Makefile' in this +- subdirectory. This should be a list of file names like `foo.o'; +- the files will actually be found in whatever directory object +- files are being built in. These files will be removed by +- `make clean'. This variable is used for secondary object files +- needed to build `others' or `tests'. +- +- +-File: libc.info, Node: Porting, Prev: Source Layout, Up: Maintenance +- +-Porting the GNU C Library +-========================= +- +- The GNU C library is written to be easily portable to a variety of +-machines and operating systems. Machine- and operating system-dependent +-functions are well separated to make it easy to add implementations for +-new machines or operating systems. This section describes the layout of +-the library source tree and explains the mechanisms used to select +-machine-dependent code to use. +- +- All the machine-dependent and operating system-dependent files in the +-library are in the subdirectory `sysdeps' under the top-level library +-source directory. This directory contains a hierarchy of +-subdirectories (*note Hierarchy Conventions::). +- +- Each subdirectory of `sysdeps' contains source files for a +-particular machine or operating system, or for a class of machine or +-operating system (for example, systems by a particular vendor, or all +-machines that use IEEE 754 floating-point format). A configuration +-specifies an ordered list of these subdirectories. Each subdirectory +-implicitly appends its parent directory to the list. For example, +-specifying the list `unix/bsd/vax' is equivalent to specifying the list +-`unix/bsd/vax unix/bsd unix'. A subdirectory can also specify that it +-implies other subdirectories which are not directly above it in the +-directory hierarchy. If the file `Implies' exists in a subdirectory, +-it lists other subdirectories of `sysdeps' which are appended to the +-list, appearing after the subdirectory containing the `Implies' file. +-Lines in an `Implies' file that begin with a `#' character are ignored +-as comments. For example, `unix/bsd/Implies' contains: +- # BSD has Internet-related things. +- unix/inet +- +-and `unix/Implies' contains: +- posix +- +-So the final list is `unix/bsd/vax unix/bsd unix/inet unix posix'. +- +- `sysdeps' has a "special" subdirectory called `generic'. It is +-always implicitly appended to the list of subdirectories, so you +-needn't put it in an `Implies' file, and you should not create any +-subdirectories under it intended to be new specific categories. +-`generic' serves two purposes. First, the makefiles do not bother to +-look for a system-dependent version of a file that's not in `generic'. +-This means that any system-dependent source file must have an analogue +-in `generic', even if the routines defined by that file are not +-implemented on other platforms. Second. the `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. +- +- If it is possible to implement the routines in a `generic' file in +-machine-independent C, using only other machine-independent functions in +-the C library, then you should do so. Otherwise, make them stubs. A +-"stub" function is a function which cannot be implemented on a +-particular machine or operating system. Stub functions always return an +-error, and set `errno' to `ENOSYS' (Function not implemented). *Note +-Error Reporting::. If you define a stub function, you must place the +-statement `stub_warning(FUNCTION)', where FUNCTION is the name of your +-function, after its definition; also, you must include the file +-`' into your file. This causes the function to be listed +-in the installed `', and makes GNU ld warn when the +-function is used. +- +- Some rare functions are only useful on specific systems and aren't +-defined at all on others; these do not appear anywhere in the +-system-independent source code or makefiles (including the `generic' +-directory), only in the system-dependent `Makefile' in the specific +-system's subdirectory. +- +- If you come across a file that is in one of the main source +-directories (`string', `stdio', etc.), and you want to write a machine- +-or operating system-dependent version of it, move the file into +-`sysdeps/generic' and write your new implementation in the appropriate +-system-specific subdirectory. Note that if a file is to be +-system-dependent, it *must not* appear in one of the main source +-directories. +- +- There are a few special files that may exist in each subdirectory of +-`sysdeps': +- +-`Makefile' +- A makefile for this machine or operating system, or class of +- machine or operating system. This file is included by the library +- makefile `Makerules', which is used by the top-level makefile and +- the subdirectory makefiles. It can change the variables set in the +- including makefile or add new rules. It can use GNU `make' +- conditional directives based on the variable `subdir' (see above) +- to select different sets of variables and rules for different +- sections of the library. It can also set the `make' variable +- `sysdep-routines', to specify extra modules to be included in the +- library. You should use `sysdep-routines' rather than adding +- modules to `routines' because the latter is used in determining +- what to distribute for each subdirectory of the main source tree. +- +- Each makefile in a subdirectory in the ordered list of +- subdirectories to be searched is included in order. Since several +- system-dependent makefiles may be included, each should append to +- `sysdep-routines' rather than simply setting it: +- +- sysdep-routines := $(sysdep-routines) foo bar +- +-`Subdirs' +- This file contains the names of new whole subdirectories under the +- top-level library source tree that should be included for this +- system. These subdirectories are treated just like the +- system-independent subdirectories in the library source tree, such +- as `stdio' and `math'. +- +- Use this when there are completely new sets of functions and header +- files that should go into the library for the system this +- subdirectory of `sysdeps' implements. For example, +- `sysdeps/unix/inet/Subdirs' contains `inet'; the `inet' directory +- contains various network-oriented operations which only make sense +- to put in the library on systems that support the Internet. +- +-`Dist' +- This file contains the names of files (relative to the +- subdirectory of `sysdeps' in which it appears) which should be +- included in the distribution. List any new files used by rules in +- the `Makefile' in the same directory, or header files used by the +- source files in that directory. You don't need to list files that +- are implementations (either C or assembly source) of routines +- whose names are given in the machine-independent makefiles in the +- main source tree. +- +-`configure' +- This file is a shell script fragment to be run at configuration +- time. The top-level `configure' script uses the shell `.' command +- to read the `configure' file in each system-dependent directory +- chosen, in order. The `configure' files are often generated from +- `configure.in' files using Autoconf. +- +- A system-dependent `configure' script will usually add things to +- the shell variables `DEFS' and `config_vars'; see the top-level +- `configure' script for details. The script can check for +- `--with-PACKAGE' options that were passed to the top-level +- `configure'. For an option `--with-PACKAGE=VALUE' `configure' +- sets the shell variable `with_PACKAGE' (with any dashes in PACKAGE +- converted to underscores) to VALUE; if the option is just +- `--with-PACKAGE' (no argument), then it sets `with_PACKAGE' to +- `yes'. +- +-`configure.in' +- This file is an Autoconf input fragment to be processed into the +- file `configure' in this subdirectory. *Note Introduction: +- (autoconf.info)Introduction, for a description of Autoconf. You +- should write either `configure' or `configure.in', but not both. +- The first line of `configure.in' should invoke the `m4' macro +- `GLIBC_PROVIDES'. This macro does several `AC_PROVIDE' calls for +- Autoconf macros which are used by the top-level `configure' +- script; without this, those macros might be invoked again +- unnecessarily by Autoconf. +- +- That is the general system for how system-dependencies are isolated. +- +-* Menu: +- +-* Hierarchy Conventions:: The layout of the `sysdeps' hierarchy. +-* Porting to Unix:: Porting the library to an average +- Unix-like system. +- +- +-File: libc.info, Node: Hierarchy Conventions, Next: Porting to Unix, Up: Porting +- +-Layout of the `sysdeps' Directory Hierarchy +-------------------------------------------- +- +- A GNU configuration name has three parts: the CPU type, the +-manufacturer's name, and the operating system. `configure' uses these +-to pick the list of system-dependent directories to look for. If the +-`--nfp' option is _not_ passed to `configure', the directory +-`MACHINE/fpu' is also used. The operating system often has a "base +-operating system"; for example, if the operating system is `Linux', the +-base operating system is `unix/sysv'. The algorithm used to pick the +-list of directories is simple: `configure' makes a list of the base +-operating system, manufacturer, CPU type, and operating system, in that +-order. It then concatenates all these together with slashes in +-between, to produce a directory name; for example, the configuration +-`i686-linux-gnu' results in `unix/sysv/linux/i386/i686'. `configure' +-then tries removing each element of the list in turn, so +-`unix/sysv/linux' and `unix/sysv' are also tried, among others. Since +-the precise version number of the operating system is often not +-important, and it would be very inconvenient, for example, to have +-identical `irix6.2' and `irix6.3' directories, `configure' tries +-successively less specific operating system names by removing trailing +-suffixes starting with a period. +- +- As an example, here is the complete list of directories that would be +-tried for the configuration `i686-linux-gnu' (with the `crypt' and +-`linuxthreads' add-on): +- +- sysdeps/i386/elf +- crypt/sysdeps/unix +- linuxthreads/sysdeps/unix/sysv/linux +- linuxthreads/sysdeps/pthread +- linuxthreads/sysdeps/unix/sysv +- linuxthreads/sysdeps/unix +- linuxthreads/sysdeps/i386/i686 +- linuxthreads/sysdeps/i386 +- linuxthreads/sysdeps/pthread/no-cmpxchg +- sysdeps/unix/sysv/linux/i386 +- sysdeps/unix/sysv/linux +- sysdeps/gnu +- sysdeps/unix/common +- sysdeps/unix/mman +- sysdeps/unix/inet +- sysdeps/unix/sysv/i386/i686 +- sysdeps/unix/sysv/i386 +- sysdeps/unix/sysv +- sysdeps/unix/i386 +- sysdeps/unix +- sysdeps/posix +- sysdeps/i386/i686 +- sysdeps/i386/i486 +- sysdeps/libm-i387/i686 +- sysdeps/i386/fpu +- sysdeps/libm-i387 +- sysdeps/i386 +- sysdeps/wordsize-32 +- sysdeps/ieee754 +- sysdeps/libm-ieee754 +- sysdeps/generic +- +- Different machine architectures are conventionally subdirectories at +-the top level of the `sysdeps' directory tree. For example, +-`sysdeps/sparc' and `sysdeps/m68k'. These contain files specific to +-those machine architectures, but not specific to any particular +-operating system. There might be subdirectories for specializations of +-those architectures, such as `sysdeps/m68k/68020'. Code which is +-specific to the floating-point coprocessor used with a particular +-machine should go in `sysdeps/MACHINE/fpu'. +- +- There are a few directories at the top level of the `sysdeps' +-hierarchy that are not for particular machine architectures. +- +-`generic' +- As described above (*note Porting::), this is the subdirectory +- that every configuration implicitly uses after all others. +- +-`ieee754' +- This directory is for code using the IEEE 754 floating-point +- format, where the C type `float' is IEEE 754 single-precision +- format, and `double' is IEEE 754 double-precision format. Usually +- this directory is referred to in the `Implies' file in a machine +- architecture-specific directory, such as `m68k/Implies'. +- +-`libm-ieee754' +- This directory contains an implementation of a mathematical library +- usable on platforms which use IEEE 754 conformant floating-point +- arithmetic. +- +-`libm-i387' +- This is a special case. Ideally the code should be in +- `sysdeps/i386/fpu' but for various reasons it is kept aside. +- +-`posix' +- This directory contains implementations of things in the library in +- terms of POSIX.1 functions. This includes some of the POSIX.1 +- functions themselves. Of course, POSIX.1 cannot be completely +- implemented in terms of itself, so a configuration using just +- `posix' cannot be complete. +- +-`unix' +- This is the directory for Unix-like things. *Note Porting to +- Unix::. `unix' implies `posix'. There are some special-purpose +- subdirectories of `unix': +- +- `unix/common' +- This directory is for things common to both BSD and System V +- release 4. Both `unix/bsd' and `unix/sysv/sysv4' imply +- `unix/common'. +- +- `unix/inet' +- This directory is for `socket' and related functions on Unix +- systems. `unix/inet/Subdirs' enables the `inet' top-level +- subdirectory. `unix/common' implies `unix/inet'. +- +-`mach' +- This is the directory for things based on the Mach microkernel +- from CMU (including the GNU operating system). Other basic +- operating systems (VMS, for example) would have their own +- directories at the top level of the `sysdeps' hierarchy, parallel +- to `unix' and `mach'. +- +- +-File: libc.info, Node: Porting to Unix, Prev: Hierarchy Conventions, Up: Porting +- +-Porting the GNU C Library to Unix Systems +------------------------------------------ +- +- Most Unix systems are fundamentally very similar. There are +-variations between different machines, and variations in what +-facilities are provided by the kernel. But the interface to the +-operating system facilities is, for the most part, pretty uniform and +-simple. +- +- The code for Unix systems is in the directory `unix', at the top +-level of the `sysdeps' hierarchy. This directory contains +-subdirectories (and subdirectory trees) for various Unix variants. +- +- The functions which are system calls in most Unix systems are +-implemented in assembly code, which is generated automatically from +-specifications in files named `syscalls.list'. There are several such +-files, one in `sysdeps/unix' and others in its subdirectories. Some +-special system calls are implemented in files that are named with a +-suffix of `.S'; for example, `_exit.S'. Files ending in `.S' are run +-through the C preprocessor before being fed to the assembler. +- +- These files all use a set of macros that should be defined in +-`sysdep.h'. The `sysdep.h' file in `sysdeps/unix' partially defines +-them; a `sysdep.h' file in another directory must finish defining them +-for the particular machine and operating system variant. See +-`sysdeps/unix/sysdep.h' and the machine-specific `sysdep.h' +-implementations to see what these macros are and what they should do. +- +- The system-specific makefile for the `unix' directory +-(`sysdeps/unix/Makefile') gives rules to generate several files from +-the Unix system you are building the library on (which is assumed to be +-the target system you are building the library _for_). All the +-generated files are put in the directory where the object files are +-kept; they should not affect the source tree itself. The files +-generated are `ioctls.h', `errnos.h', `sys/param.h', and `errlist.c' +-(for the `stdio' section of the library). +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-55 glibc-2.3.2-200304020432/manual/libc.info-55 +--- glibc-2.3.2/manual/libc.info-55 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-55 Thu Jan 1 01:00:00 1970 +@@ -1,827 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Contributors, Next: Free Manuals, Prev: Maintenance, Up: Top +- +-Contributors to the GNU C Library +-********************************* +- +- The GNU C library was written originally by Roland McGrath, and is +-currently maintained by Ulrich Drepper. Some parts of the library were +-contributed or worked on by other people. +- +- * The `getopt' function and related code was written by Richard +- Stallman, David J. MacKenzie, and Roland McGrath. +- +- * The merge sort function `qsort' was written by Michael J. Haertel. +- +- * The quick sort function used as a fallback by `qsort' was written +- by Douglas C. Schmidt. +- +- * The memory allocation functions `malloc', `realloc' and `free' and +- related code were written by Michael J. Haertel, Wolfram Gloger, +- and Doug Lea. +- +- * Fast implementations of many of the string functions (`memcpy', +- `strlen', etc.) were written by Torbjo"rn Granlund. +- +- * The `tar.h' header file was written by David J. MacKenzie. +- +- * The port to the MIPS DECStation running Ultrix 4 +- (`mips-dec-ultrix4') was contributed by Brendan Kehoe and Ian +- Lance Taylor. +- +- * The DES encryption function `crypt' and related functions were +- contributed by Michael Glad. +- +- * The `ftw' and `nftw' functions were contributed by Ulrich Drepper. +- +- * The startup code to support SunOS shared libraries was contributed +- by Tom Quinn. +- +- * The `mktime' function was contributed by Paul Eggert. +- +- * The port to the Sequent Symmetry running Dynix version 3 +- (`i386-sequent-bsd') was contributed by Jason Merrill. +- +- * The timezone support code is derived from the public-domain +- timezone package by Arthur David Olson and his many contributors. +- +- * The port to the DEC Alpha running OSF/1 (`alpha-dec-osf1') was +- contributed by Brendan Kehoe, using some code written by Roland +- McGrath. +- +- * The port to SGI machines running Irix 4 (`mips-sgi-irix4') was +- contributed by Tom Quinn. +- +- * The port of the Mach and Hurd code to the MIPS architecture +- (`mips-ANYTHING-gnu') was contributed by Kazumoto Kojima. +- +- * The floating-point printing function used by `printf' and friends +- and the floating-point reading function used by `scanf', `strtod' +- and friends were written by Ulrich Drepper. The multi-precision +- integer functions used in those functions are taken from GNU MP, +- which was contributed by Torbjo"rn Granlund. +- +- * The internationalization support in the library, and the support +- programs `locale' and `localedef', were written by Ulrich Drepper. +- Ulrich Drepper adapted the support code for message catalogs +- (`libintl.h', etc.) from the GNU `gettext' package, which he also +- wrote. He also contributed the `catgets' support and the entire +- suite of multi-byte and wide-character support functions +- (`wctype.h', `wchar.h', etc.). +- +- * The implementations of the `nsswitch.conf' mechanism and the files +- and DNS backends for it were designed and written by Ulrich +- Drepper and Roland McGrath, based on a backend interface defined +- by Peter Eriksson. +- +- * The port to Linux i386/ELF (`i386-ANYTHING-linux') was contributed +- by Ulrich Drepper, based in large part on work done in Hongjiu +- Lu's Linux version of the GNU C Library. +- +- * The port to Linux/m68k (`m68k-ANYTHING-linux') was contributed by +- Andreas Schwab. +- +- * The ports to Linux/ARM (`arm-ANYTHING-linuxaout') and ARM +- standalone (`arm-ANYTHING-none'), as well as parts of the IPv6 +- support code, were contributed by Philip Blundell. +- +- * Richard Henderson contributed the ELF dynamic linking code and +- other support for the Alpha processor. +- +- * David Mosberger-Tang contributed the port to Linux/Alpha +- (`alpha-ANYTHING-linux'). +- +- * The port to Linux on PowerPC (`powerpc-ANYTHING-linux') was +- contributed by Geoffrey Keating. +- +- * Miles Bader wrote the argp argument-parsing package, and the +- argz/envz interfaces. +- +- * Stephen R. van den Berg contributed a highly-optimized `strstr' +- function. +- +- * Ulrich Drepper contributed the `hsearch' and `drand48' families of +- functions; reentrant `...`_r'' versions of the `random' family; +- System V shared memory and IPC support code; and several +- highly-optimized string functions for iX86 processors. +- +- * The math functions are taken from `fdlibm-5.1' by Sun +- Microsystems, as modified by J.T. Conklin, Ian Lance Taylor, +- Ulrich Drepper, Andreas Schwab, and Roland McGrath. +- +- * The `libio' library used to implement `stdio' functions on some +- platforms was written by Per Bothner and modified by Ulrich +- Drepper. +- +- * Eric Youngdale and Ulrich Drepper implemented versioning of +- objects on the symbol level. +- +- * Thorsten Kukuk provided an implementation for NIS (YP) and NIS+, +- securelevel 0, 1 and 2. +- +- * Andreas Jaeger provided a test suite for the math library. +- +- * Mark Kettenis implemented the utmpx interface and an utmp daemon. +- +- * Ulrich Drepper added character conversion functions (`iconv'). +- +- * Thorsten Kukuk provided an implementation for a caching daemon for +- NSS (nscd). +- +- * Tim Waugh provided an implementation of the POSIX.2 wordexp +- function family. +- +- * Mark Kettenis provided a Hesiod NSS module. +- +- * The Internet-related code (most of the `inet' subdirectory) and +- several other miscellaneous functions and header files have been +- included from 4.4 BSD with little or no modification. The copying +- permission notice for this code can be found in the file `LICENSES' +- in the source distribution. +- +- * The random number generation functions `random', `srandom', +- `setstate' and `initstate', which are also the basis for the +- `rand' and `srand' functions, were written by Earl T. Cohen for +- the University of California at Berkeley and are copyrighted by the +- Regents of the University of California. They have undergone minor +- changes to fit into the GNU C library and to fit the ISO C +- standard, but the functional code is Berkeley's. +- +- * The DNS resolver code is taken directly from BIND 4.9.5, which +- includes copyrighted code from UC Berkeley and from Digital +- Equipment Corporation. See the file `LICENSES' for the text of +- the DEC license. +- +- * The code to support Sun RPC is taken verbatim from Sun's +- RPCSRC-4.0 distribution; see the file `LICENSES' for the text of +- the license. +- +- * Some of the support code for Mach is taken from Mach 3.0 by CMU; +- the file if_ppp.h is also copyright by CMU, but under a different +- license; see the file `LICENSES' for the text of the licenses. +- +- * Many of the IA64 math functions are taken from a collection of +- "Highly Optimized Mathematical Functions for Itanium" that Intel +- makes available under a free license; see the file `LICENSES' for +- details. +- +- * The `getaddrinfo' and `getnameinfo' functions and supporting code +- were written by Craig Metz; see the file `LICENSES' for details on +- their licensing. +- +- * Many of the IEEE 64-bit double precision math functions (in the +- `sysdeps/ieee754/dbl-64' subdirectory) come from the IBM Accurate +- Mathematical Library, contributed by IBM. +- +- +- +-File: libc.info, Node: Free Manuals, Next: Copying, Prev: Contributors, Up: Top +- +-Free Software Needs Free Documentation +-************************************** +- +- The biggest deficiency in the free software community today is not in +-the software--it is the lack of good free documentation that we can +-include with the free software. Many of our most important programs do +-not come with free reference manuals and free introductory texts. +-Documentation is an essential part of any software package; when an +-important free software package does not come with a free manual and a +-free tutorial, that is a major gap. We have many such gaps today. +- +- Consider Perl, for instance. The tutorial manuals that people +-normally use are non-free. How did this come about? Because the +-authors of those manuals published them with restrictive terms--no +-copying, no modification, source files not available--which exclude +-them from the free software world. +- +- That wasn't the first time this sort of thing happened, and it was +-far from the last. Many times we have heard a GNU user eagerly +-describe a manual that he is writing, his intended contribution to the +-community, only to learn that he had ruined everything by signing a +-publication contract to make it non-free. +- +- Free documentation, like free software, is a matter of freedom, not +-price. The problem with the non-free manual is not that publishers +-charge a price for printed copies--that in itself is fine. (The Free +-Software Foundation sells printed copies of manuals, too.) The problem +-is the restrictions on the use of the manual. Free manuals are +-available in source code form, and give you permission to copy and +-modify. Non-free manuals do not allow this. +- +- The criteria of freedom for a free manual are roughly the same as for +-free software. Redistribution (including the normal kinds of +-commercial redistribution) must be permitted, so that the manual can +-accompany every copy of the program, both on-line and on paper. +- +- Permission for modification of the technical content is crucial too. +-When people modify the software, adding or changing features, if they +-are conscientious they will change the manual too--so they can provide +-accurate and clear documentation for the modified program. A manual +-that leaves you no choice but to write a new manual to document a +-changed version of the program is not really available to our community. +- +- Some kinds of limits on the way modification is handled are +-acceptable. For example, requirements to preserve the original +-author's copyright notice, the distribution terms, or the list of +-authors, are ok. It is also no problem to require modified versions to +-include notice that they were modified. Even entire sections that may +-not be deleted or changed are acceptable, as long as they deal with +-nontechnical topics (like this one). These kinds of restrictions are +-acceptable because they don't obstruct the community's normal use of +-the manual. +- +- However, it must be possible to modify all the _technical_ content +-of the manual, and then distribute the result in all the usual media, +-through all the usual channels. Otherwise, the restrictions obstruct +-the use of the manual, it is not free, and we need another manual to +-replace it. +- +- Please spread the word about this issue. Our community continues to +-lose manuals to proprietary publishing. If we spread the word that +-free software needs free reference manuals and free tutorials, perhaps +-the next person who wants to contribute by writing documentation will +-realize, before it is too late, that only free manuals contribute to +-the free software community. +- +- If you are writing documentation, please insist on publishing it +-under the GNU Free Documentation License or another free documentation +-license. Remember that this decision requires your approval--you don't +-have to let the publisher decide. Some commercial publishers will use +-a free license if you insist, but they will not propose the option; it +-is up to you to raise the issue and say firmly that this is what you +-want. If the publisher you are dealing with refuses, please try other +-publishers. If you're not sure whether a proposed license is free, +-write to . +- +- You can encourage commercial publishers to sell more free, copylefted +-manuals and tutorials by buying them, and particularly by buying copies +-from the publishers that paid for their writing or for major +-improvements. Meanwhile, try to avoid buying non-free documentation at +-all. Check the distribution terms of a manual before you buy it, and +-insist that whoever seeks your business must respect your freedom. +-Check the history of the book, and try reward the publishers that have +-paid or pay the authors to work on it. +- +- The Free Software Foundation maintains a list of free documentation +-published by other publishers, at +-. +- +- +-File: libc.info, Node: Copying, Next: Documentation License, Prev: Free Manuals, Up: Top +- +-GNU Lesser General Public License +-********************************* +- +- Version 2.1, February 1999 +- Copyright (C) 1991, 1999 Free Software Foundation, Inc. +- 59 Temple Place -- Suite 330, Boston, MA 02111-1307, USA +- +- Everyone is permitted to copy and distribute verbatim copies +- of this license document, but changing it is not allowed. +- +- [This is the first released version of the Lesser GPL. It also counts +- as the successor of the GNU Library Public License, version 2, hence the +- version number 2.1.] +- +-Preamble +--------- +- +- The licenses for most software are designed to take away your +-freedom to share and change it. By contrast, the GNU General Public +-Licenses are intended to guarantee your freedom to share and change +-free software--to make sure the software is free for all its users. +- +- This license, the Lesser General Public License, applies to some +-specially designated software--typically libraries--of the Free +-Software Foundation and other authors who decide to use it. You can use +-it too, but we suggest you first think carefully about whether this +-license or the ordinary General Public License is the better strategy to +-use in any particular case, based on the explanations below. +- +- When we speak of free software, we are referring to freedom of use, +-not price. Our General Public Licenses are designed to make sure that +-you have the freedom to distribute copies of free software (and charge +-for this service if you wish); that you receive source code or can get +-it if you want it; that you can change the software and use pieces of it +-in new free programs; and that you are informed that you can do these +-things. +- +- To protect your rights, we need to make restrictions that forbid +-distributors to deny you these rights or to ask you to surrender these +-rights. These restrictions translate to certain responsibilities for +-you if you distribute copies of the library or if you modify it. +- +- For example, if you distribute copies of the library, whether gratis +-or for a fee, you must give the recipients all the rights that we gave +-you. You must make sure that they, too, receive or can get the source +-code. If you link other code with the library, you must provide +-complete object files to the recipients, so that they can relink them +-with the library after making changes to the library and recompiling +-it. And you must show them these terms so they know their rights. +- +- We protect your rights with a two-step method: (1) we copyright the +-library, and (2) we offer you this license, which gives you legal +-permission to copy, distribute and/or modify the library. +- +- To protect each distributor, we want to make it very clear that +-there is no warranty for the free library. Also, if the library is +-modified by someone else and passed on, the recipients should know that +-what they have is not the original version, so that the original +-author's reputation will not be affected by problems that might be +-introduced by others. +- +- Finally, software patents pose a constant threat to the existence of +-any free program. We wish to make sure that a company cannot +-effectively restrict the users of a free program by obtaining a +-restrictive license from a patent holder. Therefore, we insist that +-any patent license obtained for a version of the library must be +-consistent with the full freedom of use specified in this license. +- +- Most GNU software, including some libraries, is covered by the +-ordinary GNU General Public License. This license, the GNU Lesser +-General Public License, applies to certain designated libraries, and is +-quite different from the ordinary General Public License. We use this +-license for certain libraries in order to permit linking those +-libraries into non-free programs. +- +- When a program is linked with a library, whether statically or using +-a shared library, the combination of the two is legally speaking a +-combined work, a derivative of the original library. The ordinary +-General Public License therefore permits such linking only if the +-entire combination fits its criteria of freedom. The Lesser General +-Public License permits more lax criteria for linking other code with +-the library. +- +- We call this license the "Lesser" General Public License because it +-does _Less_ to protect the user's freedom than the ordinary General +-Public License. It also provides other free software developers Less +-of an advantage over competing non-free programs. These disadvantages +-are the reason we use the ordinary General Public License for many +-libraries. However, the Lesser license provides advantages in certain +-special circumstances. +- +- For example, on rare occasions, there may be a special need to +-encourage the widest possible use of a certain library, so that it +-becomes a de-facto standard. To achieve this, non-free programs must be +-allowed to use the library. A more frequent case is that a free +-library does the same job as widely used non-free libraries. In this +-case, there is little to gain by limiting the free library to free +-software only, so we use the Lesser General Public License. +- +- In other cases, permission to use a particular library in non-free +-programs enables a greater number of people to use a large body of free +-software. For example, permission to use the GNU C Library in non-free +-programs enables many more people to use the whole GNU operating +-system, as well as its variant, the GNU/Linux operating system. +- +- Although the Lesser General Public License is Less protective of the +-users' freedom, it does ensure that the user of a program that is +-linked with the Library has the freedom and the wherewithal to run that +-program using a modified version of the Library. +- +- The precise terms and conditions for copying, distribution and +-modification follow. Pay close attention to the difference between a +-"work based on the library" and a "work that uses the library". The +-former contains code derived from the library, whereas the latter must +-be combined with the library in order to run. +- +- GNU LESSER GENERAL PUBLIC LICENSE +- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +- 0. This License Agreement applies to any software library or other +- program which contains a notice placed by the copyright holder or +- other authorized party saying it may be distributed under the +- terms of this Lesser General Public License (also called "this +- License"). Each licensee is addressed as "you". +- +- A "library" means a collection of software functions and/or data +- prepared so as to be conveniently linked with application programs +- (which use some of those functions and data) to form executables. +- +- The "Library", below, refers to any such software library or work +- which has been distributed under these terms. A "work based on the +- Library" means either the Library or any derivative work under +- copyright law: that is to say, a work containing the Library or a +- portion of it, either verbatim or with modifications and/or +- translated straightforwardly into another language. (Hereinafter, +- translation is included without limitation in the term +- "modification".) +- +- "Source code" for a work means the preferred form of the work for +- making modifications to it. For a library, complete source code +- means all the source code for all modules it contains, plus any +- associated interface definition files, plus the scripts used to +- control compilation and installation of the library. +- +- Activities other than copying, distribution and modification are +- not covered by this License; they are outside its scope. The act +- of running a program using the Library is not restricted, and +- output from such a program is covered only if its contents +- constitute a work based on the Library (independent of the use of +- the Library in a tool for writing it). Whether that is true +- depends on what the Library does and what the program that uses +- the Library does. +- +- 1. You may copy and distribute verbatim copies of the Library's +- complete source code as you receive it, in any medium, provided +- that you conspicuously and appropriately publish on each copy an +- appropriate copyright notice and disclaimer of warranty; keep +- intact all the notices that refer to this License and to the +- absence of any warranty; and distribute a copy of this License +- along with the Library. +- +- You may charge a fee for the physical act of transferring a copy, +- and you may at your option offer warranty protection in exchange +- for a fee. +- +- 2. You may modify your copy or copies of the Library or any portion +- of it, thus forming a work based on the Library, and copy and +- distribute such modifications or work under the terms of Section 1 +- above, provided that you also meet all of these conditions: +- +- a. The modified work must itself be a software library. +- +- b. You must cause the files modified to carry prominent notices +- stating that you changed the files and the date of any change. +- +- c. You must cause the whole of the work to be licensed at no +- charge to all third parties under the terms of this License. +- +- d. If a facility in the modified Library refers to a function or +- a table of data to be supplied by an application program that +- uses the facility, other than as an argument passed when the +- facility is invoked, then you must make a good faith effort +- to ensure that, in the event an application does not supply +- such function or table, the facility still operates, and +- performs whatever part of its purpose remains meaningful. +- +- (For example, a function in a library to compute square roots +- has a purpose that is entirely well-defined independent of the +- application. Therefore, Subsection 2d requires that any +- application-supplied function or table used by this function +- must be optional: if the application does not supply it, the +- square root function must still compute square roots.) +- +- These requirements apply to the modified work as a whole. If +- identifiable sections of that work are not derived from the +- Library, and can be reasonably considered independent and separate +- works in themselves, then this License, and its terms, do not +- apply to those sections when you distribute them as separate +- works. But when you distribute the same sections as part of a +- whole which is a work based on the Library, the distribution of +- the whole must be on the terms of this License, whose permissions +- for other licensees extend to the entire whole, and thus to each +- and every part regardless of who wrote it. +- +- Thus, it is not the intent of this section to claim rights or +- contest your rights to work written entirely by you; rather, the +- intent is to exercise the right to control the distribution of +- derivative or collective works based on the Library. +- +- In addition, mere aggregation of another work not based on the +- Library with the Library (or with a work based on the Library) on +- a volume of a storage or distribution medium does not bring the +- other work under the scope of this License. +- +- 3. You may opt to apply the terms of the ordinary GNU General Public +- License instead of this License to a given copy of the Library. +- To do this, you must alter all the notices that refer to this +- License, so that they refer to the ordinary GNU General Public +- License, version 2, instead of to this License. (If a newer +- version than version 2 of the ordinary GNU General Public License +- has appeared, then you can specify that version instead if you +- wish.) Do not make any other change in these notices. +- +- Once this change is made in a given copy, it is irreversible for +- that copy, so the ordinary GNU General Public License applies to +- all subsequent copies and derivative works made from that copy. +- +- This option is useful when you wish to copy part of the code of +- the Library into a program that is not a library. +- +- 4. You may copy and distribute the Library (or a portion or +- derivative of it, under Section 2) in object code or executable +- form under the terms of Sections 1 and 2 above provided that you +- accompany it with the complete corresponding machine-readable +- source code, which must be distributed under the terms of Sections +- 1 and 2 above on a medium customarily used for software +- interchange. +- +- If distribution of object code is made by offering access to copy +- from a designated place, then offering equivalent access to copy +- the source code from the same place satisfies the requirement to +- distribute the source code, even though third parties are not +- compelled to copy the source along with the object code. +- +- 5. A program that contains no derivative of any portion of the +- Library, but is designed to work with the Library by being +- compiled or linked with it, is called a "work that uses the +- Library". Such a work, in isolation, is not a derivative work of +- the Library, and therefore falls outside the scope of this License. +- +- However, linking a "work that uses the Library" with the Library +- creates an executable that is a derivative of the Library (because +- it contains portions of the Library), rather than a "work that +- uses the library". The executable is therefore covered by this +- License. Section 6 states terms for distribution of such +- executables. +- +- When a "work that uses the Library" uses material from a header +- file that is part of the Library, the object code for the work may +- be a derivative work of the Library even though the source code is +- not. Whether this is true is especially significant if the work +- can be linked without the Library, or if the work is itself a +- library. The threshold for this to be true is not precisely +- defined by law. +- +- If such an object file uses only numerical parameters, data +- structure layouts and accessors, and small macros and small inline +- functions (ten lines or less in length), then the use of the object +- file is unrestricted, regardless of whether it is legally a +- derivative work. (Executables containing this object code plus +- portions of the Library will still fall under Section 6.) +- +- Otherwise, if the work is a derivative of the Library, you may +- distribute the object code for the work under the terms of Section +- 6. Any executables containing that work also fall under Section 6, +- whether or not they are linked directly with the Library itself. +- +- 6. As an exception to the Sections above, you may also combine or +- link a "work that uses the Library" with the Library to produce a +- work containing portions of the Library, and distribute that work +- under terms of your choice, provided that the terms permit +- modification of the work for the customer's own use and reverse +- engineering for debugging such modifications. +- +- You must give prominent notice with each copy of the work that the +- Library is used in it and that the Library and its use are covered +- by this License. You must supply a copy of this License. If the +- work during execution displays copyright notices, you must include +- the copyright notice for the Library among them, as well as a +- reference directing the user to the copy of this License. Also, +- you must do one of these things: +- +- a. Accompany the work with the complete corresponding +- machine-readable source code for the Library including +- whatever changes were used in the work (which must be +- distributed under Sections 1 and 2 above); and, if the work +- is an executable linked with the Library, with the complete +- machine-readable "work that uses the Library", as object code +- and/or source code, so that the user can modify the Library +- and then relink to produce a modified executable containing +- the modified Library. (It is understood that the user who +- changes the contents of definitions files in the Library will +- not necessarily be able to recompile the application to use +- the modified definitions.) +- +- b. Use a suitable shared library mechanism for linking with the +- Library. A suitable mechanism is one that (1) uses at run +- time a copy of the library already present on the user's +- computer system, rather than copying library functions into +- the executable, and (2) will operate properly with a modified +- version of the library, if the user installs one, as long as +- the modified version is interface-compatible with the version +- that the work was made with. +- +- c. Accompany the work with a written offer, valid for at least +- three years, to give the same user the materials specified in +- Subsection 6a, above, for a charge no more than the cost of +- performing this distribution. +- +- d. If distribution of the work is made by offering access to copy +- from a designated place, offer equivalent access to copy the +- above specified materials from the same place. +- +- e. Verify that the user has already received a copy of these +- materials or that you have already sent this user a copy. +- +- For an executable, the required form of the "work that uses the +- Library" must include any data and utility programs needed for +- reproducing the executable from it. However, as a special +- exception, the materials to be distributed need not include +- anything that is normally distributed (in either source or binary +- form) with the major components (compiler, kernel, and so on) of +- the operating system on which the executable runs, unless that +- component itself accompanies the executable. +- +- It may happen that this requirement contradicts the license +- restrictions of other proprietary libraries that do not normally +- accompany the operating system. Such a contradiction means you +- cannot use both them and the Library together in an executable +- that you distribute. +- +- 7. You may place library facilities that are a work based on the +- Library side-by-side in a single library together with other +- library facilities not covered by this License, and distribute +- such a combined library, provided that the separate distribution +- of the work based on the Library and of the other library +- facilities is otherwise permitted, and provided that you do these +- two things: +- +- a. Accompany the combined library with a copy of the same work +- based on the Library, uncombined with any other library +- facilities. This must be distributed under the terms of the +- Sections above. +- +- b. Give prominent notice with the combined library of the fact +- that part of it is a work based on the Library, and explaining +- where to find the accompanying uncombined form of the same +- work. +- +- 8. You may not copy, modify, sublicense, link with, or distribute the +- Library except as expressly provided under this License. Any +- attempt otherwise to copy, modify, sublicense, link with, or +- distribute the Library is void, and will automatically terminate +- your rights under this License. However, parties who have +- received copies, or rights, from you under this License will not +- have their licenses terminated so long as such parties remain in +- full compliance. +- +- 9. You are not required to accept this License, since you have not +- signed it. However, nothing else grants you permission to modify +- or distribute the Library or its derivative works. These actions +- are prohibited by law if you do not accept this License. +- Therefore, by modifying or distributing the Library (or any work +- based on the Library), you indicate your acceptance of this +- License to do so, and all its terms and conditions for copying, +- distributing or modifying the Library or works based on it. +- +- 10. Each time you redistribute the Library (or any work based on the +- Library), the recipient automatically receives a license from the +- original licensor to copy, distribute, link with or modify the +- Library subject to these terms and conditions. You may not impose +- any further restrictions on the recipients' exercise of the rights +- granted herein. You are not responsible for enforcing compliance +- by third parties with this License. +- +- 11. If, as a consequence of a court judgment or allegation of patent +- infringement or for any other reason (not limited to patent +- issues), conditions are imposed on you (whether by court order, +- agreement or otherwise) that contradict the conditions of this +- License, they do not excuse you from the conditions of this +- License. If you cannot distribute so as to satisfy simultaneously +- your obligations under this License and any other pertinent +- obligations, then as a consequence you may not distribute the +- Library at all. For example, if a patent license would not permit +- royalty-free redistribution of the Library by all those who +- receive copies directly or indirectly through you, then the only +- way you could satisfy both it and this License would be to refrain +- entirely from distribution of the Library. +- +- If any portion of this section is held invalid or unenforceable +- under any particular circumstance, the balance of the section is +- intended to apply, and the section as a whole is intended to apply +- in other circumstances. +- +- It is not the purpose of this section to induce you to infringe any +- patents or other property right claims or to contest validity of +- any such claims; this section has the sole purpose of protecting +- the integrity of the free software distribution system which is +- implemented by public license practices. Many people have made +- generous contributions to the wide range of software distributed +- through that system in reliance on consistent application of that +- system; it is up to the author/donor to decide if he or she is +- willing to distribute software through any other system and a +- licensee cannot impose that choice. +- +- This section is intended to make thoroughly clear what is believed +- to be a consequence of the rest of this License. +- +- 12. If the distribution and/or use of the Library is restricted in +- certain countries either by patents or by copyrighted interfaces, +- the original copyright holder who places the Library under this +- License may add an explicit geographical distribution limitation +- excluding those countries, so that distribution is permitted only +- in or among countries not thus excluded. In such case, this +- License incorporates the limitation as if written in the body of +- this License. +- +- 13. The Free Software Foundation may publish revised and/or new +- versions of the Lesser General Public License from time to time. +- Such new versions will be similar in spirit to the present version, +- but may differ in detail to address new problems or concerns. +- +- Each version is given a distinguishing version number. If the +- Library specifies a version number of this License which applies +- to it and "any later version", you have the option of following +- the terms and conditions either of that version or of any later +- version published by the Free Software Foundation. If the Library +- does not specify a license version number, you may choose any +- version ever published by the Free Software Foundation. +- +- 14. If you wish to incorporate parts of the Library into other free +- programs whose distribution conditions are incompatible with these, +- write to the author to ask for permission. For software which is +- copyrighted by the Free Software Foundation, write to the Free +- Software Foundation; we sometimes make exceptions for this. Our +- decision will be guided by the two goals of preserving the free +- status of all derivatives of our free software and of promoting +- the sharing and reuse of software generally. +- +- NO WARRANTY +- +- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +- WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE +- LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +- HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT +- WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT +- NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +- FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE +- QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE +- LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY +- SERVICING, REPAIR OR CORRECTION. +- +- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +- WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY +- MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE +- LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, +- INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR +- INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF +- DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU +- OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY +- OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN +- ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +- +- END OF TERMS AND CONDITIONS +- +-How to Apply These Terms to Your New Libraries +----------------------------------------------- +- +- If you develop a new library, and you want it to be of the greatest +-possible use to the public, we recommend making it free software that +-everyone can redistribute and change. You can do so by permitting +-redistribution under these terms (or, alternatively, under the terms of +-the ordinary General Public License). +- +- To apply these terms, attach the following notices to the library. +-It is safest to attach them to the start of each source file to most +-effectively convey the exclusion of warranty; and each file should have +-at least the "copyright" line and a pointer to where the full notice is +-found. +- +- ONE LINE TO GIVE THE LIBRARY'S NAME AND AN IDEA OF WHAT IT DOES. +- Copyright (C) YEAR NAME OF AUTHOR +- +- This 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. +- +- This 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 this library; if not, write to the Free Software +- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, +- USA. +- +- Also add information on how to contact you by electronic and paper +-mail. +- +- You should also get your employer (if you work as a programmer) or +-your school, if any, to sign a "copyright disclaimer" for the library, +-if necessary. Here is a sample; alter the names: +- +- Yoyodyne, Inc., hereby disclaims all copyright interest in the library +- `Frob' (a library for tweaking knobs) written by James Random Hacker. +- +- SIGNATURE OF TY COON, 1 April 1990 +- Ty Coon, President of Vice +- +- That's all there is to it! +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-56 glibc-2.3.2-200304020432/manual/libc.info-56 +--- glibc-2.3.2/manual/libc.info-56 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-56 Thu Jan 1 01:00:00 1970 +@@ -1,419 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Documentation License, Next: Concept Index, Prev: Copying, Up: Top +- +-GNU Free Documentation License +-****************************** +- +- Version 1.1, March 2000 +- Copyright (C) 2000 Free Software Foundation, Inc. +- 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA +- +- Everyone is permitted to copy and distribute verbatim copies +- of this license document, but changing it is not allowed. +- +- 0. PREAMBLE +- +- The purpose of this License is to make a manual, textbook, or other +- written document "free" in the sense of freedom: to assure everyone +- the effective freedom to copy and redistribute it, with or without +- modifying it, either commercially or noncommercially. Secondarily, +- this License preserves for the author and publisher a way to get +- credit for their work, while not being considered responsible for +- modifications made by others. +- +- This License is a kind of "copyleft", which means that derivative +- works of the document must themselves be free in the same sense. +- It complements the GNU General Public License, which is a copyleft +- license designed for free software. +- +- We have designed this License in order to use it for manuals for +- free software, because free software needs free documentation: a +- free program should come with manuals providing the same freedoms +- that the software does. But this License is not limited to +- software manuals; it can be used for any textual work, regardless +- of subject matter or whether it is published as a printed book. +- We recommend this License principally for works whose purpose is +- instruction or reference. +- +- 1. APPLICABILITY AND DEFINITIONS +- +- This License applies to any manual or other work that contains a +- notice placed by the copyright holder saying it can be distributed +- under the terms of this License. The "Document", below, refers to +- any such manual or work. Any member of the public is a licensee, +- and is addressed as "you". +- +- A "Modified Version" of the Document means any work containing the +- Document or a portion of it, either copied verbatim, or with +- modifications and/or translated into another language. +- +- A "Secondary Section" is a named appendix or a front-matter +- section of the Document that deals exclusively with the +- relationship of the publishers or authors of the Document to the +- Document's overall subject (or to related matters) and contains +- nothing that could fall directly within that overall subject. +- (For example, if the Document is in part a textbook of +- mathematics, a Secondary Section may not explain any mathematics.) +- The relationship could be a matter of historical connection with +- the subject or with related matters, or of legal, commercial, +- philosophical, ethical or political position regarding them. +- +- The "Invariant Sections" are certain Secondary Sections whose +- titles are designated, as being those of Invariant Sections, in +- the notice that says that the Document is released under this +- License. +- +- The "Cover Texts" are certain short passages of text that are +- listed, as Front-Cover Texts or Back-Cover Texts, in the notice +- that says that the Document is released under this License. +- +- A "Transparent" copy of the Document means a machine-readable copy, +- represented in a format whose specification is available to the +- general public, whose contents can be viewed and edited directly +- and straightforwardly with generic text editors or (for images +- composed of pixels) generic paint programs or (for drawings) some +- widely available drawing editor, and that is suitable for input to +- text formatters or for automatic translation to a variety of +- formats suitable for input to text formatters. A copy made in an +- otherwise Transparent file format whose markup has been designed +- to thwart or discourage subsequent modification by readers is not +- Transparent. A copy that is not "Transparent" is called "Opaque". +- +- Examples of suitable formats for Transparent copies include plain +- ASCII without markup, Texinfo input format, LaTeX input format, +- SGML or XML using a publicly available DTD, and +- standard-conforming simple HTML designed for human modification. +- Opaque formats include PostScript, PDF, proprietary formats that +- can be read and edited only by proprietary word processors, SGML +- or XML for which the DTD and/or processing tools are not generally +- available, and the machine-generated HTML produced by some word +- processors for output purposes only. +- +- The "Title Page" means, for a printed book, the title page itself, +- plus such following pages as are needed to hold, legibly, the +- material this License requires to appear in the title page. For +- works in formats which do not have any title page as such, "Title +- Page" means the text near the most prominent appearance of the +- work's title, preceding the beginning of the body of the text. +- +- 2. VERBATIM COPYING +- +- You may copy and distribute the Document in any medium, either +- commercially or noncommercially, provided that this License, the +- copyright notices, and the license notice saying this License +- applies to the Document are reproduced in all copies, and that you +- add no other conditions whatsoever to those of this License. You +- may not use technical measures to obstruct or control the reading +- or further copying of the copies you make or distribute. However, +- you may accept compensation in exchange for copies. If you +- distribute a large enough number of copies you must also follow +- the conditions in section 3. +- +- You may also lend copies, under the same conditions stated above, +- and you may publicly display copies. +- +- 3. COPYING IN QUANTITY +- +- If you publish printed copies of the Document numbering more than +- 100, and the Document's license notice requires Cover Texts, you +- must enclose the copies in covers that carry, clearly and legibly, +- all these Cover Texts: Front-Cover Texts on the front cover, and +- Back-Cover Texts on the back cover. Both covers must also clearly +- and legibly identify you as the publisher of these copies. The +- front cover must present the full title with all words of the +- title equally prominent and visible. You may add other material +- on the covers in addition. Copying with changes limited to the +- covers, as long as they preserve the title of the Document and +- satisfy these conditions, can be treated as verbatim copying in +- other respects. +- +- If the required texts for either cover are too voluminous to fit +- legibly, you should put the first ones listed (as many as fit +- reasonably) on the actual cover, and continue the rest onto +- adjacent pages. +- +- If you publish or distribute Opaque copies of the Document +- numbering more than 100, you must either include a +- machine-readable Transparent copy along with each Opaque copy, or +- state in or with each Opaque copy a publicly-accessible +- computer-network location containing a complete Transparent copy +- of the Document, free of added material, which the general +- network-using public has access to download anonymously at no +- charge using public-standard network protocols. If you use the +- latter option, you must take reasonably prudent steps, when you +- begin distribution of Opaque copies in quantity, to ensure that +- this Transparent copy will remain thus accessible at the stated +- location until at least one year after the last time you +- distribute an Opaque copy (directly or through your agents or +- retailers) of that edition to the public. +- +- It is requested, but not required, that you contact the authors of +- the Document well before redistributing any large number of +- copies, to give them a chance to provide you with an updated +- version of the Document. +- +- 4. MODIFICATIONS +- +- You may copy and distribute a Modified Version of the Document +- under the conditions of sections 2 and 3 above, provided that you +- release the Modified Version under precisely this License, with +- the Modified Version filling the role of the Document, thus +- licensing distribution and modification of the Modified Version to +- whoever possesses a copy of it. In addition, you must do these +- things in the Modified Version: +- +- A. Use in the Title Page (and on the covers, if any) a title +- distinct from that of the Document, and from those of +- previous versions (which should, if there were any, be listed +- in the History section of the Document). You may use the +- same title as a previous version if the original publisher of +- that version gives permission. +- +- B. List on the Title Page, as authors, one or more persons or +- entities responsible for authorship of the modifications in +- the Modified Version, together with at least five of the +- principal authors of the Document (all of its principal +- authors, if it has less than five). +- +- C. State on the Title page the name of the publisher of the +- Modified Version, as the publisher. +- +- D. Preserve all the copyright notices of the Document. +- +- E. Add an appropriate copyright notice for your modifications +- adjacent to the other copyright notices. +- +- F. Include, immediately after the copyright notices, a license +- notice giving the public permission to use the Modified +- Version under the terms of this License, in the form shown in +- the Addendum below. +- +- G. Preserve in that license notice the full lists of Invariant +- Sections and required Cover Texts given in the Document's +- license notice. +- +- H. Include an unaltered copy of this License. +- +- I. Preserve the section entitled "History", and its title, and +- add to it an item stating at least the title, year, new +- authors, and publisher of the Modified Version as given on +- the Title Page. If there is no section entitled "History" in +- the Document, create one stating the title, year, authors, +- and publisher of the Document as given on its Title Page, +- then add an item describing the Modified Version as stated in +- the previous sentence. +- +- J. Preserve the network location, if any, given in the Document +- for public access to a Transparent copy of the Document, and +- likewise the network locations given in the Document for +- previous versions it was based on. These may be placed in +- the "History" section. You may omit a network location for a +- work that was published at least four years before the +- Document itself, or if the original publisher of the version +- it refers to gives permission. +- +- K. In any section entitled "Acknowledgments" or "Dedications", +- preserve the section's title, and preserve in the section all +- the substance and tone of each of the contributor +- acknowledgments and/or dedications given therein. +- +- L. Preserve all the Invariant Sections of the Document, +- unaltered in their text and in their titles. Section numbers +- or the equivalent are not considered part of the section +- titles. +- +- M. Delete any section entitled "Endorsements". Such a section +- may not be included in the Modified Version. +- +- N. Do not retitle any existing section as "Endorsements" or to +- conflict in title with any Invariant Section. +- +- If the Modified Version includes new front-matter sections or +- appendices that qualify as Secondary Sections and contain no +- material copied from the Document, you may at your option +- designate some or all of these sections as invariant. To do this, +- add their titles to the list of Invariant Sections in the Modified +- Version's license notice. These titles must be distinct from any +- other section titles. +- +- You may add a section entitled "Endorsements", provided it contains +- nothing but endorsements of your Modified Version by various +- parties--for example, statements of peer review or that the text +- has been approved by an organization as the authoritative +- definition of a standard. +- +- You may add a passage of up to five words as a Front-Cover Text, +- and a passage of up to 25 words as a Back-Cover Text, to the end +- of the list of Cover Texts in the Modified Version. Only one +- passage of Front-Cover Text and one of Back-Cover Text may be +- added by (or through arrangements made by) any one entity. If the +- Document already includes a cover text for the same cover, +- previously added by you or by arrangement made by the same entity +- you are acting on behalf of, you may not add another; but you may +- replace the old one, on explicit permission from the previous +- publisher that added the old one. +- +- The author(s) and publisher(s) of the Document do not by this +- License give permission to use their names for publicity for or to +- assert or imply endorsement of any Modified Version. +- +- 5. COMBINING DOCUMENTS +- +- You may combine the Document with other documents released under +- this License, under the terms defined in section 4 above for +- modified versions, provided that you include in the combination +- all of the Invariant Sections of all of the original documents, +- unmodified, and list them all as Invariant Sections of your +- combined work in its license notice. +- +- The combined work need only contain one copy of this License, and +- multiple identical Invariant Sections may be replaced with a single +- copy. If there are multiple Invariant Sections with the same name +- but different contents, make the title of each such section unique +- by adding at the end of it, in parentheses, the name of the +- original author or publisher of that section if known, or else a +- unique number. Make the same adjustment to the section titles in +- the list of Invariant Sections in the license notice of the +- combined work. +- +- In the combination, you must combine any sections entitled +- "History" in the various original documents, forming one section +- entitled "History"; likewise combine any sections entitled +- "Acknowledgments", and any sections entitled "Dedications". You +- must delete all sections entitled "Endorsements." +- +- 6. COLLECTIONS OF DOCUMENTS +- +- You may make a collection consisting of the Document and other +- documents released under this License, and replace the individual +- copies of this License in the various documents with a single copy +- that is included in the collection, provided that you follow the +- rules of this License for verbatim copying of each of the +- documents in all other respects. +- +- You may extract a single document from such a collection, and +- distribute it individually under this License, provided you insert +- a copy of this License into the extracted document, and follow +- this License in all other respects regarding verbatim copying of +- that document. +- +- 7. AGGREGATION WITH INDEPENDENT WORKS +- +- A compilation of the Document or its derivatives with other +- separate and independent documents or works, in or on a volume of +- a storage or distribution medium, does not as a whole count as a +- Modified Version of the Document, provided no compilation +- copyright is claimed for the compilation. Such a compilation is +- called an "aggregate", and this License does not apply to the +- other self-contained works thus compiled with the Document, on +- account of their being thus compiled, if they are not themselves +- derivative works of the Document. +- +- If the Cover Text requirement of section 3 is applicable to these +- copies of the Document, then if the Document is less than one +- quarter of the entire aggregate, the Document's Cover Texts may be +- placed on covers that surround only the Document within the +- aggregate. Otherwise they must appear on covers around the whole +- aggregate. +- +- 8. TRANSLATION +- +- Translation is considered a kind of modification, so you may +- distribute translations of the Document under the terms of section +- 4. Replacing Invariant Sections with translations requires special +- permission from their copyright holders, but you may include +- translations of some or all Invariant Sections in addition to the +- original versions of these Invariant Sections. You may include a +- translation of this License provided that you also include the +- original English version of this License. In case of a +- disagreement between the translation and the original English +- version of this License, the original English version will prevail. +- +- 9. TERMINATION +- +- You may not copy, modify, sublicense, or distribute the Document +- except as expressly provided for under this License. Any other +- attempt to copy, modify, sublicense or distribute the Document is +- void, and will automatically terminate your rights under this +- License. However, parties who have received copies, or rights, +- from you under this License will not have their licenses +- terminated so long as such parties remain in full compliance. +- +- 10. FUTURE REVISIONS OF THIS LICENSE +- +- The Free Software Foundation may publish new, revised versions of +- the GNU Free Documentation License from time to time. Such new +- versions will be similar in spirit to the present version, but may +- differ in detail to address new problems or concerns. See +- `http://www.gnu.org/copyleft/'. +- +- Each version of the License is given a distinguishing version +- number. If the Document specifies that a particular numbered +- version of this License "or any later version" applies to it, you +- have the option of following the terms and conditions either of +- that specified version or of any later version that has been +- published (not as a draft) by the Free Software Foundation. If +- the Document does not specify a version number of this License, +- you may choose any version ever published (not as a draft) by the +- Free Software Foundation. +- +-ADDENDUM: How to use this License for your documents +----------------------------------------------------- +- +- To use this License in a document you have written, include a copy of +-the License in the document and put the following copyright and license +-notices just after the title page: +- +- Copyright (C) YEAR YOUR NAME. +- Permission is granted to copy, distribute and/or modify this document +- under the terms of the GNU Free Documentation License, Version 1.1 +- or any later version published by the Free Software Foundation; +- with the Invariant Sections being LIST THEIR TITLES, with the +- Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. +- A copy of the license is included in the section entitled ``GNU +- Free Documentation License''. +- +- If you have no Invariant Sections, write "with no Invariant Sections" +-instead of saying which ones are invariant. If you have no Front-Cover +-Texts, write "no Front-Cover Texts" instead of "Front-Cover Texts being +-LIST"; likewise for Back-Cover Texts. +- +- If your document contains nontrivial examples of program code, we +-recommend releasing these examples in parallel under your choice of +-free software license, such as the GNU General Public License, to +-permit their use in free software. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-57 glibc-2.3.2-200304020432/manual/libc.info-57 +--- glibc-2.3.2/manual/libc.info-57 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-57 Thu Jan 1 01:00:00 1970 +@@ -1,1087 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Concept Index, Next: Type Index, Prev: Documentation License, Up: Top +- +-Concept Index +-************* +- +-* Menu: +- +-* /etc/hostname: Host Identification. +-* /etc/nsswitch.conf: NSS Configuration File. +-* 4.N BSD Unix: Berkeley Unix. +-* __va_copy: Copying and Concatenation. +-* _POSIX_OPTION_ORDER environment variable.: Standard Environment. +-* _POSIX_SAVED_IDS: How Change Persona. +-* abort signal: Program Error Signals. +-* aborting a program: Aborting a Program. +-* absolute file name: File Name Resolution. +-* absolute priority: Absolute Priority. +-* absolute value functions: Absolute Value. +-* accepting connections: Accepting Connections. +-* access permission for a file: Access Permission. +-* access, testing for: Testing File Access. +-* accessing directories: Accessing Directories. +-* address of socket: Socket Addresses. +-* address space <1>: Program Basics. +-* address space: Memory Subsystem. +-* alarm signal: Alarm Signals. +-* alarms, setting: Setting an Alarm. +-* alignment (in obstacks): Obstacks Data Alignment. +-* alignment (with malloc): Aligned Memory Blocks. +-* alloca disadvantages: Disadvantages of Alloca. +-* alloca function: Variable Size Automatic. +-* allocating pseudo-terminals: Allocation. +-* allocation (obstacks): Allocation in an Obstack. +-* allocation debugging: Allocation Debugging. +-* allocation hooks, for malloc: Hooks for Malloc. +-* allocation of memory with malloc: Basic Allocation. +-* allocation size of string: Representation of Strings. +-* allocation statistics: Statistics of Malloc. +-* alphabetic character <1>: Classification of Wide Characters. +-* alphabetic character: Classification of Characters. +-* alphanumeric character <1>: Classification of Wide Characters. +-* alphanumeric character: Classification of Characters. +-* append-access files: File Position. +-* argc (program argument count): Program Arguments. +-* argp (program argument parser): Argp. +-* argp parser functions: Argp Parser Functions. +-* ARGP_HELP_FMT environment variable: Argp User Customization. +-* argument parsing with argp: Argp. +-* argument promotion: Calling Variadics. +-* argument vectors, null-character separated: Argz and Envz Vectors. +-* arguments (variadic functions): Receiving Arguments. +-* arguments, how many: How Many Arguments. +-* arguments, to program: Program Arguments. +-* argv (program argument vector): Program Arguments. +-* argz vectors (string vectors): Argz and Envz Vectors. +-* arithmetic expansion: Expansion Stages. +-* array comparison functions: String/Array Comparison. +-* array copy functions: Copying and Concatenation. +-* array search function: Array Search Function. +-* array sort function: Array Sort Function. +-* ASCII character: Classification of Characters. +-* assertions: Consistency Checking. +-* attributes of a file: Attribute Meanings. +-* automatic freeing: Variable Size Automatic. +-* automatic memory allocation: Memory Allocation and C. +-* automatic storage class: Memory Allocation and C. +-* automatic storage with variable size: Variable Size Automatic. +-* background job: Concepts of Job Control. +-* background job, launching: Foreground and Background. +-* backtrace: Backtraces. +-* backtrace_fd: Backtraces. +-* backtrace_symbols: Backtraces. +-* base (of floating point number): Floating Point Concepts. +-* baud rate: Line Speed. +-* Berkeley Unix: Berkeley Unix. +-* Bessel functions: Special Functions. +-* bias (of floating point number exponent): Floating Point Concepts. +-* big-endian: Byte Order. +-* binary I/O to a stream: Block Input/Output. +-* binary search function (for arrays): Array Search Function. +-* binary stream: Binary Streams. +-* binding a socket address: Socket Addresses. +-* blank character <1>: Classification of Wide Characters. +-* blank character: Classification of Characters. +-* block I/O to a stream: Block Input/Output. +-* blocked signals: Delivery of Signal. +-* blocked signals, checking for: Checking for Pending Signals. +-* blocking signals: Blocking Signals. +-* blocking signals, in a handler: Blocking for Handler. +-* bootstrapping, and services: Actions in the NSS configuration. +-* break condition, detecting: Input Modes. +-* break condition, generating: Line Control. +-* breaking a string into tokens: Finding Tokens in a String. +-* broken pipe signal: Operation Error Signals. +-* broken-down time <1>: Broken-down Time. +-* broken-down time: Calendar Time. +-* BSD compatibility library: Process Group Functions. +-* BSD compatibility library.: Feature Test Macros. +-* BSD Unix: Berkeley Unix. +-* buffering of streams: Stream Buffering. +-* buffering, controlling: Controlling Buffering. +-* bugs, reporting: Reporting Bugs. +-* bus error: Program Error Signals. +-* butterfly: Misc FP Arithmetic. +-* byte order conversion, for socket: Byte Order. +-* byte stream: Socket Concepts. +-* C++ streams: Streams and I18N. +-* calendar time: Time Basics. +-* calendar time and broken-down time: Broken-down Time. +-* calendar, Gregorian: Calendar Time. +-* calling variadic functions: Calling Variadics. +-* canonical input processing: Canonical or Not. +-* capacity limits, POSIX: General Limits. +-* carrier detect: Control Modes. +-* case conversion of characters: Case Conversion. +-* catching signals: Delivery of Signal. +-* categories for locales: Locale Categories. +-* change working directory: Working Directory. +-* changing the locale: Setting the Locale. +-* changing the size of a block (malloc): Changing Block Size. +-* changing the size of a block (obstacks): Growing Objects. +-* channels: Stream/Descriptor Precautions. +-* character case conversion: Case Conversion. +-* character predicates: Classification of Characters. +-* character testing: Classification of Characters. +-* checking for pending signals: Checking for Pending Signals. +-* child process <1>: Process Creation Concepts. +-* child process <2>: Processes. +-* child process: Processor Time. +-* child process signal: Job Control Signals. +-* chunks: Obstack Chunks. +-* classes, floating-point: Floating Point Classes. +-* classification of characters: Classification of Characters. +-* cleaning up a stream: Linked Channels. +-* clearing terminal input queue: Line Control. +-* client: Connections. +-* clock ticks: Processor And CPU Time. +-* clock, high accuracy: High Accuracy Clock. +-* close-on-exec (file descriptor flag): Descriptor Flags. +-* closing a file descriptor: Opening and Closing Files. +-* closing a socket: Closing a Socket. +-* closing a stream: Closing Streams. +-* collating strings: Collation Functions. +-* combining locales: Choosing Locale. +-* command argument syntax: Argument Syntax. +-* command arguments, parsing: Parsing Program Arguments. +-* command line arguments: Program Arguments. +-* command substitution: Expansion Stages. +-* communication style (of a socket): Socket Concepts. +-* comparing strings and arrays: String/Array Comparison. +-* Comparison Function: Comparison Functions. +-* compiling: Configuring and compiling. +-* complex exponentiation functions: Exponents and Logarithms. +-* complex logarithm functions: Exponents and Logarithms. +-* complex numbers: Complex Numbers. +-* complex trigonometric functions: Trig Functions. +-* concatenating strings: Copying and Concatenation. +-* configurations, all supported: Supported Configurations. +-* configuring: Configuring and compiling. +-* conjugate complex numbers: Operations on Complex. +-* connecting a socket: Connecting. +-* connection: Connections. +-* consistency checking: Consistency Checking. +-* consistency checking, of heap: Heap Consistency Checking. +-* constants <1>: Mathematical Constants. +-* constants: Memory Concepts. +-* continue signal: Job Control Signals. +-* control character <1>: Classification of Wide Characters. +-* control character: Classification of Characters. +-* control operations on files: Control Operations. +-* controlling process: Controlling Terminal. +-* controlling terminal: Concepts of Job Control. +-* controlling terminal, access to: Access to the Terminal. +-* controlling terminal, determining: Identifying the Terminal. +-* controlling terminal, setting: Open-time Flags. +-* conversion specifications (printf): Formatted Output Basics. +-* conversion specifications (scanf): Formatted Input Basics. +-* converting byte order: Byte Order. +-* converting case of characters: Case Conversion. +-* converting file descriptor to stream: Descriptors and Streams. +-* converting floats to integers: Rounding Functions. +-* converting group ID to group name: Lookup Group. +-* converting group name to group ID: Lookup Group. +-* converting host address to name: Host Names. +-* converting host name to address: Host Names. +-* converting network name to network number: Networks Database. +-* converting network number to network name: Networks Database. +-* converting port number to service name: Services Database. +-* converting service name to port number: Services Database. +-* converting string to collation order: Collation Functions. +-* converting strings to numbers: Parsing of Numbers. +-* converting user ID to user name: Lookup User. +-* converting user name to user ID: Lookup User. +-* cookie, for custom stream: Streams and Cookies. +-* copy-on-write page fault: Locked Memory Details. +-* copying strings and arrays: Copying and Concatenation. +-* cpu priority: Priority. +-* CPU time <1>: Processor Time. +-* CPU time <2>: Processor And CPU Time. +-* CPU time: Time Basics. +-* create on open (file status flag): Open-time Flags. +-* creating a directory: Creating Directories. +-* creating a FIFO special file: FIFO Special Files. +-* creating a pipe: Creating a Pipe. +-* creating a pipe to a subprocess: Pipe to a Subprocess. +-* creating a process: Process Creation Concepts. +-* creating a socket: Creating a Socket. +-* creating a socket pair: Socket Pairs. +-* creating special files: Making Special Files. +-* cube root function: Exponents and Logarithms. +-* currency symbols: Currency Symbol. +-* current limit: Limits on Resources. +-* current working directory: Working Directory. +-* custom streams: Custom Streams. +-* customizing printf: Customizing Printf. +-* data loss on sockets: Socket Concepts. +-* databases: Name Service Switch. +-* datagram socket: Datagrams. +-* datagrams, transmitting: Sending Datagrams. +-* date: Time Basics. +-* Daylight Saving Time: Broken-down Time. +-* decimal digit character: Classification of Characters. +-* decimal-point separator: General Numeric. +-* declaration (compared to definition): Header Files. +-* declaring variadic functions: Calling Variadics. +-* decompose complex numbers: Operations on Complex. +-* default action (for a signal): Delivery of Signal. +-* default action for a signal: Basic Signal Handling. +-* default argument promotions: Calling Variadics. +-* default value, and NSS: Notes on NSS Configuration File. +-* defining new printf conversions: Customizing Printf. +-* definition (compared to declaration): Header Files. +-* delayed suspend character: Signal Characters. +-* deleting a directory: Deleting Files. +-* deleting a file: Deleting Files. +-* delivery of signals: Delivery of Signal. +-* descriptors and streams: Stream/Descriptor Precautions. +-* digit character <1>: Classification of Wide Characters. +-* digit character: Classification of Characters. +-* directories, accessing: Accessing Directories. +-* directories, creating: Creating Directories. +-* directories, deleting: Deleting Files. +-* directory: Directories. +-* directory entry: Directories. +-* directory hierarchy: Working with Directory Trees. +-* directory stream: Accessing Directories. +-* disadvantages of alloca: Disadvantages of Alloca. +-* DISCARD character: Other Special. +-* division by zero: FP Exceptions. +-* DNS: Host Identification. +-* DNS server unavailable: Actions in the NSS configuration. +-* domain (of socket): Socket Concepts. +-* domain error: Math Error Reporting. +-* domain name: Host Identification. +-* Domain Name System: Host Identification. +-* dot notation, for Internet addresses: Abstract Host Addresses. +-* DSUSP character: Signal Characters. +-* duplicating file descriptors: Duplicating Descriptors. +-* dynamic memory allocation: Memory Allocation and C. +-* EBCDIC: Extended Char Intro. +-* echo of terminal input: Local Modes. +-* effective group ID: Process Persona. +-* effective user ID: Process Persona. +-* efficiency and malloc: Efficiency and Malloc. +-* efficiency and obstacks: Extra Fast Growing. +-* efficiency of chunks: Obstack Chunks. +-* EINTR, and restarting interrupted primitives: Interrupted Primitives. +-* elapsed time <1>: Elapsed Time. +-* elapsed time: Time Basics. +-* encryption: Trivial Encryption. +-* end of file, on a stream: EOF and Errors. +-* end-of-file, on a file descriptor: I/O Primitives. +-* environment: Environment Variables. +-* environment access: Environment Access. +-* environment representation: Environment Access. +-* environment variable: Environment Variables. +-* environment vectors, null-character separated: Argz and Envz Vectors. +-* envz vectors (environment vectors): Argz and Envz Vectors. +-* EOF character: Editing Characters. +-* EOL character: Editing Characters. +-* EOL2 character: Editing Characters. +-* epoch: Simple Calendar Time. +-* ERASE character: Editing Characters. +-* errno: System Calls. +-* error codes: Error Reporting. +-* error messages, in argp: Argp Helper Functions. +-* error reporting: Error Reporting. +-* errors, mathematical: Math Error Reporting. +-* establishing a handler: Signal Actions. +-* ethers: NSS Basics. +-* EUC: Extended Char Intro. +-* EUC-JP: glibc iconv Implementation. +-* exception <1>: Program Error Signals. +-* exception: FP Exceptions. +-* exclusive lock: File Locks. +-* exec functions: Executing a File. +-* execing a program: Memory Concepts. +-* executable: Memory Concepts. +-* executing a file: Executing a File. +-* exit status: Exit Status. +-* exit status value: Program Termination. +-* exiting a program: Memory Concepts. +-* expansion of shell words: Word Expansion. +-* exponent (of floating point number): Floating Point Concepts. +-* exponentiation functions: Exponents and Logarithms. +-* extending printf: Customizing Printf. +-* extracting file descriptor from stream: Descriptors and Streams. +-* fcntl function: Control Operations. +-* FDL, GNU Free Documentation License: Documentation License. +-* feature test macros: Feature Test Macros. +-* field splitting: Expansion Stages. +-* FIFO special file: Pipes and FIFOs. +-* file access permission: Access Permission. +-* file access time: File Times. +-* file attribute modification time: File Times. +-* file attributes: Attribute Meanings. +-* file creation mask: Setting Permissions. +-* file descriptor flags: Descriptor Flags. +-* file descriptor sets, for select: Waiting for I/O. +-* file descriptors, standard: Descriptors and Streams. +-* file locks: File Locks. +-* file modification time: File Times. +-* file name: File Names. +-* file name component: Directories. +-* file name errors: File Name Errors. +-* file name resolution: File Name Resolution. +-* file name translation flags: Open-time Flags. +-* file names, multiple: Hard Links. +-* file owner: File Owner. +-* file permission bits: Permission Bits. +-* file pointer: Streams. +-* file position: File Position. +-* file positioning on a file descriptor: File Position Primitive. +-* file positioning on a stream: File Positioning. +-* file status flags: File Status Flags. +-* files, accessing: Memory Concepts. +-* filtering i/o through subprocess: Pipe to a Subprocess. +-* flag character (printf): Output Conversion Syntax. +-* flag character (scanf): Input Conversion Syntax. +-* flags for sigaction: Flags for Sigaction. +-* flags, file name translation: Open-time Flags. +-* flags, open-time action: Open-time Flags. +-* floating point: Floating Point Numbers. +-* floating point, IEEE: IEEE Floating Point. +-* floating type measurements: Floating Type Macros. +-* floating-point classes: Floating Point Classes. +-* floating-point exception: Program Error Signals. +-* flow control, terminal: Line Control. +-* flushing a stream: Flushing Buffers. +-* flushing terminal output queue: Line Control. +-* foreground job: Concepts of Job Control. +-* foreground job, launching: Foreground and Background. +-* forking a process: Process Creation Concepts. +-* format string, for printf: Formatted Output. +-* format string, for scanf: Formatted Input. +-* formatted input from a stream: Formatted Input. +-* formatted messages: Formatted Messages. +-* formatted output to a stream: Formatted Output. +-* FP arithmetic: FP Bit Twiddling. +-* FQDN: Host Identification. +-* frame, real memory: Memory Concepts. +-* free documentation: Free Manuals. +-* freeing (obstacks): Freeing Obstack Objects. +-* freeing memory: Memory Concepts. +-* freeing memory allocated with malloc: Freeing after Malloc. +-* fully buffered stream: Buffering Concepts. +-* function prototypes (variadic): Variadic Prototypes. +-* gamma function: Special Functions. +-* gcvt_r: System V Number Conversion. +-* gencat: The gencat program. +-* generation of signals: Signal Generation. +-* generic i/o control operations: IOCTLs. +-* globbing: Globbing. +-* graphic character <1>: Classification of Wide Characters. +-* graphic character: Classification of Characters. +-* Gregorian calendar: Calendar Time. +-* group: NSS Basics. +-* group database: Group Database. +-* group ID: User and Group IDs. +-* group name: User and Group IDs. +-* group owner of a file: File Owner. +-* grouping of digits: General Numeric. +-* growing objects (in obstacks): Growing Objects. +-* handling multiple signals: Merged Signals. +-* hangup signal: Termination Signals. +-* hard limit: Limits on Resources. +-* hard link: Hard Links. +-* header files: Header Files. +-* heap consistency checking: Heap Consistency Checking. +-* heap, dynamic allocation from: Unconstrained Allocation. +-* heap, freeing memory from: Freeing after Malloc. +-* hexadecimal digit character <1>: Classification of Wide Characters. +-* hexadecimal digit character: Classification of Characters. +-* hidden bit (of floating point number mantissa): Floating Point Concepts. +-* hierarchy, directory: Working with Directory Trees. +-* high-priority data: Out-of-Band Data. +-* high-resolution time: Calendar Time. +-* holes in files: File Position Primitive. +-* home directory: Standard Environment. +-* HOME environment variable: Standard Environment. +-* hook functions (of custom streams): Hook Functions. +-* host address, Internet: Abstract Host Addresses. +-* host name: Host Identification. +-* hostname: Host Identification. +-* hosts: NSS Basics. +-* hosts database: Host Names. +-* how many arguments: How Many Arguments. +-* hyperbolic functions: Hyperbolic Functions. +-* identifying terminals: Is It a Terminal. +-* IEEE 754: Floating Point Numbers. +-* IEEE floating point: Floating Point Numbers. +-* IEEE floating point representation: IEEE Floating Point. +-* IEEE Std 1003.1: POSIX. +-* IEEE Std 1003.2: POSIX. +-* ignore action for a signal: Basic Signal Handling. +-* illegal instruction: Program Error Signals. +-* impossible events: Consistency Checking. +-* independent channels: Independent Channels. +-* inexact exception: FP Exceptions. +-* infinity: Infinity and NaN. +-* initial signal actions: Initial Signal Actions. +-* inode number: Attribute Meanings. +-* input available signal: Asynchronous I/O Signals. +-* input conversions, for scanf: Table of Input Conversions. +-* input from multiple files: Waiting for I/O. +-* installation tools: Tools for Compilation. +-* installing: Running make install. +-* integer: Integers. +-* integer division functions: Integer Division. +-* integer type range: Range of Type. +-* integer type width: Width of Type. +-* interactive signals, from terminal: Local Modes. +-* interactive stop signal: Job Control Signals. +-* internal representation: Extended Char Intro. +-* internationalization: Locales. +-* Internet host address: Abstract Host Addresses. +-* Internet namespace, for sockets: Internet Namespace. +-* interprocess communication, with FIFO: FIFO Special Files. +-* interprocess communication, with pipes: Creating a Pipe. +-* interprocess communication, with signals: Kill Example. +-* interprocess communication, with sockets: Sockets. +-* interrupt character: Signal Characters. +-* interrupt signal: Termination Signals. +-* interrupt-driven input: Interrupt Input. +-* interrupting primitives: Interrupted Primitives. +-* interval: Time Basics. +-* interval timer, setting: Setting an Alarm. +-* INTR character: Signal Characters. +-* invalid exception: FP Exceptions. +-* inverse complex hyperbolic functions: Hyperbolic Functions. +-* inverse complex trigonometric functions: Inverse Trig Functions. +-* inverse hyperbolic functions: Hyperbolic Functions. +-* inverse trigonometric functions: Inverse Trig Functions. +-* invocation of program: Program Arguments. +-* IOCTLs: IOCTLs. +-* ISO 10646: Extended Char Intro. +-* ISO 2022: Extended Char Intro. +-* ISO 6937: Extended Char Intro. +-* ISO C: ISO C. +-* ISO-2022-JP: glibc iconv Implementation. +-* ISO/IEC 9945-1: POSIX. +-* ISO/IEC 9945-2: POSIX. +-* job: Job Control. +-* job control: Job Control. +-* job control functions: Functions for Job Control. +-* job control is optional: Job Control is Optional. +-* job control signals: Job Control Signals. +-* job control, enabling: Initializing the Shell. +-* Kermit the frog: Search/Sort Example. +-* kernel call: System Calls. +-* kernel header files: Linux. +-* KILL character: Editing Characters. +-* kill signal: Termination Signals. +-* killing a process: Signaling Another Process. +-* Korn Shell: Wildcard Matching. +-* LANG environment variable <1>: Standard Environment. +-* LANG environment variable: The catgets Functions. +-* launching jobs: Launching Jobs. +-* LC_ALL environment variable <1>: Standard Environment. +-* LC_ALL environment variable: The catgets Functions. +-* LC_COLLATE environment variable: Standard Environment. +-* LC_CTYPE environment variable: Standard Environment. +-* LC_MESSAGES environment variable <1>: Standard Environment. +-* LC_MESSAGES environment variable: The catgets Functions. +-* LC_MONETARY environment variable: Standard Environment. +-* LC_NUMERIC environment variable: Standard Environment. +-* LC_TIME environment variable: Standard Environment. +-* leap second: Broken-down Time. +-* length of string: Representation of Strings. +-* level, for socket options: Socket Options. +-* LGPL, Lesser General Public License: Copying. +-* library: Introduction. +-* limit: Limits on Resources. +-* limits on resource usage: Limits on Resources. +-* limits, file name length: Limits for Files. +-* limits, floating types: Floating Type Macros. +-* limits, integer types: Range of Type. +-* limits, link count of files: Limits for Files. +-* limits, number of open files: General Limits. +-* limits, number of processes: General Limits. +-* limits, number of supplementary group IDs: General Limits. +-* limits, pipe buffer size: Limits for Files. +-* limits, POSIX: General Limits. +-* limits, program argument size: General Limits. +-* limits, terminal input queue: Limits for Files. +-* limits, time zone name length: General Limits. +-* line buffered stream: Buffering Concepts. +-* line speed: Line Speed. +-* lines (in a text file): Binary Streams. +-* link: Directories. +-* link, hard: Hard Links. +-* link, soft: Symbolic Links. +-* link, symbolic: Symbolic Links. +-* linked channels: Linked Channels. +-* listening (sockets): Listening. +-* literals: Memory Concepts. +-* little-endian: Byte Order. +-* LNEXT character: Other Special. +-* load average: Processor Resources. +-* local namespace, for sockets: Local Namespace. +-* local network address number: Abstract Host Addresses. +-* local time: Calendar Time. +-* locale categories: Locale Categories. +-* locale, changing: Setting the Locale. +-* locales: Locales. +-* locking pages: Locking Pages. +-* logarithm functions: Exponents and Logarithms. +-* login name: User and Group IDs. +-* login name, determining: Who Logged In. +-* LOGNAME environment variable: Standard Environment. +-* long jumps: Non-Local Exits. +-* long-named options: Argument Syntax. +-* longjmp: Advantages of Alloca. +-* loss of data on sockets: Socket Concepts. +-* lost resource signal: Operation Error Signals. +-* lower-case character <1>: Classification of Wide Characters. +-* lower-case character: Classification of Characters. +-* macros: Obstack Functions. +-* main function: Program Arguments. +-* malloc debugger: Allocation Debugging. +-* malloc function: Unconstrained Allocation. +-* mantissa (of floating point number): Floating Point Concepts. +-* matching failure, in scanf: Formatted Input Basics. +-* math errors: Errors in Math Functions. +-* mathematical constants: Mathematical Constants. +-* maximum: Misc FP Arithmetic. +-* maximum field width (scanf): Input Conversion Syntax. +-* maximum limit: Limits on Resources. +-* maximum possible integer: Integers. +-* measurements of floating types: Floating Type Macros. +-* memory allocation: Memory. +-* memory lock: Locking Pages. +-* memory mapped file: Memory Concepts. +-* memory mapped I/O: Memory Concepts. +-* memory page: Memory Subsystem. +-* merging of signals: Merged Signals. +-* MIN termios slot: Noncanonical Input. +-* minimum: Misc FP Arithmetic. +-* minimum field width (printf): Output Conversion Syntax. +-* minimum possible integer: Integers. +-* mixing descriptors and streams: Stream/Descriptor Precautions. +-* modem disconnect: Control Modes. +-* modem status lines: Control Modes. +-* monetary value formatting: The Lame Way to Locale Data. +-* multi-threaded application: Streams and Threads. +-* multibyte character: Extended Char Intro. +-* multibyte character string: Representation of Strings. +-* multibyte string: Representation of Strings. +-* multiple names for one file: Hard Links. +-* multiplexing input: Waiting for I/O. +-* multiply-add: Misc FP Arithmetic. +-* name of running program: Error Messages. +-* name of socket: Socket Addresses. +-* Name Service Switch: Name Service Switch. +-* name space: Reserved Names. +-* names of signals: Standard Signals. +-* namespace (of socket): Socket Concepts. +-* NaN <1>: FP Bit Twiddling. +-* NaN: Infinity and NaN. +-* Netgroup: Netgroup Data. +-* netgroup: NSS Basics. +-* network byte order: Byte Order. +-* network number: Abstract Host Addresses. +-* network protocol: Socket Concepts. +-* networks: NSS Basics. +-* networks database: Networks Database. +-* NIS: Host Identification. +-* NIS domain name: Host Identification. +-* nisplus, and booting: Actions in the NSS configuration. +-* nisplus, and completeness: Actions in the NSS configuration. +-* NLSPATH environment variable <1>: Standard Environment. +-* NLSPATH environment variable: The catgets Functions. +-* non-blocking open: Open-time Flags. +-* non-local exit, from signal handler: Longjmp in Handler. +-* non-local exits: Non-Local Exits. +-* noncanonical input processing: Canonical or Not. +-* normalization functions (floating-point): Normalization Functions. +-* normalized floating point number: Floating Point Concepts. +-* not a number: Infinity and NaN. +-* NSS: Name Service Switch. +-* nsswitch.conf: NSS Configuration File. +-* null character: Representation of Strings. +-* null pointer constant: Null Pointer Constant. +-* null wide character: Representation of Strings. +-* number of arguments passed: How Many Arguments. +-* number syntax, parsing: Parsing of Numbers. +-* numeric value formatting: The Lame Way to Locale Data. +-* obstack status: Status of an Obstack. +-* obstacks: Obstacks. +-* open-time action flags: Open-time Flags. +-* opening a file: I/O Concepts. +-* opening a file descriptor: Opening and Closing Files. +-* opening a pipe: Creating a Pipe. +-* opening a pseudo-terminal pair: Pseudo-Terminal Pairs. +-* opening a socket: Creating a Socket. +-* opening a socket pair: Socket Pairs. +-* opening a stream: Opening Streams. +-* Optimization: FP Function Optimizations. +-* optimizing NSS: Notes on NSS Configuration File. +-* option parsing with argp: Argp. +-* optional arguments: Variadic Functions. +-* optional POSIX features: System Options. +-* orientation, stream <1>: Streams and I18N. +-* orientation, stream: Opening Streams. +-* orphaned process group: Orphaned Process Groups. +-* out-of-band data: Out-of-Band Data. +-* output conversions, for printf: Table of Output Conversions. +-* output possible signal: Asynchronous I/O Signals. +-* overflow exception: FP Exceptions. +-* owner of a file: File Owner. +-* packet: Socket Concepts. +-* page boundary: Aligned Memory Blocks. +-* page fault: Memory Concepts. +-* page fault, copy-on-write: Locked Memory Details. +-* page frame: Memory Concepts. +-* page, memory: Memory Subsystem. +-* page, virtual memory: Memory Concepts. +-* paging <1>: Locking Pages. +-* paging: Memory Concepts. +-* parameter promotion: String/Array Conventions. +-* parent directory: File Name Resolution. +-* parent process <1>: Process Creation Concepts. +-* parent process: Processes. +-* parity checking: Input Modes. +-* parsing a template string: Parsing a Template String. +-* parsing numbers (in formatted input): Parsing of Numbers. +-* parsing program arguments: Parsing Program Arguments. +-* parsing tokens from a string: Finding Tokens in a String. +-* passwd: NSS Basics. +-* password database: User Database. +-* PATH environment variable: Standard Environment. +-* pause function: Waiting for a Signal. +-* peeking at input: Unreading. +-* pending signals: Delivery of Signal. +-* pending signals, checking for: Checking for Pending Signals. +-* period of time: Time Basics. +-* permission to access a file: Access Permission. +-* persona: Process Persona. +-* physical address: Memory Subsystem. +-* physical memory: Memory Subsystem. +-* pi (trigonometric constant): Trig Functions. +-* pipe: Pipes and FIFOs. +-* pipe signal: Operation Error Signals. +-* pipe to a subprocess: Pipe to a Subprocess. +-* port number: Ports. +-* positioning a file descriptor: File Position Primitive. +-* positioning a stream: File Positioning. +-* positive difference: Misc FP Arithmetic. +-* POSIX: POSIX. +-* POSIX capacity limits: General Limits. +-* POSIX optional features: System Options. +-* POSIX.1: POSIX. +-* POSIX.2: POSIX. +-* power functions: Exponents and Logarithms. +-* precision (of floating point number): Floating Point Concepts. +-* precision (printf): Output Conversion Syntax. +-* predicates on arrays: String/Array Comparison. +-* predicates on characters: Classification of Characters. +-* predicates on strings: String/Array Comparison. +-* preemptive scheduling: Absolute Priority. +-* primitives, interrupting: Interrupted Primitives. +-* printing character <1>: Classification of Wide Characters. +-* printing character: Classification of Characters. +-* priority of a process: Priority. +-* priority, absolute: Absolute Priority. +-* process <1>: Processes. +-* process: Program Basics. +-* process completion: Process Completion. +-* process group functions: Functions for Job Control. +-* process group ID: Launching Jobs. +-* process group leader: Launching Jobs. +-* process groups: Job Control. +-* process ID: Process Creation Concepts. +-* process image: Process Creation Concepts. +-* process lifetime: Process Creation Concepts. +-* process priority: Priority. +-* process signal mask: Process Signal Mask. +-* process termination: Program Termination. +-* processor time <1>: Processor Time. +-* processor time: Time Basics. +-* profiling alarm signal: Alarm Signals. +-* profiling timer: Setting an Alarm. +-* program: Program Basics. +-* program argument syntax: Argument Syntax. +-* program arguments: Program Arguments. +-* program arguments, parsing: Parsing Program Arguments. +-* program error signals: Program Error Signals. +-* program name: Error Messages. +-* program startup: Program Arguments. +-* program termination: Program Termination. +-* program termination signals: Termination Signals. +-* programming your own streams: Custom Streams. +-* project complex numbers: Operations on Complex. +-* protocol (of socket): Socket Concepts. +-* protocol family: Socket Concepts. +-* protocols: NSS Basics. +-* protocols database: Protocols Database. +-* prototypes for variadic functions: Variadic Prototypes. +-* pseudo-random numbers: Pseudo-Random Numbers. +-* pseudo-terminals: Pseudo-Terminals. +-* punctuation character <1>: Classification of Wide Characters. +-* punctuation character: Classification of Characters. +-* pushing input back: Unreading. +-* quick sort function (for arrays): Array Sort Function. +-* QUIT character: Signal Characters. +-* quit signal: Termination Signals. +-* quote removal: Expansion Stages. +-* race conditions, relating to job control: Launching Jobs. +-* race conditions, relating to signals: Signals in Handler. +-* radix (of floating point number): Floating Point Concepts. +-* raising signals: Generating Signals. +-* random numbers: Pseudo-Random Numbers. +-* random-access files: File Position. +-* range error: Math Error Reporting. +-* range of integer type: Range of Type. +-* read lock: File Locks. +-* reading from a directory: Accessing Directories. +-* reading from a file descriptor: I/O Primitives. +-* reading from a socket: Transferring Data. +-* reading from a stream, by blocks: Block Input/Output. +-* reading from a stream, by characters: Character Input. +-* reading from a stream, formatted: Formatted Input. +-* ready to run: Absolute Priority. +-* real group ID: Process Persona. +-* real user ID: Process Persona. +-* real-time timer: Setting an Alarm. +-* realtime CPU scheduling: Absolute Priority. +-* realtime processing: Why Lock Pages. +-* realtime scheduling: Realtime Scheduling. +-* receiving datagrams: Receiving Datagrams. +-* record locking: File Locks. +-* redirecting input and output: Duplicating Descriptors. +-* reentrant functions: Nonreentrancy. +-* reentrant NSS functions: NSS Module Names. +-* relative file name: File Name Resolution. +-* removal of quotes: Expansion Stages. +-* removing a file: Deleting Files. +-* removing macros that shadow functions: Macro Definitions. +-* renaming a file: Renaming Files. +-* reporting bugs: Reporting Bugs. +-* reporting errors: Error Reporting. +-* REPRINT character: Editing Characters. +-* reserved names: Reserved Names. +-* resource limits: Limits on Resources. +-* restarting interrupted primitives: Interrupted Primitives. +-* restrictions on signal handler functions: Nonreentrancy. +-* root directory: File Name Resolution. +-* Rot13: Trivial Encryption. +-* rpc: NSS Basics. +-* runnable process: Absolute Priority. +-* running a command: Running a Command. +-* saved set-group-ID: How Change Persona. +-* saved set-user-ID: How Change Persona. +-* scanning the group list: Scanning All Groups. +-* scanning the user list: Scanning All Users. +-* scatter-gather: Scatter-Gather. +-* scheduling, traditional: Traditional Scheduling. +-* search function (for arrays): Array Search Function. +-* search functions (for strings): Search Functions. +-* seed (for random numbers): Pseudo-Random Numbers. +-* seeking on a file descriptor: File Position Primitive. +-* seeking on a stream: File Positioning. +-* segmentation violation: Program Error Signals. +-* sending a datagram: Sending Datagrams. +-* sending signals: Generating Signals. +-* sequential-access files: File Position. +-* server: Connections. +-* services: NSS Basics. +-* services database: Services Database. +-* session <1>: Concepts of Job Control. +-* session: Job Control. +-* session leader: Concepts of Job Control. +-* setting an alarm: Setting an Alarm. +-* setuid programs: How Change Persona. +-* setuid programs and file access: Testing File Access. +-* severity class <1>: Adding Severity Classes. +-* severity class: Printing Formatted Messages. +-* sgettext: GUI program problems. +-* shadow: NSS Basics. +-* shadowing functions with macros: Macro Definitions. +-* shared lock: File Locks. +-* shared memory: Memory Subsystem. +-* shell: Concepts of Job Control. +-* shift state: Keeping the state. +-* Shift_JIS: Extended Char Intro. +-* shrinking objects: Growing Objects. +-* shutting down a socket: Closing a Socket. +-* sigaction flags: Flags for Sigaction. +-* sigaction function: Advanced Signal Handling. +-* SIGCHLD, handling of: Stopped and Terminated Jobs. +-* sign (of floating point number): Floating Point Concepts. +-* signal <1>: Signal Handling. +-* signal: FP Exceptions. +-* signal action: Delivery of Signal. +-* signal actions: Signal Actions. +-* signal flags: Flags for Sigaction. +-* signal function: Basic Signal Handling. +-* signal handler function: Defining Handlers. +-* signal mask: Process Signal Mask. +-* signal messages: Signal Messages. +-* signal names: Standard Signals. +-* signal number: Standard Signals. +-* signal set: Signal Sets. +-* signals, generating: Generating Signals. +-* signedness: Integers. +-* significand (of floating point number): Floating Point Concepts. +-* SIGTTIN, from background job: Access to the Terminal. +-* SIGTTOU, from background job: Access to the Terminal. +-* simple time: Calendar Time. +-* single-byte string: Representation of Strings. +-* size of string: Representation of Strings. +-* SJIS: Extended Char Intro. +-* socket: Sockets. +-* socket address (name) binding: Socket Addresses. +-* socket domain: Socket Concepts. +-* socket namespace: Socket Concepts. +-* socket option level: Socket Options. +-* socket options: Socket Options. +-* socket pair: Socket Pairs. +-* socket protocol: Socket Concepts. +-* socket shutdown: Closing a Socket. +-* socket, client actions: Connecting. +-* socket, closing: Closing a Socket. +-* socket, connecting: Connecting. +-* socket, creating: Creating a Socket. +-* socket, initiating a connection: Connecting. +-* sockets, accepting connections: Accepting Connections. +-* sockets, listening: Listening. +-* sockets, server actions: Listening. +-* soft limit: Limits on Resources. +-* soft link: Symbolic Links. +-* sort function (for arrays): Array Sort Function. +-* sparse files: File Position Primitive. +-* special files: Making Special Files. +-* special functions: Special Functions. +-* specified action (for a signal): Delivery of Signal. +-* speed of execution: Why Lock Pages. +-* square root function: Exponents and Logarithms. +-* stable sorting: Array Sort Function. +-* standard dot notation, for Internet addresses: Abstract Host Addresses. +-* standard environment variables: Standard Environment. +-* standard error file descriptor: Descriptors and Streams. +-* standard error stream: Standard Streams. +-* standard file descriptors: Descriptors and Streams. +-* standard input file descriptor: Descriptors and Streams. +-* standard input stream: Standard Streams. +-* standard output file descriptor: Descriptors and Streams. +-* standard output stream: Standard Streams. +-* standard streams: Standard Streams. +-* standards: Standards and Portability. +-* START character: Start/Stop Characters. +-* startup of program: Program Arguments. +-* stateful <1>: glibc iconv Implementation. +-* stateful <2>: iconv Examples. +-* stateful <3>: Generic Conversion Interface. +-* stateful <4>: Converting Strings. +-* stateful <5>: Converting a Character. +-* stateful: Keeping the state. +-* static memory allocation: Memory Allocation and C. +-* static storage class: Memory Allocation and C. +-* STATUS character: Other Special. +-* status codes: Error Reporting. +-* status of a file: Attribute Meanings. +-* status of obstack: Status of an Obstack. +-* sticky bit: Permission Bits. +-* STOP character: Start/Stop Characters. +-* stop signal: Job Control Signals. +-* stopped job: Concepts of Job Control. +-* stopped jobs, continuing: Continuing Stopped Jobs. +-* stopped jobs, detecting: Stopped and Terminated Jobs. +-* storage allocation: Memory. +-* stream (sockets): Socket Concepts. +-* stream orientation <1>: Streams and I18N. +-* stream orientation: Opening Streams. +-* stream, for I/O to a string: String Streams. +-* streams and descriptors: Stream/Descriptor Precautions. +-* streams, and file descriptors: Descriptors and Streams. +-* streams, C++: Streams and I18N. +-* streams, standard: Standard Streams. +-* string: Representation of Strings. +-* string allocation: Representation of Strings. +-* string collation functions: Collation Functions. +-* string comparison functions: String/Array Comparison. +-* string concatenation functions: Copying and Concatenation. +-* string copy functions: Copying and Concatenation. +-* string length: Representation of Strings. +-* string literal: Representation of Strings. +-* string search functions: Search Functions. +-* string stream: String Streams. +-* string vectors, null-character separated: Argz and Envz Vectors. +-* string, representation of: Representation of Strings. +-* style of communication (of a socket): Socket Concepts. +-* subshell: Initializing the Shell. +-* substitution of variables and commands: Expansion Stages. +-* successive signals: Merged Signals. +-* summer time: Broken-down Time. +-* SunOS: Berkeley Unix. +-* supplementary group IDs: Process Persona. +-* SUSP character: Signal Characters. +-* suspend character: Signal Characters. +-* SVID: SVID. +-* swap space: Memory Concepts. +-* symbolic link: Symbolic Links. +-* symbolic link, opening: Open-time Flags. +-* synchronizing <1>: Synchronizing AIO Operations. +-* synchronizing: Synchronizing I/O. +-* syntax error messages, in argp: Argp Helper Functions. +-* syntax, for program arguments: Argument Syntax. +-* syntax, for reading numbers: Parsing of Numbers. +-* sysconf <1>: Processor Resources. +-* sysconf: Query Memory Parameters. +-* system call: System Calls. +-* system call number: System Calls. +-* System V Unix: SVID. +-* TCP (Internet protocol): Protocols Database. +-* template, for printf: Formatted Output. +-* template, for scanf: Formatted Input. +-* TERM environment variable: Standard Environment. +-* terminal flow control: Line Control. +-* terminal identification: Is It a Terminal. +-* terminal input queue: I/O Queues. +-* terminal input queue, clearing: Line Control. +-* terminal input signal: Job Control Signals. +-* terminal line control functions: Line Control. +-* terminal line speed: Line Speed. +-* terminal mode data types: Mode Data Types. +-* terminal mode functions: Mode Functions. +-* terminal modes, BSD: BSD Terminal Modes. +-* terminal output queue: I/O Queues. +-* terminal output queue, flushing: Line Control. +-* terminal output signal: Job Control Signals. +-* terminated jobs, detecting: Stopped and Terminated Jobs. +-* termination signal: Termination Signals. +-* testing access permission: Testing File Access. +-* testing exit status of child process: Process Completion. +-* text stream: Binary Streams. +-* thrashing: Memory Subsystem. +-* thread of control: Program Basics. +-* threads: Streams and Threads. +-* ticks, clock: Processor And CPU Time. +-* tilde expansion: Expansion Stages. +-* time: Time Basics. +-* TIME termios slot: Noncanonical Input. +-* time zone: TZ Variable. +-* time zone database: TZ Variable. +-* time, elapsed: Time Basics. +-* time, high precision: High Accuracy Clock. +-* timer, profiling: Setting an Alarm. +-* timer, real-time: Setting an Alarm. +-* timer, virtual: Setting an Alarm. +-* timers, setting: Setting an Alarm. +-* timespec: Elapsed Time. +-* timeval: Elapsed Time. +-* timing error in signal handling: Remembering a Signal. +-* TMPDIR environment variable: Temporary Files. +-* tokenizing strings: Finding Tokens in a String. +-* tools, for installing library: Tools for Compilation. +-* transmitting datagrams: Sending Datagrams. +-* tree, directory: Working with Directory Trees. +-* triangulation: glibc iconv Implementation. +-* trigonometric functions: Trig Functions. +-* type measurements, floating: Floating Type Macros. +-* type measurements, integer: Width of Type. +-* type modifier character (printf): Output Conversion Syntax. +-* type modifier character (scanf): Input Conversion Syntax. +-* typeahead buffer: I/O Queues. +-* TZ environment variable: Standard Environment. +-* UCS-2: Extended Char Intro. +-* UCS-4: Extended Char Intro. +-* ulps: Errors in Math Functions. +-* umask: Setting Permissions. +-* unbuffered stream: Buffering Concepts. +-* unconstrained memory allocation: Unconstrained Allocation. +-* undefining macros that shadow functions: Macro Definitions. +-* underflow exception: FP Exceptions. +-* Unicode: Extended Char Intro. +-* Unix, Berkeley: Berkeley Unix. +-* Unix, System V: SVID. +-* unlinking a file: Deleting Files. +-* unordered comparison: FP Comparison Functions. +-* unreading characters: Unreading. +-* upgrading from libc5: Linux. +-* upper-case character <1>: Classification of Wide Characters. +-* upper-case character: Classification of Characters. +-* urgent data signal: Asynchronous I/O Signals. +-* urgent socket condition: Out-of-Band Data. +-* usage limits: Limits on Resources. +-* usage messages, in argp: Argp Helper Functions. +-* user accounting database: User Accounting Database. +-* user database: User Database. +-* user ID: User and Group IDs. +-* user ID, determining: Who Logged In. +-* user name: User and Group IDs. +-* user signals: Miscellaneous Signals. +-* usual file name errors: File Name Errors. +-* UTF-16: Extended Char Intro. +-* UTF-7: Extended Char Intro. +-* UTF-8: Extended Char Intro. +-* va_copy: Copying and Concatenation. +-* variable number of arguments: Variadic Functions. +-* variable substitution: Expansion Stages. +-* variable-sized arrays: GNU C Variable-Size Arrays. +-* variadic function argument access: Receiving Arguments. +-* variadic function prototypes: Variadic Prototypes. +-* variadic functions: Variadic Functions. +-* variadic functions, calling: Calling Variadics. +-* virtual time alarm signal: Alarm Signals. +-* virtual timer: Setting an Alarm. +-* volatile declarations: Nonreentrancy. +-* waiting for a signal: Waiting for a Signal. +-* waiting for completion of child process: Process Completion. +-* waiting for input or output: Waiting for I/O. +-* WERASE character: Editing Characters. +-* whitespace character <1>: Classification of Wide Characters. +-* whitespace character: Classification of Characters. +-* wide character: Extended Char Intro. +-* wide character string: Representation of Strings. +-* width of integer type: Width of Type. +-* wildcard expansion: Expansion Stages. +-* wint_t: String/Array Conventions. +-* word expansion: Word Expansion. +-* working directory: Working Directory. +-* write lock: File Locks. +-* writing to a file descriptor: I/O Primitives. +-* writing to a socket: Transferring Data. +-* writing to a stream, by blocks: Block Input/Output. +-* writing to a stream, by characters: Simple Output. +-* writing to a stream, formatted: Formatted Output. +-* YP: Host Identification. +-* YP domain name: Host Identification. +-* zero divide: FP Exceptions. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-58 glibc-2.3.2-200304020432/manual/libc.info-58 +--- glibc-2.3.2/manual/libc.info-58 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-58 Thu Jan 1 01:00:00 1970 +@@ -1,168 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Type Index, Next: Function Index, Prev: Concept Index, Up: Top +- +-Type Index +-********** +- +-* Menu: +- +-* __ftw64_func_t: Working with Directory Trees. +-* __ftw_func_t: Working with Directory Trees. +-* __nftw64_func_t: Working with Directory Trees. +-* __nftw_func_t: Working with Directory Trees. +-* blkcnt64_t: Attribute Meanings. +-* blkcnt_t: Attribute Meanings. +-* cc_t: Mode Data Types. +-* clock_t: CPU Time. +-* comparison_fn_t: Comparison Functions. +-* cookie_close_function: Hook Functions. +-* cookie_io_functions_t: Streams and Cookies. +-* cookie_read_function: Hook Functions. +-* cookie_seek_function: Hook Functions. +-* cookie_write_function: Hook Functions. +-* dev_t: Attribute Meanings. +-* DIR: Opening a Directory. +-* div_t: Integer Division. +-* enum mcheck_status: Heap Consistency Checking. +-* fd_set: Waiting for I/O. +-* FILE: Streams. +-* fpos64_t: Portable Positioning. +-* fpos_t: Portable Positioning. +-* gid_t: Reading Persona. +-* glob64_t: Calling Glob. +-* glob_t: Calling Glob. +-* iconv_t: Generic Conversion Interface. +-* imaxdiv_t: Integer Division. +-* ino64_t: Attribute Meanings. +-* ino_t: Attribute Meanings. +-* jmp_buf: Non-Local Details. +-* ldiv_t: Integer Division. +-* lldiv_t: Integer Division. +-* mbstate_t: Keeping the state. +-* mode_t: Attribute Meanings. +-* nlink_t: Attribute Meanings. +-* off64_t: File Position Primitive. +-* off_t: File Position Primitive. +-* pid_t: Process Identification. +-* printf_arginfo_function: Defining the Output Handler. +-* printf_function: Defining the Output Handler. +-* ptrdiff_t: Important Data Types. +-* regex_t: POSIX Regexp Compilation. +-* regmatch_t: Regexp Subexpressions. +-* regoff_t: Regexp Subexpressions. +-* sig_atomic_t: Atomic Types. +-* sighandler_t: Basic Signal Handling. +-* sigjmp_buf: Non-Local Exits and Signals. +-* sigset_t: Signal Sets. +-* size_t: Important Data Types. +-* speed_t: Line Speed. +-* ssize_t: I/O Primitives. +-* stack_t: Signal Stack. +-* struct __gconv_step: glibc iconv Implementation. +-* struct __gconv_step_data: glibc iconv Implementation. +-* struct aiocb: Asynchronous I/O. +-* struct aiocb64: Asynchronous I/O. +-* struct aioinit: Configuration of AIO. +-* struct argp: Argp Parsers. +-* struct argp_child: Argp Children. +-* struct argp_option: Argp Option Vectors. +-* struct argp_state: Argp Parsing State. +-* struct dirent: Directory Entries. +-* struct ENTRY: Hash Search Function. +-* struct exit_status: Manipulating the Database. +-* struct flock: File Locks. +-* struct fstab: fstab. +-* struct FTW: Working with Directory Trees. +-* struct group: Group Data Structure. +-* struct hostent: Host Names. +-* struct if_nameindex: Interface Naming. +-* struct in6_addr: Host Address Data Type. +-* struct in_addr: Host Address Data Type. +-* struct iovec: Scatter-Gather. +-* struct itimerval: Setting an Alarm. +-* struct lconv: The Lame Way to Locale Data. +-* struct linger: Socket-Level Options. +-* struct mallinfo: Statistics of Malloc. +-* struct mntent: mtab. +-* struct netent: Networks Database. +-* struct ntptimeval: High Accuracy Clock. +-* struct obstack: Creating Obstacks. +-* struct option: Getopt Long Options. +-* struct passwd: User Data Structure. +-* struct printf_info: Conversion Specifier Options. +-* struct protoent: Protocols Database. +-* struct random_data: BSD Random. +-* struct rlimit: Limits on Resources. +-* struct rlimit64: Limits on Resources. +-* struct rusage: Resource Usage. +-* struct sched_param: Basic Scheduling Functions. +-* struct servent: Services Database. +-* struct sgttyb: BSD Terminal Modes. +-* struct sigaction: Advanced Signal Handling. +-* struct sigstack: Signal Stack. +-* struct sigvec: BSD Handler. +-* struct sockaddr: Address Formats. +-* struct sockaddr_in: Internet Address Formats. +-* struct sockaddr_in6: Internet Address Formats. +-* struct sockaddr_un: Local Namespace Details. +-* struct stat: Attribute Meanings. +-* struct stat64: Attribute Meanings. +-* struct termios: Mode Data Types. +-* struct timespec: Elapsed Time. +-* struct timeval: Elapsed Time. +-* struct timex: High Accuracy Clock. +-* struct timezone: High-Resolution Calendar. +-* struct tm: Broken-down Time. +-* struct tms: Processor Time. +-* struct utimbuf: File Times. +-* struct utmp: Manipulating the Database. +-* struct utmpx: XPG Functions. +-* struct utsname: Platform Type. +-* struct vtimes: Resource Usage. +-* tcflag_t: Mode Data Types. +-* time_t: Simple Calendar Time. +-* ucontext_t: System V contexts. +-* uid_t: Reading Persona. +-* union wait: BSD Wait Functions. +-* va_list: Argument Macros. +-* VISIT: Tree Search Function. +-* wchar_t: Extended Char Intro. +-* wctrans_t: Wide Character Case Conversion. +-* wctype_t: Classification of Wide Characters. +-* wint_t: Extended Char Intro. +-* wordexp_t: Calling Wordexp. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-59 glibc-2.3.2-200304020432/manual/libc.info-59 +--- glibc-2.3.2/manual/libc.info-59 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-59 Thu Jan 1 01:00:00 1970 +@@ -1,1374 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Function Index, Next: Variable Index, Prev: Type Index, Up: Top +- +-Function and Macro Index +-************************ +- +-* Menu: +- +-* __fbufsize: Controlling Buffering. +-* __flbf: Controlling Buffering. +-* __fpending: Controlling Buffering. +-* __fpurge: Flushing Buffers. +-* __freadable: Opening Streams. +-* __freading: Opening Streams. +-* __fsetlocking: Streams and Threads. +-* __fwritable: Opening Streams. +-* __fwriting: Opening Streams. +-* __va_copy: Argument Macros. +-* _Exit: Termination Internals. +-* _exit: Termination Internals. +-* _flushlbf: Flushing Buffers. +-* _tolower: Case Conversion. +-* _toupper: Case Conversion. +-* a64l: Encode Binary Data. +-* abort: Aborting a Program. +-* abs: Absolute Value. +-* accept: Accepting Connections. +-* access: Testing File Access. +-* acos: Inverse Trig Functions. +-* acosf: Inverse Trig Functions. +-* acosh: Hyperbolic Functions. +-* acoshf: Hyperbolic Functions. +-* acoshl: Hyperbolic Functions. +-* acosl: Inverse Trig Functions. +-* addmntent: mtab. +-* addseverity: Adding Severity Classes. +-* adjtime: High-Resolution Calendar. +-* adjtimex: High-Resolution Calendar. +-* aio_cancel: Cancel AIO Operations. +-* aio_cancel64: Cancel AIO Operations. +-* aio_error: Status of AIO Operations. +-* aio_error64: Status of AIO Operations. +-* aio_fsync: Synchronizing AIO Operations. +-* aio_fsync64: Synchronizing AIO Operations. +-* aio_init: Configuration of AIO. +-* aio_read: Asynchronous Reads/Writes. +-* aio_read64: Asynchronous Reads/Writes. +-* aio_return: Status of AIO Operations. +-* aio_return64: Status of AIO Operations. +-* aio_suspend: Synchronizing AIO Operations. +-* aio_suspend64: Synchronizing AIO Operations. +-* aio_write: Asynchronous Reads/Writes. +-* aio_write64: Asynchronous Reads/Writes. +-* alarm: Setting an Alarm. +-* alloca: Variable Size Automatic. +-* alphasort: Scanning Directory Content. +-* alphasort64: Scanning Directory Content. +-* argp_error: Argp Helper Functions. +-* argp_failure: Argp Helper Functions. +-* argp_help: Argp Help. +-* argp_parse: Argp. +-* argp_state_help: Argp Helper Functions. +-* argp_usage: Argp Helper Functions. +-* argz_add: Argz Functions. +-* argz_add_sep: Argz Functions. +-* argz_append: Argz Functions. +-* argz_count: Argz Functions. +-* argz_create: Argz Functions. +-* argz_create_sep: Argz Functions. +-* argz_delete: Argz Functions. +-* argz_extract: Argz Functions. +-* argz_insert: Argz Functions. +-* argz_next: Argz Functions. +-* argz_replace: Argz Functions. +-* argz_stringify: Argz Functions. +-* asctime: Formatting Calendar Time. +-* asctime_r: Formatting Calendar Time. +-* asin: Inverse Trig Functions. +-* asinf: Inverse Trig Functions. +-* asinh: Hyperbolic Functions. +-* asinhf: Hyperbolic Functions. +-* asinhl: Hyperbolic Functions. +-* asinl: Inverse Trig Functions. +-* asprintf: Dynamic Output. +-* assert: Consistency Checking. +-* assert_perror: Consistency Checking. +-* atan: Inverse Trig Functions. +-* atan2: Inverse Trig Functions. +-* atan2f: Inverse Trig Functions. +-* atan2l: Inverse Trig Functions. +-* atanf: Inverse Trig Functions. +-* atanh: Hyperbolic Functions. +-* atanhf: Hyperbolic Functions. +-* atanhl: Hyperbolic Functions. +-* atanl: Inverse Trig Functions. +-* atexit: Cleanups on Exit. +-* atof: Parsing of Floats. +-* atoi: Parsing of Integers. +-* atol: Parsing of Integers. +-* atoll: Parsing of Integers. +-* backtrace: Backtraces. +-* backtrace_symbols: Backtraces. +-* backtrace_symbols_fd: Backtraces. +-* basename: Finding Tokens in a String. +-* bcmp: String/Array Comparison. +-* bcopy: Copying and Concatenation. +-* bind: Setting Address. +-* bind_textdomain_codeset: Charset conversion in gettext. +-* bindtextdomain: Locating gettext catalog. +-* brk: Resizing the Data Segment. +-* bsearch: Array Search Function. +-* btowc: Converting a Character. +-* bzero: Copying and Concatenation. +-* cabs: Absolute Value. +-* cabsf: Absolute Value. +-* cabsl: Absolute Value. +-* cacos: Inverse Trig Functions. +-* cacosf: Inverse Trig Functions. +-* cacosh: Hyperbolic Functions. +-* cacoshf: Hyperbolic Functions. +-* cacoshl: Hyperbolic Functions. +-* cacosl: Inverse Trig Functions. +-* calloc: Allocating Cleared Space. +-* canonicalize_file_name: Symbolic Links. +-* carg: Operations on Complex. +-* cargf: Operations on Complex. +-* cargl: Operations on Complex. +-* casin: Inverse Trig Functions. +-* casinf: Inverse Trig Functions. +-* casinh: Hyperbolic Functions. +-* casinhf: Hyperbolic Functions. +-* casinhl: Hyperbolic Functions. +-* casinl: Inverse Trig Functions. +-* catan: Inverse Trig Functions. +-* catanf: Inverse Trig Functions. +-* catanh: Hyperbolic Functions. +-* catanhf: Hyperbolic Functions. +-* catanhl: Hyperbolic Functions. +-* catanl: Inverse Trig Functions. +-* catclose: The catgets Functions. +-* catgets: The catgets Functions. +-* catopen: The catgets Functions. +-* cbc_crypt: DES Encryption. +-* cbrt: Exponents and Logarithms. +-* cbrtf: Exponents and Logarithms. +-* cbrtl: Exponents and Logarithms. +-* ccos: Trig Functions. +-* ccosf: Trig Functions. +-* ccosh: Hyperbolic Functions. +-* ccoshf: Hyperbolic Functions. +-* ccoshl: Hyperbolic Functions. +-* ccosl: Trig Functions. +-* ceil: Rounding Functions. +-* ceilf: Rounding Functions. +-* ceill: Rounding Functions. +-* cexp: Exponents and Logarithms. +-* cexpf: Exponents and Logarithms. +-* cexpl: Exponents and Logarithms. +-* cfgetispeed: Line Speed. +-* cfgetospeed: Line Speed. +-* cfmakeraw: Noncanonical Input. +-* cfree: Freeing after Malloc. +-* cfsetispeed: Line Speed. +-* cfsetospeed: Line Speed. +-* cfsetspeed: Line Speed. +-* chdir: Working Directory. +-* chmod: Setting Permissions. +-* chown: File Owner. +-* cimag: Operations on Complex. +-* cimagf: Operations on Complex. +-* cimagl: Operations on Complex. +-* clearenv: Environment Access. +-* clearerr: Error Recovery. +-* clearerr_unlocked: Error Recovery. +-* clock: CPU Time. +-* clog: Exponents and Logarithms. +-* clog10: Exponents and Logarithms. +-* clog10f: Exponents and Logarithms. +-* clog10l: Exponents and Logarithms. +-* clogf: Exponents and Logarithms. +-* clogl: Exponents and Logarithms. +-* close: Opening and Closing Files. +-* closedir: Reading/Closing Directory. +-* closelog: closelog. +-* confstr: String Parameters. +-* conj: Operations on Complex. +-* conjf: Operations on Complex. +-* conjl: Operations on Complex. +-* connect: Connecting. +-* copysign: FP Bit Twiddling. +-* copysignf: FP Bit Twiddling. +-* copysignl: FP Bit Twiddling. +-* cos: Trig Functions. +-* cosf: Trig Functions. +-* cosh: Hyperbolic Functions. +-* coshf: Hyperbolic Functions. +-* coshl: Hyperbolic Functions. +-* cosl: Trig Functions. +-* cpow: Exponents and Logarithms. +-* cpowf: Exponents and Logarithms. +-* cpowl: Exponents and Logarithms. +-* cproj: Operations on Complex. +-* cprojf: Operations on Complex. +-* cprojl: Operations on Complex. +-* creal: Operations on Complex. +-* crealf: Operations on Complex. +-* creall: Operations on Complex. +-* creat: Opening and Closing Files. +-* creat64: Opening and Closing Files. +-* crypt: crypt. +-* crypt_r: crypt. +-* csin: Trig Functions. +-* csinf: Trig Functions. +-* csinh: Hyperbolic Functions. +-* csinhf: Hyperbolic Functions. +-* csinhl: Hyperbolic Functions. +-* csinl: Trig Functions. +-* csqrt: Exponents and Logarithms. +-* csqrtf: Exponents and Logarithms. +-* csqrtl: Exponents and Logarithms. +-* ctan: Trig Functions. +-* ctanf: Trig Functions. +-* ctanh: Hyperbolic Functions. +-* ctanhf: Hyperbolic Functions. +-* ctanhl: Hyperbolic Functions. +-* ctanl: Trig Functions. +-* ctermid: Identifying the Terminal. +-* ctime: Formatting Calendar Time. +-* ctime_r: Formatting Calendar Time. +-* cuserid: Who Logged In. +-* dcgettext: Translation with gettext. +-* dcngettext: Advanced gettext functions. +-* DES_FAILED: DES Encryption. +-* des_setparity: DES Encryption. +-* dgettext: Translation with gettext. +-* difftime: Elapsed Time. +-* dirfd: Opening a Directory. +-* dirname: Finding Tokens in a String. +-* div: Integer Division. +-* dngettext: Advanced gettext functions. +-* drand48: SVID Random. +-* drand48_r: SVID Random. +-* drem: Remainder Functions. +-* dremf: Remainder Functions. +-* dreml: Remainder Functions. +-* DTTOIF: Directory Entries. +-* dup: Duplicating Descriptors. +-* dup2: Duplicating Descriptors. +-* ecb_crypt: DES Encryption. +-* ecvt: System V Number Conversion. +-* ecvt_r: System V Number Conversion. +-* encrypt: DES Encryption. +-* encrypt_r: DES Encryption. +-* endfsent: fstab. +-* endgrent: Scanning All Groups. +-* endhostent: Host Names. +-* endmntent: mtab. +-* endnetent: Networks Database. +-* endnetgrent: Lookup Netgroup. +-* endprotoent: Protocols Database. +-* endpwent: Scanning All Users. +-* endservent: Services Database. +-* endutent: Manipulating the Database. +-* endutxent: XPG Functions. +-* envz_add: Envz Functions. +-* envz_entry: Envz Functions. +-* envz_get: Envz Functions. +-* envz_merge: Envz Functions. +-* envz_strip: Envz Functions. +-* erand48: SVID Random. +-* erand48_r: SVID Random. +-* erf: Special Functions. +-* erfc: Special Functions. +-* erfcf: Special Functions. +-* erfcl: Special Functions. +-* erff: Special Functions. +-* erfl: Special Functions. +-* err: Error Messages. +-* error: Error Messages. +-* error_at_line: Error Messages. +-* errx: Error Messages. +-* execl: Executing a File. +-* execle: Executing a File. +-* execlp: Executing a File. +-* execv: Executing a File. +-* execve: Executing a File. +-* execvp: Executing a File. +-* exit: Normal Termination. +-* exp: Exponents and Logarithms. +-* exp10: Exponents and Logarithms. +-* exp10f: Exponents and Logarithms. +-* exp10l: Exponents and Logarithms. +-* exp2: Exponents and Logarithms. +-* exp2f: Exponents and Logarithms. +-* exp2l: Exponents and Logarithms. +-* expf: Exponents and Logarithms. +-* expl: Exponents and Logarithms. +-* expm1: Exponents and Logarithms. +-* expm1f: Exponents and Logarithms. +-* expm1l: Exponents and Logarithms. +-* fabs: Absolute Value. +-* fabsf: Absolute Value. +-* fabsl: Absolute Value. +-* fchdir: Working Directory. +-* fchmod: Setting Permissions. +-* fchown: File Owner. +-* fclean: Cleaning Streams. +-* fclose: Closing Streams. +-* fcloseall: Closing Streams. +-* fcntl: Control Operations. +-* fcvt: System V Number Conversion. +-* fcvt_r: System V Number Conversion. +-* FD_CLR: Waiting for I/O. +-* FD_ISSET: Waiting for I/O. +-* FD_SET: Waiting for I/O. +-* FD_ZERO: Waiting for I/O. +-* fdatasync: Synchronizing I/O. +-* fdim: Misc FP Arithmetic. +-* fdimf: Misc FP Arithmetic. +-* fdiml: Misc FP Arithmetic. +-* fdopen: Descriptors and Streams. +-* feclearexcept: Status bit operations. +-* fedisableexcept: Control Functions. +-* feenableexcept: Control Functions. +-* fegetenv: Control Functions. +-* fegetexcept: Control Functions. +-* fegetexceptflag: Status bit operations. +-* fegetround: Rounding. +-* feholdexcept: Control Functions. +-* feof: EOF and Errors. +-* feof_unlocked: EOF and Errors. +-* feraiseexcept: Status bit operations. +-* ferror: EOF and Errors. +-* ferror_unlocked: EOF and Errors. +-* fesetenv: Control Functions. +-* fesetexceptflag: Status bit operations. +-* fesetround: Rounding. +-* fetestexcept: Status bit operations. +-* feupdateenv: Control Functions. +-* fflush: Flushing Buffers. +-* fflush_unlocked: Flushing Buffers. +-* fgetc: Character Input. +-* fgetc_unlocked: Character Input. +-* fgetgrent: Scanning All Groups. +-* fgetgrent_r: Scanning All Groups. +-* fgetpos: Portable Positioning. +-* fgetpos64: Portable Positioning. +-* fgetpwent: Scanning All Users. +-* fgetpwent_r: Scanning All Users. +-* fgets: Line Input. +-* fgets_unlocked: Line Input. +-* fgetwc: Character Input. +-* fgetwc_unlocked: Character Input. +-* fgetws: Line Input. +-* fgetws_unlocked: Line Input. +-* fileno: Descriptors and Streams. +-* fileno_unlocked: Descriptors and Streams. +-* finite: Floating Point Classes. +-* finitef: Floating Point Classes. +-* finitel: Floating Point Classes. +-* flockfile: Streams and Threads. +-* floor: Rounding Functions. +-* floorf: Rounding Functions. +-* floorl: Rounding Functions. +-* fma: Misc FP Arithmetic. +-* fmaf: Misc FP Arithmetic. +-* fmal: Misc FP Arithmetic. +-* fmax: Misc FP Arithmetic. +-* fmaxf: Misc FP Arithmetic. +-* fmaxl: Misc FP Arithmetic. +-* fmemopen: String Streams. +-* fmin: Misc FP Arithmetic. +-* fminf: Misc FP Arithmetic. +-* fminl: Misc FP Arithmetic. +-* fmod: Remainder Functions. +-* fmodf: Remainder Functions. +-* fmodl: Remainder Functions. +-* fmtmsg: Printing Formatted Messages. +-* fnmatch: Wildcard Matching. +-* fopen: Opening Streams. +-* fopen64: Opening Streams. +-* fopencookie: Streams and Cookies. +-* fork: Creating a Process. +-* forkpty: Pseudo-Terminal Pairs. +-* fpathconf: Pathconf. +-* fpclassify: Floating Point Classes. +-* fprintf: Formatted Output Functions. +-* fputc: Simple Output. +-* fputc_unlocked: Simple Output. +-* fputs: Simple Output. +-* fputs_unlocked: Simple Output. +-* fputwc: Simple Output. +-* fputwc_unlocked: Simple Output. +-* fputws: Simple Output. +-* fputws_unlocked: Simple Output. +-* fread: Block Input/Output. +-* fread_unlocked: Block Input/Output. +-* free: Freeing after Malloc. +-* freopen: Opening Streams. +-* freopen64: Opening Streams. +-* frexp: Normalization Functions. +-* frexpf: Normalization Functions. +-* frexpl: Normalization Functions. +-* fscanf: Formatted Input Functions. +-* fseek: File Positioning. +-* fseeko: File Positioning. +-* fseeko64: File Positioning. +-* fsetpos: Portable Positioning. +-* fsetpos64: Portable Positioning. +-* fstat: Reading Attributes. +-* fstat64: Reading Attributes. +-* fsync: Synchronizing I/O. +-* ftell: File Positioning. +-* ftello: File Positioning. +-* ftello64: File Positioning. +-* ftruncate: File Size. +-* ftruncate64: File Size. +-* ftrylockfile: Streams and Threads. +-* ftw: Working with Directory Trees. +-* ftw64: Working with Directory Trees. +-* funlockfile: Streams and Threads. +-* futimes: File Times. +-* fwide: Streams and I18N. +-* fwprintf: Formatted Output Functions. +-* fwrite: Block Input/Output. +-* fwrite_unlocked: Block Input/Output. +-* fwscanf: Formatted Input Functions. +-* gamma: Special Functions. +-* gammaf: Special Functions. +-* gammal: Special Functions. +-* gcvt: System V Number Conversion. +-* get_avphys_pages: Query Memory Parameters. +-* get_current_dir_name: Working Directory. +-* get_nprocs: Processor Resources. +-* get_nprocs_conf: Processor Resources. +-* get_phys_pages: Query Memory Parameters. +-* getc: Character Input. +-* getc_unlocked: Character Input. +-* getchar: Character Input. +-* getchar_unlocked: Character Input. +-* getcontext: System V contexts. +-* getcwd: Working Directory. +-* getdate: General Time String Parsing. +-* getdate_r: General Time String Parsing. +-* getdelim: Line Input. +-* getdomainnname: Host Identification. +-* getegid: Reading Persona. +-* getenv: Environment Access. +-* geteuid: Reading Persona. +-* getfsent: fstab. +-* getfsfile: fstab. +-* getfsspec: fstab. +-* getgid: Reading Persona. +-* getgrent: Scanning All Groups. +-* getgrent_r: Scanning All Groups. +-* getgrgid: Lookup Group. +-* getgrgid_r: Lookup Group. +-* getgrnam: Lookup Group. +-* getgrnam_r: Lookup Group. +-* getgrouplist: Setting Groups. +-* getgroups: Reading Persona. +-* gethostbyaddr: Host Names. +-* gethostbyaddr_r: Host Names. +-* gethostbyname: Host Names. +-* gethostbyname2: Host Names. +-* gethostbyname2_r: Host Names. +-* gethostbyname_r: Host Names. +-* gethostent: Host Names. +-* gethostid: Host Identification. +-* gethostname: Host Identification. +-* getitimer: Setting an Alarm. +-* getline: Line Input. +-* getloadavg: Processor Resources. +-* getlogin: Who Logged In. +-* getmntent: mtab. +-* getmntent_r: mtab. +-* getnetbyaddr: Networks Database. +-* getnetbyname: Networks Database. +-* getnetent: Networks Database. +-* getnetgrent: Lookup Netgroup. +-* getnetgrent_r: Lookup Netgroup. +-* getopt: Using Getopt. +-* getopt_long: Getopt Long Options. +-* getopt_long_only: Getopt Long Options. +-* getpagesize: Query Memory Parameters. +-* getpass: getpass. +-* getpeername: Who is Connected. +-* getpgid: Process Group Functions. +-* getpgrp: Process Group Functions. +-* getpid: Process Identification. +-* getppid: Process Identification. +-* getpriority: Traditional Scheduling Functions. +-* getprotobyname: Protocols Database. +-* getprotobynumber: Protocols Database. +-* getprotoent: Protocols Database. +-* getpt: Allocation. +-* getpwent: Scanning All Users. +-* getpwent_r: Scanning All Users. +-* getpwnam: Lookup User. +-* getpwnam_r: Lookup User. +-* getpwuid: Lookup User. +-* getpwuid_r: Lookup User. +-* getrlimit: Limits on Resources. +-* getrlimit64: Limits on Resources. +-* getrusage: Resource Usage. +-* gets: Line Input. +-* getservbyname: Services Database. +-* getservbyport: Services Database. +-* getservent: Services Database. +-* getsid: Process Group Functions. +-* getsockname: Reading Address. +-* getsockopt: Socket Option Functions. +-* getsubopt: Suboptions. +-* gettext: Translation with gettext. +-* gettimeofday: High-Resolution Calendar. +-* getuid: Reading Persona. +-* getumask: Setting Permissions. +-* getutent: Manipulating the Database. +-* getutent_r: Manipulating the Database. +-* getutid: Manipulating the Database. +-* getutid_r: Manipulating the Database. +-* getutline: Manipulating the Database. +-* getutline_r: Manipulating the Database. +-* getutmp: XPG Functions. +-* getutmpx: XPG Functions. +-* getutxent: XPG Functions. +-* getutxid: XPG Functions. +-* getutxline: XPG Functions. +-* getw: Character Input. +-* getwc: Character Input. +-* getwc_unlocked: Character Input. +-* getwchar: Character Input. +-* getwchar_unlocked: Character Input. +-* getwd: Working Directory. +-* glob: Calling Glob. +-* glob64: Calling Glob. +-* globfree: More Flags for Globbing. +-* globfree64: More Flags for Globbing. +-* gmtime: Broken-down Time. +-* gmtime_r: Broken-down Time. +-* grantpt: Allocation. +-* gsignal: Signaling Yourself. +-* gtty: BSD Terminal Modes. +-* hasmntopt: mtab. +-* hcreate: Hash Search Function. +-* hcreate_r: Hash Search Function. +-* hdestroy: Hash Search Function. +-* hdestroy_r: Hash Search Function. +-* hsearch: Hash Search Function. +-* hsearch_r: Hash Search Function. +-* htonl: Byte Order. +-* htons: Byte Order. +-* hypot: Exponents and Logarithms. +-* hypotf: Exponents and Logarithms. +-* hypotl: Exponents and Logarithms. +-* iconv: Generic Conversion Interface. +-* iconv_close: Generic Conversion Interface. +-* iconv_open: Generic Conversion Interface. +-* if_freenameindex: Interface Naming. +-* if_indextoname: Interface Naming. +-* if_nameindex: Interface Naming. +-* if_nametoindex: Interface Naming. +-* IFTODT: Directory Entries. +-* ilogb: Exponents and Logarithms. +-* ilogbf: Exponents and Logarithms. +-* ilogbl: Exponents and Logarithms. +-* imaxabs: Absolute Value. +-* imaxdiv: Integer Division. +-* index: Search Functions. +-* inet_addr: Host Address Functions. +-* inet_aton: Host Address Functions. +-* inet_lnaof: Host Address Functions. +-* inet_makeaddr: Host Address Functions. +-* inet_netof: Host Address Functions. +-* inet_network: Host Address Functions. +-* inet_ntoa: Host Address Functions. +-* inet_ntop: Host Address Functions. +-* inet_pton: Host Address Functions. +-* initgroups: Setting Groups. +-* initstate: BSD Random. +-* initstate_r: BSD Random. +-* innetgr: Netgroup Membership. +-* ioctl: IOCTLs. +-* isalnum: Classification of Characters. +-* isalpha: Classification of Characters. +-* isascii: Classification of Characters. +-* isatty: Is It a Terminal. +-* isblank: Classification of Characters. +-* iscntrl: Classification of Characters. +-* isdigit: Classification of Characters. +-* isfinite: Floating Point Classes. +-* isgraph: Classification of Characters. +-* isgreater: FP Comparison Functions. +-* isgreaterequal: FP Comparison Functions. +-* isinf: Floating Point Classes. +-* isinff: Floating Point Classes. +-* isinfl: Floating Point Classes. +-* isless: FP Comparison Functions. +-* islessequal: FP Comparison Functions. +-* islessgreater: FP Comparison Functions. +-* islower: Classification of Characters. +-* isnan: Floating Point Classes. +-* isnanf: Floating Point Classes. +-* isnanl: Floating Point Classes. +-* isnormal: Floating Point Classes. +-* isprint: Classification of Characters. +-* ispunct: Classification of Characters. +-* isspace: Classification of Characters. +-* isunordered: FP Comparison Functions. +-* isupper: Classification of Characters. +-* iswalnum: Classification of Wide Characters. +-* iswalpha: Classification of Wide Characters. +-* iswblank: Classification of Wide Characters. +-* iswcntrl: Classification of Wide Characters. +-* iswctype: Classification of Wide Characters. +-* iswdigit: Classification of Wide Characters. +-* iswgraph: Classification of Wide Characters. +-* iswlower: Classification of Wide Characters. +-* iswprint: Classification of Wide Characters. +-* iswpunct: Classification of Wide Characters. +-* iswspace: Classification of Wide Characters. +-* iswupper: Classification of Wide Characters. +-* iswxdigit: Classification of Wide Characters. +-* isxdigit: Classification of Characters. +-* j0: Special Functions. +-* j0f: Special Functions. +-* j0l: Special Functions. +-* j1: Special Functions. +-* j1f: Special Functions. +-* j1l: Special Functions. +-* jn: Special Functions. +-* jnf: Special Functions. +-* jnl: Special Functions. +-* jrand48: SVID Random. +-* jrand48_r: SVID Random. +-* kill: Signaling Another Process. +-* killpg: Signaling Another Process. +-* l64a: Encode Binary Data. +-* labs: Absolute Value. +-* lcong48: SVID Random. +-* lcong48_r: SVID Random. +-* ldexp: Normalization Functions. +-* ldexpf: Normalization Functions. +-* ldexpl: Normalization Functions. +-* ldiv: Integer Division. +-* lfind: Array Search Function. +-* lgamma: Special Functions. +-* lgamma_r: Special Functions. +-* lgammaf: Special Functions. +-* lgammaf_r: Special Functions. +-* lgammal: Special Functions. +-* lgammal_r: Special Functions. +-* link: Hard Links. +-* lio_listio: Asynchronous Reads/Writes. +-* lio_listio64: Asynchronous Reads/Writes. +-* listen: Listening. +-* llabs: Absolute Value. +-* lldiv: Integer Division. +-* llrint: Rounding Functions. +-* llrintf: Rounding Functions. +-* llrintl: Rounding Functions. +-* llround: Rounding Functions. +-* llroundf: Rounding Functions. +-* llroundl: Rounding Functions. +-* localeconv: The Lame Way to Locale Data. +-* localtime: Broken-down Time. +-* localtime_r: Broken-down Time. +-* log: Exponents and Logarithms. +-* log10: Exponents and Logarithms. +-* log10f: Exponents and Logarithms. +-* log10l: Exponents and Logarithms. +-* log1p: Exponents and Logarithms. +-* log1pf: Exponents and Logarithms. +-* log1pl: Exponents and Logarithms. +-* log2: Exponents and Logarithms. +-* log2f: Exponents and Logarithms. +-* log2l: Exponents and Logarithms. +-* logb: Exponents and Logarithms. +-* logbf: Exponents and Logarithms. +-* logbl: Exponents and Logarithms. +-* logf: Exponents and Logarithms. +-* login: Logging In and Out. +-* login_tty: Logging In and Out. +-* logl: Exponents and Logarithms. +-* logout: Logging In and Out. +-* logwtmp: Logging In and Out. +-* longjmp: Non-Local Details. +-* lrand48: SVID Random. +-* lrand48_r: SVID Random. +-* lrint: Rounding Functions. +-* lrintf: Rounding Functions. +-* lrintl: Rounding Functions. +-* lround: Rounding Functions. +-* lroundf: Rounding Functions. +-* lroundl: Rounding Functions. +-* lsearch: Array Search Function. +-* lseek: File Position Primitive. +-* lseek64: File Position Primitive. +-* lstat: Reading Attributes. +-* lstat64: Reading Attributes. +-* lutimes: File Times. +-* madvise: Memory-mapped I/O. +-* main: Program Arguments. +-* makecontext: System V contexts. +-* mallinfo: Statistics of Malloc. +-* malloc: Basic Allocation. +-* mallopt: Malloc Tunable Parameters. +-* matherr: FP Exceptions. +-* mblen: Non-reentrant Character Conversion. +-* mbrlen: Converting a Character. +-* mbrtowc: Converting a Character. +-* mbsinit: Keeping the state. +-* mbsnrtowcs: Converting Strings. +-* mbsrtowcs: Converting Strings. +-* mbstowcs: Non-reentrant String Conversion. +-* mbtowc: Non-reentrant Character Conversion. +-* mcheck: Heap Consistency Checking. +-* memalign: Aligned Memory Blocks. +-* memccpy: Copying and Concatenation. +-* memchr: Search Functions. +-* memcmp: String/Array Comparison. +-* memcpy: Copying and Concatenation. +-* memfrob: Trivial Encryption. +-* memmem: Search Functions. +-* memmove: Copying and Concatenation. +-* mempcpy: Copying and Concatenation. +-* memrchr: Search Functions. +-* memset: Copying and Concatenation. +-* mkdir: Creating Directories. +-* mkdtemp: Temporary Files. +-* mkfifo: FIFO Special Files. +-* mknod: Making Special Files. +-* mkstemp: Temporary Files. +-* mktemp: Temporary Files. +-* mktime: Broken-down Time. +-* mlock: Page Lock Functions. +-* mlockall: Page Lock Functions. +-* mmap: Memory-mapped I/O. +-* mmap64: Memory-mapped I/O. +-* modf: Rounding Functions. +-* modff: Rounding Functions. +-* modfl: Rounding Functions. +-* mount: Mount-Unmount-Remount. +-* mprobe: Heap Consistency Checking. +-* mrand48: SVID Random. +-* mrand48_r: SVID Random. +-* mremap: Memory-mapped I/O. +-* msync: Memory-mapped I/O. +-* mtrace: Tracing malloc. +-* munlock: Page Lock Functions. +-* munlockall: Page Lock Functions. +-* munmap: Memory-mapped I/O. +-* muntrace: Tracing malloc. +-* nan: FP Bit Twiddling. +-* nanf: FP Bit Twiddling. +-* nanl: FP Bit Twiddling. +-* nanosleep: Sleeping. +-* nearbyint: Rounding Functions. +-* nearbyintf: Rounding Functions. +-* nearbyintl: Rounding Functions. +-* nextafter: FP Bit Twiddling. +-* nextafterf: FP Bit Twiddling. +-* nextafterl: FP Bit Twiddling. +-* nexttoward: FP Bit Twiddling. +-* nexttowardf: FP Bit Twiddling. +-* nexttowardl: FP Bit Twiddling. +-* nftw: Working with Directory Trees. +-* nftw64: Working with Directory Trees. +-* ngettext: Advanced gettext functions. +-* nice: Traditional Scheduling Functions. +-* nl_langinfo: The Elegant and Fast Way. +-* notfound: Actions in the NSS configuration. +-* nrand48: SVID Random. +-* nrand48_r: SVID Random. +-* ntohl: Byte Order. +-* ntohs: Byte Order. +-* ntp_adjtime: High Accuracy Clock. +-* ntp_gettime: High Accuracy Clock. +-* obstack_1grow: Growing Objects. +-* obstack_1grow_fast: Extra Fast Growing. +-* obstack_alignment_mask: Obstacks Data Alignment. +-* obstack_alloc: Allocation in an Obstack. +-* obstack_base: Status of an Obstack. +-* obstack_blank: Growing Objects. +-* obstack_blank_fast: Extra Fast Growing. +-* obstack_chunk_alloc: Preparing for Obstacks. +-* obstack_chunk_free: Preparing for Obstacks. +-* obstack_chunk_size: Obstack Chunks. +-* obstack_copy: Allocation in an Obstack. +-* obstack_copy0: Allocation in an Obstack. +-* obstack_finish: Growing Objects. +-* obstack_free: Freeing Obstack Objects. +-* obstack_grow: Growing Objects. +-* obstack_grow0: Growing Objects. +-* obstack_init: Preparing for Obstacks. +-* obstack_int_grow: Growing Objects. +-* obstack_int_grow_fast: Extra Fast Growing. +-* obstack_next_free: Status of an Obstack. +-* obstack_object_size <1>: Status of an Obstack. +-* obstack_object_size: Growing Objects. +-* obstack_printf: Dynamic Output. +-* obstack_ptr_grow: Growing Objects. +-* obstack_ptr_grow_fast: Extra Fast Growing. +-* obstack_room: Extra Fast Growing. +-* obstack_vprintf: Variable Arguments Output. +-* offsetof: Structure Measurement. +-* on_exit: Cleanups on Exit. +-* open: Opening and Closing Files. +-* open64: Opening and Closing Files. +-* open_memstream: String Streams. +-* open_obstack_stream: Obstack Streams. +-* opendir: Opening a Directory. +-* openlog: openlog. +-* openpty: Pseudo-Terminal Pairs. +-* parse_printf_format: Parsing a Template String. +-* pathconf: Pathconf. +-* pause: Using Pause. +-* pclose: Pipe to a Subprocess. +-* perror: Error Messages. +-* pipe: Creating a Pipe. +-* popen: Pipe to a Subprocess. +-* posix_memalign: Aligned Memory Blocks. +-* pow: Exponents and Logarithms. +-* pow10: Exponents and Logarithms. +-* pow10f: Exponents and Logarithms. +-* pow10l: Exponents and Logarithms. +-* powf: Exponents and Logarithms. +-* powl: Exponents and Logarithms. +-* pread: I/O Primitives. +-* pread64: I/O Primitives. +-* printf: Formatted Output Functions. +-* printf_size: Predefined Printf Handlers. +-* printf_size_info: Predefined Printf Handlers. +-* psignal: Signal Messages. +-* pthread_atfork: Threads and Fork. +-* pthread_attr_destroy: Thread Attributes. +-* pthread_attr_getattr: Thread Attributes. +-* pthread_attr_getdetachstate: Thread Attributes. +-* pthread_attr_getguardsize: Thread Attributes. +-* pthread_attr_getinheritsched: Thread Attributes. +-* pthread_attr_getschedparam: Thread Attributes. +-* pthread_attr_getschedpolicy: Thread Attributes. +-* pthread_attr_getscope: Thread Attributes. +-* pthread_attr_getstack: Thread Attributes. +-* pthread_attr_getstackaddr: Thread Attributes. +-* pthread_attr_getstacksize: Thread Attributes. +-* pthread_attr_init: Thread Attributes. +-* pthread_attr_setattr: Thread Attributes. +-* pthread_attr_setdetachstate: Thread Attributes. +-* pthread_attr_setguardsize: Thread Attributes. +-* pthread_attr_setinheritsched: Thread Attributes. +-* pthread_attr_setschedparam: Thread Attributes. +-* pthread_attr_setschedpolicy: Thread Attributes. +-* pthread_attr_setscope: Thread Attributes. +-* pthread_attr_setstack: Thread Attributes. +-* pthread_attr_setstackaddr: Thread Attributes. +-* pthread_attr_setstacksize: Thread Attributes. +-* pthread_cancel: Basic Thread Operations. +-* pthread_cleanup_pop: Cleanup Handlers. +-* pthread_cleanup_pop_restore_np: Cleanup Handlers. +-* pthread_cleanup_push: Cleanup Handlers. +-* pthread_cleanup_push_defer_np: Cleanup Handlers. +-* pthread_cond_broadcast: Condition Variables. +-* pthread_cond_destroy: Condition Variables. +-* pthread_cond_init: Condition Variables. +-* pthread_cond_signal: Condition Variables. +-* pthread_cond_timedwait: Condition Variables. +-* pthread_cond_wait: Condition Variables. +-* pthread_condattr_destroy: Condition Variables. +-* pthread_condattr_init: Condition Variables. +-* pthread_create: Basic Thread Operations. +-* pthread_detach: Miscellaneous Thread Functions. +-* pthread_equal: Miscellaneous Thread Functions. +-* pthread_exit: Basic Thread Operations. +-* pthread_getconcurrency: Miscellaneous Thread Functions. +-* pthread_getschedparam: Miscellaneous Thread Functions. +-* pthread_getspecific: Thread-Specific Data. +-* pthread_join: Basic Thread Operations. +-* pthread_key_create: Thread-Specific Data. +-* pthread_key_delete: Thread-Specific Data. +-* pthread_kill: Threads and Signal Handling. +-* pthread_kill_other_threads_np: Miscellaneous Thread Functions. +-* pthread_mutex_destroy: Mutexes. +-* pthread_mutex_init: Mutexes. +-* pthread_mutex_lock: Mutexes. +-* pthread_mutex_timedlock: Mutexes. +-* pthread_mutex_trylock: Mutexes. +-* pthread_mutex_unlock: Mutexes. +-* pthread_mutexattr_destroy: Mutexes. +-* pthread_mutexattr_gettype: Mutexes. +-* pthread_mutexattr_init: Mutexes. +-* pthread_mutexattr_settype: Mutexes. +-* pthread_once: Miscellaneous Thread Functions. +-* pthread_self: Miscellaneous Thread Functions. +-* pthread_setcancelstate: Cancellation. +-* pthread_setcanceltype: Cancellation. +-* pthread_setconcurrency: Miscellaneous Thread Functions. +-* pthread_setschedparam: Miscellaneous Thread Functions. +-* pthread_setspecific: Thread-Specific Data. +-* pthread_sigmask: Threads and Signal Handling. +-* pthread_testcancel: Cancellation. +-* ptsname: Allocation. +-* ptsname_r: Allocation. +-* putc: Simple Output. +-* putc_unlocked: Simple Output. +-* putchar: Simple Output. +-* putchar_unlocked: Simple Output. +-* putenv: Environment Access. +-* putpwent: Writing a User Entry. +-* puts: Simple Output. +-* pututline: Manipulating the Database. +-* pututxline: XPG Functions. +-* putw: Simple Output. +-* putwc: Simple Output. +-* putwc_unlocked: Simple Output. +-* putwchar: Simple Output. +-* putwchar_unlocked: Simple Output. +-* pwrite: I/O Primitives. +-* pwrite64: I/O Primitives. +-* qecvt: System V Number Conversion. +-* qecvt_r: System V Number Conversion. +-* qfcvt: System V Number Conversion. +-* qfcvt_r: System V Number Conversion. +-* qgcvt: System V Number Conversion. +-* qsort: Array Sort Function. +-* raise: Signaling Yourself. +-* rand: ISO Random. +-* rand_r: ISO Random. +-* random: BSD Random. +-* random_r: BSD Random. +-* rawmemchr: Search Functions. +-* read: I/O Primitives. +-* readdir: Reading/Closing Directory. +-* readdir64: Reading/Closing Directory. +-* readdir64_r: Reading/Closing Directory. +-* readdir_r: Reading/Closing Directory. +-* readlink: Symbolic Links. +-* readv: Scatter-Gather. +-* realloc: Changing Block Size. +-* realpath: Symbolic Links. +-* recv: Receiving Data. +-* recvfrom: Receiving Datagrams. +-* regcomp: POSIX Regexp Compilation. +-* regerror: Regexp Cleanup. +-* regexec: Matching POSIX Regexps. +-* regfree: Regexp Cleanup. +-* register_printf_function: Registering New Conversions. +-* remainder: Remainder Functions. +-* remainderf: Remainder Functions. +-* remainderl: Remainder Functions. +-* remove: Deleting Files. +-* rename: Renaming Files. +-* rewind: File Positioning. +-* rewinddir: Random Access Directory. +-* rindex: Search Functions. +-* rint: Rounding Functions. +-* rintf: Rounding Functions. +-* rintl: Rounding Functions. +-* rmdir: Deleting Files. +-* round: Rounding Functions. +-* roundf: Rounding Functions. +-* roundl: Rounding Functions. +-* rpmatch: Yes-or-No Questions. +-* S_ISBLK: Testing File Type. +-* S_ISCHR: Testing File Type. +-* S_ISDIR: Testing File Type. +-* S_ISFIFO: Testing File Type. +-* S_ISLNK: Testing File Type. +-* S_ISREG: Testing File Type. +-* S_ISSOCK: Testing File Type. +-* S_TYPEISMQ: Testing File Type. +-* S_TYPEISSEM: Testing File Type. +-* S_TYPEISSHM: Testing File Type. +-* sbrk: Resizing the Data Segment. +-* scalb: Normalization Functions. +-* scalbf: Normalization Functions. +-* scalbl: Normalization Functions. +-* scalbln: Normalization Functions. +-* scalblnf: Normalization Functions. +-* scalblnl: Normalization Functions. +-* scalbn: Normalization Functions. +-* scalbnf: Normalization Functions. +-* scalbnl: Normalization Functions. +-* scandir: Scanning Directory Content. +-* scandir64: Scanning Directory Content. +-* scanf: Formatted Input Functions. +-* sched_get_priority_max: Basic Scheduling Functions. +-* sched_get_priority_min: Basic Scheduling Functions. +-* sched_getparam: Basic Scheduling Functions. +-* sched_getscheduler: Basic Scheduling Functions. +-* sched_rr_get_interval: Basic Scheduling Functions. +-* sched_setparam: Basic Scheduling Functions. +-* sched_setscheduler: Basic Scheduling Functions. +-* sched_yield: Basic Scheduling Functions. +-* seed48: SVID Random. +-* seed48_r: SVID Random. +-* seekdir: Random Access Directory. +-* select: Waiting for I/O. +-* sem_destroy: POSIX Semaphores. +-* sem_getvalue: POSIX Semaphores. +-* sem_init: POSIX Semaphores. +-* sem_post: POSIX Semaphores. +-* sem_trywait: POSIX Semaphores. +-* sem_wait: POSIX Semaphores. +-* send: Sending Data. +-* sendto: Sending Datagrams. +-* setbuf: Controlling Buffering. +-* setbuffer: Controlling Buffering. +-* setcontext: System V contexts. +-* setdomainname: Host Identification. +-* setegid: Setting Groups. +-* setenv: Environment Access. +-* seteuid: Setting User ID. +-* setfsent: fstab. +-* setgid: Setting Groups. +-* setgrent: Scanning All Groups. +-* setgroups: Setting Groups. +-* sethostent: Host Names. +-* sethostid: Host Identification. +-* sethostname: Host Identification. +-* setitimer: Setting an Alarm. +-* setjmp: Non-Local Details. +-* setkey: DES Encryption. +-* setkey_r: DES Encryption. +-* setlinebuf: Controlling Buffering. +-* setlocale: Setting the Locale. +-* setlogmask: setlogmask. +-* setmntent: mtab. +-* setnetent: Networks Database. +-* setnetgrent: Lookup Netgroup. +-* setpgid: Process Group Functions. +-* setpgrp: Process Group Functions. +-* setpriority: Traditional Scheduling Functions. +-* setprotoent: Protocols Database. +-* setpwent: Scanning All Users. +-* setregid: Setting Groups. +-* setreuid: Setting User ID. +-* setrlimit: Limits on Resources. +-* setrlimit64: Limits on Resources. +-* setservent: Services Database. +-* setsid: Process Group Functions. +-* setsockopt: Socket Option Functions. +-* setstate: BSD Random. +-* setstate_r: BSD Random. +-* settimeofday: High-Resolution Calendar. +-* setuid: Setting User ID. +-* setutent: Manipulating the Database. +-* setutxent: XPG Functions. +-* setvbuf: Controlling Buffering. +-* shutdown: Closing a Socket. +-* sigaction: Advanced Signal Handling. +-* sigaddset: Signal Sets. +-* sigaltstack: Signal Stack. +-* sigblock: Blocking in BSD. +-* sigdelset: Signal Sets. +-* sigemptyset: Signal Sets. +-* sigfillset: Signal Sets. +-* siginterrupt: BSD Handler. +-* sigismember: Signal Sets. +-* siglongjmp: Non-Local Exits and Signals. +-* sigmask: Blocking in BSD. +-* signal: Basic Signal Handling. +-* signbit: FP Bit Twiddling. +-* significand: Normalization Functions. +-* significandf: Normalization Functions. +-* significandl: Normalization Functions. +-* sigpause: Blocking in BSD. +-* sigpending: Checking for Pending Signals. +-* sigprocmask: Process Signal Mask. +-* sigsetjmp: Non-Local Exits and Signals. +-* sigsetmask: Blocking in BSD. +-* sigstack: Signal Stack. +-* sigsuspend: Sigsuspend. +-* sigvec: BSD Handler. +-* sigwait: Threads and Signal Handling. +-* sin: Trig Functions. +-* sincos: Trig Functions. +-* sincosf: Trig Functions. +-* sincosl: Trig Functions. +-* sinf: Trig Functions. +-* sinh: Hyperbolic Functions. +-* sinhf: Hyperbolic Functions. +-* sinhl: Hyperbolic Functions. +-* sinl: Trig Functions. +-* sleep: Sleeping. +-* snprintf: Formatted Output Functions. +-* socket: Creating a Socket. +-* socketpair: Socket Pairs. +-* sprintf: Formatted Output Functions. +-* sqrt: Exponents and Logarithms. +-* sqrtf: Exponents and Logarithms. +-* sqrtl: Exponents and Logarithms. +-* srand: ISO Random. +-* srand48: SVID Random. +-* srand48_r: SVID Random. +-* srandom: BSD Random. +-* srandom_r: BSD Random. +-* sscanf: Formatted Input Functions. +-* ssignal: Basic Signal Handling. +-* stat: Reading Attributes. +-* stat64: Reading Attributes. +-* stime: Simple Calendar Time. +-* stpcpy: Copying and Concatenation. +-* stpncpy: Copying and Concatenation. +-* strcasecmp: String/Array Comparison. +-* strcasestr: Search Functions. +-* strcat: Copying and Concatenation. +-* strchr: Search Functions. +-* strchrnul: Search Functions. +-* strcmp: String/Array Comparison. +-* strcoll: Collation Functions. +-* strcpy: Copying and Concatenation. +-* strcspn: Search Functions. +-* strdup: Copying and Concatenation. +-* strdupa: Copying and Concatenation. +-* strerror: Error Messages. +-* strerror_r: Error Messages. +-* strfmon: Formatting Numbers. +-* strfry: strfry. +-* strftime: Formatting Calendar Time. +-* strlen: String Length. +-* strncasecmp: String/Array Comparison. +-* strncat: Copying and Concatenation. +-* strncmp: String/Array Comparison. +-* strncpy: Copying and Concatenation. +-* strndup: Copying and Concatenation. +-* strndupa: Copying and Concatenation. +-* strnlen: String Length. +-* strpbrk: Search Functions. +-* strptime: Low-Level Time String Parsing. +-* strrchr: Search Functions. +-* strsep: Finding Tokens in a String. +-* strsignal: Signal Messages. +-* strspn: Search Functions. +-* strstr: Search Functions. +-* strtod: Parsing of Floats. +-* strtof: Parsing of Floats. +-* strtoimax: Parsing of Integers. +-* strtok: Finding Tokens in a String. +-* strtok_r: Finding Tokens in a String. +-* strtol: Parsing of Integers. +-* strtold: Parsing of Floats. +-* strtoll: Parsing of Integers. +-* strtoq: Parsing of Integers. +-* strtoul: Parsing of Integers. +-* strtoull: Parsing of Integers. +-* strtoumax: Parsing of Integers. +-* strtouq: Parsing of Integers. +-* strverscmp: String/Array Comparison. +-* strxfrm: Collation Functions. +-* stty: BSD Terminal Modes. +-* success: Actions in the NSS configuration. +-* SUN_LEN: Local Namespace Details. +-* swapcontext: System V contexts. +-* swprintf: Formatted Output Functions. +-* swscanf: Formatted Input Functions. +-* symlink: Symbolic Links. +-* sync: Synchronizing I/O. +-* syscall: System Calls. +-* sysconf: Sysconf Definition. +-* sysctl: System Parameters. +-* syslog: syslog; vsyslog. +-* system: Running a Command. +-* sysv_signal: Basic Signal Handling. +-* tan: Trig Functions. +-* tanf: Trig Functions. +-* tanh: Hyperbolic Functions. +-* tanhf: Hyperbolic Functions. +-* tanhl: Hyperbolic Functions. +-* tanl: Trig Functions. +-* tcdrain: Line Control. +-* tcflow: Line Control. +-* tcflush: Line Control. +-* tcgetattr: Mode Functions. +-* tcgetpgrp: Terminal Access Functions. +-* tcgetsid: Terminal Access Functions. +-* tcsendbreak: Line Control. +-* tcsetattr: Mode Functions. +-* tcsetpgrp: Terminal Access Functions. +-* tdelete: Tree Search Function. +-* tdestroy: Tree Search Function. +-* telldir: Random Access Directory. +-* TEMP_FAILURE_RETRY: Interrupted Primitives. +-* tempnam: Temporary Files. +-* textdomain: Locating gettext catalog. +-* tfind: Tree Search Function. +-* tgamma: Special Functions. +-* tgammaf: Special Functions. +-* tgammal: Special Functions. +-* time: Simple Calendar Time. +-* timegm: Broken-down Time. +-* timelocal: Broken-down Time. +-* times: Processor Time. +-* tmpfile: Temporary Files. +-* tmpfile64: Temporary Files. +-* tmpnam: Temporary Files. +-* tmpnam_r: Temporary Files. +-* toascii: Case Conversion. +-* tolower: Case Conversion. +-* toupper: Case Conversion. +-* towctrans: Wide Character Case Conversion. +-* towlower: Wide Character Case Conversion. +-* towupper: Wide Character Case Conversion. +-* trunc: Rounding Functions. +-* truncate: File Size. +-* truncate64: File Size. +-* truncf: Rounding Functions. +-* truncl: Rounding Functions. +-* tryagain: Actions in the NSS configuration. +-* tsearch: Tree Search Function. +-* ttyname: Is It a Terminal. +-* ttyname_r: Is It a Terminal. +-* twalk: Tree Search Function. +-* tzset: Time Zone Functions. +-* ulimit: Limits on Resources. +-* umask: Setting Permissions. +-* umount: Mount-Unmount-Remount. +-* umount2: Mount-Unmount-Remount. +-* uname: Platform Type. +-* unavail: Actions in the NSS configuration. +-* ungetc: How Unread. +-* ungetwc: How Unread. +-* unlink: Deleting Files. +-* unlockpt: Allocation. +-* unsetenv: Environment Access. +-* updwtmp: Manipulating the Database. +-* utime: File Times. +-* utimes: File Times. +-* utmpname: Manipulating the Database. +-* utmpxname: XPG Functions. +-* va_alist: Old Varargs. +-* va_arg: Argument Macros. +-* va_dcl: Old Varargs. +-* va_end: Argument Macros. +-* va_start <1>: Old Varargs. +-* va_start: Argument Macros. +-* valloc: Aligned Memory Blocks. +-* vasprintf: Variable Arguments Output. +-* verr: Error Messages. +-* verrx: Error Messages. +-* versionsort: Scanning Directory Content. +-* versionsort64: Scanning Directory Content. +-* vfork: Creating a Process. +-* vfprintf: Variable Arguments Output. +-* vfscanf: Variable Arguments Input. +-* vfwprintf: Variable Arguments Output. +-* vfwscanf: Variable Arguments Input. +-* vlimit: Limits on Resources. +-* vprintf: Variable Arguments Output. +-* vscanf: Variable Arguments Input. +-* vsnprintf: Variable Arguments Output. +-* vsprintf: Variable Arguments Output. +-* vsscanf: Variable Arguments Input. +-* vswprintf: Variable Arguments Output. +-* vswscanf: Variable Arguments Input. +-* vsyslog: syslog; vsyslog. +-* vtimes: Resource Usage. +-* vwarn: Error Messages. +-* vwarnx: Error Messages. +-* vwprintf: Variable Arguments Output. +-* vwscanf: Variable Arguments Input. +-* wait: Process Completion. +-* wait3: BSD Wait Functions. +-* wait4: Process Completion. +-* waitpid: Process Completion. +-* warn: Error Messages. +-* warnx: Error Messages. +-* WCOREDUMP: Process Completion Status. +-* wcpcpy: Copying and Concatenation. +-* wcpncpy: Copying and Concatenation. +-* wcrtomb: Converting a Character. +-* wcscasecmp: String/Array Comparison. +-* wcscat: Copying and Concatenation. +-* wcschr: Search Functions. +-* wcschrnul: Search Functions. +-* wcscmp: String/Array Comparison. +-* wcscoll: Collation Functions. +-* wcscpy: Copying and Concatenation. +-* wcscspn: Search Functions. +-* wcsdup: Copying and Concatenation. +-* wcsftime: Formatting Calendar Time. +-* wcslen: String Length. +-* wcsncasecmp: String/Array Comparison. +-* wcsncat: Copying and Concatenation. +-* wcsncmp: String/Array Comparison. +-* wcsncpy: Copying and Concatenation. +-* wcsnlen: String Length. +-* wcsnrtombs: Converting Strings. +-* wcspbrk: Search Functions. +-* wcsrchr: Search Functions. +-* wcsrtombs: Converting Strings. +-* wcsspn: Search Functions. +-* wcsstr: Search Functions. +-* wcstod: Parsing of Floats. +-* wcstof: Parsing of Floats. +-* wcstoimax: Parsing of Integers. +-* wcstok: Finding Tokens in a String. +-* wcstol: Parsing of Integers. +-* wcstold: Parsing of Floats. +-* wcstoll: Parsing of Integers. +-* wcstombs: Non-reentrant String Conversion. +-* wcstoq: Parsing of Integers. +-* wcstoul: Parsing of Integers. +-* wcstoull: Parsing of Integers. +-* wcstoumax: Parsing of Integers. +-* wcstouq: Parsing of Integers. +-* wcswcs: Search Functions. +-* wcsxfrm: Collation Functions. +-* wctob: Converting a Character. +-* wctomb: Non-reentrant Character Conversion. +-* wctrans: Wide Character Case Conversion. +-* wctype: Classification of Wide Characters. +-* WEXITSTATUS: Process Completion Status. +-* WIFEXITED: Process Completion Status. +-* WIFSIGNALED: Process Completion Status. +-* WIFSTOPPED: Process Completion Status. +-* wmemchr: Search Functions. +-* wmemcmp: String/Array Comparison. +-* wmemcpy: Copying and Concatenation. +-* wmemmove: Copying and Concatenation. +-* wmempcpy: Copying and Concatenation. +-* wmemset: Copying and Concatenation. +-* wordexp: Calling Wordexp. +-* wordfree: Calling Wordexp. +-* wprintf: Formatted Output Functions. +-* write: I/O Primitives. +-* writev: Scatter-Gather. +-* wscanf: Formatted Input Functions. +-* WSTOPSIG: Process Completion Status. +-* WTERMSIG: Process Completion Status. +-* y0: Special Functions. +-* y0f: Special Functions. +-* y0l: Special Functions. +-* y1: Special Functions. +-* y1f: Special Functions. +-* y1l: Special Functions. +-* yn: Special Functions. +-* ynf: Special Functions. +-* ynl: Special Functions. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-6 glibc-2.3.2-200304020432/manual/libc.info-6 +--- glibc-2.3.2/manual/libc.info-6 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-6 Thu Jan 1 01:00:00 1970 +@@ -1,686 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Classification of Wide Characters, Next: Using Wide Char Classes, Prev: Case Conversion, Up: Character Handling +- +-Character class determination for wide characters +-================================================= +- +- Amendment 1 to ISO C90 defines functions to classify wide +-characters. Although the original ISO C90 standard already defined the +-type `wchar_t', no functions operating on them were defined. +- +- The general design of the classification functions for wide +-characters is more general. It allows extensions to the set of +-available classifications, beyond those which are always available. +-The POSIX standard specifies how extensions can be made, and this is +-already implemented in the GNU C library implementation of the +-`localedef' program. +- +- The character class functions are normally implemented with bitsets, +-with a bitset per character. For a given character, the appropriate +-bitset is read from a table and a test is performed as to whether a +-certain bit is set. Which bit is tested for is determined by the class. +- +- For the wide character classification functions this is made visible. +-There is a type classification type defined, a function to retrieve this +-value for a given class, and a function to test whether a given +-character is in this class, using the classification value. On top of +-this the normal character classification functions as used for `char' +-objects can be defined. +- +- - Data type: wctype_t +- The `wctype_t' can hold a value which represents a character class. +- The only defined way to generate such a value is by using the +- `wctype' function. +- +- This type is defined in `wctype.h'. +- +- - Function: wctype_t wctype (const char *PROPERTY) +- The `wctype' returns a value representing a class of wide +- characters which is identified by the string PROPERTY. Beside +- some standard properties each locale can define its own ones. In +- case no property with the given name is known for the current +- locale selected for the `LC_CTYPE' category, the function returns +- zero. +- +- The properties known in every locale are: +- +- `"alnum"' `"alpha"' `"cntrl"' `"digit"' +- `"graph"' `"lower"' `"print"' `"punct"' +- `"space"' `"upper"' `"xdigit"' +- +- This function is declared in `wctype.h'. +- +- To test the membership of a character to one of the non-standard +-classes the ISO C standard defines a completely new function. +- +- - Function: int iswctype (wint_t WC, wctype_t DESC) +- This function returns a nonzero value if WC is in the character +- class specified by DESC. DESC must previously be returned by a +- successful call to `wctype'. +- +- This function is declared in `wctype.h'. +- +- To make it easier to use the commonly-used classification functions, +-they are defined in the C library. There is no need to use `wctype' if +-the property string is one of the known character classes. In some +-situations it is desirable to construct the property strings, and then +-it is important that `wctype' can also handle the standard classes. +- +- - Function: int iswalnum (wint_t WC) +- This function returns a nonzero value if WC is an alphanumeric +- character (a letter or number); in other words, if either +- `iswalpha' or `iswdigit' is true of a character, then `iswalnum' +- is also true. +- +- This function can be implemented using +- +- iswctype (wc, wctype ("alnum")) +- +- It is declared in `wctype.h'. +- +- - Function: int iswalpha (wint_t WC) +- Returns true if WC is an alphabetic character (a letter). If +- `iswlower' or `iswupper' is true of a character, then `iswalpha' +- is also true. +- +- In some locales, there may be additional characters for which +- `iswalpha' is true--letters which are neither upper case nor lower +- case. But in the standard `"C"' locale, there are no such +- additional characters. +- +- This function can be implemented using +- +- iswctype (wc, wctype ("alpha")) +- +- It is declared in `wctype.h'. +- +- - Function: int iswcntrl (wint_t WC) +- Returns true if WC is a control character (that is, a character +- that is not a printing character). +- +- This function can be implemented using +- +- iswctype (wc, wctype ("cntrl")) +- +- It is declared in `wctype.h'. +- +- - Function: int iswdigit (wint_t WC) +- Returns true if WC is a digit (e.g., `0' through `9'). Please +- note that this function does not only return a nonzero value for +- _decimal_ digits, but for all kinds of digits. A consequence is +- that code like the following will *not* work unconditionally for +- wide characters: +- +- n = 0; +- while (iswdigit (*wc)) +- { +- n *= 10; +- n += *wc++ - L'0'; +- } +- +- This function can be implemented using +- +- iswctype (wc, wctype ("digit")) +- +- It is declared in `wctype.h'. +- +- - Function: int iswgraph (wint_t WC) +- Returns true if WC is a graphic character; that is, a character +- that has a glyph associated with it. The whitespace characters +- are not considered graphic. +- +- This function can be implemented using +- +- iswctype (wc, wctype ("graph")) +- +- It is declared in `wctype.h'. +- +- - Function: int iswlower (wint_t WC) +- Returns true if WC is a lower-case letter. The letter need not be +- from the Latin alphabet, any alphabet representable is valid. +- +- This function can be implemented using +- +- iswctype (wc, wctype ("lower")) +- +- It is declared in `wctype.h'. +- +- - Function: int iswprint (wint_t WC) +- Returns true if WC is a printing character. Printing characters +- include all the graphic characters, plus the space (` ') character. +- +- This function can be implemented using +- +- iswctype (wc, wctype ("print")) +- +- It is declared in `wctype.h'. +- +- - Function: int iswpunct (wint_t WC) +- Returns true if WC is a punctuation character. This means any +- printing character that is not alphanumeric or a space character. +- +- This function can be implemented using +- +- iswctype (wc, wctype ("punct")) +- +- It is declared in `wctype.h'. +- +- - Function: int iswspace (wint_t WC) +- Returns true if WC is a "whitespace" character. In the standard +- `"C"' locale, `iswspace' returns true for only the standard +- whitespace characters: +- +- `L' '' +- space +- +- `L'\f'' +- formfeed +- +- `L'\n'' +- newline +- +- `L'\r'' +- carriage return +- +- `L'\t'' +- horizontal tab +- +- `L'\v'' +- vertical tab +- +- This function can be implemented using +- +- iswctype (wc, wctype ("space")) +- +- It is declared in `wctype.h'. +- +- - Function: int iswupper (wint_t WC) +- Returns true if WC is an upper-case letter. The letter need not be +- from the Latin alphabet, any alphabet representable is valid. +- +- This function can be implemented using +- +- iswctype (wc, wctype ("upper")) +- +- It is declared in `wctype.h'. +- +- - Function: int iswxdigit (wint_t WC) +- Returns true if WC is a hexadecimal digit. Hexadecimal digits +- include the normal decimal digits `0' through `9' and the letters +- `A' through `F' and `a' through `f'. +- +- This function can be implemented using +- +- iswctype (wc, wctype ("xdigit")) +- +- It is declared in `wctype.h'. +- +- The GNU C library also provides a function which is not defined in +-the ISO C standard but which is available as a version for single byte +-characters as well. +- +- - Function: int iswblank (wint_t WC) +- Returns true if WC is a blank character; that is, a space or a tab. +- This function is a GNU extension. It is declared in `wchar.h'. +- +- +-File: libc.info, Node: Using Wide Char Classes, Next: Wide Character Case Conversion, Prev: Classification of Wide Characters, Up: Character Handling +- +-Notes on using the wide character classes +-========================================= +- +- The first note is probably not astonishing but still occasionally a +-cause of problems. The `iswXXX' functions can be implemented using +-macros and in fact, the GNU C library does this. They are still +-available as real functions but when the `wctype.h' header is included +-the macros will be used. This is the same as the `char' type versions +-of these functions. +- +- The second note covers something new. It can be best illustrated by +-a (real-world) example. The first piece of code is an excerpt from the +-original code. It is truncated a bit but the intention should be clear. +- +- int +- is_in_class (int c, const char *class) +- { +- if (strcmp (class, "alnum") == 0) +- return isalnum (c); +- if (strcmp (class, "alpha") == 0) +- return isalpha (c); +- if (strcmp (class, "cntrl") == 0) +- return iscntrl (c); +- ... +- return 0; +- } +- +- Now, with the `wctype' and `iswctype' you can avoid the `if' +-cascades, but rewriting the code as follows is wrong: +- +- int +- is_in_class (int c, const char *class) +- { +- wctype_t desc = wctype (class); +- return desc ? iswctype ((wint_t) c, desc) : 0; +- } +- +- The problem is that it is not guaranteed that the wide character +-representation of a single-byte character can be found using casting. +-In fact, usually this fails miserably. The correct solution to this +-problem is to write the code as follows: +- +- int +- is_in_class (int c, const char *class) +- { +- wctype_t desc = wctype (class); +- return desc ? iswctype (btowc (c), desc) : 0; +- } +- +- *Note Converting a Character::, for more information on `btowc'. +-Note that this change probably does not improve the performance of the +-program a lot since the `wctype' function still has to make the string +-comparisons. It gets really interesting if the `is_in_class' function +-is called more than once for the same class name. In this case the +-variable DESC could be computed once and reused for all the calls. +-Therefore the above form of the function is probably not the final one. +- +- +-File: libc.info, Node: Wide Character Case Conversion, Prev: Using Wide Char Classes, Up: Character Handling +- +-Mapping of wide characters. +-=========================== +- +- The classification functions are also generalized by the ISO C +-standard. Instead of just allowing the two standard mappings, a locale +-can contain others. Again, the `localedef' program already supports +-generating such locale data files. +- +- - Data Type: wctrans_t +- This data type is defined as a scalar type which can hold a value +- representing the locale-dependent character mapping. There is no +- way to construct such a value apart from using the return value of +- the `wctrans' function. +- +- This type is defined in `wctype.h'. +- +- - Function: wctrans_t wctrans (const char *PROPERTY) +- The `wctrans' function has to be used to find out whether a named +- mapping is defined in the current locale selected for the +- `LC_CTYPE' category. If the returned value is non-zero, you can +- use it afterwards in calls to `towctrans'. If the return value is +- zero no such mapping is known in the current locale. +- +- Beside locale-specific mappings there are two mappings which are +- guaranteed to be available in every locale: +- +- `"tolower"' `"toupper"' +- +- These functions are declared in `wctype.h'. +- +- - Function: wint_t towctrans (wint_t WC, wctrans_t DESC) +- `towctrans' maps the input character WC according to the rules of +- the mapping for which DESC is a descriptor, and returns the value +- it finds. DESC must be obtained by a successful call to `wctrans'. +- +- This function is declared in `wctype.h'. +- +- For the generally available mappings, the ISO C standard defines +-convenient shortcuts so that it is not necessary to call `wctrans' for +-them. +- +- - Function: wint_t towlower (wint_t WC) +- If WC is an upper-case letter, `towlower' returns the corresponding +- lower-case letter. If WC is not an upper-case letter, WC is +- returned unchanged. +- +- `towlower' can be implemented using +- +- towctrans (wc, wctrans ("tolower")) +- +- This function is declared in `wctype.h'. +- +- - Function: wint_t towupper (wint_t WC) +- If WC is a lower-case letter, `towupper' returns the corresponding +- upper-case letter. Otherwise WC is returned unchanged. +- +- `towupper' can be implemented using +- +- towctrans (wc, wctrans ("toupper")) +- +- This function is declared in `wctype.h'. +- +- The same warnings given in the last section for the use of the wide +-character classification functions apply here. It is not possible to +-simply cast a `char' type value to a `wint_t' and use it as an argument +-to `towctrans' calls. +- +- +-File: libc.info, Node: String and Array Utilities, Next: Character Set Handling, Prev: Character Handling, Up: Top +- +-String and Array Utilities +-************************** +- +- Operations on strings (or arrays of characters) are an important +-part of many programs. The GNU C library provides an extensive set of +-string utility functions, including functions for copying, +-concatenating, comparing, and searching strings. Many of these +-functions can also operate on arbitrary regions of storage; for +-example, the `memcpy' function can be used to copy the contents of any +-kind of array. +- +- It's fairly common for beginning C programmers to "reinvent the +-wheel" by duplicating this functionality in their own code, but it pays +-to become familiar with the library functions and to make use of them, +-since this offers benefits in maintenance, efficiency, and portability. +- +- For instance, you could easily compare one string to another in two +-lines of C code, but if you use the built-in `strcmp' function, you're +-less likely to make a mistake. And, since these library functions are +-typically highly optimized, your program may run faster too. +- +-* Menu: +- +-* Representation of Strings:: Introduction to basic concepts. +-* String/Array Conventions:: Whether to use a string function or an +- arbitrary array function. +-* String Length:: Determining the length of a string. +-* Copying and Concatenation:: Functions to copy the contents of strings +- and arrays. +-* String/Array Comparison:: Functions for byte-wise and character-wise +- comparison. +-* Collation Functions:: Functions for collating strings. +-* Search Functions:: Searching for a specific element or substring. +-* Finding Tokens in a String:: Splitting a string into tokens by looking +- for delimiters. +-* strfry:: Function for flash-cooking a string. +-* Trivial Encryption:: Obscuring data. +-* Encode Binary Data:: Encoding and Decoding of Binary Data. +-* Argz and Envz Vectors:: Null-separated string vectors. +- +- +-File: libc.info, Node: Representation of Strings, Next: String/Array Conventions, Up: String and Array Utilities +- +-Representation of Strings +-========================= +- +- This section is a quick summary of string concepts for beginning C +-programmers. It describes how character strings are represented in C +-and some common pitfalls. If you are already familiar with this +-material, you can skip this section. +- +- A "string" is an array of `char' objects. But string-valued +-variables are usually declared to be pointers of type `char *'. Such +-variables do not include space for the text of a string; that has to be +-stored somewhere else--in an array variable, a string constant, or +-dynamically allocated memory (*note Memory Allocation::). It's up to +-you to store the address of the chosen memory space into the pointer +-variable. Alternatively you can store a "null pointer" in the pointer +-variable. The null pointer does not point anywhere, so attempting to +-reference the string it points to gets an error. +- +- "string" normally refers to multibyte character strings as opposed to +-wide character strings. Wide character strings are arrays of type +-`wchar_t' and as for multibyte character strings usually pointers of +-type `wchar_t *' are used. +- +- By convention, a "null character", `'\0'', marks the end of a +-multibyte character string and the "null wide character", `L'\0'', +-marks the end of a wide character string. For example, in testing to +-see whether the `char *' variable P points to a null character marking +-the end of a string, you can write `!*P' or `*P == '\0''. +- +- A null character is quite different conceptually from a null pointer, +-although both are represented by the integer `0'. +- +- "String literals" appear in C program source as strings of +-characters between double-quote characters (`"') where the initial +-double-quote character is immediately preceded by a capital `L' (ell) +-character (as in `L"foo"'). In ISO C, string literals can also be +-formed by "string concatenation": `"a" "b"' is the same as `"ab"'. For +-wide character strings one can either use `L"a" L"b"' or `L"a" "b"'. +-Modification of string literals is not allowed by the GNU C compiler, +-because literals are placed in read-only storage. +- +- Character arrays that are declared `const' cannot be modified +-either. It's generally good style to declare non-modifiable string +-pointers to be of type `const char *', since this often allows the C +-compiler to detect accidental modifications as well as providing some +-amount of documentation about what your program intends to do with the +-string. +- +- The amount of memory allocated for the character array may extend +-past the null character that normally marks the end of the string. In +-this document, the term "allocated size" is always used to refer to the +-total amount of memory allocated for the string, while the term +-"length" refers to the number of characters up to (but not including) +-the terminating null character. +- +- A notorious source of program bugs is trying to put more characters +-in a string than fit in its allocated size. When writing code that +-extends strings or moves characters into a pre-allocated array, you +-should be very careful to keep track of the length of the text and make +-explicit checks for overflowing the array. Many of the library +-functions _do not_ do this for you! Remember also that you need to +-allocate an extra byte to hold the null character that marks the end of +-the string. +- +- Originally strings were sequences of bytes where each byte +-represents a single character. This is still true today if the strings +-are encoded using a single-byte character encoding. Things are +-different if the strings are encoded using a multibyte encoding (for +-more information on encodings see *Note Extended Char Intro::). There +-is no difference in the programming interface for these two kind of +-strings; the programmer has to be aware of this and interpret the byte +-sequences accordingly. +- +- But since there is no separate interface taking care of these +-differences the byte-based string functions are sometimes hard to use. +-Since the count parameters of these functions specify bytes a call to +-`strncpy' could cut a multibyte character in the middle and put an +-incomplete (and therefore unusable) byte sequence in the target buffer. +- +- To avoid these problems later versions of the ISO C standard +-introduce a second set of functions which are operating on "wide +-characters" (*note Extended Char Intro::). These functions don't have +-the problems the single-byte versions have since every wide character is +-a legal, interpretable value. This does not mean that cutting wide +-character strings at arbitrary points is without problems. It normally +-is for alphabet-based languages (except for non-normalized text) but +-languages based on syllables still have the problem that more than one +-wide character is necessary to complete a logical unit. This is a +-higher level problem which the C library functions are not designed to +-solve. But it is at least good that no invalid byte sequences can be +-created. Also, the higher level functions can also much easier operate +-on wide character than on multibyte characters so that a general advise +-is to use wide characters internally whenever text is more than simply +-copied. +- +- The remaining of this chapter will discuss the functions for handling +-wide character strings in parallel with the discussion of the multibyte +-character strings since there is almost always an exact equivalent +-available. +- +- +-File: libc.info, Node: String/Array Conventions, Next: String Length, Prev: Representation of Strings, Up: String and Array Utilities +- +-String and Array Conventions +-============================ +- +- This chapter describes both functions that work on arbitrary arrays +-or blocks of memory, and functions that are specific to null-terminated +-arrays of characters and wide characters. +- +- Functions that operate on arbitrary blocks of memory have names +-beginning with `mem' and `wmem' (such as `memcpy' and `wmemcpy') and +-invariably take an argument which specifies the size (in bytes and wide +-characters respectively) of the block of memory to operate on. The +-array arguments and return values for these functions have type `void +-*' or `wchar_t'. As a matter of style, the elements of the arrays used +-with the `mem' functions are referred to as "bytes". You can pass any +-kind of pointer to these functions, and the `sizeof' operator is useful +-in computing the value for the size argument. Parameters to the `wmem' +-functions must be of type `wchar_t *'. These functions are not really +-usable with anything but arrays of this type. +- +- In contrast, functions that operate specifically on strings and wide +-character strings have names beginning with `str' and `wcs' +-respectively (such as `strcpy' and `wcscpy') and look for a null +-character to terminate the string instead of requiring an explicit size +-argument to be passed. (Some of these functions accept a specified +-maximum length, but they also check for premature termination with a +-null character.) The array arguments and return values for these +-functions have type `char *' and `wchar_t *' respectively, and the +-array elements are referred to as "characters" and "wide characters". +- +- In many cases, there are both `mem' and `str'/`wcs' versions of a +-function. The one that is more appropriate to use depends on the exact +-situation. When your program is manipulating arbitrary arrays or +-blocks of storage, then you should always use the `mem' functions. On +-the other hand, when you are manipulating null-terminated strings it is +-usually more convenient to use the `str'/`wcs' functions, unless you +-already know the length of the string in advance. The `wmem' functions +-should be used for wide character arrays with known size. +- +- Some of the memory and string functions take single characters as +-arguments. Since a value of type `char' is automatically promoted into +-an value of type `int' when used as a parameter, the functions are +-declared with `int' as the type of the parameter in question. In case +-of the wide character function the situation is similarly: the +-parameter type for a single wide character is `wint_t' and not +-`wchar_t'. This would for many implementations not be necessary since +-the `wchar_t' is large enough to not be automatically promoted, but +-since the ISO C standard does not require such a choice of types the +-`wint_t' type is used. +- +- +-File: libc.info, Node: String Length, Next: Copying and Concatenation, Prev: String/Array Conventions, Up: String and Array Utilities +- +-String Length +-============= +- +- You can get the length of a string using the `strlen' function. +-This function is declared in the header file `string.h'. +- +- - Function: size_t strlen (const char *S) +- The `strlen' function returns the length of the null-terminated +- string S in bytes. (In other words, it returns the offset of the +- terminating null character within the array.) +- +- For example, +- strlen ("hello, world") +- => 12 +- +- When applied to a character array, the `strlen' function returns +- the length of the string stored there, not its allocated size. +- You can get the allocated size of the character array that holds a +- string using the `sizeof' operator: +- +- char string[32] = "hello, world"; +- sizeof (string) +- => 32 +- strlen (string) +- => 12 +- +- But beware, this will not work unless STRING is the character +- array itself, not a pointer to it. For example: +- +- char string[32] = "hello, world"; +- char *ptr = string; +- sizeof (string) +- => 32 +- sizeof (ptr) +- => 4 /* (on a machine with 4 byte pointers) */ +- +- This is an easy mistake to make when you are working with +- functions that take string arguments; those arguments are always +- pointers, not arrays. +- +- It must also be noted that for multibyte encoded strings the return +- value does not have to correspond to the number of characters in +- the string. To get this value the string can be converted to wide +- characters and `wcslen' can be used or something like the following +- code can be used: +- +- /* The input is in `string'. +- The length is expected in `n'. */ +- { +- mbstate_t t; +- char *scopy = string; +- /* In initial state. */ +- memset (&t, '\0', sizeof (t)); +- /* Determine number of characters. */ +- n = mbsrtowcs (NULL, &scopy, strlen (scopy), &t); +- } +- +- This is cumbersome to do so if the number of characters (as +- opposed to bytes) is needed often it is better to work with wide +- characters. +- +- The wide character equivalent is declared in `wchar.h'. +- +- - Function: size_t wcslen (const wchar_t *WS) +- The `wcslen' function is the wide character equivalent to +- `strlen'. The return value is the number of wide characters in the +- wide character string pointed to by WS (this is also the offset of +- the terminating null wide character of WS). +- +- Since there are no multi wide character sequences making up one +- character the return value is not only the offset in the array, it +- is also the number of wide characters. +- +- This function was introduced in Amendment 1 to ISO C90. +- +- - Function: size_t strnlen (const char *S, size_t MAXLEN) +- The `strnlen' function returns the length of the string S in bytes +- if this length is smaller than MAXLEN bytes. Otherwise it returns +- MAXLEN. Therefore this function is equivalent to `(strlen (S) < n +- ? strlen (S) : MAXLEN)' but it is more efficient and works even if +- the string S is not null-terminated. +- +- char string[32] = "hello, world"; +- strnlen (string, 32) +- => 12 +- strnlen (string, 5) +- => 5 +- +- This function is a GNU extension and is declared in `string.h'. +- +- - Function: size_t wcsnlen (const wchar_t *WS, size_t MAXLEN) +- `wcsnlen' is the wide character equivalent to `strnlen'. The +- MAXLEN parameter specifies the maximum number of wide characters. +- +- This function is a GNU extension and is declared in `wchar.h'. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-60 glibc-2.3.2-200304020432/manual/libc.info-60 +--- glibc-2.3.2/manual/libc.info-60 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-60 Thu Jan 1 01:00:00 1970 +@@ -1,1115 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Variable Index, Next: File Index, Prev: Function Index, Up: Top +- +-Variable and Constant Macro Index +-********************************* +- +-* Menu: +- +-* (*__gconv_end_fct): glibc iconv Implementation. +-* (*__gconv_fct): glibc iconv Implementation. +-* (*__gconv_init_fct): glibc iconv Implementation. +-* __free_hook: Hooks for Malloc. +-* __malloc_hook: Hooks for Malloc. +-* __malloc_initialize_hook: Hooks for Malloc. +-* __memalign_hook: Hooks for Malloc. +-* __realloc_hook: Hooks for Malloc. +-* _BSD_SOURCE: Feature Test Macros. +-* _Complex_I: Complex Numbers. +-* _FILE_OFFSET_BITS: Feature Test Macros. +-* _GNU_SOURCE: Feature Test Macros. +-* _IOFBF: Controlling Buffering. +-* _IOLBF: Controlling Buffering. +-* _IONBF: Controlling Buffering. +-* _ISOC99_SOURCE: Feature Test Macros. +-* _LARGEFILE64_SOURCE: Feature Test Macros. +-* _LARGEFILE_SOURCE: Feature Test Macros. +-* _PATH_FSTAB: Mount Information. +-* _PATH_MNTTAB: Mount Information. +-* _PATH_MOUNTED: Mount Information. +-* _PATH_UTMP: Manipulating the Database. +-* _PATH_WTMP: Manipulating the Database. +-* _POSIX2_C_DEV: System Options. +-* _POSIX2_C_VERSION: Version Supported. +-* _POSIX2_FORT_DEV: System Options. +-* _POSIX2_FORT_RUN: System Options. +-* _POSIX2_LOCALEDEF: System Options. +-* _POSIX2_SW_DEV: System Options. +-* _POSIX_C_SOURCE: Feature Test Macros. +-* _POSIX_CHOWN_RESTRICTED: Options for Files. +-* _POSIX_JOB_CONTROL: System Options. +-* _POSIX_NO_TRUNC: Options for Files. +-* _POSIX_SAVED_IDS: System Options. +-* _POSIX_SOURCE: Feature Test Macros. +-* _POSIX_VDISABLE <1>: Options for Files. +-* _POSIX_VDISABLE: Special Characters. +-* _POSIX_VERSION: Version Supported. +-* _REENTRANT: Feature Test Macros. +-* _SC_2_C_DEV: Constants for Sysconf. +-* _SC_2_FORT_DEV: Constants for Sysconf. +-* _SC_2_FORT_RUN: Constants for Sysconf. +-* _SC_2_LOCALEDEF: Constants for Sysconf. +-* _SC_2_SW_DEV: Constants for Sysconf. +-* _SC_2_VERSION: Constants for Sysconf. +-* _SC_AIO_LISTIO_MAX: Constants for Sysconf. +-* _SC_AIO_MAX: Constants for Sysconf. +-* _SC_AIO_PRIO_DELTA_MAX: Constants for Sysconf. +-* _SC_ARG_MAX: Constants for Sysconf. +-* _SC_ASYNCHRONOUS_IO: Constants for Sysconf. +-* _SC_ATEXIT_MAX: Constants for Sysconf. +-* _SC_AVPHYS_PAGES <1>: Constants for Sysconf. +-* _SC_AVPHYS_PAGES: Query Memory Parameters. +-* _SC_BC_BASE_MAX: Constants for Sysconf. +-* _SC_BC_DIM_MAX: Constants for Sysconf. +-* _SC_BC_SCALE_MAX: Constants for Sysconf. +-* _SC_BC_STRING_MAX: Constants for Sysconf. +-* _SC_CHAR_BIT: Constants for Sysconf. +-* _SC_CHAR_MAX: Constants for Sysconf. +-* _SC_CHAR_MIN: Constants for Sysconf. +-* _SC_CHARCLASS_NAME_MAX: Constants for Sysconf. +-* _SC_CHILD_MAX: Constants for Sysconf. +-* _SC_CLK_TCK: Constants for Sysconf. +-* _SC_COLL_WEIGHTS_MAX: Constants for Sysconf. +-* _SC_DELAYTIMER_MAX: Constants for Sysconf. +-* _SC_EQUIV_CLASS_MAX: Constants for Sysconf. +-* _SC_EXPR_NEST_MAX: Constants for Sysconf. +-* _SC_FSYNC: Constants for Sysconf. +-* _SC_GETGR_R_SIZE_MAX: Constants for Sysconf. +-* _SC_GETPW_R_SIZE_MAX: Constants for Sysconf. +-* _SC_INT_MAX: Constants for Sysconf. +-* _SC_INT_MIN: Constants for Sysconf. +-* _SC_JOB_CONTROL: Constants for Sysconf. +-* _SC_LINE_MAX: Constants for Sysconf. +-* _SC_LOGIN_NAME_MAX: Constants for Sysconf. +-* _SC_LONG_BIT: Constants for Sysconf. +-* _SC_MAPPED_FILES: Constants for Sysconf. +-* _SC_MB_LEN_MAX: Constants for Sysconf. +-* _SC_MEMLOCK: Constants for Sysconf. +-* _SC_MEMLOCK_RANGE: Constants for Sysconf. +-* _SC_MEMORY_PROTECTION: Constants for Sysconf. +-* _SC_MESSAGE_PASSING: Constants for Sysconf. +-* _SC_MQ_OPEN_MAX: Constants for Sysconf. +-* _SC_MQ_PRIO_MAX: Constants for Sysconf. +-* _SC_NGROUPS_MAX: Constants for Sysconf. +-* _SC_NL_ARGMAX: Constants for Sysconf. +-* _SC_NL_LANGMAX: Constants for Sysconf. +-* _SC_NL_MSGMAX: Constants for Sysconf. +-* _SC_NL_NMAX: Constants for Sysconf. +-* _SC_NL_SETMAX: Constants for Sysconf. +-* _SC_NL_TEXTMAX: Constants for Sysconf. +-* _SC_NPROCESSORS_CONF <1>: Constants for Sysconf. +-* _SC_NPROCESSORS_CONF: Processor Resources. +-* _SC_NPROCESSORS_ONLN <1>: Constants for Sysconf. +-* _SC_NPROCESSORS_ONLN: Processor Resources. +-* _SC_NZERO: Constants for Sysconf. +-* _SC_OPEN_MAX: Constants for Sysconf. +-* _SC_PAGESIZE <1>: Constants for Sysconf. +-* _SC_PAGESIZE <2>: Query Memory Parameters. +-* _SC_PAGESIZE: Memory-mapped I/O. +-* _SC_PHYS_PAGES <1>: Constants for Sysconf. +-* _SC_PHYS_PAGES: Query Memory Parameters. +-* _SC_PII: Constants for Sysconf. +-* _SC_PII_INTERNET: Constants for Sysconf. +-* _SC_PII_INTERNET_DGRAM: Constants for Sysconf. +-* _SC_PII_INTERNET_STREAM: Constants for Sysconf. +-* _SC_PII_OSI: Constants for Sysconf. +-* _SC_PII_OSI_CLTS: Constants for Sysconf. +-* _SC_PII_OSI_COTS: Constants for Sysconf. +-* _SC_PII_OSI_M: Constants for Sysconf. +-* _SC_PII_SOCKET: Constants for Sysconf. +-* _SC_PII_XTI: Constants for Sysconf. +-* _SC_PRIORITIZED_IO: Constants for Sysconf. +-* _SC_PRIORITY_SCHEDULING: Constants for Sysconf. +-* _SC_REALTIME_SIGNALS: Constants for Sysconf. +-* _SC_RTSIG_MAX: Constants for Sysconf. +-* _SC_SAVED_IDS: Constants for Sysconf. +-* _SC_SCHAR_MAX: Constants for Sysconf. +-* _SC_SCHAR_MIN: Constants for Sysconf. +-* _SC_SELECT: Constants for Sysconf. +-* _SC_SEM_NSEMS_MAX: Constants for Sysconf. +-* _SC_SEM_VALUE_MAX: Constants for Sysconf. +-* _SC_SEMAPHORES: Constants for Sysconf. +-* _SC_SHARED_MEMORY_OBJECTS: Constants for Sysconf. +-* _SC_SHRT_MAX: Constants for Sysconf. +-* _SC_SHRT_MIN: Constants for Sysconf. +-* _SC_SIGQUEUE_MAX: Constants for Sysconf. +-* _SC_STREAM_MAX: Constants for Sysconf. +-* _SC_SYNCHRONIZED_IO: Constants for Sysconf. +-* _SC_T_IOV_MAX: Constants for Sysconf. +-* _SC_THREAD_ATTR_STACKADDR: Constants for Sysconf. +-* _SC_THREAD_ATTR_STACKSIZE: Constants for Sysconf. +-* _SC_THREAD_DESTRUCTOR_ITERATIONS: Constants for Sysconf. +-* _SC_THREAD_KEYS_MAX: Constants for Sysconf. +-* _SC_THREAD_PRIO_INHERIT: Constants for Sysconf. +-* _SC_THREAD_PRIO_PROTECT: Constants for Sysconf. +-* _SC_THREAD_PRIORITY_SCHEDULING: Constants for Sysconf. +-* _SC_THREAD_PROCESS_SHARED: Constants for Sysconf. +-* _SC_THREAD_SAFE_FUNCTIONS: Constants for Sysconf. +-* _SC_THREAD_STACK_MIN: Constants for Sysconf. +-* _SC_THREAD_THREADS_MAX: Constants for Sysconf. +-* _SC_THREADS: Constants for Sysconf. +-* _SC_TIMER_MAX: Constants for Sysconf. +-* _SC_TIMERS: Constants for Sysconf. +-* _SC_TTY_NAME_MAX: Constants for Sysconf. +-* _SC_TZNAME_MAX: Constants for Sysconf. +-* _SC_UCHAR_MAX: Constants for Sysconf. +-* _SC_UINT_MAX: Constants for Sysconf. +-* _SC_UIO_MAXIOV: Constants for Sysconf. +-* _SC_ULONG_MAX: Constants for Sysconf. +-* _SC_USHRT_MAX: Constants for Sysconf. +-* _SC_VERSION: Constants for Sysconf. +-* _SC_WORD_BIT: Constants for Sysconf. +-* _SC_XOPEN_CRYPT: Constants for Sysconf. +-* _SC_XOPEN_ENH_I18N: Constants for Sysconf. +-* _SC_XOPEN_LEGACY: Constants for Sysconf. +-* _SC_XOPEN_REALTIME: Constants for Sysconf. +-* _SC_XOPEN_REALTIME_THREADS: Constants for Sysconf. +-* _SC_XOPEN_SHM: Constants for Sysconf. +-* _SC_XOPEN_UNIX: Constants for Sysconf. +-* _SC_XOPEN_VERSION: Constants for Sysconf. +-* _SC_XOPEN_XCU_VERSION: Constants for Sysconf. +-* _SC_XOPEN_XPG2: Constants for Sysconf. +-* _SC_XOPEN_XPG3: Constants for Sysconf. +-* _SC_XOPEN_XPG4: Constants for Sysconf. +-* _SVID_SOURCE: Feature Test Macros. +-* _THREAD_SAFE: Feature Test Macros. +-* _XOPEN_SOURCE: Feature Test Macros. +-* _XOPEN_SOURCE_EXTENDED: Feature Test Macros. +-* ABDAY_1: The Elegant and Fast Way. +-* ABDAY_2: The Elegant and Fast Way. +-* ABDAY_3: The Elegant and Fast Way. +-* ABDAY_4: The Elegant and Fast Way. +-* ABDAY_5: The Elegant and Fast Way. +-* ABDAY_6: The Elegant and Fast Way. +-* ABDAY_7: The Elegant and Fast Way. +-* ABMON_1: The Elegant and Fast Way. +-* ABMON_10: The Elegant and Fast Way. +-* ABMON_11: The Elegant and Fast Way. +-* ABMON_12: The Elegant and Fast Way. +-* ABMON_2: The Elegant and Fast Way. +-* ABMON_3: The Elegant and Fast Way. +-* ABMON_4: The Elegant and Fast Way. +-* ABMON_5: The Elegant and Fast Way. +-* ABMON_6: The Elegant and Fast Way. +-* ABMON_7: The Elegant and Fast Way. +-* ABMON_8: The Elegant and Fast Way. +-* ABMON_9: The Elegant and Fast Way. +-* ACCOUNTING: Manipulating the Database. +-* AF_FILE: Address Formats. +-* AF_INET: Address Formats. +-* AF_LOCAL: Address Formats. +-* AF_UNIX: Address Formats. +-* AF_UNSPEC: Address Formats. +-* aliases: NSS Basics. +-* ALT_DIGITS: The Elegant and Fast Way. +-* ALTWERASE: Local Modes. +-* AM_STR: The Elegant and Fast Way. +-* ARG_MAX: General Limits. +-* argp_err_exit_status: Argp Global Variables. +-* ARGP_ERR_UNKNOWN: Argp Parser Functions. +-* ARGP_HELP_BUG_ADDR: Argp Help Flags. +-* ARGP_HELP_DOC: Argp Help Flags. +-* ARGP_HELP_EXIT_ERR: Argp Help Flags. +-* ARGP_HELP_EXIT_OK: Argp Help Flags. +-* ARGP_HELP_LONG: Argp Help Flags. +-* ARGP_HELP_LONG_ONLY: Argp Help Flags. +-* ARGP_HELP_POST_DOC: Argp Help Flags. +-* ARGP_HELP_PRE_DOC: Argp Help Flags. +-* ARGP_HELP_SEE: Argp Help Flags. +-* ARGP_HELP_SHORT_USAGE: Argp Help Flags. +-* ARGP_HELP_STD_ERR: Argp Help Flags. +-* ARGP_HELP_STD_HELP: Argp Help Flags. +-* ARGP_HELP_STD_USAGE: Argp Help Flags. +-* ARGP_HELP_USAGE: Argp Help Flags. +-* ARGP_IN_ORDER: Argp Flags. +-* ARGP_KEY_ARG: Argp Special Keys. +-* ARGP_KEY_ARGS: Argp Special Keys. +-* ARGP_KEY_END: Argp Special Keys. +-* ARGP_KEY_ERROR: Argp Special Keys. +-* ARGP_KEY_FINI: Argp Special Keys. +-* ARGP_KEY_HELP_ARGS_DOC: Argp Help Filter Keys. +-* ARGP_KEY_HELP_DUP_ARGS_NOTE: Argp Help Filter Keys. +-* ARGP_KEY_HELP_EXTRA: Argp Help Filter Keys. +-* ARGP_KEY_HELP_HEADER: Argp Help Filter Keys. +-* ARGP_KEY_HELP_POST_DOC: Argp Help Filter Keys. +-* ARGP_KEY_HELP_PRE_DOC: Argp Help Filter Keys. +-* ARGP_KEY_INIT: Argp Special Keys. +-* ARGP_KEY_NO_ARGS: Argp Special Keys. +-* ARGP_KEY_SUCCESS: Argp Special Keys. +-* ARGP_LONG_ONLY: Argp Flags. +-* ARGP_NO_ARGS: Argp Flags. +-* ARGP_NO_ERRS: Argp Flags. +-* ARGP_NO_EXIT: Argp Flags. +-* ARGP_NO_HELP: Argp Flags. +-* ARGP_PARSE_ARGV0: Argp Flags. +-* argp_program_bug_address: Argp Global Variables. +-* argp_program_version: Argp Global Variables. +-* argp_program_version_hook: Argp Global Variables. +-* ARGP_SILENT: Argp Flags. +-* B0: Line Speed. +-* B110: Line Speed. +-* B115200: Line Speed. +-* B1200: Line Speed. +-* B134: Line Speed. +-* B150: Line Speed. +-* B1800: Line Speed. +-* B19200: Line Speed. +-* B200: Line Speed. +-* B230400: Line Speed. +-* B2400: Line Speed. +-* B300: Line Speed. +-* B38400: Line Speed. +-* B460800: Line Speed. +-* B4800: Line Speed. +-* B50: Line Speed. +-* B57600: Line Speed. +-* B600: Line Speed. +-* B75: Line Speed. +-* B9600: Line Speed. +-* BC_BASE_MAX: Utility Limits. +-* BC_DIM_MAX: Utility Limits. +-* BC_SCALE_MAX: Utility Limits. +-* BC_STRING_MAX: Utility Limits. +-* BOOT_TIME <1>: XPG Functions. +-* BOOT_TIME: Manipulating the Database. +-* BRKINT: Input Modes. +-* BUFSIZ: Controlling Buffering. +-* CCTS_OFLOW: Control Modes. +-* CHAR_MAX: Range of Type. +-* CHAR_MIN: Range of Type. +-* CHILD_MAX: General Limits. +-* CIGNORE: Control Modes. +-* CLK_TCK: CPU Time. +-* CLOCAL: Control Modes. +-* CLOCKS_PER_SEC: CPU Time. +-* CODESET: The Elegant and Fast Way. +-* COLL_WEIGHTS_MAX: Utility Limits. +-* COREFILE: Program Error Signals. +-* CREAD: Control Modes. +-* CRNCYSTR: The Elegant and Fast Way. +-* CRTS_IFLOW: Control Modes. +-* CS5: Control Modes. +-* CS6: Control Modes. +-* CS7: Control Modes. +-* CS8: Control Modes. +-* CSIZE: Control Modes. +-* CSTOPB: Control Modes. +-* CURRENCY_SYMBOL: The Elegant and Fast Way. +-* D_FMT: The Elegant and Fast Way. +-* D_T_FMT: The Elegant and Fast Way. +-* DAY_1: The Elegant and Fast Way. +-* DAY_2: The Elegant and Fast Way. +-* DAY_3: The Elegant and Fast Way. +-* DAY_4: The Elegant and Fast Way. +-* DAY_5: The Elegant and Fast Way. +-* DAY_6: The Elegant and Fast Way. +-* DAY_7: The Elegant and Fast Way. +-* daylight: Time Zone Functions. +-* DBL_DIG: Floating Point Parameters. +-* DBL_EPSILON: Floating Point Parameters. +-* DBL_MANT_DIG: Floating Point Parameters. +-* DBL_MAX: Floating Point Parameters. +-* DBL_MAX_10_EXP: Floating Point Parameters. +-* DBL_MAX_EXP: Floating Point Parameters. +-* DBL_MIN: Floating Point Parameters. +-* DBL_MIN_10_EXP: Floating Point Parameters. +-* DBL_MIN_EXP: Floating Point Parameters. +-* DEAD_PROCESS <1>: XPG Functions. +-* DEAD_PROCESS: Manipulating the Database. +-* DECIMAL_POINT: The Elegant and Fast Way. +-* DES_DECRYPT: DES Encryption. +-* DES_ENCRYPT: DES Encryption. +-* DES_HW: DES Encryption. +-* DES_SW: DES Encryption. +-* DESERR_BADPARAM: DES Encryption. +-* DESERR_HWERROR: DES Encryption. +-* DESERR_NOHWDEVICE: DES Encryption. +-* DESERR_NONE: DES Encryption. +-* DT_BLK: Directory Entries. +-* DT_CHR: Directory Entries. +-* DT_DIR: Directory Entries. +-* DT_FIFO: Directory Entries. +-* DT_REG: Directory Entries. +-* DT_SOCK: Directory Entries. +-* DT_UNKNOWN: Directory Entries. +-* E2BIG: Error Codes. +-* EACCES: Error Codes. +-* EADDRINUSE: Error Codes. +-* EADDRNOTAVAIL: Error Codes. +-* EADV: Error Codes. +-* EAFNOSUPPORT: Error Codes. +-* EAGAIN: Error Codes. +-* EALREADY: Error Codes. +-* EAUTH: Error Codes. +-* EBACKGROUND: Error Codes. +-* EBADE: Error Codes. +-* EBADF <1>: Line Control. +-* EBADF: Error Codes. +-* EBADFD: Error Codes. +-* EBADMSG: Error Codes. +-* EBADR: Error Codes. +-* EBADRPC: Error Codes. +-* EBADRQC: Error Codes. +-* EBADSLT: Error Codes. +-* EBFONT: Error Codes. +-* EBUSY: Error Codes. +-* ECANCELED: Error Codes. +-* ECHILD: Error Codes. +-* ECHO: Local Modes. +-* ECHOCTL: Local Modes. +-* ECHOE: Local Modes. +-* ECHOK: Local Modes. +-* ECHOKE: Local Modes. +-* ECHONL: Local Modes. +-* ECHOPRT: Local Modes. +-* ECHRNG: Error Codes. +-* ECOMM: Error Codes. +-* ECONNABORTED: Error Codes. +-* ECONNREFUSED: Error Codes. +-* ECONNRESET: Error Codes. +-* ED: Error Codes. +-* EDEADLK: Error Codes. +-* EDEADLOCK: Error Codes. +-* EDESTADDRREQ: Error Codes. +-* EDIED: Error Codes. +-* EDOM: Error Codes. +-* EDOTDOT: Error Codes. +-* EDQUOT: Error Codes. +-* EEXIST: Error Codes. +-* EFAULT: Error Codes. +-* EFBIG: Error Codes. +-* EFTYPE: Error Codes. +-* EGRATUITOUS: Error Codes. +-* EGREGIOUS: Error Codes. +-* EHOSTDOWN: Error Codes. +-* EHOSTUNREACH: Error Codes. +-* EIDRM: Error Codes. +-* EIEIO: Error Codes. +-* EILSEQ: Error Codes. +-* EINPROGRESS: Error Codes. +-* EINTR: Error Codes. +-* EINVAL <1>: Line Control. +-* EINVAL: Error Codes. +-* EIO: Error Codes. +-* EISCONN: Error Codes. +-* EISDIR: Error Codes. +-* EISNAM: Error Codes. +-* EL2HLT: Error Codes. +-* EL2NSYNC: Error Codes. +-* EL3HLT: Error Codes. +-* EL3RST: Error Codes. +-* ELIBACC: Error Codes. +-* ELIBBAD: Error Codes. +-* ELIBEXEC: Error Codes. +-* ELIBMAX: Error Codes. +-* ELIBSCN: Error Codes. +-* ELNRNG: Error Codes. +-* ELOOP: Error Codes. +-* EMEDIUMTYPE: Error Codes. +-* EMFILE: Error Codes. +-* EMLINK: Error Codes. +-* EMPTY <1>: XPG Functions. +-* EMPTY: Manipulating the Database. +-* EMSGSIZE: Error Codes. +-* EMULTIHOP: Error Codes. +-* ENAMETOOLONG: Error Codes. +-* ENAVAIL: Error Codes. +-* ENEEDAUTH: Error Codes. +-* ENETDOWN: Error Codes. +-* ENETRESET: Error Codes. +-* ENETUNREACH: Error Codes. +-* ENFILE: Error Codes. +-* ENOANO: Error Codes. +-* ENOBUFS: Error Codes. +-* ENOCSI: Error Codes. +-* ENODATA: Error Codes. +-* ENODEV: Error Codes. +-* ENOENT: Error Codes. +-* ENOEXEC: Error Codes. +-* ENOLCK: Error Codes. +-* ENOLINK: Error Codes. +-* ENOMEDIUM: Error Codes. +-* ENOMEM: Error Codes. +-* ENOMSG: Error Codes. +-* ENONET: Error Codes. +-* ENOPKG: Error Codes. +-* ENOPROTOOPT: Error Codes. +-* ENOSPC: Error Codes. +-* ENOSR: Error Codes. +-* ENOSTR: Error Codes. +-* ENOSYS: Error Codes. +-* ENOTBLK: Error Codes. +-* ENOTCONN: Error Codes. +-* ENOTDIR: Error Codes. +-* ENOTEMPTY: Error Codes. +-* ENOTNAM: Error Codes. +-* ENOTSOCK: Error Codes. +-* ENOTSUP: Error Codes. +-* ENOTTY <1>: Line Control. +-* ENOTTY: Error Codes. +-* ENOTUNIQ: Error Codes. +-* environ: Environment Access. +-* ENXIO: Error Codes. +-* EOF: EOF and Errors. +-* EOPNOTSUPP: Error Codes. +-* EOVERFLOW: Error Codes. +-* EPERM: Error Codes. +-* EPFNOSUPPORT: Error Codes. +-* EPIPE: Error Codes. +-* EPROCLIM: Error Codes. +-* EPROCUNAVAIL: Error Codes. +-* EPROGMISMATCH: Error Codes. +-* EPROGUNAVAIL: Error Codes. +-* EPROTO: Error Codes. +-* EPROTONOSUPPORT: Error Codes. +-* EPROTOTYPE: Error Codes. +-* EQUIV_CLASS_MAX: Utility Limits. +-* ERA: The Elegant and Fast Way. +-* ERA_D_FMT: The Elegant and Fast Way. +-* ERA_D_T_FMT: The Elegant and Fast Way. +-* ERA_T_FMT: The Elegant and Fast Way. +-* ERA_YEAR: The Elegant and Fast Way. +-* ERANGE: Error Codes. +-* EREMCHG: Error Codes. +-* EREMOTE: Error Codes. +-* EREMOTEIO: Error Codes. +-* ERESTART: Error Codes. +-* EROFS: Error Codes. +-* ERPCMISMATCH: Error Codes. +-* errno: Checking for Errors. +-* error_message_count: Error Messages. +-* error_one_per_line: Error Messages. +-* error_print_progname: Error Messages. +-* ESHUTDOWN: Error Codes. +-* ESOCKTNOSUPPORT: Error Codes. +-* ESPIPE: Error Codes. +-* ESRCH: Error Codes. +-* ESRMNT: Error Codes. +-* ESTALE: Error Codes. +-* ESTRPIPE: Error Codes. +-* ethers: NSS Basics. +-* ETIME: Error Codes. +-* ETIMEDOUT: Error Codes. +-* ETOOMANYREFS: Error Codes. +-* ETXTBSY: Error Codes. +-* EUCLEAN: Error Codes. +-* EUNATCH: Error Codes. +-* EUSERS: Error Codes. +-* EWOULDBLOCK: Error Codes. +-* EXDEV: Error Codes. +-* EXFULL: Error Codes. +-* EXIT_FAILURE: Exit Status. +-* EXIT_SUCCESS: Exit Status. +-* EXPR_NEST_MAX: Utility Limits. +-* EXTA: Line Speed. +-* EXTB: Line Speed. +-* F_DUPFD: Duplicating Descriptors. +-* F_GETFD: Descriptor Flags. +-* F_GETFL: Getting File Status Flags. +-* F_GETLK: File Locks. +-* F_GETOWN: Interrupt Input. +-* F_OK: Testing File Access. +-* F_RDLCK: File Locks. +-* F_SETFD: Descriptor Flags. +-* F_SETFL: Getting File Status Flags. +-* F_SETLK: File Locks. +-* F_SETLKW: File Locks. +-* F_SETOWN: Interrupt Input. +-* F_UNLCK: File Locks. +-* F_WRLCK: File Locks. +-* FD_CLOEXEC: Descriptor Flags. +-* FD_SETSIZE: Waiting for I/O. +-* FE_DFL_ENV: Control Functions. +-* FE_DIVBYZERO: Status bit operations. +-* FE_DOWNWARD: Rounding. +-* FE_INEXACT: Status bit operations. +-* FE_INVALID: Status bit operations. +-* FE_NOMASK_ENV: Control Functions. +-* FE_OVERFLOW: Status bit operations. +-* FE_TONEAREST: Rounding. +-* FE_TOWARDZERO: Rounding. +-* FE_UNDERFLOW: Status bit operations. +-* FE_UPWARD: Rounding. +-* FILENAME_MAX: Limits for Files. +-* FLT_DIG: Floating Point Parameters. +-* FLT_EPSILON: Floating Point Parameters. +-* FLT_MANT_DIG: Floating Point Parameters. +-* FLT_MAX: Floating Point Parameters. +-* FLT_MAX_10_EXP: Floating Point Parameters. +-* FLT_MAX_EXP: Floating Point Parameters. +-* FLT_MIN: Floating Point Parameters. +-* FLT_MIN_10_EXP: Floating Point Parameters. +-* FLT_MIN_EXP: Floating Point Parameters. +-* FLT_RADIX: Floating Point Parameters. +-* FLT_ROUNDS: Floating Point Parameters. +-* FLUSHO: Local Modes. +-* FOPEN_MAX: Opening Streams. +-* FP_FAST_FMA: Misc FP Arithmetic. +-* FP_ILOGB0: Exponents and Logarithms. +-* FP_ILOGBNAN: Exponents and Logarithms. +-* FP_INFINITE: Floating Point Classes. +-* FP_NAN: Floating Point Classes. +-* FP_NORMAL: Floating Point Classes. +-* FP_SUBNORMAL: Floating Point Classes. +-* FP_ZERO: Floating Point Classes. +-* FPE_DECOVF_TRAP: Program Error Signals. +-* FPE_FLTDIV_TRAP: Program Error Signals. +-* FPE_FLTOVF_TRAP: Program Error Signals. +-* FPE_FLTUND_TRAP: Program Error Signals. +-* FPE_INTDIV_TRAP: Program Error Signals. +-* FPE_INTOVF_TRAP: Program Error Signals. +-* FPE_SUBRNG_TRAP: Program Error Signals. +-* FRAC_DIGITS: The Elegant and Fast Way. +-* FSETLOCKING_BYCALLER: Streams and Threads. +-* FSETLOCKING_INTERNAL: Streams and Threads. +-* FSETLOCKING_QUERY: Streams and Threads. +-* FSTAB: Mount Information. +-* FSTAB_RO: fstab. +-* FSTAB_RQ: fstab. +-* FSTAB_RW: fstab. +-* FSTAB_SW: fstab. +-* FSTAB_XX: fstab. +-* FTW_CHDIR: Working with Directory Trees. +-* FTW_D: Working with Directory Trees. +-* FTW_DEPTH: Working with Directory Trees. +-* FTW_DNR: Working with Directory Trees. +-* FTW_DP: Working with Directory Trees. +-* FTW_F: Working with Directory Trees. +-* FTW_MOUNT: Working with Directory Trees. +-* FTW_NS: Working with Directory Trees. +-* FTW_PHYS: Working with Directory Trees. +-* FTW_SL: Working with Directory Trees. +-* FTW_SLN: Working with Directory Trees. +-* getdate_err: General Time String Parsing. +-* GLOB_ABORTED: Calling Glob. +-* GLOB_ALTDIRFUNC: More Flags for Globbing. +-* GLOB_APPEND: Flags for Globbing. +-* GLOB_BRACE: More Flags for Globbing. +-* GLOB_DOOFFS: Flags for Globbing. +-* GLOB_ERR: Flags for Globbing. +-* GLOB_MAGCHAR: More Flags for Globbing. +-* GLOB_MARK: Flags for Globbing. +-* GLOB_NOCHECK: Flags for Globbing. +-* GLOB_NOESCAPE: Flags for Globbing. +-* GLOB_NOMAGIC: More Flags for Globbing. +-* GLOB_NOMATCH: Calling Glob. +-* GLOB_NOSORT: Flags for Globbing. +-* GLOB_NOSPACE: Calling Glob. +-* GLOB_ONLYDIR: More Flags for Globbing. +-* GLOB_PERIOD: More Flags for Globbing. +-* GLOB_TILDE: More Flags for Globbing. +-* GLOB_TILDE_CHECK: More Flags for Globbing. +-* group: NSS Basics. +-* GROUPING: The Elegant and Fast Way. +-* h_errno: Host Names. +-* HOST_NOT_FOUND: Host Names. +-* hosts: NSS Basics. +-* HUGE_VAL: Math Error Reporting. +-* HUGE_VALF: Math Error Reporting. +-* HUGE_VALL: Math Error Reporting. +-* HUPCL: Control Modes. +-* I: Complex Numbers. +-* ICANON: Local Modes. +-* ICRNL: Input Modes. +-* IEXTEN: Local Modes. +-* IFNAMSIZ: Interface Naming. +-* IGNBRK: Input Modes. +-* IGNCR: Input Modes. +-* IGNPAR: Input Modes. +-* IMAXBEL: Input Modes. +-* in6addr_any: Host Address Data Type. +-* in6addr_loopback: Host Address Data Type. +-* INADDR_ANY: Host Address Data Type. +-* INADDR_BROADCAST: Host Address Data Type. +-* INADDR_LOOPBACK: Host Address Data Type. +-* INADDR_NONE: Host Address Data Type. +-* INFINITY: Infinity and NaN. +-* INIT_PROCESS <1>: XPG Functions. +-* INIT_PROCESS: Manipulating the Database. +-* INLCR: Input Modes. +-* INPCK: Input Modes. +-* INT_CURR_SYMBOL: The Elegant and Fast Way. +-* INT_FRAC_DIGITS: The Elegant and Fast Way. +-* INT_MAX: Range of Type. +-* INT_MIN: Range of Type. +-* INT_N_CS_PRECEDES: The Elegant and Fast Way. +-* INT_N_SEP_BY_SPACE: The Elegant and Fast Way. +-* INT_N_SIGN_POSN: The Elegant and Fast Way. +-* INT_P_CS_PRECEDES: The Elegant and Fast Way. +-* INT_P_SEP_BY_SPACE: The Elegant and Fast Way. +-* INT_P_SIGN_POSN: The Elegant and Fast Way. +-* IPPORT_RESERVED: Ports. +-* IPPORT_USERRESERVED: Ports. +-* ISIG: Local Modes. +-* ISTRIP: Input Modes. +-* ITIMER_PROF: Setting an Alarm. +-* ITIMER_REAL: Setting an Alarm. +-* ITIMER_VIRTUAL: Setting an Alarm. +-* IXANY: Input Modes. +-* IXOFF: Input Modes. +-* IXON: Input Modes. +-* L_ctermid: Identifying the Terminal. +-* L_cuserid: Who Logged In. +-* L_INCR: File Positioning. +-* L_SET: File Positioning. +-* L_tmpnam: Temporary Files. +-* L_XTND: File Positioning. +-* LANG: Locale Categories. +-* LANGUAGE: Locale Categories. +-* LC_ALL: Locale Categories. +-* LC_COLLATE: Locale Categories. +-* LC_CTYPE: Locale Categories. +-* LC_MESSAGES: Locale Categories. +-* LC_MONETARY: Locale Categories. +-* LC_NUMERIC: Locale Categories. +-* LC_TIME: Locale Categories. +-* LDBL_DIG: Floating Point Parameters. +-* LDBL_EPSILON: Floating Point Parameters. +-* LDBL_MANT_DIG: Floating Point Parameters. +-* LDBL_MAX: Floating Point Parameters. +-* LDBL_MAX_10_EXP: Floating Point Parameters. +-* LDBL_MAX_EXP: Floating Point Parameters. +-* LDBL_MIN: Floating Point Parameters. +-* LDBL_MIN_10_EXP: Floating Point Parameters. +-* LDBL_MIN_EXP: Floating Point Parameters. +-* LINE_MAX: Utility Limits. +-* LINK_MAX: Limits for Files. +-* LIO_NOP: Asynchronous I/O. +-* LIO_READ: Asynchronous I/O. +-* LIO_WRITE: Asynchronous I/O. +-* LOG_ALERT: syslog; vsyslog. +-* LOG_AUTH: syslog; vsyslog. +-* LOG_AUTHPRIV: syslog; vsyslog. +-* LOG_CRIT: syslog; vsyslog. +-* LOG_CRON: syslog; vsyslog. +-* LOG_DAEMON: syslog; vsyslog. +-* LOG_DEBUG: syslog; vsyslog. +-* LOG_EMERG: syslog; vsyslog. +-* LOG_ERR: syslog; vsyslog. +-* LOG_FTP: syslog; vsyslog. +-* LOG_INFO: syslog; vsyslog. +-* LOG_LOCAL0: syslog; vsyslog. +-* LOG_LOCAL1: syslog; vsyslog. +-* LOG_LOCAL2: syslog; vsyslog. +-* LOG_LOCAL3: syslog; vsyslog. +-* LOG_LOCAL4: syslog; vsyslog. +-* LOG_LOCAL5: syslog; vsyslog. +-* LOG_LOCAL6: syslog; vsyslog. +-* LOG_LOCAL7: syslog; vsyslog. +-* LOG_LPR: syslog; vsyslog. +-* LOG_MAIL: syslog; vsyslog. +-* LOG_NEWS: syslog; vsyslog. +-* LOG_NOTICE: syslog; vsyslog. +-* LOG_SYSLOG: syslog; vsyslog. +-* LOG_USER: syslog; vsyslog. +-* LOG_UUCP: syslog; vsyslog. +-* LOG_WARNING: syslog; vsyslog. +-* LOGIN_PROCESS <1>: XPG Functions. +-* LOGIN_PROCESS: Manipulating the Database. +-* LONG_LONG_MAX: Range of Type. +-* LONG_LONG_MIN: Range of Type. +-* LONG_MAX: Range of Type. +-* LONG_MIN: Range of Type. +-* M_1_PI: Mathematical Constants. +-* M_2_PI: Mathematical Constants. +-* M_2_SQRTPI: Mathematical Constants. +-* M_E: Mathematical Constants. +-* M_LN10: Mathematical Constants. +-* M_LN2: Mathematical Constants. +-* M_LOG10E: Mathematical Constants. +-* M_LOG2E: Mathematical Constants. +-* M_PI: Mathematical Constants. +-* M_PI_2: Mathematical Constants. +-* M_PI_4: Mathematical Constants. +-* M_SQRT1_2: Mathematical Constants. +-* M_SQRT2: Mathematical Constants. +-* MAP_ANON: Memory-mapped I/O. +-* MAP_ANONYMOUS: Memory-mapped I/O. +-* MAP_FIXED: Memory-mapped I/O. +-* MAP_PRIVATE: Memory-mapped I/O. +-* MAP_SHARED: Memory-mapped I/O. +-* MAX_CANON: Limits for Files. +-* MAX_INPUT: Limits for Files. +-* MAXNAMLEN: Limits for Files. +-* MAXSYMLINKS: Symbolic Links. +-* MB_CUR_MAX: Selecting the Conversion. +-* MB_LEN_MAX: Selecting the Conversion. +-* MDMBUF: Control Modes. +-* MINSIGSTKSZ: Signal Stack. +-* MM_APPL: Printing Formatted Messages. +-* MM_CONSOLE: Printing Formatted Messages. +-* MM_ERROR: Printing Formatted Messages. +-* MM_FIRM: Printing Formatted Messages. +-* MM_HALT: Printing Formatted Messages. +-* MM_HARD: Printing Formatted Messages. +-* MM_INFO: Printing Formatted Messages. +-* MM_NOSEV: Printing Formatted Messages. +-* MM_NRECOV: Printing Formatted Messages. +-* MM_NULLACT: Printing Formatted Messages. +-* MM_NULLLBL: Printing Formatted Messages. +-* MM_NULLMC: Printing Formatted Messages. +-* MM_NULLSEV: Printing Formatted Messages. +-* MM_NULLTAG: Printing Formatted Messages. +-* MM_NULLTXT: Printing Formatted Messages. +-* MM_OPSYS: Printing Formatted Messages. +-* MM_PRINT: Printing Formatted Messages. +-* MM_RECOVER: Printing Formatted Messages. +-* MM_SOFT: Printing Formatted Messages. +-* MM_UTIL: Printing Formatted Messages. +-* MM_WARNING: Printing Formatted Messages. +-* MNTOPT_DEFAULTS: mtab. +-* MNTOPT_NOAUTO: mtab. +-* MNTOPT_NOSUID: mtab. +-* MNTOPT_RO: mtab. +-* MNTOPT_RW: mtab. +-* MNTOPT_SUID: mtab. +-* MNTTAB: Mount Information. +-* MNTTYPE_IGNORE: mtab. +-* MNTTYPE_NFS: mtab. +-* MNTTYPE_SWAP: mtab. +-* MON_1: The Elegant and Fast Way. +-* MON_10: The Elegant and Fast Way. +-* MON_11: The Elegant and Fast Way. +-* MON_12: The Elegant and Fast Way. +-* MON_2: The Elegant and Fast Way. +-* MON_3: The Elegant and Fast Way. +-* MON_4: The Elegant and Fast Way. +-* MON_5: The Elegant and Fast Way. +-* MON_6: The Elegant and Fast Way. +-* MON_7: The Elegant and Fast Way. +-* MON_8: The Elegant and Fast Way. +-* MON_9: The Elegant and Fast Way. +-* MON_DECIMAL_POINT: The Elegant and Fast Way. +-* MON_GROUPING: The Elegant and Fast Way. +-* MON_THOUSANDS_SEP: The Elegant and Fast Way. +-* MOUNTED: Mount Information. +-* MS_ASYNC: Memory-mapped I/O. +-* MS_SYNC: Memory-mapped I/O. +-* MSG_DONTROUTE: Socket Data Options. +-* MSG_OOB: Socket Data Options. +-* MSG_PEEK: Socket Data Options. +-* N_CS_PRECEDES: The Elegant and Fast Way. +-* N_SEP_BY_SPACE: The Elegant and Fast Way. +-* N_SIGN_POSN: The Elegant and Fast Way. +-* NAME_MAX: Limits for Files. +-* NAN: Infinity and NaN. +-* NCCS: Mode Data Types. +-* NDEBUG: Consistency Checking. +-* NEGATIVE_SIGN: The Elegant and Fast Way. +-* netgroup: NSS Basics. +-* networks: NSS Basics. +-* NEW_TIME <1>: XPG Functions. +-* NEW_TIME: Manipulating the Database. +-* NGROUPS_MAX: General Limits. +-* NL_ARGMAX: Output Conversion Syntax. +-* NO_ADDRESS: Host Names. +-* NO_RECOVERY: Host Names. +-* NOEXPR: The Elegant and Fast Way. +-* NOFLSH: Local Modes. +-* NOKERNINFO: Local Modes. +-* NOSTR: The Elegant and Fast Way. +-* NSIG: Standard Signals. +-* NSS_STATUS_NOTFOUND: NSS Modules Interface. +-* NSS_STATUS_SUCCESS: NSS Modules Interface. +-* NSS_STATUS_TRYAGAIN: NSS Modules Interface. +-* NSS_STATUS_UNAVAIL: NSS Modules Interface. +-* NULL: Null Pointer Constant. +-* O_ACCMODE: Access Modes. +-* O_APPEND: Operating Modes. +-* O_ASYNC: Operating Modes. +-* O_CREAT: Open-time Flags. +-* O_EXCL: Open-time Flags. +-* O_EXEC: Access Modes. +-* O_EXLOCK: Open-time Flags. +-* O_FSYNC: Operating Modes. +-* O_IGNORE_CTTY: Open-time Flags. +-* O_NDELAY: Operating Modes. +-* O_NOATIME: Operating Modes. +-* O_NOCTTY: Open-time Flags. +-* O_NOLINK: Open-time Flags. +-* O_NONBLOCK <1>: Operating Modes. +-* O_NONBLOCK: Open-time Flags. +-* O_NOTRANS: Open-time Flags. +-* O_RDONLY: Access Modes. +-* O_RDWR: Access Modes. +-* O_READ: Access Modes. +-* O_SHLOCK: Open-time Flags. +-* O_SYNC: Operating Modes. +-* O_TRUNC: Open-time Flags. +-* O_WRITE: Access Modes. +-* O_WRONLY: Access Modes. +-* obstack_alloc_failed_handler: Preparing for Obstacks. +-* OLD_TIME <1>: XPG Functions. +-* OLD_TIME: Manipulating the Database. +-* ONLCR: Output Modes. +-* ONOEOT: Output Modes. +-* OPEN_MAX: General Limits. +-* OPOST: Output Modes. +-* optarg: Using Getopt. +-* opterr: Using Getopt. +-* optind: Using Getopt. +-* OPTION_ALIAS: Argp Option Flags. +-* OPTION_ARG_OPTIONAL: Argp Option Flags. +-* OPTION_DOC: Argp Option Flags. +-* OPTION_HIDDEN: Argp Option Flags. +-* OPTION_NO_USAGE: Argp Option Flags. +-* optopt: Using Getopt. +-* OXTABS: Output Modes. +-* P_CS_PRECEDES: The Elegant and Fast Way. +-* P_SEP_BY_SPACE: The Elegant and Fast Way. +-* P_SIGN_POSN: The Elegant and Fast Way. +-* P_tmpdir: Temporary Files. +-* PA_CHAR: Parsing a Template String. +-* PA_DOUBLE: Parsing a Template String. +-* PA_FLAG_LONG: Parsing a Template String. +-* PA_FLAG_LONG_DOUBLE: Parsing a Template String. +-* PA_FLAG_LONG_LONG: Parsing a Template String. +-* PA_FLAG_MASK: Parsing a Template String. +-* PA_FLAG_PTR: Parsing a Template String. +-* PA_FLAG_SHORT: Parsing a Template String. +-* PA_FLOAT: Parsing a Template String. +-* PA_INT: Parsing a Template String. +-* PA_LAST: Parsing a Template String. +-* PA_POINTER: Parsing a Template String. +-* PA_STRING: Parsing a Template String. +-* PARENB: Control Modes. +-* PARMRK: Input Modes. +-* PARODD: Control Modes. +-* passwd: NSS Basics. +-* PATH_MAX: Limits for Files. +-* PENDIN: Local Modes. +-* PF_CCITT: Misc Namespaces. +-* PF_FILE: Local Namespace Details. +-* PF_IMPLINK: Misc Namespaces. +-* PF_INET: Internet Namespace. +-* PF_INET6: Internet Namespace. +-* PF_ISO: Misc Namespaces. +-* PF_LOCAL: Local Namespace Details. +-* PF_NS: Misc Namespaces. +-* PF_ROUTE: Misc Namespaces. +-* PF_UNIX: Local Namespace Details. +-* PI: Mathematical Constants. +-* PIPE_BUF: Limits for Files. +-* PM_STR: The Elegant and Fast Way. +-* POSITIVE_SIGN: The Elegant and Fast Way. +-* PRIO_MAX: Traditional Scheduling Functions. +-* PRIO_MIN: Traditional Scheduling Functions. +-* PRIO_PGRP: Traditional Scheduling Functions. +-* PRIO_PROCESS: Traditional Scheduling Functions. +-* PRIO_USER: Traditional Scheduling Functions. +-* program_invocation_name: Error Messages. +-* program_invocation_short_name: Error Messages. +-* PROT_EXEC: Memory-mapped I/O. +-* PROT_READ: Memory-mapped I/O. +-* PROT_WRITE: Memory-mapped I/O. +-* protocols: NSS Basics. +-* PWD: Working Directory. +-* R_OK: Testing File Access. +-* RADIXCHAR: The Elegant and Fast Way. +-* RAND_MAX: ISO Random. +-* RE_DUP_MAX: General Limits. +-* RLIM_INFINITY: Limits on Resources. +-* RLIM_NLIMITS: Limits on Resources. +-* RLIMIT_AS: Limits on Resources. +-* RLIMIT_CORE: Limits on Resources. +-* RLIMIT_CPU: Limits on Resources. +-* RLIMIT_DATA: Limits on Resources. +-* RLIMIT_FSIZE: Limits on Resources. +-* RLIMIT_NOFILE: Limits on Resources. +-* RLIMIT_OFILE: Limits on Resources. +-* RLIMIT_RSS: Limits on Resources. +-* RLIMIT_STACK: Limits on Resources. +-* rpc: NSS Basics. +-* RUN_LVL <1>: XPG Functions. +-* RUN_LVL: Manipulating the Database. +-* S_IEXEC: Permission Bits. +-* S_IFBLK: Testing File Type. +-* S_IFCHR: Testing File Type. +-* S_IFDIR: Testing File Type. +-* S_IFIFO: Testing File Type. +-* S_IFLNK: Testing File Type. +-* S_IFMT: Testing File Type. +-* S_IFREG: Testing File Type. +-* S_IFSOCK: Testing File Type. +-* S_IREAD: Permission Bits. +-* S_IRGRP: Permission Bits. +-* S_IROTH: Permission Bits. +-* S_IRUSR: Permission Bits. +-* S_IRWXG: Permission Bits. +-* S_IRWXO: Permission Bits. +-* S_IRWXU: Permission Bits. +-* S_ISGID: Permission Bits. +-* S_ISUID: Permission Bits. +-* S_ISVTX: Permission Bits. +-* S_IWGRP: Permission Bits. +-* S_IWOTH: Permission Bits. +-* S_IWRITE: Permission Bits. +-* S_IWUSR: Permission Bits. +-* S_IXGRP: Permission Bits. +-* S_IXOTH: Permission Bits. +-* S_IXUSR: Permission Bits. +-* SA_NOCLDSTOP: Flags for Sigaction. +-* SA_ONSTACK: Flags for Sigaction. +-* SA_RESTART: Flags for Sigaction. +-* SC_SSIZE_MAX: Constants for Sysconf. +-* SCHAR_MAX: Range of Type. +-* SCHAR_MIN: Range of Type. +-* SEEK_CUR: File Positioning. +-* SEEK_END: File Positioning. +-* SEEK_SET: File Positioning. +-* SEM_VALUE_MAX: POSIX Semaphores. +-* services: NSS Basics. +-* shadow: NSS Basics. +-* SHRT_MAX: Range of Type. +-* SHRT_MIN: Range of Type. +-* SIG_BLOCK: Process Signal Mask. +-* SIG_DFL: Basic Signal Handling. +-* SIG_ERR: Basic Signal Handling. +-* SIG_IGN: Basic Signal Handling. +-* SIG_SETMASK: Process Signal Mask. +-* SIG_UNBLOCK: Process Signal Mask. +-* SIGABRT: Program Error Signals. +-* SIGALRM: Alarm Signals. +-* SIGBUS: Program Error Signals. +-* SIGCHLD: Job Control Signals. +-* SIGCLD: Job Control Signals. +-* SIGCONT: Job Control Signals. +-* SIGEMT: Program Error Signals. +-* SIGFPE: Program Error Signals. +-* SIGHUP: Termination Signals. +-* SIGILL: Program Error Signals. +-* SIGINFO: Miscellaneous Signals. +-* SIGINT: Termination Signals. +-* SIGIO: Asynchronous I/O Signals. +-* SIGIOT: Program Error Signals. +-* SIGKILL: Termination Signals. +-* SIGLOST: Operation Error Signals. +-* signgam: Special Functions. +-* SIGPIPE: Operation Error Signals. +-* SIGPOLL: Asynchronous I/O Signals. +-* SIGPROF: Alarm Signals. +-* SIGQUIT: Termination Signals. +-* SIGSEGV: Program Error Signals. +-* SIGSTKSZ: Signal Stack. +-* SIGSTOP: Job Control Signals. +-* SIGSYS: Program Error Signals. +-* SIGTERM: Termination Signals. +-* SIGTRAP: Program Error Signals. +-* SIGTSTP: Job Control Signals. +-* SIGTTIN: Job Control Signals. +-* SIGTTOU: Job Control Signals. +-* SIGURG: Asynchronous I/O Signals. +-* SIGUSR1: Miscellaneous Signals. +-* SIGUSR2: Miscellaneous Signals. +-* SIGVTALRM: Alarm Signals. +-* SIGWINCH: Miscellaneous Signals. +-* SIGXCPU: Operation Error Signals. +-* SIGXFSZ: Operation Error Signals. +-* SOCK_DGRAM: Communication Styles. +-* SOCK_RAW: Communication Styles. +-* SOCK_STREAM: Communication Styles. +-* SOL_SOCKET: Socket-Level Options. +-* SS_DISABLE: Signal Stack. +-* SS_ONSTACK: Signal Stack. +-* SSIZE_MAX: General Limits. +-* stderr: Standard Streams. +-* STDERR_FILENO: Descriptors and Streams. +-* stdin: Standard Streams. +-* STDIN_FILENO: Descriptors and Streams. +-* stdout: Standard Streams. +-* STDOUT_FILENO: Descriptors and Streams. +-* STREAM_MAX: General Limits. +-* SV_INTERRUPT: BSD Handler. +-* SV_ONSTACK: BSD Handler. +-* SV_RESETHAND: BSD Handler. +-* sys_siglist: Signal Messages. +-* T_FMT: The Elegant and Fast Way. +-* T_FMT_AMPM: The Elegant and Fast Way. +-* TCIFLUSH: Line Control. +-* TCIOFF: Line Control. +-* TCIOFLUSH: Line Control. +-* TCION: Line Control. +-* TCOFLUSH: Line Control. +-* TCOOFF: Line Control. +-* TCOON: Line Control. +-* TCSADRAIN: Mode Functions. +-* TCSAFLUSH: Mode Functions. +-* TCSANOW: Mode Functions. +-* TCSASOFT: Mode Functions. +-* THOUSANDS_SEP: The Elegant and Fast Way. +-* THOUSEP: The Elegant and Fast Way. +-* timezone: Time Zone Functions. +-* TMP_MAX: Temporary Files. +-* TOSTOP: Local Modes. +-* TRY_AGAIN: Host Names. +-* tzname: Time Zone Functions. +-* TZNAME_MAX: General Limits. +-* UCHAR_MAX: Range of Type. +-* UINT_MAX: Range of Type. +-* ULONG_LONG_MAX: Range of Type. +-* ULONG_MAX: Range of Type. +-* USER_PROCESS <1>: XPG Functions. +-* USER_PROCESS: Manipulating the Database. +-* USHRT_MAX: Range of Type. +-* VDISCARD: Other Special. +-* VDSUSP: Signal Characters. +-* VEOF: Editing Characters. +-* VEOL: Editing Characters. +-* VEOL2: Editing Characters. +-* VERASE: Editing Characters. +-* VINTR: Signal Characters. +-* VKILL: Editing Characters. +-* VLNEXT: Other Special. +-* VMIN: Noncanonical Input. +-* VQUIT: Signal Characters. +-* VREPRINT: Editing Characters. +-* VSTART: Start/Stop Characters. +-* VSTATUS: Other Special. +-* VSTOP: Start/Stop Characters. +-* VSUSP: Signal Characters. +-* VTIME: Noncanonical Input. +-* VWERASE: Editing Characters. +-* W_OK: Testing File Access. +-* WCHAR_MAX <1>: Range of Type. +-* WCHAR_MAX: Extended Char Intro. +-* WCHAR_MIN: Extended Char Intro. +-* WEOF <1>: EOF and Errors. +-* WEOF: Extended Char Intro. +-* X_OK: Testing File Access. +-* YESEXPR: The Elegant and Fast Way. +-* YESSTR: The Elegant and Fast Way. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-61 glibc-2.3.2-200304020432/manual/libc.info-61 +--- glibc-2.3.2/manual/libc.info-61 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-61 Thu Jan 1 01:00:00 1970 +@@ -1,302 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: File Index, Prev: Variable Index, Up: Top +- +-Program and File Index +-********************** +- +-* Menu: +- +-* -lbsd-compat <1>: Process Group Functions. +-* -lbsd-compat: Feature Test Macros. +-* /etc/group: Group Database. +-* /etc/hosts: Host Names. +-* /etc/localtime: TZ Variable. +-* /etc/networks: Networks Database. +-* /etc/passwd: User Database. +-* /etc/protocols: Protocols Database. +-* /etc/services: Services Database. +-* /share/lib/zoneinfo: TZ Variable. +-* argp.h: Argp. +-* argz.h: Argz Functions. +-* arpa/inet.h: Host Address Functions. +-* assert.h: Consistency Checking. +-* bsd-compat <1>: Process Group Functions. +-* bsd-compat: Feature Test Macros. +-* cd: Working Directory. +-* chgrp: File Owner. +-* chown: File Owner. +-* complex.h <1>: Operations on Complex. +-* complex.h <2>: Complex Numbers. +-* complex.h: Mathematics. +-* ctype.h <1>: Case Conversion. +-* ctype.h <2>: Classification of Characters. +-* ctype.h: Character Handling. +-* dirent.h <1>: Random Access Directory. +-* dirent.h <2>: Reading/Closing Directory. +-* dirent.h <3>: Opening a Directory. +-* dirent.h <4>: Directory Entries. +-* dirent.h: Reserved Names. +-* envz.h: Envz Functions. +-* errno.h <1>: Error Codes. +-* errno.h <2>: Checking for Errors. +-* errno.h: Error Reporting. +-* execinfo.h: Backtraces. +-* fcntl.h <1>: Interrupt Input. +-* fcntl.h <2>: File Locks. +-* fcntl.h <3>: File Status Flags. +-* fcntl.h <4>: Descriptor Flags. +-* fcntl.h <5>: Duplicating Descriptors. +-* fcntl.h <6>: Control Operations. +-* fcntl.h <7>: Opening and Closing Files. +-* fcntl.h: Reserved Names. +-* float.h: Floating Point Parameters. +-* fnmatch.h: Wildcard Matching. +-* gcc: ISO C. +-* gconv.h: glibc iconv Implementation. +-* grp.h <1>: Group Data Structure. +-* grp.h <2>: Setting Groups. +-* grp.h: Reserved Names. +-* hostid: Host Identification. +-* hostname: Host Identification. +-* iconv.h: Generic Conversion Interface. +-* kill: Termination Signals. +-* ksh: Wildcard Matching. +-* langinfo.h: The Elegant and Fast Way. +-* limits.h <1>: Width of Type. +-* limits.h <2>: Limits for Files. +-* limits.h <3>: General Limits. +-* limits.h <4>: Selecting the Conversion. +-* limits.h: Reserved Names. +-* locale: Setting the Locale. +-* locale.h <1>: The Lame Way to Locale Data. +-* locale.h: Setting the Locale. +-* localtime: TZ Variable. +-* ls: File Attributes. +-* malloc.h <1>: Statistics of Malloc. +-* malloc.h <2>: Hooks for Malloc. +-* malloc.h: Malloc Tunable Parameters. +-* math.h <1>: Rounding Functions. +-* math.h <2>: Normalization Functions. +-* math.h <3>: Absolute Value. +-* math.h <4>: Floating Point Classes. +-* math.h: Mathematics. +-* mcheck.h: Heap Consistency Checking. +-* mkdir: Creating Directories. +-* netdb.h <1>: Networks Database. +-* netdb.h <2>: Protocols Database. +-* netdb.h <3>: Services Database. +-* netdb.h: Host Names. +-* netinet/in.h <1>: Byte Order. +-* netinet/in.h <2>: Ports. +-* netinet/in.h <3>: Host Address Data Type. +-* netinet/in.h: Internet Address Formats. +-* obstack.h: Creating Obstacks. +-* printf.h <1>: Conversion Specifier Options. +-* printf.h: Registering New Conversions. +-* pwd.h <1>: User Data Structure. +-* pwd.h: Reserved Names. +-* setjmp.h <1>: Non-Local Exits and Signals. +-* setjmp.h: Non-Local Details. +-* sh: Running a Command. +-* signal.h <1>: BSD Signal Handling. +-* signal.h <2>: Checking for Pending Signals. +-* signal.h <3>: Process Signal Mask. +-* signal.h <4>: Signal Sets. +-* signal.h <5>: Signaling Another Process. +-* signal.h <6>: Signaling Yourself. +-* signal.h <7>: Flags for Sigaction. +-* signal.h <8>: Advanced Signal Handling. +-* signal.h <9>: Basic Signal Handling. +-* signal.h <10>: Standard Signals. +-* signal.h: Reserved Names. +-* stdarg.h <1>: Argument Macros. +-* stdarg.h: Receiving Arguments. +-* stddef.h: Important Data Types. +-* stdint.h: Integers. +-* stdio.h <1>: Who Logged In. +-* stdio.h <2>: Identifying the Terminal. +-* stdio.h <3>: Signal Messages. +-* stdio.h <4>: Temporary Files. +-* stdio.h <5>: Deleting Files. +-* stdio.h <6>: Descriptors and Streams. +-* stdio.h <7>: Streams and Cookies. +-* stdio.h <8>: String Streams. +-* stdio.h <9>: Controlling Buffering. +-* stdio.h <10>: Flushing Buffers. +-* stdio.h <11>: Portable Positioning. +-* stdio.h <12>: File Positioning. +-* stdio.h <13>: Formatted Input Functions. +-* stdio.h <14>: Variable Arguments Output. +-* stdio.h <15>: Formatted Output Functions. +-* stdio.h <16>: Block Input/Output. +-* stdio.h <17>: Character Input. +-* stdio.h <18>: Simple Output. +-* stdio.h <19>: Opening Streams. +-* stdio.h <20>: Standard Streams. +-* stdio.h: Streams. +-* stdlib.h <1>: Running a Command. +-* stdlib.h <2>: Aborting a Program. +-* stdlib.h <3>: Exit Status. +-* stdlib.h <4>: Environment Access. +-* stdlib.h <5>: Parsing of Floats. +-* stdlib.h <6>: Parsing of Integers. +-* stdlib.h <7>: Absolute Value. +-* stdlib.h <8>: Integer Division. +-* stdlib.h <9>: SVID Random. +-* stdlib.h <10>: BSD Random. +-* stdlib.h <11>: ISO Random. +-* stdlib.h <12>: Allocation. +-* stdlib.h <13>: Array Sort Function. +-* stdlib.h <14>: Array Search Function. +-* stdlib.h <15>: Non-reentrant Character Conversion. +-* stdlib.h <16>: Selecting the Conversion. +-* stdlib.h <17>: Variable Size Automatic. +-* stdlib.h <18>: Aligned Memory Blocks. +-* stdlib.h <19>: Allocating Cleared Space. +-* stdlib.h <20>: Changing Block Size. +-* stdlib.h <21>: Freeing after Malloc. +-* stdlib.h: Basic Allocation. +-* string.h <1>: Signal Messages. +-* string.h <2>: Trivial Encryption. +-* string.h <3>: Finding Tokens in a String. +-* string.h <4>: Search Functions. +-* string.h <5>: Collation Functions. +-* string.h <6>: String/Array Comparison. +-* string.h <7>: Copying and Concatenation. +-* string.h: String Length. +-* sys/param.h: Host Identification. +-* sys/resource.h <1>: Traditional Scheduling Functions. +-* sys/resource.h <2>: Limits on Resources. +-* sys/resource.h: Resource Usage. +-* sys/socket.h <1>: Socket-Level Options. +-* sys/socket.h <2>: Socket Option Functions. +-* sys/socket.h <3>: Sending Datagrams. +-* sys/socket.h <4>: Socket Data Options. +-* sys/socket.h <5>: Receiving Data. +-* sys/socket.h <6>: Sending Data. +-* sys/socket.h <7>: Socket Pairs. +-* sys/socket.h <8>: Closing a Socket. +-* sys/socket.h <9>: Creating a Socket. +-* sys/socket.h <10>: Internet Namespace. +-* sys/socket.h <11>: Local Namespace Details. +-* sys/socket.h <12>: Reading Address. +-* sys/socket.h <13>: Setting Address. +-* sys/socket.h <14>: Address Formats. +-* sys/socket.h: Communication Styles. +-* sys/stat.h <1>: FIFO Special Files. +-* sys/stat.h <2>: Making Special Files. +-* sys/stat.h <3>: Setting Permissions. +-* sys/stat.h <4>: Permission Bits. +-* sys/stat.h <5>: Testing File Type. +-* sys/stat.h <6>: Attribute Meanings. +-* sys/stat.h <7>: Creating Directories. +-* sys/stat.h: Reserved Names. +-* sys/time.h <1>: Setting an Alarm. +-* sys/time.h <2>: High-Resolution Calendar. +-* sys/time.h: File Times. +-* sys/times.h <1>: Processor Time. +-* sys/times.h: Reserved Names. +-* sys/timex.h: High Accuracy Clock. +-* sys/types.h <1>: Setting Groups. +-* sys/types.h <2>: Setting User ID. +-* sys/types.h <3>: Reading Persona. +-* sys/types.h <4>: Terminal Access Functions. +-* sys/types.h <5>: Process Group Functions. +-* sys/types.h <6>: Process Identification. +-* sys/types.h: Waiting for I/O. +-* sys/un.h: Local Namespace Details. +-* sys/utsname.h: Platform Type. +-* sys/vlimit.h: Limits on Resources. +-* sys/vtimes.h: Resource Usage. +-* sys/wait.h <1>: BSD Wait Functions. +-* sys/wait.h <2>: Process Completion Status. +-* sys/wait.h: Process Completion. +-* termios.h <1>: Terminal Modes. +-* termios.h: Reserved Names. +-* time.h <1>: TZ Variable. +-* time.h <2>: Formatting Calendar Time. +-* time.h <3>: Simple Calendar Time. +-* time.h <4>: CPU Time. +-* time.h: File Times. +-* ulimit.h: Limits on Resources. +-* umask: Setting Permissions. +-* unistd.h <1>: Options for Files. +-* unistd.h <2>: System Options. +-* unistd.h <3>: Host Identification. +-* unistd.h <4>: Who Logged In. +-* unistd.h <5>: Setting Groups. +-* unistd.h <6>: Setting User ID. +-* unistd.h <7>: Reading Persona. +-* unistd.h <8>: Terminal Access Functions. +-* unistd.h <9>: Process Group Functions. +-* unistd.h <10>: Executing a File. +-* unistd.h <11>: Creating a Process. +-* unistd.h <12>: Process Identification. +-* unistd.h <13>: Termination Internals. +-* unistd.h <14>: Using Getopt. +-* unistd.h <15>: Setting an Alarm. +-* unistd.h <16>: Is It a Terminal. +-* unistd.h <17>: Creating a Pipe. +-* unistd.h <18>: Testing File Access. +-* unistd.h <19>: File Owner. +-* unistd.h <20>: Deleting Files. +-* unistd.h <21>: Symbolic Links. +-* unistd.h <22>: Hard Links. +-* unistd.h <23>: Working Directory. +-* unistd.h <24>: Duplicating Descriptors. +-* unistd.h <25>: Descriptors and Streams. +-* unistd.h <26>: I/O Primitives. +-* unistd.h: Opening and Closing Files. +-* utime.h: File Times. +-* utmp.h <1>: Logging In and Out. +-* utmp.h: Manipulating the Database. +-* utmpx.h: XPG Functions. +-* varargs.h: Old Varargs. +-* wchar.h <1>: Parsing of Integers. +-* wchar.h <2>: Character Input. +-* wchar.h <3>: Simple Output. +-* wchar.h <4>: Converting Strings. +-* wchar.h <5>: Converting a Character. +-* wchar.h <6>: Keeping the state. +-* wchar.h <7>: Extended Char Intro. +-* wchar.h <8>: Collation Functions. +-* wchar.h: Copying and Concatenation. +-* wctype.h <1>: Wide Character Case Conversion. +-* wctype.h: Classification of Wide Characters. +-* zoneinfo: TZ Variable. +- +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-7 glibc-2.3.2-200304020432/manual/libc.info-7 +--- glibc-2.3.2/manual/libc.info-7 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-7 Thu Jan 1 01:00:00 1970 +@@ -1,1131 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Copying and Concatenation, Next: String/Array Comparison, Prev: String Length, Up: String and Array Utilities +- +-Copying and Concatenation +-========================= +- +- You can use the functions described in this section to copy the +-contents of strings and arrays, or to append the contents of one string +-to another. The `str' and `mem' functions are declared in the header +-file `string.h' while the `wstr' and `wmem' functions are declared in +-the file `wchar.h'. +- +- A helpful way to remember the ordering of the arguments to the +-functions in this section is that it corresponds to an assignment +-expression, with the destination array specified to the left of the +-source array. All of these functions return the address of the +-destination array. +- +- Most of these functions do not work properly if the source and +-destination arrays overlap. For example, if the beginning of the +-destination array overlaps the end of the source array, the original +-contents of that part of the source array may get overwritten before it +-is copied. Even worse, in the case of the string functions, the null +-character marking the end of the string may be lost, and the copy +-function might get stuck in a loop trashing all the memory allocated to +-your program. +- +- All functions that have problems copying between overlapping arrays +-are explicitly identified in this manual. In addition to functions in +-this section, there are a few others like `sprintf' (*note Formatted +-Output Functions::) and `scanf' (*note Formatted Input Functions::). +- +- - Function: void * memcpy (void *restrict TO, const void *restrict +- FROM, size_t SIZE) +- The `memcpy' function copies SIZE bytes from the object beginning +- at FROM into the object beginning at TO. The behavior of this +- function is undefined if the two arrays TO and FROM overlap; use +- `memmove' instead if overlapping is possible. +- +- The value returned by `memcpy' is the value of TO. +- +- Here is an example of how you might use `memcpy' to copy the +- contents of an array: +- +- struct foo *oldarray, *newarray; +- int arraysize; +- ... +- memcpy (new, old, arraysize * sizeof (struct foo)); +- +- - Function: wchar_t * wmemcpy (wchar_t *restrict WTO, const wchar_t +- *restruct WFROM, size_t SIZE) +- The `wmemcpy' function copies SIZE wide characters from the object +- beginning at WFROM into the object beginning at WTO. The behavior +- of this function is undefined if the two arrays WTO and WFROM +- overlap; use `wmemmove' instead if overlapping is possible. +- +- The following is a possible implementation of `wmemcpy' but there +- are more optimizations possible. +- +- wchar_t * +- wmemcpy (wchar_t *restrict wto, const wchar_t *restrict wfrom, +- size_t size) +- { +- return (wchar_t *) memcpy (wto, wfrom, size * sizeof (wchar_t)); +- } +- +- The value returned by `wmemcpy' is the value of WTO. +- +- This function was introduced in Amendment 1 to ISO C90. +- +- - Function: void * mempcpy (void *restrict TO, const void *restrict +- FROM, size_t SIZE) +- The `mempcpy' function is nearly identical to the `memcpy' +- function. It copies SIZE bytes from the object beginning at +- `from' into the object pointed to by TO. But instead of returning +- the value of TO it returns a pointer to the byte following the +- last written byte in the object beginning at TO. I.e., the value +- is `((void *) ((char *) TO + SIZE))'. +- +- This function is useful in situations where a number of objects +- shall be copied to consecutive memory positions. +- +- void * +- combine (void *o1, size_t s1, void *o2, size_t s2) +- { +- void *result = malloc (s1 + s2); +- if (result != NULL) +- mempcpy (mempcpy (result, o1, s1), o2, s2); +- return result; +- } +- +- This function is a GNU extension. +- +- - Function: wchar_t * wmempcpy (wchar_t *restrict WTO, const wchar_t +- *restrict WFROM, size_t SIZE) +- The `wmempcpy' function is nearly identical to the `wmemcpy' +- function. It copies SIZE wide characters from the object +- beginning at `wfrom' into the object pointed to by WTO. But +- instead of returning the value of WTO it returns a pointer to the +- wide character following the last written wide character in the +- object beginning at WTO. I.e., the value is `WTO + SIZE'. +- +- This function is useful in situations where a number of objects +- shall be copied to consecutive memory positions. +- +- The following is a possible implementation of `wmemcpy' but there +- are more optimizations possible. +- +- wchar_t * +- wmempcpy (wchar_t *restrict wto, const wchar_t *restrict wfrom, +- size_t size) +- { +- return (wchar_t *) mempcpy (wto, wfrom, size * sizeof (wchar_t)); +- } +- +- This function is a GNU extension. +- +- - Function: void * memmove (void *TO, const void *FROM, size_t SIZE) +- `memmove' copies the SIZE bytes at FROM into the SIZE bytes at TO, +- even if those two blocks of space overlap. In the case of +- overlap, `memmove' is careful to copy the original values of the +- bytes in the block at FROM, including those bytes which also +- belong to the block at TO. +- +- The value returned by `memmove' is the value of TO. +- +- - Function: wchar_t * wmemmove (wchar *WTO, const wchar_t *WFROM, +- size_t SIZE) +- `wmemmove' copies the SIZE wide characters at WFROM into the SIZE +- wide characters at WTO, even if those two blocks of space overlap. +- In the case of overlap, `memmove' is careful to copy the original +- values of the wide characters in the block at WFROM, including +- those wide characters which also belong to the block at WTO. +- +- The following is a possible implementation of `wmemcpy' but there +- are more optimizations possible. +- +- wchar_t * +- wmempcpy (wchar_t *restrict wto, const wchar_t *restrict wfrom, +- size_t size) +- { +- return (wchar_t *) mempcpy (wto, wfrom, size * sizeof (wchar_t)); +- } +- +- The value returned by `wmemmove' is the value of WTO. +- +- This function is a GNU extension. +- +- - Function: void * memccpy (void *restrict TO, const void *restrict +- FROM, int C, size_t SIZE) +- This function copies no more than SIZE bytes from FROM to TO, +- stopping if a byte matching C is found. The return value is a +- pointer into TO one byte past where C was copied, or a null +- pointer if no byte matching C appeared in the first SIZE bytes of +- FROM. +- +- - Function: void * memset (void *BLOCK, int C, size_t SIZE) +- This function copies the value of C (converted to an `unsigned +- char') into each of the first SIZE bytes of the object beginning +- at BLOCK. It returns the value of BLOCK. +- +- - Function: wchar_t * wmemset (wchar_t *BLOCK, wchar_t WC, size_t SIZE) +- This function copies the value of WC into each of the first SIZE +- wide characters of the object beginning at BLOCK. It returns the +- value of BLOCK. +- +- - Function: char * strcpy (char *restrict TO, const char *restrict +- FROM) +- This copies characters from the string FROM (up to and including +- the terminating null character) into the string TO. Like +- `memcpy', this function has undefined results if the strings +- overlap. The return value is the value of TO. +- +- - Function: wchar_t * wcscpy (wchar_t *restrict WTO, const wchar_t +- *restrict WFROM) +- This copies wide characters from the string WFROM (up to and +- including the terminating null wide character) into the string +- WTO. Like `wmemcpy', this function has undefined results if the +- strings overlap. The return value is the value of WTO. +- +- - Function: char * strncpy (char *restrict TO, const char *restrict +- FROM, size_t SIZE) +- This function is similar to `strcpy' but always copies exactly +- SIZE characters into TO. +- +- If the length of FROM is more than SIZE, then `strncpy' copies +- just the first SIZE characters. Note that in this case there is +- no null terminator written into TO. +- +- If the length of FROM is less than SIZE, then `strncpy' copies all +- of FROM, followed by enough null characters to add up to SIZE +- characters in all. This behavior is rarely useful, but it is +- specified by the ISO C standard. +- +- The behavior of `strncpy' is undefined if the strings overlap. +- +- Using `strncpy' as opposed to `strcpy' is a way to avoid bugs +- relating to writing past the end of the allocated space for TO. +- However, it can also make your program much slower in one common +- case: copying a string which is probably small into a potentially +- large buffer. In this case, SIZE may be large, and when it is, +- `strncpy' will waste a considerable amount of time copying null +- characters. +- +- - Function: wchar_t * wcsncpy (wchar_t *restrict WTO, const wchar_t +- *restrict WFROM, size_t SIZE) +- This function is similar to `wcscpy' but always copies exactly +- SIZE wide characters into WTO. +- +- If the length of WFROM is more than SIZE, then `wcsncpy' copies +- just the first SIZE wide characters. Note that in this case there +- is no null terminator written into WTO. +- +- If the length of WFROM is less than SIZE, then `wcsncpy' copies +- all of WFROM, followed by enough null wide characters to add up to +- SIZE wide characters in all. This behavior is rarely useful, but +- it is specified by the ISO C standard. +- +- The behavior of `wcsncpy' is undefined if the strings overlap. +- +- Using `wcsncpy' as opposed to `wcscpy' is a way to avoid bugs +- relating to writing past the end of the allocated space for WTO. +- However, it can also make your program much slower in one common +- case: copying a string which is probably small into a potentially +- large buffer. In this case, SIZE may be large, and when it is, +- `wcsncpy' will waste a considerable amount of time copying null +- wide characters. +- +- - Function: char * strdup (const char *S) +- This function copies the null-terminated string S into a newly +- allocated string. The string is allocated using `malloc'; see +- *Note Unconstrained Allocation::. If `malloc' cannot allocate +- space for the new string, `strdup' returns a null pointer. +- Otherwise it returns a pointer to the new string. +- +- - Function: wchar_t * wcsdup (const wchar_t *WS) +- This function copies the null-terminated wide character string WS +- into a newly allocated string. The string is allocated using +- `malloc'; see *Note Unconstrained Allocation::. If `malloc' +- cannot allocate space for the new string, `wcsdup' returns a null +- pointer. Otherwise it returns a pointer to the new wide character +- string. +- +- This function is a GNU extension. +- +- - Function: char * strndup (const char *S, size_t SIZE) +- This function is similar to `strdup' but always copies at most +- SIZE characters into the newly allocated string. +- +- If the length of S is more than SIZE, then `strndup' copies just +- the first SIZE characters and adds a closing null terminator. +- Otherwise all characters are copied and the string is terminated. +- +- This function is different to `strncpy' in that it always +- terminates the destination string. +- +- `strndup' is a GNU extension. +- +- - Function: char * stpcpy (char *restrict TO, const char *restrict +- FROM) +- This function is like `strcpy', except that it returns a pointer to +- the end of the string TO (that is, the address of the terminating +- null character `to + strlen (from)') rather than the beginning. +- +- For example, this program uses `stpcpy' to concatenate `foo' and +- `bar' to produce `foobar', which it then prints. +- +- #include +- #include +- +- int +- main (void) +- { +- char buffer[10]; +- char *to = buffer; +- to = stpcpy (to, "foo"); +- to = stpcpy (to, "bar"); +- puts (buffer); +- return 0; +- } +- +- This function is not part of the ISO or POSIX standards, and is not +- customary on Unix systems, but we did not invent it either. +- Perhaps it comes from MS-DOG. +- +- Its behavior is undefined if the strings overlap. The function is +- declared in `string.h'. +- +- - Function: wchar_t * wcpcpy (wchar_t *restrict WTO, const wchar_t +- *restrict WFROM) +- This function is like `wcscpy', except that it returns a pointer to +- the end of the string WTO (that is, the address of the terminating +- null character `wto + strlen (wfrom)') rather than the beginning. +- +- This function is not part of ISO or POSIX but was found useful +- while developing the GNU C Library itself. +- +- The behavior of `wcpcpy' is undefined if the strings overlap. +- +- `wcpcpy' is a GNU extension and is declared in `wchar.h'. +- +- - Function: char * stpncpy (char *restrict TO, const char *restrict +- FROM, size_t SIZE) +- This function is similar to `stpcpy' but copies always exactly +- SIZE characters into TO. +- +- If the length of FROM is more then SIZE, then `stpncpy' copies +- just the first SIZE characters and returns a pointer to the +- character directly following the one which was copied last. Note +- that in this case there is no null terminator written into TO. +- +- If the length of FROM is less than SIZE, then `stpncpy' copies all +- of FROM, followed by enough null characters to add up to SIZE +- characters in all. This behavior is rarely useful, but it is +- implemented to be useful in contexts where this behavior of the +- `strncpy' is used. `stpncpy' returns a pointer to the _first_ +- written null character. +- +- This function is not part of ISO or POSIX but was found useful +- while developing the GNU C Library itself. +- +- Its behavior is undefined if the strings overlap. The function is +- declared in `string.h'. +- +- - Function: wchar_t * wcpncpy (wchar_t *restrict WTO, const wchar_t +- *restrict WFROM, size_t SIZE) +- This function is similar to `wcpcpy' but copies always exactly +- WSIZE characters into WTO. +- +- If the length of WFROM is more then SIZE, then `wcpncpy' copies +- just the first SIZE wide characters and returns a pointer to the +- wide character directly following the one which was copied last. +- Note that in this case there is no null terminator written into +- WTO. +- +- If the length of WFROM is less than SIZE, then `wcpncpy' copies +- all of WFROM, followed by enough null characters to add up to SIZE +- characters in all. This behavior is rarely useful, but it is +- implemented to be useful in contexts where this behavior of the +- `wcsncpy' is used. `wcpncpy' returns a pointer to the _first_ +- written null character. +- +- This function is not part of ISO or POSIX but was found useful +- while developing the GNU C Library itself. +- +- Its behavior is undefined if the strings overlap. +- +- `wcpncpy' is a GNU extension and is declared in `wchar.h'. +- +- - Macro: char * strdupa (const char *S) +- This macro is similar to `strdup' but allocates the new string +- using `alloca' instead of `malloc' (*note Variable Size +- Automatic::). This means of course the returned string has the +- same limitations as any block of memory allocated using `alloca'. +- +- For obvious reasons `strdupa' is implemented only as a macro; you +- cannot get the address of this function. Despite this limitation +- it is a useful function. The following code shows a situation +- where using `malloc' would be a lot more expensive. +- +- #include +- #include +- #include +- +- const char path[] = _PATH_STDPATH; +- +- int +- main (void) +- { +- char *wr_path = strdupa (path); +- char *cp = strtok (wr_path, ":"); +- +- while (cp != NULL) +- { +- puts (cp); +- cp = strtok (NULL, ":"); +- } +- return 0; +- } +- +- Please note that calling `strtok' using PATH directly is invalid. +- It is also not allowed to call `strdupa' in the argument list of +- `strtok' since `strdupa' uses `alloca' (*note Variable Size +- Automatic::) can interfere with the parameter passing. +- +- This function is only available if GNU CC is used. +- +- - Macro: char * strndupa (const char *S, size_t SIZE) +- This function is similar to `strndup' but like `strdupa' it +- allocates the new string using `alloca' *note Variable Size +- Automatic::. The same advantages and limitations of `strdupa' are +- valid for `strndupa', too. +- +- This function is implemented only as a macro, just like `strdupa'. +- Just as `strdupa' this macro also must not be used inside the +- parameter list in a function call. +- +- `strndupa' is only available if GNU CC is used. +- +- - Function: char * strcat (char *restrict TO, const char *restrict +- FROM) +- The `strcat' function is similar to `strcpy', except that the +- characters from FROM are concatenated or appended to the end of +- TO, instead of overwriting it. That is, the first character from +- FROM overwrites the null character marking the end of TO. +- +- An equivalent definition for `strcat' would be: +- +- char * +- strcat (char *restrict to, const char *restrict from) +- { +- strcpy (to + strlen (to), from); +- return to; +- } +- +- This function has undefined results if the strings overlap. +- +- - Function: wchar_t * wcscat (wchar_t *restrict WTO, const wchar_t +- *restrict WFROM) +- The `wcscat' function is similar to `wcscpy', except that the +- characters from WFROM are concatenated or appended to the end of +- WTO, instead of overwriting it. That is, the first character from +- WFROM overwrites the null character marking the end of WTO. +- +- An equivalent definition for `wcscat' would be: +- +- wchar_t * +- wcscat (wchar_t *wto, const wchar_t *wfrom) +- { +- wcscpy (wto + wcslen (wto), wfrom); +- return wto; +- } +- +- This function has undefined results if the strings overlap. +- +- Programmers using the `strcat' or `wcscat' function (or the +-following `strncat' or `wcsncar' functions for that matter) can easily +-be recognized as lazy and reckless. In almost all situations the +-lengths of the participating strings are known (it better should be +-since how can one otherwise ensure the allocated size of the buffer is +-sufficient?) Or at least, one could know them if one keeps track of the +-results of the various function calls. But then it is very inefficient +-to use `strcat'/`wcscat'. A lot of time is wasted finding the end of +-the destination string so that the actual copying can start. This is a +-common example: +- +- /* This function concatenates arbitrarily many strings. The last +- parameter must be `NULL'. */ +- char * +- concat (const char *str, ...) +- { +- va_list ap, ap2; +- size_t total = 1; +- const char *s; +- char *result; +- +- va_start (ap, str); +- /* Actually `va_copy', but this is the name more gcc versions +- understand. */ +- __va_copy (ap2, ap); +- +- /* Determine how much space we need. */ +- for (s = str; s != NULL; s = va_arg (ap, const char *)) +- total += strlen (s); +- +- va_end (ap); +- +- result = (char *) malloc (total); +- if (result != NULL) +- { +- result[0] = '\0'; +- +- /* Copy the strings. */ +- for (s = str; s != NULL; s = va_arg (ap2, const char *)) +- strcat (result, s); +- } +- +- va_end (ap2); +- +- return result; +- } +- +- This looks quite simple, especially the second loop where the strings +-are actually copied. But these innocent lines hide a major performance +-penalty. Just imagine that ten strings of 100 bytes each have to be +-concatenated. For the second string we search the already stored 100 +-bytes for the end of the string so that we can append the next string. +-For all strings in total the comparisons necessary to find the end of +-the intermediate results sums up to 5500! If we combine the copying +-with the search for the allocation we can write this function more +-efficient: +- +- char * +- concat (const char *str, ...) +- { +- va_list ap; +- size_t allocated = 100; +- char *result = (char *) malloc (allocated); +- char *wp; +- +- if (allocated != NULL) +- { +- char *newp; +- +- va_start (ap, atr); +- +- wp = result; +- for (s = str; s != NULL; s = va_arg (ap, const char *)) +- { +- size_t len = strlen (s); +- +- /* Resize the allocated memory if necessary. */ +- if (wp + len + 1 > result + allocated) +- { +- allocated = (allocated + len) * 2; +- newp = (char *) realloc (result, allocated); +- if (newp == NULL) +- { +- free (result); +- return NULL; +- } +- wp = newp + (wp - result); +- result = newp; +- } +- +- wp = mempcpy (wp, s, len); +- } +- +- /* Terminate the result string. */ +- *wp++ = '\0'; +- +- /* Resize memory to the optimal size. */ +- newp = realloc (result, wp - result); +- if (newp != NULL) +- result = newp; +- +- va_end (ap); +- } +- +- return result; +- } +- +- With a bit more knowledge about the input strings one could fine-tune +-the memory allocation. The difference we are pointing to here is that +-we don't use `strcat' anymore. We always keep track of the length of +-the current intermediate result so we can safe us the search for the +-end of the string and use `mempcpy'. Please note that we also don't +-use `stpcpy' which might seem more natural since we handle with +-strings. But this is not necessary since we already know the length of +-the string and therefore can use the faster memory copying function. +-The example would work for wide characters the same way. +- +- Whenever a programmer feels the need to use `strcat' she or he +-should think twice and look through the program whether the code cannot +-be rewritten to take advantage of already calculated results. Again: it +-is almost always unnecessary to use `strcat'. +- +- - Function: char * strncat (char *restrict TO, const char *restrict +- FROM, size_t SIZE) +- This function is like `strcat' except that not more than SIZE +- characters from FROM are appended to the end of TO. A single null +- character is also always appended to TO, so the total allocated +- size of TO must be at least `SIZE + 1' bytes longer than its +- initial length. +- +- The `strncat' function could be implemented like this: +- +- char * +- strncat (char *to, const char *from, size_t size) +- { +- to[strlen (to) + size] = '\0'; +- strncpy (to + strlen (to), from, size); +- return to; +- } +- +- The behavior of `strncat' is undefined if the strings overlap. +- +- - Function: wchar_t * wcsncat (wchar_t *restrict WTO, const wchar_t +- *restrict WFROM, size_t SIZE) +- This function is like `wcscat' except that not more than SIZE +- characters from FROM are appended to the end of TO. A single null +- character is also always appended to TO, so the total allocated +- size of TO must be at least `SIZE + 1' bytes longer than its +- initial length. +- +- The `wcsncat' function could be implemented like this: +- +- wchar_t * +- wcsncat (wchar_t *restrict wto, const wchar_t *restrict wfrom, +- size_t size) +- { +- wto[wcslen (to) + size] = L'\0'; +- wcsncpy (wto + wcslen (wto), wfrom, size); +- return wto; +- } +- +- The behavior of `wcsncat' is undefined if the strings overlap. +- +- Here is an example showing the use of `strncpy' and `strncat' (the +-wide character version is equivalent). Notice how, in the call to +-`strncat', the SIZE parameter is computed to avoid overflowing the +-character array `buffer'. +- +- #include +- #include +- +- #define SIZE 10 +- +- static char buffer[SIZE]; +- +- main () +- { +- strncpy (buffer, "hello", SIZE); +- puts (buffer); +- strncat (buffer, ", world", SIZE - strlen (buffer) - 1); +- puts (buffer); +- } +- +-The output produced by this program looks like: +- +- hello +- hello, wo +- +- - Function: void bcopy (const void *FROM, void *TO, size_t SIZE) +- This is a partially obsolete alternative for `memmove', derived +- from BSD. Note that it is not quite equivalent to `memmove', +- because the arguments are not in the same order and there is no +- return value. +- +- - Function: void bzero (void *BLOCK, size_t SIZE) +- This is a partially obsolete alternative for `memset', derived from +- BSD. Note that it is not as general as `memset', because the only +- value it can store is zero. +- +- +-File: libc.info, Node: String/Array Comparison, Next: Collation Functions, Prev: Copying and Concatenation, Up: String and Array Utilities +- +-String/Array Comparison +-======================= +- +- You can use the functions in this section to perform comparisons on +-the contents of strings and arrays. As well as checking for equality, +-these functions can also be used as the ordering functions for sorting +-operations. *Note Searching and Sorting::, for an example of this. +- +- Unlike most comparison operations in C, the string comparison +-functions return a nonzero value if the strings are _not_ equivalent +-rather than if they are. The sign of the value indicates the relative +-ordering of the first characters in the strings that are not +-equivalent: a negative value indicates that the first string is "less" +-than the second, while a positive value indicates that the first string +-is "greater". +- +- The most common use of these functions is to check only for equality. +-This is canonically done with an expression like `! strcmp (s1, s2)'. +- +- All of these functions are declared in the header file `string.h'. +- +- - Function: int memcmp (const void *A1, const void *A2, size_t SIZE) +- The function `memcmp' compares the SIZE bytes of memory beginning +- at A1 against the SIZE bytes of memory beginning at A2. The value +- returned has the same sign as the difference between the first +- differing pair of bytes (interpreted as `unsigned char' objects, +- then promoted to `int'). +- +- If the contents of the two blocks are equal, `memcmp' returns `0'. +- +- - Function: int wmemcmp (const wchar_t *A1, const wchar_t *A2, size_t +- SIZE) +- The function `wmemcmp' compares the SIZE wide characters beginning +- at A1 against the SIZE wide characters beginning at A2. The value +- returned is smaller than or larger than zero depending on whether +- the first differing wide character is A1 is smaller or larger than +- the corresponding character in A2. +- +- If the contents of the two blocks are equal, `wmemcmp' returns `0'. +- +- On arbitrary arrays, the `memcmp' function is mostly useful for +-testing equality. It usually isn't meaningful to do byte-wise ordering +-comparisons on arrays of things other than bytes. For example, a +-byte-wise comparison on the bytes that make up floating-point numbers +-isn't likely to tell you anything about the relationship between the +-values of the floating-point numbers. +- +- `wmemcmp' is really only useful to compare arrays of type `wchar_t' +-since the function looks at `sizeof (wchar_t)' bytes at a time and this +-number of bytes is system dependent. +- +- You should also be careful about using `memcmp' to compare objects +-that can contain "holes", such as the padding inserted into structure +-objects to enforce alignment requirements, extra space at the end of +-unions, and extra characters at the ends of strings whose length is less +-than their allocated size. The contents of these "holes" are +-indeterminate and may cause strange behavior when performing byte-wise +-comparisons. For more predictable results, perform an explicit +-component-wise comparison. +- +- For example, given a structure type definition like: +- +- struct foo +- { +- unsigned char tag; +- union +- { +- double f; +- long i; +- char *p; +- } value; +- }; +- +-you are better off writing a specialized comparison function to compare +-`struct foo' objects instead of comparing them with `memcmp'. +- +- - Function: int strcmp (const char *S1, const char *S2) +- The `strcmp' function compares the string S1 against S2, returning +- a value that has the same sign as the difference between the first +- differing pair of characters (interpreted as `unsigned char' +- objects, then promoted to `int'). +- +- If the two strings are equal, `strcmp' returns `0'. +- +- A consequence of the ordering used by `strcmp' is that if S1 is an +- initial substring of S2, then S1 is considered to be "less than" +- S2. +- +- `strcmp' does not take sorting conventions of the language the +- strings are written in into account. To get that one has to use +- `strcoll'. +- +- - Function: int wcscmp (const wchar_t *WS1, const wchar_t *WS2) +- The `wcscmp' function compares the wide character string WS1 +- against WS2. The value returned is smaller than or larger than +- zero depending on whether the first differing wide character is +- WS1 is smaller or larger than the corresponding character in WS2. +- +- If the two strings are equal, `wcscmp' returns `0'. +- +- A consequence of the ordering used by `wcscmp' is that if WS1 is +- an initial substring of WS2, then WS1 is considered to be "less +- than" WS2. +- +- `wcscmp' does not take sorting conventions of the language the +- strings are written in into account. To get that one has to use +- `wcscoll'. +- +- - Function: int strcasecmp (const char *S1, const char *S2) +- This function is like `strcmp', except that differences in case are +- ignored. How uppercase and lowercase characters are related is +- determined by the currently selected locale. In the standard `"C"' +- locale the characters A" and a" do not match but in a locale which +- regards these characters as parts of the alphabet they do match. +- +- `strcasecmp' is derived from BSD. +- +- - Function: int wcscasecmp (const wchar_t *WS1, const wchar_T *WS2) +- This function is like `wcscmp', except that differences in case are +- ignored. How uppercase and lowercase characters are related is +- determined by the currently selected locale. In the standard `"C"' +- locale the characters A" and a" do not match but in a locale which +- regards these characters as parts of the alphabet they do match. +- +- `wcscasecmp' is a GNU extension. +- +- - Function: int strncmp (const char *S1, const char *S2, size_t SIZE) +- This function is the similar to `strcmp', except that no more than +- SIZE wide characters are compared. In other words, if the two +- strings are the same in their first SIZE wide characters, the +- return value is zero. +- +- - Function: int wcsncmp (const wchar_t *WS1, const wchar_t *WS2, +- size_t SIZE) +- This function is the similar to `wcscmp', except that no more than +- SIZE wide characters are compared. In other words, if the two +- strings are the same in their first SIZE wide characters, the +- return value is zero. +- +- - Function: int strncasecmp (const char *S1, const char *S2, size_t N) +- This function is like `strncmp', except that differences in case +- are ignored. Like `strcasecmp', it is locale dependent how +- uppercase and lowercase characters are related. +- +- `strncasecmp' is a GNU extension. +- +- - Function: int wcsncasecmp (const wchar_t *WS1, const wchar_t *S2, +- size_t N) +- This function is like `wcsncmp', except that differences in case +- are ignored. Like `wcscasecmp', it is locale dependent how +- uppercase and lowercase characters are related. +- +- `wcsncasecmp' is a GNU extension. +- +- Here are some examples showing the use of `strcmp' and `strncmp' +-(equivalent examples can be constructed for the wide character +-functions). These examples assume the use of the ASCII character set. +-(If some other character set--say, EBCDIC--is used instead, then the +-glyphs are associated with different numeric codes, and the return +-values and ordering may differ.) +- +- strcmp ("hello", "hello") +- => 0 /* These two strings are the same. */ +- strcmp ("hello", "Hello") +- => 32 /* Comparisons are case-sensitive. */ +- strcmp ("hello", "world") +- => -15 /* The character `'h'' comes before `'w''. */ +- strcmp ("hello", "hello, world") +- => -44 /* Comparing a null character against a comma. */ +- strncmp ("hello", "hello, world", 5) +- => 0 /* The initial 5 characters are the same. */ +- strncmp ("hello, world", "hello, stupid world!!!", 5) +- => 0 /* The initial 5 characters are the same. */ +- +- - Function: int strverscmp (const char *S1, const char *S2) +- The `strverscmp' function compares the string S1 against S2, +- considering them as holding indices/version numbers. Return value +- follows the same conventions as found in the `strverscmp' +- function. In fact, if S1 and S2 contain no digits, `strverscmp' +- behaves like `strcmp'. +- +- Basically, we compare strings normally (character by character), +- until we find a digit in each string - then we enter a special +- comparison mode, where each sequence of digits is taken as a +- whole. If we reach the end of these two parts without noticing a +- difference, we return to the standard comparison mode. There are +- two types of numeric parts: "integral" and "fractional" (those +- begin with a '0'). The types of the numeric parts affect the way +- we sort them: +- +- * integral/integral: we compare values as you would expect. +- +- * fractional/integral: the fractional part is less than the +- integral one. Again, no surprise. +- +- * fractional/fractional: the things become a bit more complex. +- If the common prefix contains only leading zeroes, the +- longest part is less than the other one; else the comparison +- behaves normally. +- +- strverscmp ("no digit", "no digit") +- => 0 /* same behavior as strcmp. */ +- strverscmp ("item#99", "item#100") +- => <0 /* same prefix, but 99 < 100. */ +- strverscmp ("alpha1", "alpha001") +- => >0 /* fractional part inferior to integral one. */ +- strverscmp ("part1_f012", "part1_f01") +- => >0 /* two fractional parts. */ +- strverscmp ("foo.009", "foo.0") +- => <0 /* idem, but with leading zeroes only. */ +- +- This function is especially useful when dealing with filename +- sorting, because filenames frequently hold indices/version numbers. +- +- `strverscmp' is a GNU extension. +- +- - Function: int bcmp (const void *A1, const void *A2, size_t SIZE) +- This is an obsolete alias for `memcmp', derived from BSD. +- +- +-File: libc.info, Node: Collation Functions, Next: Search Functions, Prev: String/Array Comparison, Up: String and Array Utilities +- +-Collation Functions +-=================== +- +- In some locales, the conventions for lexicographic ordering differ +-from the strict numeric ordering of character codes. For example, in +-Spanish most glyphs with diacritical marks such as accents are not +-considered distinct letters for the purposes of collation. On the +-other hand, the two-character sequence `ll' is treated as a single +-letter that is collated immediately after `l'. +- +- You can use the functions `strcoll' and `strxfrm' (declared in the +-headers file `string.h') and `wcscoll' and `wcsxfrm' (declared in the +-headers file `wchar') to compare strings using a collation ordering +-appropriate for the current locale. The locale used by these functions +-in particular can be specified by setting the locale for the +-`LC_COLLATE' category; see *Note Locales::. +- +- In the standard C locale, the collation sequence for `strcoll' is +-the same as that for `strcmp'. Similarly, `wcscoll' and `wcscmp' are +-the same in this situation. +- +- Effectively, the way these functions work is by applying a mapping to +-transform the characters in a string to a byte sequence that represents +-the string's position in the collating sequence of the current locale. +-Comparing two such byte sequences in a simple fashion is equivalent to +-comparing the strings with the locale's collating sequence. +- +- The functions `strcoll' and `wcscoll' perform this translation +-implicitly, in order to do one comparison. By contrast, `strxfrm' and +-`wcsxfrm' perform the mapping explicitly. If you are making multiple +-comparisons using the same string or set of strings, it is likely to be +-more efficient to use `strxfrm' or `wcsxfrm' to transform all the +-strings just once, and subsequently compare the transformed strings +-with `strcmp' or `wcscmp'. +- +- - Function: int strcoll (const char *S1, const char *S2) +- The `strcoll' function is similar to `strcmp' but uses the +- collating sequence of the current locale for collation (the +- `LC_COLLATE' locale). +- +- - Function: int wcscoll (const wchar_t *WS1, const wchar_t *WS2) +- The `wcscoll' function is similar to `wcscmp' but uses the +- collating sequence of the current locale for collation (the +- `LC_COLLATE' locale). +- +- Here is an example of sorting an array of strings, using `strcoll' +-to compare them. The actual sort algorithm is not written here; it +-comes from `qsort' (*note Array Sort Function::). The job of the code +-shown here is to say how to compare the strings while sorting them. +-(Later on in this section, we will show a way to do this more +-efficiently using `strxfrm'.) +- +- /* This is the comparison function used with `qsort'. */ +- +- int +- compare_elements (char **p1, char **p2) +- { +- return strcoll (*p1, *p2); +- } +- +- /* This is the entry point--the function to sort +- strings using the locale's collating sequence. */ +- +- void +- sort_strings (char **array, int nstrings) +- { +- /* Sort `temp_array' by comparing the strings. */ +- qsort (array, nstrings, +- sizeof (char *), compare_elements); +- } +- +- - Function: size_t strxfrm (char *restrict TO, const char *restrict +- FROM, size_t SIZE) +- The function `strxfrm' transforms the string FROM using the +- collation transformation determined by the locale currently +- selected for collation, and stores the transformed string in the +- array TO. Up to SIZE characters (including a terminating null +- character) are stored. +- +- The behavior is undefined if the strings TO and FROM overlap; see +- *Note Copying and Concatenation::. +- +- The return value is the length of the entire transformed string. +- This value is not affected by the value of SIZE, but if it is +- greater or equal than SIZE, it means that the transformed string +- did not entirely fit in the array TO. In this case, only as much +- of the string as actually fits was stored. To get the whole +- transformed string, call `strxfrm' again with a bigger output +- array. +- +- The transformed string may be longer than the original string, and +- it may also be shorter. +- +- If SIZE is zero, no characters are stored in TO. In this case, +- `strxfrm' simply returns the number of characters that would be +- the length of the transformed string. This is useful for +- determining what size the allocated array should be. It does not +- matter what TO is if SIZE is zero; TO may even be a null pointer. +- +- - Function: size_t wcsxfrm (wchar_t *restrict WTO, const wchar_t +- *WFROM, size_t SIZE) +- The function `wcsxfrm' transforms wide character string WFROM +- using the collation transformation determined by the locale +- currently selected for collation, and stores the transformed +- string in the array WTO. Up to SIZE wide characters (including a +- terminating null character) are stored. +- +- The behavior is undefined if the strings WTO and WFROM overlap; +- see *Note Copying and Concatenation::. +- +- The return value is the length of the entire transformed wide +- character string. This value is not affected by the value of +- SIZE, but if it is greater or equal than SIZE, it means that the +- transformed wide character string did not entirely fit in the +- array WTO. In this case, only as much of the wide character +- string as actually fits was stored. To get the whole transformed +- wide character string, call `wcsxfrm' again with a bigger output +- array. +- +- The transformed wide character string may be longer than the +- original wide character string, and it may also be shorter. +- +- If SIZE is zero, no characters are stored in TO. In this case, +- `wcsxfrm' simply returns the number of wide characters that would +- be the length of the transformed wide character string. This is +- useful for determining what size the allocated array should be +- (remember to multiply with `sizeof (wchar_t)'). It does not +- matter what WTO is if SIZE is zero; WTO may even be a null pointer. +- +- Here is an example of how you can use `strxfrm' when you plan to do +-many comparisons. It does the same thing as the previous example, but +-much faster, because it has to transform each string only once, no +-matter how many times it is compared with other strings. Even the time +-needed to allocate and free storage is much less than the time we save, +-when there are many strings. +- +- struct sorter { char *input; char *transformed; }; +- +- /* This is the comparison function used with `qsort' +- to sort an array of `struct sorter'. */ +- +- int +- compare_elements (struct sorter *p1, struct sorter *p2) +- { +- return strcmp (p1->transformed, p2->transformed); +- } +- +- /* This is the entry point--the function to sort +- strings using the locale's collating sequence. */ +- +- void +- sort_strings_fast (char **array, int nstrings) +- { +- struct sorter temp_array[nstrings]; +- int i; +- +- /* Set up `temp_array'. Each element contains +- one input string and its transformed string. */ +- for (i = 0; i < nstrings; i++) +- { +- size_t length = strlen (array[i]) * 2; +- char *transformed; +- size_t transformed_length; +- +- temp_array[i].input = array[i]; +- +- /* First try a buffer perhaps big enough. */ +- transformed = (char *) xmalloc (length); +- +- /* Transform `array[i]'. */ +- transformed_length = strxfrm (transformed, array[i], length); +- +- /* If the buffer was not large enough, resize it +- and try again. */ +- if (transformed_length >= length) +- { +- /* Allocate the needed space. +1 for terminating +- `NUL' character. */ +- transformed = (char *) xrealloc (transformed, +- transformed_length + 1); +- +- /* The return value is not interesting because we know +- how long the transformed string is. */ +- (void) strxfrm (transformed, array[i], +- transformed_length + 1); +- } +- +- temp_array[i].transformed = transformed; +- } +- +- /* Sort `temp_array' by comparing transformed strings. */ +- qsort (temp_array, sizeof (struct sorter), +- nstrings, compare_elements); +- +- /* Put the elements back in the permanent array +- in their sorted order. */ +- for (i = 0; i < nstrings; i++) +- array[i] = temp_array[i].input; +- +- /* Free the strings we allocated. */ +- for (i = 0; i < nstrings; i++) +- free (temp_array[i].transformed); +- } +- +- The interesting part of this code for the wide character version +-would look like this: +- +- void +- sort_strings_fast (wchar_t **array, int nstrings) +- { +- ... +- /* Transform `array[i]'. */ +- transformed_length = wcsxfrm (transformed, array[i], length); +- +- /* If the buffer was not large enough, resize it +- and try again. */ +- if (transformed_length >= length) +- { +- /* Allocate the needed space. +1 for terminating +- `NUL' character. */ +- transformed = (wchar_t *) xrealloc (transformed, +- (transformed_length + 1) +- * sizeof (wchar_t)); +- +- /* The return value is not interesting because we know +- how long the transformed string is. */ +- (void) wcsxfrm (transformed, array[i], +- transformed_length + 1); +- } +- ... +- +-Note the additional multiplication with `sizeof (wchar_t)' in the +-`realloc' call. +- +- *Compatibility Note:* The string collation functions are a new +-feature of ISO C90. Older C dialects have no equivalent feature. The +-wide character versions were introduced in Amendment 1 to ISO C90. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-8 glibc-2.3.2-200304020432/manual/libc.info-8 +--- glibc-2.3.2/manual/libc.info-8 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-8 Thu Jan 1 01:00:00 1970 +@@ -1,997 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Search Functions, Next: Finding Tokens in a String, Prev: Collation Functions, Up: String and Array Utilities +- +-Search Functions +-================ +- +- This section describes library functions which perform various kinds +-of searching operations on strings and arrays. These functions are +-declared in the header file `string.h'. +- +- - Function: void * memchr (const void *BLOCK, int C, size_t SIZE) +- This function finds the first occurrence of the byte C (converted +- to an `unsigned char') in the initial SIZE bytes of the object +- beginning at BLOCK. The return value is a pointer to the located +- byte, or a null pointer if no match was found. +- +- - Function: wchar_t * wmemchr (const wchar_t *BLOCK, wchar_t WC, +- size_t SIZE) +- This function finds the first occurrence of the wide character WC +- in the initial SIZE wide characters of the object beginning at +- BLOCK. The return value is a pointer to the located wide +- character, or a null pointer if no match was found. +- +- - Function: void * rawmemchr (const void *BLOCK, int C) +- Often the `memchr' function is used with the knowledge that the +- byte C is available in the memory block specified by the +- parameters. But this means that the SIZE parameter is not really +- needed and that the tests performed with it at runtime (to check +- whether the end of the block is reached) are not needed. +- +- The `rawmemchr' function exists for just this situation which is +- surprisingly frequent. The interface is similar to `memchr' except +- that the SIZE parameter is missing. The function will look beyond +- the end of the block pointed to by BLOCK in case the programmer +- made an error in assuming that the byte C is present in the block. +- In this case the result is unspecified. Otherwise the return +- value is a pointer to the located byte. +- +- This function is of special interest when looking for the end of a +- string. Since all strings are terminated by a null byte a call +- like +- +- rawmemchr (str, '\0') +- +- will never go beyond the end of the string. +- +- This function is a GNU extension. +- +- - Function: void * memrchr (const void *BLOCK, int C, size_t SIZE) +- The function `memrchr' is like `memchr', except that it searches +- backwards from the end of the block defined by BLOCK and SIZE +- (instead of forwards from the front). +- +- - Function: char * strchr (const char *STRING, int C) +- The `strchr' function finds the first occurrence of the character +- C (converted to a `char') in the null-terminated string beginning +- at STRING. The return value is a pointer to the located +- character, or a null pointer if no match was found. +- +- For example, +- strchr ("hello, world", 'l') +- => "llo, world" +- strchr ("hello, world", '?') +- => NULL +- +- The terminating null character is considered to be part of the +- string, so you can use this function get a pointer to the end of a +- string by specifying a null character as the value of the C +- argument. It would be better (but less portable) to use +- `strchrnul' in this case, though. +- +- - Function: wchar_t * wcschr (const wchar_t *WSTRING, int WC) +- The `wcschr' function finds the first occurrence of the wide +- character WC in the null-terminated wide character string +- beginning at WSTRING. The return value is a pointer to the +- located wide character, or a null pointer if no match was found. +- +- The terminating null character is considered to be part of the wide +- character string, so you can use this function get a pointer to +- the end of a wide character string by specifying a null wude +- character as the value of the WC argument. It would be better +- (but less portable) to use `wcschrnul' in this case, though. +- +- - Function: char * strchrnul (const char *STRING, int C) +- `strchrnul' is the same as `strchr' except that if it does not +- find the character, it returns a pointer to string's terminating +- null character rather than a null pointer. +- +- This function is a GNU extension. +- +- - Function: wchar_t * wcschrnul (const wchar_t *WSTRING, wchar_t WC) +- `wcschrnul' is the same as `wcschr' except that if it does not +- find the wide character, it returns a pointer to wide character +- string's terminating null wide character rather than a null +- pointer. +- +- This function is a GNU extension. +- +- One useful, but unusual, use of the `strchr' function is when one +-wants to have a pointer pointing to the NUL byte terminating a string. +-This is often written in this way: +- +- s += strlen (s); +- +-This is almost optimal but the addition operation duplicated a bit of +-the work already done in the `strlen' function. A better solution is +-this: +- +- s = strchr (s, '\0'); +- +- There is no restriction on the second parameter of `strchr' so it +-could very well also be the NUL character. Those readers thinking very +-hard about this might now point out that the `strchr' function is more +-expensive than the `strlen' function since we have two abort criteria. +-This is right. But in the GNU C library the implementation of `strchr' +-is optimized in a special way so that `strchr' actually is faster. +- +- - Function: char * strrchr (const char *STRING, int C) +- The function `strrchr' is like `strchr', except that it searches +- backwards from the end of the string STRING (instead of forwards +- from the front). +- +- For example, +- strrchr ("hello, world", 'l') +- => "ld" +- +- - Function: wchar_t * wcsrchr (const wchar_t *WSTRING, wchar_t C) +- The function `wcsrchr' is like `wcschr', except that it searches +- backwards from the end of the string WSTRING (instead of forwards +- from the front). +- +- - Function: char * strstr (const char *HAYSTACK, const char *NEEDLE) +- This is like `strchr', except that it searches HAYSTACK for a +- substring NEEDLE rather than just a single character. It returns +- a pointer into the string HAYSTACK that is the first character of +- the substring, or a null pointer if no match was found. If NEEDLE +- is an empty string, the function returns HAYSTACK. +- +- For example, +- strstr ("hello, world", "l") +- => "llo, world" +- strstr ("hello, world", "wo") +- => "world" +- +- - Function: wchar_t * wcsstr (const wchar_t *HAYSTACK, const wchar_t +- *NEEDLE) +- This is like `wcschr', except that it searches HAYSTACK for a +- substring NEEDLE rather than just a single wide character. It +- returns a pointer into the string HAYSTACK that is the first wide +- character of the substring, or a null pointer if no match was +- found. If NEEDLE is an empty string, the function returns +- HAYSTACK. +- +- - Function: wchar_t * wcswcs (const wchar_t *HAYSTACK, const wchar_t +- *NEEDLE) +- `wcsstr' is an depricated alias for `wcsstr'. This is the name +- originally used in the X/Open Portability Guide before the +- Amendment 1 to ISO C90 was published. +- +- - Function: char * strcasestr (const char *HAYSTACK, const char +- *NEEDLE) +- This is like `strstr', except that it ignores case in searching for +- the substring. Like `strcasecmp', it is locale dependent how +- uppercase and lowercase characters are related. +- +- For example, +- strstr ("hello, world", "L") +- => "llo, world" +- strstr ("hello, World", "wo") +- => "World" +- +- - Function: void * memmem (const void *HAYSTACK, size_t HAYSTACK-LEN, +- const void *NEEDLE, size_t NEEDLE-LEN) +- This is like `strstr', but NEEDLE and HAYSTACK are byte arrays +- rather than null-terminated strings. NEEDLE-LEN is the length of +- NEEDLE and HAYSTACK-LEN is the length of HAYSTACK. +- +- This function is a GNU extension. +- +- - Function: size_t strspn (const char *STRING, const char *SKIPSET) +- The `strspn' ("string span") function returns the length of the +- initial substring of STRING that consists entirely of characters +- that are members of the set specified by the string SKIPSET. The +- order of the characters in SKIPSET is not important. +- +- For example, +- strspn ("hello, world", "abcdefghijklmnopqrstuvwxyz") +- => 5 +- +- 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. +- +- - Function: size_t wcsspn (const wchar_t *WSTRING, const wchar_t +- *SKIPSET) +- The `wcsspn' ("wide character string span") function returns the +- length of the initial substring of WSTRING that consists entirely +- of wide characters that are members of the set specified by the +- string SKIPSET. The order of the wide characters in SKIPSET is not +- important. +- +- - Function: size_t strcspn (const char *STRING, const char *STOPSET) +- The `strcspn' ("string complement span") function returns the +- length of the initial substring of STRING that consists entirely +- of characters that are _not_ members of the set specified by the +- string STOPSET. (In other words, it returns the offset of the +- first character in STRING that is a member of the set STOPSET.) +- +- For example, +- strcspn ("hello, world", " \t\n,.;!?") +- => 5 +- +- 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. +- +- - Function: size_t wcscspn (const wchar_t *WSTRING, const wchar_t +- *STOPSET) +- The `wcscspn' ("wide character string complement span") function +- returns the length of the initial substring of WSTRING that +- consists entirely of wide characters that are _not_ members of the +- set specified by the string STOPSET. (In other words, it returns +- the offset of the first character in STRING that is a member of +- the set STOPSET.) +- +- - Function: char * strpbrk (const char *STRING, const char *STOPSET) +- The `strpbrk' ("string pointer break") function is related to +- `strcspn', except that it returns a pointer to the first character +- in STRING that is a member of the set STOPSET instead of the +- length of the initial substring. It returns a null pointer if no +- such character from STOPSET is found. +- +- For example, +- +- strpbrk ("hello, world", " \t\n,.;!?") +- => ", world" +- +- 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. +- +- - Function: wchar_t * wcspbrk (const wchar_t *WSTRING, const wchar_t +- *STOPSET) +- The `wcspbrk' ("wide character string pointer break") function is +- related to `wcscspn', except that it returns a pointer to the first +- wide character in WSTRING that is a member of the set STOPSET +- instead of the length of the initial substring. It returns a null +- pointer if no such character from STOPSET is found. +- +-Compatibility String Search Functions +-------------------------------------- +- +- - Function: char * index (const char *STRING, int C) +- `index' is another name for `strchr'; they are exactly the same. +- New code should always use `strchr' since this name is defined in +- ISO C while `index' is a BSD invention which never was available +- on System V derived systems. +- +- - Function: char * rindex (const char *STRING, int C) +- `rindex' is another name for `strrchr'; they are exactly the same. +- New code should always use `strrchr' since this name is defined in +- ISO C while `rindex' is a BSD invention which never was available +- on System V derived systems. +- +- +-File: libc.info, Node: Finding Tokens in a String, Next: strfry, Prev: Search Functions, Up: String and Array Utilities +- +-Finding Tokens in a String +-========================== +- +- It's fairly common for programs to have a need to do some simple +-kinds of lexical analysis and parsing, such as splitting a command +-string up into tokens. You can do this with the `strtok' function, +-declared in the header file `string.h'. +- +- - Function: char * strtok (char *restrict NEWSTRING, const char +- *restrict DELIMITERS) +- A string can be split into tokens by making a series of calls to +- the function `strtok'. +- +- The string to be split up is passed as the NEWSTRING argument on +- the first call only. The `strtok' function uses this to set up +- some internal state information. Subsequent calls to get +- additional tokens from the same string are indicated by passing a +- null pointer as the NEWSTRING argument. Calling `strtok' with +- another non-null NEWSTRING argument reinitializes the state +- information. It is guaranteed that no other library function ever +- calls `strtok' behind your back (which would mess up this internal +- state information). +- +- The DELIMITERS argument is a string that specifies a set of +- delimiters that may surround the token being extracted. All the +- initial characters that are members of this set are discarded. +- The first character that is _not_ a member of this set of +- delimiters marks the beginning of the next token. The end of the +- token is found by looking for the next character that is a member +- of the delimiter set. This character in the original string +- NEWSTRING is overwritten by a null character, and the pointer to +- the beginning of the token in NEWSTRING is returned. +- +- On the next call to `strtok', the searching begins at the next +- character beyond the one that marked the end of the previous token. +- Note that the set of delimiters DELIMITERS do not have to be the +- same on every call in a series of calls to `strtok'. +- +- If the end of the string NEWSTRING is reached, or if the remainder +- of string consists only of delimiter characters, `strtok' returns +- a null pointer. +- +- 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. +- +- - Function: wchar_t * wcstok (wchar_t *NEWSTRING, const char +- *DELIMITERS) +- A string can be split into tokens by making a series of calls to +- the function `wcstok'. +- +- The string to be split up is passed as the NEWSTRING argument on +- the first call only. The `wcstok' function uses this to set up +- some internal state information. Subsequent calls to get +- additional tokens from the same wide character string are +- indicated by passing a null pointer as the NEWSTRING argument. +- Calling `wcstok' with another non-null NEWSTRING argument +- reinitializes the state information. It is guaranteed that no +- other library function ever calls `wcstok' behind your back (which +- would mess up this internal state information). +- +- The DELIMITERS argument is a wide character string that specifies +- a set of delimiters that may surround the token being extracted. +- All the initial wide characters that are members of this set are +- discarded. The first wide character that is _not_ a member of +- this set of delimiters marks the beginning of the next token. The +- end of the token is found by looking for the next wide character +- that is a member of the delimiter set. This wide character in the +- original wide character string NEWSTRING is overwritten by a null +- wide character, and the pointer to the beginning of the token in +- NEWSTRING is returned. +- +- On the next call to `wcstok', the searching begins at the next +- wide character beyond the one that marked the end of the previous +- token. Note that the set of delimiters DELIMITERS do not have to +- be the same on every call in a series of calls to `wcstok'. +- +- If the end of the wide character string NEWSTRING is reached, or +- if the remainder of string consists only of delimiter wide +- characters, `wcstok' returns a null pointer. +- +- 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. +- +- *Warning:* Since `strtok' and `wcstok' alter the string they is +-parsing, you should always copy the string to a temporary buffer before +-parsing it with `strtok'/`wcstok' (*note Copying and Concatenation::). +-If you allow `strtok' or `wcstok' to modify a string that came from +-another part of your program, you are asking for trouble; that string +-might be used for other purposes after `strtok' or `wcstok' has +-modified it, and it would not have the expected value. +- +- The string that you are operating on might even be a constant. Then +-when `strtok' or `wcstok' tries to modify it, your program will get a +-fatal signal for writing in read-only memory. *Note Program Error +-Signals::. Even if the operation of `strtok' or `wcstok' would not +-require a modification of the string (e.g., if there is exactly one +-token) the string can (and in the GNU libc case will) be modified. +- +- This is a special case of a general principle: if a part of a program +-does not have as its purpose the modification of a certain data +-structure, then it is error-prone to modify the data structure +-temporarily. +- +- The functions `strtok' and `wcstok' are not reentrant. *Note +-Nonreentrancy::, for a discussion of where and why reentrancy is +-important. +- +- Here is a simple example showing the use of `strtok'. +- +- #include +- #include +- +- ... +- +- const char string[] = "words separated by spaces -- and, punctuation!"; +- const char delimiters[] = " .,;:!-"; +- char *token, *cp; +- +- ... +- +- cp = strdupa (string); /* Make writable copy. */ +- token = strtok (cp, delimiters); /* token => "words" */ +- token = strtok (NULL, delimiters); /* token => "separated" */ +- token = strtok (NULL, delimiters); /* token => "by" */ +- token = strtok (NULL, delimiters); /* token => "spaces" */ +- token = strtok (NULL, delimiters); /* token => "and" */ +- token = strtok (NULL, delimiters); /* token => "punctuation" */ +- token = strtok (NULL, delimiters); /* token => NULL */ +- +- The GNU C library contains two more functions for tokenizing a string +-which overcome the limitation of non-reentrancy. They are only +-available for multibyte character strings. +- +- - Function: char * strtok_r (char *NEWSTRING, const char *DELIMITERS, +- char **SAVE_PTR) +- Just like `strtok', this function splits the string into several +- tokens which can be accessed by successive calls to `strtok_r'. +- The difference is that the information about the next token is +- stored in the space pointed to by the third argument, SAVE_PTR, +- which is a pointer to a string pointer. Calling `strtok_r' with a +- null pointer for NEWSTRING and leaving SAVE_PTR between the calls +- unchanged does the job without hindering reentrancy. +- +- This function is defined in POSIX.1 and can be found on many +- systems which support multi-threading. +- +- - Function: char * strsep (char **STRING_PTR, const char *DELIMITER) +- This function has a similar functionality as `strtok_r' with the +- NEWSTRING argument replaced by the SAVE_PTR argument. The +- initialization of the moving pointer has to be done by the user. +- Successive calls to `strsep' move the pointer along the tokens +- separated by DELIMITER, returning the address of the next token +- and updating STRING_PTR to point to the beginning of the next +- token. +- +- One difference between `strsep' and `strtok_r' is that if the +- input string contains more than one character from DELIMITER in a +- row `strsep' returns an empty string for each pair of characters +- from DELIMITER. This means that a program normally should test +- for `strsep' returning an empty string before processing it. +- +- This function was introduced in 4.3BSD and therefore is widely +- available. +- +- Here is how the above example looks like when `strsep' is used. +- +- #include +- #include +- +- ... +- +- const char string[] = "words separated by spaces -- and, punctuation!"; +- const char delimiters[] = " .,;:!-"; +- char *running; +- char *token; +- +- ... +- +- running = strdupa (string); +- token = strsep (&running, delimiters); /* token => "words" */ +- token = strsep (&running, delimiters); /* token => "separated" */ +- token = strsep (&running, delimiters); /* token => "by" */ +- token = strsep (&running, delimiters); /* token => "spaces" */ +- token = strsep (&running, delimiters); /* token => "" */ +- token = strsep (&running, delimiters); /* token => "" */ +- token = strsep (&running, delimiters); /* token => "" */ +- token = strsep (&running, delimiters); /* token => "and" */ +- token = strsep (&running, delimiters); /* token => "" */ +- token = strsep (&running, delimiters); /* token => "punctuation" */ +- token = strsep (&running, delimiters); /* token => "" */ +- token = strsep (&running, delimiters); /* token => NULL */ +- +- - Function: char * basename (const char *FILENAME) +- The GNU version of the `basename' function returns the last +- component of the path in FILENAME. This function is the preferred +- usage, since it does not modify the argument, FILENAME, and +- respects trailing slashes. The prototype for `basename' can be +- found in `string.h'. Note, this function is overriden by the XPG +- version, if `libgen.h' is included. +- +- Example of using GNU `basename': +- +- #include +- +- int +- main (int argc, char *argv[]) +- { +- char *prog = basename (argv[0]); +- +- if (argc < 2) +- { +- fprintf (stderr, "Usage %s \n", prog); +- exit (1); +- } +- +- ... +- } +- +- *Portability Note:* This function may produce different results on +- different systems. +- +- +- - Function: char * basename (char *PATH) +- This is the standard XPG defined `basename'. It is similar in +- spirit to the GNU version, but may modify the PATH by removing +- trailing '/' characters. If the PATH is made up entirely of '/' +- characters, then "/" will be returned. Also, if PATH is `NULL' or +- an empty string, then "." is returned. The prototype for the XPG +- version can be found in `libgen.h'. +- +- Example of using XPG `basename': +- +- #include +- +- int +- main (int argc, char *argv[]) +- { +- char *prog; +- char *path = strdupa (argv[0]); +- +- prog = basename (path); +- +- if (argc < 2) +- { +- fprintf (stderr, "Usage %s \n", prog); +- exit (1); +- } +- +- ... +- +- } +- +- - Function: char * dirname (char *PATH) +- The `dirname' function is the compliment to the XPG version of +- `basename'. It returns the parent directory of the file specified +- by PATH. If PATH is `NULL', an empty string, or contains no '/' +- characters, then "." is returned. The prototype for this function +- can be found in `libgen.h'. +- +- +-File: libc.info, Node: strfry, Next: Trivial Encryption, Prev: Finding Tokens in a String, Up: String and Array Utilities +- +-strfry +-====== +- +- The function below addresses the perennial programming quandary: +-"How do I take good data in string form and painlessly turn it into +-garbage?" This is actually a fairly simple task for C programmers who +-do not use the GNU C library string functions, but for programs based +-on the GNU C library, the `strfry' function is the preferred method for +-destroying string data. +- +- The prototype for this function is in `string.h'. +- +- - Function: char * strfry (char *STRING) +- `strfry' creates a pseudorandom anagram of a string, replacing the +- input with the anagram in place. For each position in the string, +- `strfry' swaps it with a position in the string selected at random +- (from a uniform distribution). The two positions may be the same. +- +- The return value of `strfry' is always STRING. +- +- *Portability Note:* This function is unique to the GNU C library. +- +- +- +-File: libc.info, Node: Trivial Encryption, Next: Encode Binary Data, Prev: strfry, Up: String and Array Utilities +- +-Trivial Encryption +-================== +- +- The `memfrob' function converts an array of data to something +-unrecognizable and back again. It is not encryption in its usual sense +-since it is easy for someone to convert the encrypted data back to clear +-text. The transformation is analogous to Usenet's "Rot13" encryption +-method for obscuring offensive jokes from sensitive eyes and such. +-Unlike Rot13, `memfrob' works on arbitrary binary data, not just text. +- +- For true encryption, *Note Cryptographic Functions::. +- +- This function is declared in `string.h'. +- +- - Function: void * memfrob (void *MEM, size_t LENGTH) +- `memfrob' transforms (frobnicates) each byte of the data structure +- at MEM, which is LENGTH bytes long, by bitwise exclusive oring it +- with binary 00101010. It does the transformation in place and its +- return value is always MEM. +- +- Note that `memfrob' a second time on the same data structure +- returns it to its original state. +- +- This is a good function for hiding information from someone who +- doesn't want to see it or doesn't want to see it very much. To +- really prevent people from retrieving the information, use +- stronger encryption such as that described in *Note Cryptographic +- Functions::. +- +- *Portability Note:* This function is unique to the GNU C library. +- +- +- +-File: libc.info, Node: Encode Binary Data, Next: Argz and Envz Vectors, Prev: Trivial Encryption, Up: String and Array Utilities +- +-Encode Binary Data +-================== +- +- To store or transfer binary data in environments which only support +-text one has to encode the binary data by mapping the input bytes to +-characters in the range allowed for storing or transfering. SVID +-systems (and nowadays XPG compliant systems) provide minimal support for +-this task. +- +- - Function: char * l64a (long int N) +- This function encodes a 32-bit input value using characters from +- the basic character set. It returns a pointer to a 6 character +- buffer which contains an encoded version of N. To encode a series +- of bytes the user must copy the returned string to a destination +- buffer. It returns the empty string if N is zero, which is +- somewhat bizarre but mandated by the standard. +- *Warning:* Since a static buffer is used this function should not +- be used in multi-threaded programs. There is no thread-safe +- alternative to this function in the C library. +- *Compatibility Note:* The XPG standard states that the return +- value of `l64a' is undefined if N is negative. In the GNU +- implementation, `l64a' treats its argument as unsigned, so it will +- return a sensible encoding for any nonzero N; however, portable +- programs should not rely on this. +- +- To encode a large buffer `l64a' must be called in a loop, once for +- each 32-bit word of the buffer. For example, one could do +- something like this: +- +- char * +- encode (const void *buf, size_t len) +- { +- /* We know in advance how long the buffer has to be. */ +- unsigned char *in = (unsigned char *) buf; +- char *out = malloc (6 + ((len + 3) / 4) * 6 + 1); +- char *cp = out; +- +- /* Encode the length. */ +- /* Using `htonl' is necessary so that the data can be +- decoded even on machines with different byte order. */ +- +- cp = mempcpy (cp, l64a (htonl (len)), 6); +- +- while (len > 3) +- { +- unsigned long int n = *in++; +- n = (n << 8) | *in++; +- n = (n << 8) | *in++; +- n = (n << 8) | *in++; +- len -= 4; +- if (n) +- cp = mempcpy (cp, l64a (htonl (n)), 6); +- else +- /* `l64a' returns the empty string for n==0, so we +- must generate its encoding ("......") by hand. */ +- cp = stpcpy (cp, "......"); +- } +- if (len > 0) +- { +- unsigned long int n = *in++; +- if (--len > 0) +- { +- n = (n << 8) | *in++; +- if (--len > 0) +- n = (n << 8) | *in; +- } +- memcpy (cp, l64a (htonl (n)), 6); +- cp += 6; +- } +- *cp = '\0'; +- return out; +- } +- +- It is strange that the library does not provide the complete +- functionality needed but so be it. +- +- +- To decode data produced with `l64a' the following function should be +-used. +- +- - Function: long int a64l (const char *STRING) +- The parameter STRING should contain a string which was produced by +- a call to `l64a'. The function processes at least 6 characters of +- this string, and decodes the characters it finds according to the +- table below. It stops decoding when it finds a character not in +- the table, rather like `atoi'; if you have a buffer which has been +- broken into lines, you must be careful to skip over the +- end-of-line characters. +- +- The decoded number is returned as a `long int' value. +- +- The `l64a' and `a64l' functions use a base 64 encoding, in which +-each character of an encoded string represents six bits of an input +-word. These symbols are used for the base 64 digits: +- +- 0 1 2 3 4 5 6 7 +-0 `.' `/' `0' `1' `2' `3' `4' `5' +-8 `6' `7' `8' `9' `A' `B' `C' `D' +-16 `E' `F' `G' `H' `I' `J' `K' `L' +-24 `M' `N' `O' `P' `Q' `R' `S' `T' +-32 `U' `V' `W' `X' `Y' `Z' `a' `b' +-40 `c' `d' `e' `f' `g' `h' `i' `j' +-48 `k' `l' `m' `n' `o' `p' `q' `r' +-56 `s' `t' `u' `v' `w' `x' `y' `z' +- +- This encoding scheme is not standard. There are some other encoding +-methods which are much more widely used (UU encoding, MIME encoding). +-Generally, it is better to use one of these encodings. +- +- +-File: libc.info, Node: Argz and Envz Vectors, Prev: Encode Binary Data, Up: String and Array Utilities +- +-Argz and Envz Vectors +-===================== +- +- "argz vectors" are vectors of strings in a contiguous block of +-memory, each element separated from its neighbors by null-characters +-(`'\0''). +- +- "Envz vectors" are an extension of argz vectors where each element +-is a name-value pair, separated by a `'='' character (as in a Unix +-environment). +- +-* Menu: +- +-* Argz Functions:: Operations on argz vectors. +-* Envz Functions:: Additional operations on environment vectors. +- +- +-File: libc.info, Node: Argz Functions, Next: Envz Functions, Up: Argz and Envz Vectors +- +-Argz Functions +--------------- +- +- Each argz vector is represented by a pointer to the first element, of +-type `char *', and a size, of type `size_t', both of which can be +-initialized to `0' to represent an empty argz vector. All argz +-functions accept either a pointer and a size argument, or pointers to +-them, if they will be modified. +- +- The argz functions use `malloc'/`realloc' to allocate/grow argz +-vectors, and so any argz vector creating using these functions may be +-freed by using `free'; conversely, any argz function that may grow a +-string expects that string to have been allocated using `malloc' (those +-argz functions that only examine their arguments or modify them in +-place will work on any sort of memory). *Note Unconstrained +-Allocation::. +- +- All argz functions that do memory allocation have a return type of +-`error_t', and return `0' for success, and `ENOMEM' if an allocation +-error occurs. +- +- These functions are declared in the standard include file `argz.h'. +- +- - Function: error_t argz_create (char *const ARGV[], char **ARGZ, +- size_t *ARGZ_LEN) +- The `argz_create' function converts the Unix-style argument vector +- ARGV (a vector of pointers to normal C strings, terminated by +- `(char *)0'; *note Program Arguments::) into an argz vector with +- the same elements, which is returned in ARGZ and ARGZ_LEN. +- +- - Function: error_t argz_create_sep (const char *STRING, int SEP, char +- **ARGZ, size_t *ARGZ_LEN) +- The `argz_create_sep' function converts the null-terminated string +- STRING into an argz vector (returned in ARGZ and ARGZ_LEN) by +- splitting it into elements at every occurrence of the character +- SEP. +- +- - Function: size_t argz_count (const char *ARGZ, size_t ARG_LEN) +- Returns the number of elements in the argz vector ARGZ and +- ARGZ_LEN. +- +- - Function: void argz_extract (char *ARGZ, size_t ARGZ_LEN, char +- **ARGV) +- The `argz_extract' function converts the argz vector ARGZ and +- ARGZ_LEN into a Unix-style argument vector stored in ARGV, by +- putting pointers to every element in ARGZ into successive +- positions in ARGV, followed by a terminator of `0'. ARGV must be +- pre-allocated with enough space to hold all the elements in ARGZ +- plus the terminating `(char *)0' (`(argz_count (ARGZ, ARGZ_LEN) + +- 1) * sizeof (char *)' bytes should be enough). Note that the +- string pointers stored into ARGV point into ARGZ--they are not +- copies--and so ARGZ must be copied if it will be changed while +- ARGV is still active. This function is useful for passing the +- elements in ARGZ to an exec function (*note Executing a File::). +- +- - Function: void argz_stringify (char *ARGZ, size_t LEN, int SEP) +- The `argz_stringify' converts ARGZ into a normal string with the +- elements separated by the character SEP, by replacing each `'\0'' +- inside ARGZ (except the last one, which terminates the string) +- with SEP. This is handy for printing ARGZ in a readable manner. +- +- - Function: error_t argz_add (char **ARGZ, size_t *ARGZ_LEN, const +- char *STR) +- The `argz_add' function adds the string STR to the end of the argz +- vector `*ARGZ', and updates `*ARGZ' and `*ARGZ_LEN' accordingly. +- +- - Function: error_t argz_add_sep (char **ARGZ, size_t *ARGZ_LEN, const +- char *STR, int DELIM) +- The `argz_add_sep' function is similar to `argz_add', but STR is +- split into separate elements in the result at occurrences of the +- character DELIM. This is useful, for instance, for adding the +- components of a Unix search path to an argz vector, by using a +- value of `':'' for DELIM. +- +- - Function: error_t argz_append (char **ARGZ, size_t *ARGZ_LEN, const +- char *BUF, size_t BUF_LEN) +- The `argz_append' function appends BUF_LEN bytes starting at BUF +- to the argz vector `*ARGZ', reallocating `*ARGZ' to accommodate +- it, and adding BUF_LEN to `*ARGZ_LEN'. +- +- - Function: error_t argz_delete (char **ARGZ, size_t *ARGZ_LEN, char +- *ENTRY) +- If ENTRY points to the beginning of one of the elements in the +- argz vector `*ARGZ', the `argz_delete' function will remove this +- entry and reallocate `*ARGZ', modifying `*ARGZ' and `*ARGZ_LEN' +- accordingly. Note that as destructive argz functions usually +- reallocate their argz argument, pointers into argz vectors such as +- ENTRY will then become invalid. +- +- - Function: error_t argz_insert (char **ARGZ, size_t *ARGZ_LEN, char +- *BEFORE, const char *ENTRY) +- The `argz_insert' function inserts the string ENTRY into the argz +- vector `*ARGZ' at a point just before the existing element pointed +- to by BEFORE, reallocating `*ARGZ' and updating `*ARGZ' and +- `*ARGZ_LEN'. If BEFORE is `0', ENTRY is added to the end instead +- (as if by `argz_add'). Since the first element is in fact the +- same as `*ARGZ', passing in `*ARGZ' as the value of BEFORE will +- result in ENTRY being inserted at the beginning. +- +- - Function: char * argz_next (char *ARGZ, size_t ARGZ_LEN, const char +- *ENTRY) +- The `argz_next' function provides a convenient way of iterating +- over the elements in the argz vector ARGZ. It returns a pointer +- to the next element in ARGZ after the element ENTRY, or `0' if +- there are no elements following ENTRY. If ENTRY is `0', the first +- element of ARGZ is returned. +- +- This behavior suggests two styles of iteration: +- +- char *entry = 0; +- while ((entry = argz_next (ARGZ, ARGZ_LEN, entry))) +- ACTION; +- +- (the double parentheses are necessary to make some C compilers +- shut up about what they consider a questionable `while'-test) and: +- +- char *entry; +- for (entry = ARGZ; +- entry; +- entry = argz_next (ARGZ, ARGZ_LEN, entry)) +- ACTION; +- +- Note that the latter depends on ARGZ having a value of `0' if it +- is empty (rather than a pointer to an empty block of memory); this +- invariant is maintained for argz vectors created by the functions +- here. +- +- - Function: error_t argz_replace (char **ARGZ, size_t *ARGZ_LEN, +- const char *STR, const char *WITH, unsigned *REPLACE_COUNT) +- Replace any occurrences of the string STR in ARGZ with WITH, +- reallocating ARGZ as necessary. If REPLACE_COUNT is non-zero, +- `*REPLACE_COUNT' will be incremented by number of replacements +- performed. +- +- +-File: libc.info, Node: Envz Functions, Prev: Argz Functions, Up: Argz and Envz Vectors +- +-Envz Functions +--------------- +- +- Envz vectors are just argz vectors with additional constraints on +-the form of each element; as such, argz functions can also be used on +-them, where it makes sense. +- +- Each element in an envz vector is a name-value pair, separated by a +-`'='' character; if multiple `'='' characters are present in an +-element, those after the first are considered part of the value, and +-treated like all other non-`'\0'' characters. +- +- If _no_ `'='' characters are present in an element, that element is +-considered the name of a "null" entry, as distinct from an entry with an +-empty value: `envz_get' will return `0' if given the name of null +-entry, whereas an entry with an empty value would result in a value of +-`""'; `envz_entry' will still find such entries, however. Null entries +-can be removed with `envz_strip' function. +- +- As with argz functions, envz functions that may allocate memory (and +-thus fail) have a return type of `error_t', and return either `0' or +-`ENOMEM'. +- +- These functions are declared in the standard include file `envz.h'. +- +- - Function: char * envz_entry (const char *ENVZ, size_t ENVZ_LEN, +- const char *NAME) +- The `envz_entry' function finds the entry in ENVZ with the name +- NAME, and returns a pointer to the whole entry--that is, the argz +- element which begins with NAME followed by a `'='' character. If +- there is no entry with that name, `0' is returned. +- +- - Function: char * envz_get (const char *ENVZ, size_t ENVZ_LEN, const +- char *NAME) +- The `envz_get' function finds the entry in ENVZ with the name NAME +- (like `envz_entry'), and returns a pointer to the value portion of +- that entry (following the `'=''). If there is no entry with that +- name (or only a null entry), `0' is returned. +- +- - Function: error_t envz_add (char **ENVZ, size_t *ENVZ_LEN, const +- char *NAME, const char *VALUE) +- The `envz_add' function adds an entry to `*ENVZ' (updating `*ENVZ' +- and `*ENVZ_LEN') with the name NAME, and value VALUE. If an entry +- with the same name already exists in ENVZ, it is removed first. +- If VALUE is `0', then the new entry will the special null type of +- entry (mentioned above). +- +- - Function: error_t envz_merge (char **ENVZ, size_t *ENVZ_LEN, const +- char *ENVZ2, size_t ENVZ2_LEN, int OVERRIDE) +- The `envz_merge' function adds each entry in ENVZ2 to ENVZ, as if +- with `envz_add', updating `*ENVZ' and `*ENVZ_LEN'. If OVERRIDE is +- true, then values in ENVZ2 will supersede those with the same name +- in ENVZ, otherwise not. +- +- Null entries are treated just like other entries in this respect, +- so a null entry in ENVZ can prevent an entry of the same name in +- ENVZ2 from being added to ENVZ, if OVERRIDE is false. +- +- - Function: void envz_strip (char **ENVZ, size_t *ENVZ_LEN) +- The `envz_strip' function removes any null entries from ENVZ, +- updating `*ENVZ' and `*ENVZ_LEN'. +- +- +-File: libc.info, Node: Character Set Handling, Next: Locales, Prev: String and Array Utilities, Up: Top +- +-Character Set Handling +-********************** +- +- Character sets used in the early days of computing had only six, +-seven, or eight bits for each character: there was never a case where +-more than eight bits (one byte) were used to represent a single +-character. The limitations of this approach became more apparent as +-more people grappled with non-Roman character sets, where not all the +-characters that make up a language's character set can be represented +-by 2^8 choices. This chapter shows the functionality that was added to +-the C library to support multiple character sets. +- +-* Menu: +- +-* Extended Char Intro:: Introduction to Extended Characters. +-* Charset Function Overview:: Overview about Character Handling +- Functions. +-* Restartable multibyte conversion:: Restartable multibyte conversion +- Functions. +-* Non-reentrant Conversion:: Non-reentrant Conversion Function. +-* Generic Charset Conversion:: Generic Charset Conversion. +- +diff -u -udbrN glibc-2.3.2/manual/libc.info-9 glibc-2.3.2-200304020432/manual/libc.info-9 +--- glibc-2.3.2/manual/libc.info-9 Sat Mar 1 02:39:41 2003 ++++ glibc-2.3.2-200304020432/manual/libc.info-9 Thu Jan 1 01:00:00 1970 +@@ -1,1056 +0,0 @@ +-This is libc.info, produced by makeinfo version 4.2 from libc.texinfo. +- +-INFO-DIR-SECTION GNU libraries +-START-INFO-DIR-ENTRY +-* Libc: (libc). C library. +-END-INFO-DIR-ENTRY +- +- This file documents the GNU C library. +- +- This is Edition 0.10, last updated 2001-07-06, of `The GNU C Library +-Reference Manual', for Version 2.3.x. +- +- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002 +-Free Software Foundation, Inc. +- +- Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or +-any later version published by the Free Software Foundation; with the +-Invariant Sections being "Free Software Needs Free Documentation" and +-"GNU Lesser General Public License", the Front-Cover texts being (a) +-(see below), and with the Back-Cover Texts being (b) (see below). A +-copy of the license is included in the section entitled "GNU Free +-Documentation License". +- +- (a) The FSF's Front-Cover Text is: +- +- A GNU Manual +- +- (b) The FSF's Back-Cover Text is: +- +- You have freedom to copy and modify this GNU Manual, like GNU +-software. Copies published by the Free Software Foundation raise +-funds for GNU development. +- +- +-File: libc.info, Node: Extended Char Intro, Next: Charset Function Overview, Up: Character Set Handling +- +-Introduction to Extended Characters +-=================================== +- +- A variety of solutions is available to overcome the differences +-between character sets with a 1:1 relation between bytes and characters +-and character sets with ratios of 2:1 or 4:1. The remainder of this +-section gives a few examples to help understand the design decisions +-made while developing the functionality of the C library. +- +- A distinction we have to make right away is between internal and +-external representation. "Internal representation" means the +-representation used by a program while keeping the text in memory. +-External representations are used when text is stored or transmitted +-through some communication channel. Examples of external +-representations include files waiting in a directory to be read and +-parsed. +- +- Traditionally there has been no difference between the two +-representations. It was equally comfortable and useful to use the same +-single-byte representation internally and externally. This comfort +-level decreases with more and larger character sets. +- +- One of the problems to overcome with the internal representation is +-handling text that is externally encoded using different character +-sets. Assume a program that reads two texts and compares them using +-some metric. The comparison can be usefully done only if the texts are +-internally kept in a common format. +- +- For such a common format (= character set) eight bits are certainly +-no longer enough. So the smallest entity will have to grow: "wide +-characters" will now be used. Instead of one byte per character, two or +-four will be used instead. (Three are not good to address in memory and +-more than four bytes seem not to be necessary). +- +- As shown in some other part of this manual, a completely new family +-has been created of functions that can handle wide character texts in +-memory. The most commonly used character sets for such internal wide +-character representations are Unicode and ISO 10646 (also known as UCS +-for Universal Character Set). Unicode was originally planned as a +-16-bit character set; whereas, ISO 10646 was designed to be a 31-bit +-large code space. The two standards are practically identical. They +-have the same character repertoire and code table, but Unicode specifies +-added semantics. At the moment, only characters in the first `0x10000' +-code positions (the so-called Basic Multilingual Plane, BMP) have been +-assigned, but the assignment of more specialized characters outside this +-16-bit space is already in progress. A number of encodings have been +-defined for Unicode and ISO 10646 characters: UCS-2 is a 16-bit word +-that can only represent characters from the BMP, UCS-4 is a 32-bit word +-than can represent any Unicode and ISO 10646 character, UTF-8 is an +-ASCII compatible encoding where ASCII characters are represented by +-ASCII bytes and non-ASCII characters by sequences of 2-6 non-ASCII +-bytes, and finally UTF-16 is an extension of UCS-2 in which pairs of +-certain UCS-2 words can be used to encode non-BMP characters up to +-`0x10ffff'. +- +- To represent wide characters the `char' type is not suitable. For +-this reason the ISO C standard introduces a new type that is designed +-to keep one character of a wide character string. To maintain the +-similarity there is also a type corresponding to `int' for those +-functions that take a single wide character. +- +- - Data type: wchar_t +- This data type is used as the base type for wide character strings. +- In other words, arrays of objects of this type are the equivalent +- of `char[]' for multibyte character strings. The type is defined +- in `stddef.h'. +- +- The ISO C90 standard, where `wchar_t' was introduced, does not say +- anything specific about the representation. It only requires that +- this type is capable of storing all elements of the basic +- character set. Therefore it would be legitimate to define +- `wchar_t' as `char', which might make sense for embedded systems. +- +- But for GNU systems `wchar_t' is always 32 bits wide and, +- therefore, capable of representing all UCS-4 values and, +- therefore, covering all of ISO 10646. Some Unix systems define +- `wchar_t' as a 16-bit type and thereby follow Unicode very +- strictly. This definition is perfectly fine with the standard, +- but it also means that to represent all characters from Unicode +- and ISO 10646 one has to use UTF-16 surrogate characters, which is +- in fact a multi-wide-character encoding. But resorting to +- multi-wide-character encoding contradicts the purpose of the +- `wchar_t' type. +- +- - Data type: wint_t +- `wint_t' is a data type used for parameters and variables that +- contain a single wide character. As the name suggests this type +- is the equivalent of `int' when using the normal `char' strings. +- The types `wchar_t' and `wint_t' often have the same +- representation if their size is 32 bits wide but if `wchar_t' is +- defined as `char' the type `wint_t' must be defined as `int' due +- to the parameter promotion. +- +- This type is defined in `wchar.h' and was introduced in +- Amendment 1 to ISO C90. +- +- As there are for the `char' data type macros are available for +-specifying the minimum and maximum value representable in an object of +-type `wchar_t'. +- +- - Macro: wint_t WCHAR_MIN +- The macro `WCHAR_MIN' evaluates to the minimum value representable +- by an object of type `wint_t'. +- +- This macro was introduced in Amendment 1 to ISO C90. +- +- - Macro: wint_t WCHAR_MAX +- The macro `WCHAR_MAX' evaluates to the maximum value representable +- by an object of type `wint_t'. +- +- This macro was introduced in Amendment 1 to ISO C90. +- +- Another special wide character value is the equivalent to `EOF'. +- +- - Macro: wint_t WEOF +- The macro `WEOF' evaluates to a constant expression of type +- `wint_t' whose value is different from any member of the extended +- character set. +- +- `WEOF' need not be the same value as `EOF' and unlike `EOF' it +- also need _not_ be negative. In other words, sloppy code like +- +- { +- int c; +- ... +- while ((c = getc (fp)) < 0) +- ... +- } +- +- has to be rewritten to use `WEOF' explicitly when wide characters +- are used: +- +- { +- wint_t c; +- ... +- while ((c = wgetc (fp)) != WEOF) +- ... +- } +- +- This macro was introduced in Amendment 1 to ISO C90 and is defined +- in `wchar.h'. +- +- These internal representations present problems when it comes to +-storing 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, 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. +- +- For all the above reasons, an external encoding that is different +-from the internal encoding is often used if the latter is UCS-2 or +-UCS-4. The external encoding is byte-based and can be chosen +-appropriately for the environment and for the texts to be handled. A +-variety of different character sets can be used for this external +-encoding (information that will not be exhaustively presented +-here-instead, a description of the major groups will suffice). All of +-the ASCII-based character sets fulfill one requirement: they are +-"filesystem safe." This means that the character `'/'' is used in the +-encoding _only_ to represent itself. Things are a bit different for +-character sets like EBCDIC (Extended Binary Coded Decimal Interchange +-Code, a character set family used by IBM), but if the operation system +-does not understand EBCDIC directly the parameters-to-system calls have +-to be converted first anyhow. +- +- * The simplest character sets are single-byte character sets. There +- can be only up to 256 characters (for 8 bit character sets), which +- is not sufficient to cover all languages but might be sufficient +- to handle a specific text. Handling of a 8 bit character sets is +- simple. This is not true for other kinds presented later, and +- therefore, the application one uses might require the use of 8 bit +- character sets. +- +- * The ISO 2022 standard defines a mechanism for extended character +- sets where one character _can_ be represented by more than one +- byte. This is achieved by associating a state with the text. +- Characters that can be used to change the state can be embedded in +- the text. Each byte in the text might have a different +- interpretation in each state. The state might even influence +- whether a given byte stands for a character on its own or whether +- it has to be combined with some more bytes. +- +- In most uses of ISO 2022 the defined character sets do not allow +- state changes that cover more than the next character. This has +- the big advantage that whenever one can identify the beginning of +- the byte sequence of a character one can interpret a text +- correctly. Examples of character sets using this policy are the +- various EUC character sets (used by Sun's operations systems, +- EUC-JP, EUC-KR, EUC-TW, and EUC-CN) or Shift_JIS (SJIS, a Japanese +- encoding). +- +- But there are also character sets using a state that is valid for +- more than one character and has to be changed by another byte +- sequence. Examples for this are ISO-2022-JP, ISO-2022-KR, and +- ISO-2022-CN. +- +- * Early attempts to fix 8 bit character sets for other languages +- using the Roman alphabet lead to character sets like ISO 6937. +- Here bytes representing characters like the acute accent do not +- produce output themselves: one has to combine them with other +- characters to get the desired result. For example, the byte +- sequence `0xc2 0x61' (non-spacing acute accent, followed by +- lower-case `a') to get the "small a with acute" character. To +- get the acute accent character on its own, one has to write `0xc2 +- 0x20' (the non-spacing acute followed by a space). +- +- Character sets like ISO 6937 are used in some embedded systems such +- as teletex. +- +- * Instead of converting the Unicode or ISO 10646 text used +- internally, it is often also sufficient to simply use an encoding +- different than UCS-2/UCS-4. The Unicode and ISO 10646 standards +- even specify such an encoding: UTF-8. This encoding is able to +- represent all of ISO 10646 31 bits in a byte string of length one +- to six. +- +- There were a few other attempts to encode ISO 10646 such as UTF-7, +- but UTF-8 is today the only encoding that should be used. In +- fact, with any luck UTF-8 will soon be the only external encoding +- that has to be supported. It proves to be universally usable and +- its only disadvantage is that it favors Roman languages by making +- the byte string representation of other scripts (Cyrillic, Greek, +- Asian scripts) longer than necessary if using a specific character +- set for these scripts. Methods like the Unicode compression +- scheme can alleviate these problems. +- +- The question remaining is: how to select the character set or +-encoding to use. The answer: you cannot decide about it yourself, it +-is decided by the developers of the system or the majority of the +-users. Since the goal is interoperability one has to use whatever the +-other people one works with use. If there are no constraints, the +-selection is based on the requirements the expected circle of users +-will have. In other words, if a project is expected to be used in +-only, say, Russia it is fine to use KOI8-R or a similar character set. +-But if at the same time people from, say, Greece are participating one +-should use a character set that allows all people to collaborate. +- +- The most widely useful solution seems to be: go with the most general +-character set, namely ISO 10646. Use UTF-8 as the external encoding +-and problems about users not being able to use their own language +-adequately are a thing of the past. +- +- One final comment about the choice of the wide character +-representation is necessary at this point. We have said above that the +-natural choice is using Unicode or ISO 10646. This is not required, +-but at least encouraged, by the ISO C standard. The standard defines +-at least a macro `__STDC_ISO_10646__' that is only defined on systems +-where the `wchar_t' type encodes ISO 10646 characters. If this symbol +-is not defined one should avoid making assumptions about the wide +-character representation. If the programmer uses only the functions +-provided by the C library to handle wide character strings there should +-be no compatibility problems with other systems. +- +- +-File: libc.info, Node: Charset Function Overview, Next: Restartable multibyte conversion, Prev: Extended Char Intro, Up: Character Set Handling +- +-Overview about Character Handling Functions +-=========================================== +- +- A Unix C library contains three different sets of functions in two +-families to handle character set conversion. One of the function +-families (the most commonly used) is specified in the ISO C90 standard +-and, therefore, is portable even beyond the Unix world. Unfortunately +-this family is the least useful one. These functions should be avoided +-whenever possible, especially when developing libraries (as opposed to +-applications). +- +- The second family of functions got introduced in the early Unix +-standards (XPG2) and is still part of the latest and greatest Unix +-standard: Unix 98. It is also the most powerful and useful set of +-functions. But we will start with the functions defined in Amendment 1 +-to ISO C90. +- +- +-File: libc.info, Node: Restartable multibyte conversion, Next: Non-reentrant Conversion, Prev: Charset Function Overview, Up: Character Set Handling +- +-Restartable Multibyte Conversion Functions +-========================================== +- +- The ISO C standard defines functions to convert strings from a +-multibyte representation to wide character strings. There are a number +-of peculiarities: +- +- * The character set assumed for the multibyte encoding is not +- specified as an argument to the functions. Instead the character +- set specified by the `LC_CTYPE' category of the current locale is +- used; see *Note Locale Categories::. +- +- * The functions handling more than one character at a time require +- NUL terminated strings as the argument (i.e., converting blocks of +- text does not work unless one can add a NUL byte at an appropriate +- place). The GNU C library contains some extensions to the +- standard that allow specifying a size, but basically they also +- expect terminated strings. +- +- Despite these limitations the ISO C functions can be used in many +-contexts. In graphical user interfaces, for instance, it is not +-uncommon to have functions that require text to be displayed in a wide +-character string if the text is not simple ASCII. The text itself might +-come from a file with translations and the user should decide about the +-current locale, which determines the translation and therefore also the +-external encoding used. In such a situation (and many others) the +-functions described here are perfect. If more freedom while performing +-the conversion is necessary take a look at the `iconv' functions (*note +-Generic Charset Conversion::). +- +-* Menu: +- +-* Selecting the Conversion:: Selecting the conversion and its properties. +-* Keeping the state:: Representing the state of the conversion. +-* Converting a Character:: Converting Single Characters. +-* Converting Strings:: Converting Multibyte and Wide Character +- Strings. +-* Multibyte Conversion Example:: A Complete Multibyte Conversion Example. +- +- +-File: libc.info, Node: Selecting the Conversion, Next: Keeping the state, Up: Restartable multibyte conversion +- +-Selecting the conversion and its properties +-------------------------------------------- +- +- We already said above that the currently selected locale for the +-`LC_CTYPE' category decides about the conversion that is performed by +-the functions we are about to describe. Each locale uses its own +-character set (given as an argument to `localedef') and this is the one +-assumed as the external multibyte encoding. The wide character +-character set always is UCS-4, at least on GNU systems. +- +- A characteristic of each multibyte character set is the maximum +-number of bytes that can be necessary to represent one character. This +-information is quite important when writing code that uses the +-conversion functions (as shown in the examples below). The ISO C +-standard defines two macros that provide this information. +- +- - Macro: int MB_LEN_MAX +- `MB_LEN_MAX' specifies the maximum number of bytes in the multibyte +- sequence for a single character in any of the supported locales. +- It is a compile-time constant and is defined in `limits.h'. +- +- - Macro: int MB_CUR_MAX +- `MB_CUR_MAX' expands into a positive integer expression that is the +- maximum number of bytes in a multibyte character in the current +- locale. The value is never greater than `MB_LEN_MAX'. Unlike +- `MB_LEN_MAX' this macro need not be a compile-time constant, and in +- the GNU C library it is not. +- +- `MB_CUR_MAX' is defined in `stdlib.h'. +- +- Two different macros are necessary since strictly ISO C90 compilers +-do not allow variable length array definitions, but still it is +-desirable to avoid dynamic allocation. This incomplete piece of code +-shows the problem: +- +- { +- char buf[MB_LEN_MAX]; +- ssize_t len = 0; +- +- while (! feof (fp)) +- { +- fread (&buf[len], 1, MB_CUR_MAX - len, fp); +- /* ... process buf */ +- len -= used; +- } +- } +- +- The code in the inner loop is expected to have always enough bytes in +-the array BUF to convert one multibyte character. The array BUF has to +-be sized statically since many compilers do not allow a variable size. +-The `fread' call makes sure that `MB_CUR_MAX' bytes are always +-available in BUF. Note that it isn't a problem if `MB_CUR_MAX' is not +-a compile-time constant. +- +- +-File: libc.info, Node: Keeping the state, Next: Converting a Character, Prev: Selecting the Conversion, Up: Restartable multibyte conversion +- +-Representing the state of the conversion +----------------------------------------- +- +- In the introduction of this chapter it was said that certain +-character sets use a "stateful" encoding. That is, the encoded values +-depend in some way on the previous bytes in the text. +- +- Since the conversion functions allow converting a text in more than +-one step we must have a way to pass this information from one call of +-the functions to another. +- +- - Data type: mbstate_t +- A variable of type `mbstate_t' can contain all the information +- about the "shift state" needed from one call to a conversion +- function to another. +- +- `mbstate_t' is defined in `wchar.h'. It was introduced in +- Amendment 1 to ISO C90. +- +- To use objects of type `mbstate_t' the programmer has to define such +-objects (normally as local variables on the stack) and pass a pointer to +-the object to the conversion functions. This way the conversion +-function can update the object if the current multibyte character set +-is stateful. +- +- There is no specific function or initializer to put the state object +-in any specific state. The rules are that the object should always +-represent the initial state before the first use, and this is achieved +-by clearing the whole variable with code such as follows: +- +- { +- mbstate_t state; +- memset (&state, '\0', sizeof (state)); +- /* from now on STATE can be used. */ +- ... +- } +- +- When using the conversion functions to generate output it is often +-necessary to test whether the current state corresponds to the initial +-state. This is necessary, for example, to decide whether to emit +-escape sequences to set the state to the initial state at certain +-sequence points. Communication protocols often require this. +- +- - Function: int mbsinit (const mbstate_t *PS) +- The `mbsinit' function determines whether the state object pointed +- to by PS is in the initial state. If PS is a null pointer or the +- object is in the initial state the return value is nonzero. +- Otherwise it is zero. +- +- `mbsinit' was introduced in Amendment 1 to ISO C90 and is declared +- in `wchar.h'. +- +- Code using `mbsinit' often looks similar to this: +- +- { +- mbstate_t state; +- memset (&state, '\0', sizeof (state)); +- /* Use STATE. */ +- ... +- if (! mbsinit (&state)) +- { +- /* Emit code to return to initial state. */ +- const wchar_t empty[] = L""; +- const wchar_t *srcp = empty; +- wcsrtombs (outbuf, &srcp, outbuflen, &state); +- } +- ... +- } +- +- The code to emit the escape sequence to get back to the initial +-state is interesting. The `wcsrtombs' function can be used to +-determine the necessary output code (*note Converting Strings::). +-Please note that on GNU systems it is not necessary to perform this +-extra action for the conversion from multibyte text to wide character +-text since the wide character encoding is not stateful. But there is +-nothing mentioned in any standard that prohibits making `wchar_t' using +-a stateful encoding. +- +- +-File: libc.info, Node: Converting a Character, Next: Converting Strings, Prev: Keeping the state, Up: Restartable multibyte conversion +- +-Converting Single Characters +----------------------------- +- +- The most fundamental of the conversion functions are those dealing +-with single characters. Please note that this does not always mean +-single bytes. But since there is very often a subset of the multibyte +-character set that consists of single byte sequences, there are +-functions to help with converting bytes. Frequently, ASCII is a subpart +-of the multibyte character set. In such a scenario, each ASCII +-character stands for itself, and all other characters have at least a +-first byte that is beyond the range 0 to 127. +- +- - Function: wint_t btowc (int C) +- The `btowc' function ("byte to wide character") converts a valid +- single byte character C in the initial shift state into the wide +- character equivalent using the conversion rules from the currently +- selected locale of the `LC_CTYPE' category. +- +- If `(unsigned char) C' is no valid single byte multibyte character +- or if C is `EOF', the function returns `WEOF'. +- +- Please note the restriction of C being tested for validity only in +- the initial shift state. No `mbstate_t' object is used from which +- the state information is taken, and the function also does not use +- any static state. +- +- The `btowc' function was introduced in Amendment 1 to ISO C90 and +- is declared in `wchar.h'. +- +- Despite the limitation that the single byte value always is +-interpreted in the initial state this function is actually useful most +-of the time. Most characters are either entirely single-byte character +-sets or they are extension to ASCII. But then it is possible to write +-code like this (not that this specific example is very useful): +- +- wchar_t * +- itow (unsigned long int val) +- { +- static wchar_t buf[30]; +- wchar_t *wcp = &buf[29]; +- *wcp = L'\0'; +- while (val != 0) +- { +- *--wcp = btowc ('0' + val % 10); +- val /= 10; +- } +- if (wcp == &buf[29]) +- *--wcp = L'0'; +- return wcp; +- } +- +- Why is it necessary to use such a complicated implementation and not +-simply cast `'0' + val % 10' to a wide character? The answer is that +-there is no guarantee that one can perform this kind of arithmetic on +-the character of the character set used for `wchar_t' representation. +-In other situations the bytes are not constant at compile time and so +-the compiler cannot do the work. In situations like this it is +-necessary `btowc'. +- +-There also is a function for the conversion in the other direction. +- +- - Function: int wctob (wint_t C) +- The `wctob' function ("wide character to byte") takes as the +- parameter a valid wide character. If the multibyte representation +- for this character in the initial state is exactly one byte long, +- the return value of this function is this character. Otherwise +- the return value is `EOF'. +- +- `wctob' was introduced in Amendment 1 to ISO C90 and is declared +- in `wchar.h'. +- +- There are more general functions to convert single character from +-multibyte representation to wide characters and vice versa. These +-functions pose no limit on the length of the multibyte representation +-and they also do not require it to be in the initial state. +- +- - Function: size_t mbrtowc (wchar_t *restrict PWC, const char +- *restrict S, size_t N, mbstate_t *restrict PS) +- The `mbrtowc' function ("multibyte restartable to wide character") +- converts the next multibyte character in the string pointed to by +- S into a wide character and stores it in the wide character string +- pointed to by PWC. The conversion is performed according to the +- locale currently selected for the `LC_CTYPE' category. If the +- conversion for the character set used in the locale requires a +- state, the multibyte string is interpreted in the state +- represented by the object pointed to by PS. If PS is a null +- pointer, a static, internal state variable used only by the +- `mbrtowc' function is used. +- +- If the next multibyte character corresponds to the NUL wide +- character, the return value of the function is 0 and the state +- object is afterwards in the initial state. If the next N or fewer +- bytes form a correct multibyte character, the return value is the +- number of bytes starting from S that form the multibyte character. +- The conversion state is updated according to the bytes consumed +- in the conversion. In both cases the wide character (either the +- `L'\0'' or the one found in the conversion) is stored in the +- string pointed to by PWC if PWC is not null. +- +- If the first N bytes of the multibyte string possibly form a valid +- multibyte character but there are more than N bytes needed to +- complete it, the return value of the function is `(size_t) -2' and +- no value is stored. Please note that this can happen even if N +- has a value greater than or equal to `MB_CUR_MAX' since the input +- might contain redundant shift sequences. +- +- If the first `n' bytes of the multibyte string cannot possibly form +- a valid multibyte character, no value is stored, the global +- variable `errno' is set to the value `EILSEQ', and the function +- returns `(size_t) -1'. The conversion state is afterwards +- undefined. +- +- `mbrtowc' was introduced in Amendment 1 to ISO C90 and is declared +- in `wchar.h'. +- +- Use of `mbrtowc' is straightforward. A function that copies a +-multibyte string into a wide character string while at the same time +-converting all lowercase characters into uppercase could look like this +-(this is not the final version, just an example; it has no error +-checking, and sometimes leaks memory): +- +- wchar_t * +- mbstouwcs (const char *s) +- { +- size_t len = strlen (s); +- wchar_t *result = malloc ((len + 1) * sizeof (wchar_t)); +- wchar_t *wcp = result; +- wchar_t tmp[1]; +- mbstate_t state; +- size_t nbytes; +- +- memset (&state, '\0', sizeof (state)); +- while ((nbytes = mbrtowc (tmp, s, len, &state)) > 0) +- { +- if (nbytes >= (size_t) -2) +- /* Invalid input string. */ +- return NULL; +- *result++ = towupper (tmp[0]); +- len -= nbytes; +- s += nbytes; +- } +- return result; +- } +- +- The use of `mbrtowc' should be clear. A single wide character is +-stored in `TMP[0]', and the number of consumed bytes is stored in the +-variable NBYTES. If the conversion is successful, the uppercase +-variant of the wide character is stored in the RESULT array and the +-pointer to the input string and the number of available bytes is +-adjusted. +- +- The only non-obvious thing about `mbrtowc' might be the way memory +-is allocated for the result. The above code uses the fact that there +-can never be more wide characters in the converted results than there +-are bytes in the multibyte input string. This method yields a +-pessimistic guess about the size of the result, and if many wide +-character strings have to be constructed this way or if the strings are +-long, the extra memory required to be allocated because the input +-string contains multibyte characters might be significant. The +-allocated memory block can be resized to the correct size before +-returning it, but a better solution might be to allocate just the right +-amount of space for the result right away. Unfortunately there is no +-function to compute the length of the wide character string directly +-from the multibyte string. There is, however, a function that does +-part of the work. +- +- - Function: size_t mbrlen (const char *restrict S, size_t N, mbstate_t +- *PS) +- The `mbrlen' function ("multibyte restartable length") computes +- the number of at most N bytes starting at S, which form the next +- valid and complete multibyte character. +- +- If the next multibyte character corresponds to the NUL wide +- character, the return value is 0. If the next N bytes form a valid +- multibyte character, the number of bytes belonging to this +- multibyte character byte sequence is returned. +- +- If the the first N bytes possibly form a valid multibyte character +- but the character is incomplete, the return value is `(size_t) +- -2'. Otherwise the multibyte character sequence is invalid and +- the return value is `(size_t) -1'. +- +- The multibyte sequence is interpreted in the state represented by +- the object pointed to by PS. If PS is a null pointer, a state +- object local to `mbrlen' is used. +- +- `mbrlen' was introduced in Amendment 1 to ISO C90 and is declared +- in `wchar.h'. +- +- The attentive reader now will note that `mbrlen' can be implemented +-as +- +- mbrtowc (NULL, s, n, ps != NULL ? ps : &internal) +- +- This is true and in fact is mentioned in the official specification. +-How can this function be used to determine the length of the wide +-character string created from a multibyte character string? It is not +-directly usable, but we can define a function `mbslen' using it: +- +- size_t +- mbslen (const char *s) +- { +- mbstate_t state; +- size_t result = 0; +- size_t nbytes; +- memset (&state, '\0', sizeof (state)); +- while ((nbytes = mbrlen (s, MB_LEN_MAX, &state)) > 0) +- { +- if (nbytes >= (size_t) -2) +- /* Something is wrong. */ +- return (size_t) -1; +- s += nbytes; +- ++result; +- } +- return result; +- } +- +- This function simply calls `mbrlen' for each multibyte character in +-the string and counts the number of function calls. Please note that +-we here use `MB_LEN_MAX' as the size argument in the `mbrlen' call. +-This is acceptable since a) this value is larger then the length of the +-longest multibyte character sequence and b) we know that the string S +-ends with a NUL byte, which cannot be part of any other multibyte +-character sequence but the one representing the NUL wide character. +-Therefore, the `mbrlen' function will never read invalid memory. +- +- Now that this function is available (just to make this clear, this +-function is _not_ part of the GNU C library) we can compute the number +-of wide character required to store the converted multibyte character +-string S using +- +- wcs_bytes = (mbslen (s) + 1) * sizeof (wchar_t); +- +- Please note that the `mbslen' function is quite inefficient. The +-implementation of `mbstouwcs' with `mbslen' would have to perform the +-conversion of the multibyte character input string twice, and this +-conversion might be quite expensive. So it is necessary to think about +-the consequences of using the easier but imprecise method before doing +-the work twice. +- +- - Function: size_t wcrtomb (char *restrict S, wchar_t WC, mbstate_t +- *restrict PS) +- The `wcrtomb' function ("wide character restartable to multibyte") +- converts a single wide character into a multibyte string +- corresponding to that wide character. +- +- If S is a null pointer, the function resets the state stored in +- the objects pointed to by PS (or the internal `mbstate_t' object) +- to the initial state. This can also be achieved by a call like +- this: +- +- wcrtombs (temp_buf, L'\0', ps) +- +- since, if S is a null pointer, `wcrtomb' performs as if it writes +- into an internal buffer, which is guaranteed to be large enough. +- +- If WC is the NUL wide character, `wcrtomb' emits, if necessary, a +- shift sequence to get the state PS into the initial state followed +- by a single NUL byte, which is stored in the string S. +- +- Otherwise a byte sequence (possibly including shift sequences) is +- written into the string S. This only happens if WC is a valid wide +- character (i.e., it has a multibyte representation in the +- character set selected by locale of the `LC_CTYPE' category). If +- WC is no valid wide character, nothing is stored in the strings S, +- `errno' is set to `EILSEQ', the conversion state in PS is +- undefined and the return value is `(size_t) -1'. +- +- If no error occurred the function returns the number of bytes +- stored in the string S. This includes all bytes representing shift +- sequences. +- +- One word about the interface of the function: there is no parameter +- specifying the length of the array S. Instead the function +- assumes that there are at least `MB_CUR_MAX' bytes available since +- this is the maximum length of any byte sequence representing a +- single character. So the caller has to make sure that there is +- enough space available, otherwise buffer overruns can occur. +- +- `wcrtomb' was introduced in Amendment 1 to ISO C90 and is declared +- in `wchar.h'. +- +- Using `wcrtomb' is as easy as using `mbrtowc'. The following +-example appends a wide character string to a multibyte character string. +-Again, the code is not really useful (or correct), it is simply here to +-demonstrate the use and some problems. +- +- char * +- mbscatwcs (char *s, size_t len, const wchar_t *ws) +- { +- mbstate_t state; +- /* Find the end of the existing string. */ +- char *wp = strchr (s, '\0'); +- len -= wp - s; +- memset (&state, '\0', sizeof (state)); +- do +- { +- size_t nbytes; +- if (len < MB_CUR_LEN) +- { +- /* We cannot guarantee that the next +- character fits into the buffer, so +- return an error. */ +- errno = E2BIG; +- return NULL; +- } +- nbytes = wcrtomb (wp, *ws, &state); +- if (nbytes == (size_t) -1) +- /* Error in the conversion. */ +- return NULL; +- len -= nbytes; +- wp += nbytes; +- } +- while (*ws++ != L'\0'); +- return s; +- } +- +- First the function has to find the end of the string currently in the +-array S. The `strchr' call does this very efficiently since a +-requirement for multibyte character representations is that the NUL byte +-is never used except to represent itself (and in this context, the end +-of the string). +- +- After initializing the state object the loop is entered where the +-first task is to make sure there is enough room in the array S. We +-abort if there are not at least `MB_CUR_LEN' bytes available. This is +-not always optimal but we have no other choice. We might have less +-than `MB_CUR_LEN' bytes available but the next multibyte character +-might also be only one byte long. At the time the `wcrtomb' call +-returns it is too late to decide whether the buffer was large enough. +-If this solution is unsuitable, there is a very slow but more accurate +-solution. +- +- ... +- if (len < MB_CUR_LEN) +- { +- mbstate_t temp_state; +- memcpy (&temp_state, &state, sizeof (state)); +- if (wcrtomb (NULL, *ws, &temp_state) > len) +- { +- /* We cannot guarantee that the next +- character fits into the buffer, so +- return an error. */ +- errno = E2BIG; +- return NULL; +- } +- } +- ... +- +- Here we perform the conversion that might overflow the buffer so that +-we are afterwards in the position to make an exact decision about the +-buffer size. Please note the `NULL' argument for the destination +-buffer in the new `wcrtomb' call; since we are not interested in the +-converted text at this point, this is a nice way to express this. The +-most unusual thing about this piece of code certainly is the duplication +-of the conversion state object, but if a change of the state is +-necessary to emit the next multibyte character, we want to have the +-same shift state change performed in the real conversion. Therefore, +-we have to preserve the initial shift state information. +- +- There are certainly many more and even better solutions to this +-problem. This example is only provided for educational purposes. +- +- +-File: libc.info, Node: Converting Strings, Next: Multibyte Conversion Example, Prev: Converting a Character, Up: Restartable multibyte conversion +- +-Converting Multibyte and Wide Character Strings +------------------------------------------------ +- +- The functions described in the previous section only convert a single +-character at a time. Most operations to be performed in real-world +-programs include strings and therefore the ISO C standard also defines +-conversions on entire strings. However, the defined set of functions +-is quite limited; therefore, the GNU C library contains a few +-extensions that can help in some important situations. +- +- - Function: size_t mbsrtowcs (wchar_t *restrict DST, const char +- **restrict SRC, size_t LEN, mbstate_t *restrict PS) +- The `mbsrtowcs' function ("multibyte string restartable to wide +- character string") converts an NUL-terminated multibyte character +- string at `*SRC' into an equivalent wide character string, +- including the NUL wide character at the end. The conversion is +- started using the state information from the object pointed to by +- PS or from an internal object of `mbsrtowcs' if PS is a null +- pointer. Before returning, the state object is updated to match +- the state after the last converted character. The state is the +- initial state if the terminating NUL byte is reached and converted. +- +- If DST is not a null pointer, the result is stored in the array +- pointed to by DST; otherwise, the conversion result is not +- available since it is stored in an internal buffer. +- +- If LEN wide characters are stored in the array DST before reaching +- the end of the input string, the conversion stops and LEN is +- returned. If DST is a null pointer, LEN is never checked. +- +- Another reason for a premature return from the function call is if +- the input string contains an invalid multibyte sequence. In this +- case the global variable `errno' is set to `EILSEQ' and the +- function returns `(size_t) -1'. +- +- In all other cases the function returns the number of wide +- characters converted during this call. If DST is not null, +- `mbsrtowcs' stores in the pointer pointed to by SRC either a null +- pointer (if the NUL byte in the input string was reached) or the +- address of the byte following the last converted multibyte +- character. +- +- `mbsrtowcs' was introduced in Amendment 1 to ISO C90 and is +- declared in `wchar.h'. +- +- The definition of the `mbsrtowcs' function has one important +-limitation. The requirement that DST has to be a NUL-terminated string +-provides problems if one wants to convert buffers with text. A buffer +-is normally no collection of NUL-terminated strings but instead a +-continuous collection of lines, separated by newline characters. Now +-assume that a function to convert one line from a buffer is needed. +-Since the line is not NUL-terminated, the source pointer cannot +-directly point into the unmodified text buffer. This means, either one +-inserts the NUL byte at the appropriate place for the time of the +-`mbsrtowcs' function call (which is not doable for a read-only buffer +-or in a multi-threaded application) or one copies the line in an extra +-buffer where it can be terminated by a NUL byte. Note that it is not +-in general possible to limit the number of characters to convert by +-setting the parameter LEN to any specific value. Since it is not known +-how many bytes each multibyte character sequence is in length, one can +-only guess. +- +- There is still a problem with the method of NUL-terminating a line +-right after the newline character, which could lead to very strange +-results. As said in the description of the `mbsrtowcs' function above +-the conversion state is guaranteed to be in the initial shift state +-after processing the NUL byte at the end of the input string. But this +-NUL byte is not really part of the text (i.e., the conversion state +-after the newline in the original text could be something different +-than the initial shift state and therefore the first character of the +-next line is encoded using this state). But the state in question is +-never accessible to the user since the conversion stops after the NUL +-byte (which resets the state). Most stateful character sets in use +-today require that the shift state after a newline be the initial +-state-but this is not a strict guarantee. Therefore, simply +-NUL-terminating a piece of a running text is not always an adequate +-solution and, therefore, should never be used in generally used code. +- +- The generic conversion interface (*note Generic Charset Conversion::) +-does not have this limitation (it simply works on buffers, not +-strings), and the GNU C library contains a set of functions that take +-additional parameters specifying the maximal number of bytes that are +-consumed from the input string. This way the problem of `mbsrtowcs''s +-example above could be solved by determining the line length and +-passing this length to the function. +- +- - Function: size_t wcsrtombs (char *restrict DST, const wchar_t +- **restrict SRC, size_t LEN, mbstate_t *restrict PS) +- The `wcsrtombs' function ("wide character string restartable to +- multibyte string") converts the NUL-terminated wide character +- string at `*SRC' into an equivalent multibyte character string and +- stores the result in the array pointed to by DST. The NUL wide +- character is also converted. The conversion starts in the state +- described in the object pointed to by PS or by a state object +- locally to `wcsrtombs' in case PS is a null pointer. If DST is a +- null pointer, the conversion is performed as usual but the result +- is not available. If all characters of the input string were +- successfully converted and if DST is not a null pointer, the +- pointer pointed to by SRC gets assigned a null pointer. +- +- If one of the wide characters in the input string has no valid +- multibyte character equivalent, the conversion stops early, sets +- the global variable `errno' to `EILSEQ', and returns `(size_t) -1'. +- +- Another reason for a premature stop is if DST is not a null +- pointer and the next converted character would require more than +- LEN bytes in total to the array DST. In this case (and if DEST is +- not a null pointer) the pointer pointed to by SRC is assigned a +- value pointing to the wide character right after the last one +- successfully converted. +- +- Except in the case of an encoding error the return value of the +- `wcsrtombs' function is the number of bytes in all the multibyte +- character sequences stored in DST. Before returning the state in +- the object pointed to by PS (or the internal object in case PS is +- a null pointer) is updated to reflect the state after the last +- conversion. The state is the initial shift state in case the +- terminating NUL wide character was converted. +- +- The `wcsrtombs' function was introduced in Amendment 1 to ISO C90 +- and is declared in `wchar.h'. +- +- The restriction mentioned above for the `mbsrtowcs' function applies +-here also. There is no possibility of directly controlling the number +-of input characters. One has to place the NUL wide character at the +-correct place or control the consumed input indirectly via the +-available output array size (the LEN parameter). +- +- - Function: size_t mbsnrtowcs (wchar_t *restrict DST, const char +- **restrict SRC, size_t NMC, size_t LEN, mbstate_t *restrict +- PS) +- The `mbsnrtowcs' function is very similar to the `mbsrtowcs' +- function. All the parameters are the same except for NMC, which is +- new. The return value is the same as for `mbsrtowcs'. +- +- This new parameter specifies how many bytes at most can be used +- from the multibyte character string. In other words, the +- multibyte character string `*SRC' need not be NUL-terminated. But +- if a NUL byte is found within the NMC first bytes of the string, +- the conversion stops here. +- +- This function is a GNU extension. It is meant to work around the +- problems mentioned above. Now it is possible to convert a buffer +- with multibyte character text piece for piece without having to +- care about inserting NUL bytes and the effect of NUL bytes on the +- conversion state. +- +- A function to convert a multibyte string into a wide character string +-and display it could be written like this (this is not a really useful +-example): +- +- void +- showmbs (const char *src, FILE *fp) +- { +- mbstate_t state; +- int cnt = 0; +- memset (&state, '\0', sizeof (state)); +- while (1) +- { +- wchar_t linebuf[100]; +- const char *endp = strchr (src, '\n'); +- size_t n; +- +- /* Exit if there is no more line. */ +- if (endp == NULL) +- break; +- +- n = mbsnrtowcs (linebuf, &src, endp - src, 99, &state); +- linebuf[n] = L'\0'; +- fprintf (fp, "line %d: \"%S\"\n", linebuf); +- } +- } +- +- There is no problem with the state after a call to `mbsnrtowcs'. +-Since we don't insert characters in the strings that were not in there +-right from the beginning and we use STATE only for the conversion of +-the given buffer, there is no problem with altering the state. +- +- - Function: size_t wcsnrtombs (char *restrict DST, const wchar_t +- **restrict SRC, size_t NWC, size_t LEN, mbstate_t *restrict +- PS) +- The `wcsnrtombs' function implements the conversion from wide +- character strings to multibyte character strings. It is similar to +- `wcsrtombs' but, just like `mbsnrtowcs', it takes an extra +- parameter, which specifies the length of the input string. +- +- No more than NWC wide characters from the input string `*SRC' are +- converted. If the input string contains a NUL wide character in +- the first NWC characters, the conversion stops at this place. +- +- The `wcsnrtombs' function is a GNU extension and just like +- `mbsnrtowcs' helps in situations where no NUL-terminated input +- strings are available. +- +diff -u -udbrN glibc-2.3.2/manual/libc.pg glibc-2.3.2-200304020432/manual/libc.pg +--- glibc-2.3.2/manual/libc.pg Tue Feb 25 11:35:07 2003 ++++ glibc-2.3.2-200304020432/manual/libc.pg Thu Jan 1 01:00:00 1970 +@@ -1,289 +0,0 @@ +-\entry{gcc}{2}{\code {gcc}} +-\entry{dirent.h}{7}{\code {dirent.h}} +-\entry{fcntl.h}{7}{\code {fcntl.h}} +-\entry{grp.h}{7}{\code {grp.h}} +-\entry{limits.h}{7}{\code {limits.h}} +-\entry{pwd.h}{7}{\code {pwd.h}} +-\entry{signal.h}{7}{\code {signal.h}} +-\entry{sys/stat.h}{7}{\code {sys/stat.h}} +-\entry{sys/times.h}{7}{\code {sys/times.h}} +-\entry{termios.h}{7}{\code {termios.h}} +-\entry{-lbsd-compat}{8}{\code {-lbsd-compat}} +-\entry{bsd-compat}{8}{\code {bsd-compat}} +-\entry{errno.h}{15}{\code {errno.h}} +-\entry{errno.h}{15}{\code {errno.h}} +-\entry{errno.h}{16}{\code {errno.h}} +-\entry{errno.h}{16}{\code {errno.h}} +-\entry{stdlib.h}{34}{\code {stdlib.h}} +-\entry{stdlib.h}{35}{\code {stdlib.h}} +-\entry{stdlib.h}{36}{\code {stdlib.h}} +-\entry{stdlib.h}{37}{\code {stdlib.h}} +-\entry{stdlib.h}{38}{\code {stdlib.h}} +-\entry{malloc.h}{39}{\code {malloc.h}} +-\entry{mcheck.h}{39}{\code {mcheck.h}} +-\entry{malloc.h}{41}{\code {malloc.h}} +-\entry{malloc.h}{43}{\code {malloc.h}} +-\entry{obstack.h}{49}{\code {obstack.h}} +-\entry{stdlib.h}{59}{\code {stdlib.h}} +-\entry{ctype.h}{67}{\code {ctype.h}} +-\entry{ctype.h}{67}{\code {ctype.h}} +-\entry{ctype.h}{69}{\code {ctype.h}} +-\entry{wctype.h}{70}{\code {wctype.h}} +-\entry{wctype.h}{70}{\code {wctype.h}} +-\entry{wctype.h}{70}{\code {wctype.h}} +-\entry{wctype.h}{70}{\code {wctype.h}} +-\entry{wctype.h}{71}{\code {wctype.h}} +-\entry{wctype.h}{71}{\code {wctype.h}} +-\entry{wctype.h}{71}{\code {wctype.h}} +-\entry{wctype.h}{71}{\code {wctype.h}} +-\entry{wctype.h}{71}{\code {wctype.h}} +-\entry{wctype.h}{71}{\code {wctype.h}} +-\entry{wctype.h}{72}{\code {wctype.h}} +-\entry{wctype.h}{72}{\code {wctype.h}} +-\entry{wctype.h}{72}{\code {wctype.h}} +-\entry{wctype.h}{72}{\code {wctype.h}} +-\entry{wctype.h}{74}{\code {wctype.h}} +-\entry{wctype.h}{74}{\code {wctype.h}} +-\entry{wctype.h}{74}{\code {wctype.h}} +-\entry{wctype.h}{74}{\code {wctype.h}} +-\entry{wctype.h}{74}{\code {wctype.h}} +-\entry{string.h}{77}{\code {string.h}} +-\entry{string.h}{79}{\code {string.h}} +-\entry{wchar.h}{79}{\code {wchar.h}} +-\entry{string.h}{89}{\code {string.h}} +-\entry{string.h}{92}{\code {string.h}} +-\entry{wchar.h}{92}{\code {wchar.h}} +-\entry{string.h}{96}{\code {string.h}} +-\entry{string.h}{100}{\code {string.h}} +-\entry{string.h}{105}{\code {string.h}} +-\entry{argz.h}{107}{\code {argz.h}} +-\entry{envz.h}{110}{\code {envz.h}} +-\entry{wchar.h}{112}{\code {wchar.h}} +-\entry{wchar.h}{113}{\code {wchar.h}} +-\entry{limits.h}{116}{\code {limits.h}} +-\entry{stdlib.h}{116}{\code {stdlib.h}} +-\entry{wchar.h}{116}{\code {wchar.h}} +-\entry{wchar.h}{117}{\code {wchar.h}} +-\entry{wchar.h}{118}{\code {wchar.h}} +-\entry{wchar.h}{118}{\code {wchar.h}} +-\entry{wchar.h}{119}{\code {wchar.h}} +-\entry{wchar.h}{120}{\code {wchar.h}} +-\entry{wchar.h}{122}{\code {wchar.h}} +-\entry{wchar.h}{123}{\code {wchar.h}} +-\entry{wchar.h}{125}{\code {wchar.h}} +-\entry{stdlib.h}{129}{\code {stdlib.h}} +-\entry{iconv.h}{133}{\code {iconv.h}} +-\entry{iconv.h}{133}{\code {iconv.h}} +-\entry{iconv.h}{135}{\code {iconv.h}} +-\entry{gconv.h}{142}{\code {gconv.h}} +-\entry{locale.h}{155}{\code {locale.h}} +-\entry{locale}{155}{\code {locale}} +-\entry{locale.h}{158}{\code {locale.h}} +-\entry{langinfo.h}{162}{\code {langinfo.h}} +-\entry{stdlib.h}{196}{\code {stdlib.h}} +-\entry{stdlib.h}{196}{\code {stdlib.h}} +-\entry{fnmatch.h}{205}{\code {fnmatch.h}} +-\entry{ksh}{206}{\code {ksh}} +-\entry{stdio.h}{231}{\code {stdio.h}} +-\entry{stdio.h}{231}{\code {stdio.h}} +-\entry{stdio.h}{232}{\code {stdio.h}} +-\entry{stdio.h}{241}{\code {stdio.h}} +-\entry{wchar.h}{241}{\code {wchar.h}} +-\entry{stdio.h}{243}{\code {stdio.h}} +-\entry{wchar.h}{243}{\code {wchar.h}} +-\entry{stdio.h}{249}{\code {stdio.h}} +-\entry{stdio.h}{259}{\code {stdio.h}} +-\entry{stdio.h}{262}{\code {stdio.h}} +-\entry{printf.h}{266}{\code {printf.h}} +-\entry{printf.h}{267}{\code {printf.h}} +-\entry{stdio.h}{279}{\code {stdio.h}} +-\entry{stdio.h}{284}{\code {stdio.h}} +-\entry{stdio.h}{287}{\code {stdio.h}} +-\entry{stdio.h}{289}{\code {stdio.h}} +-\entry{stdio.h}{290}{\code {stdio.h}} +-\entry{stdio.h}{292}{\code {stdio.h}} +-\entry{stdio.h}{295}{\code {stdio.h}} +-\entry{unistd.h}{303}{\code {unistd.h}} +-\entry{fcntl.h}{303}{\code {fcntl.h}} +-\entry{unistd.h}{306}{\code {unistd.h}} +-\entry{stdio.h}{313}{\code {stdio.h}} +-\entry{unistd.h}{313}{\code {unistd.h}} +-\entry{sys/types.h}{321}{\code {sys/types.h}} +-\entry{fcntl.h}{336}{\code {fcntl.h}} +-\entry{unistd.h}{337}{\code {unistd.h}} +-\entry{fcntl.h}{337}{\code {fcntl.h}} +-\entry{fcntl.h}{339}{\code {fcntl.h}} +-\entry{fcntl.h}{340}{\code {fcntl.h}} +-\entry{fcntl.h}{346}{\code {fcntl.h}} +-\entry{fcntl.h}{348}{\code {fcntl.h}} +-\entry{cd}{351}{\code {cd}} +-\entry{unistd.h}{351}{\code {unistd.h}} +-\entry{dirent.h}{353}{\code {dirent.h}} +-\entry{dirent.h}{354}{\code {dirent.h}} +-\entry{dirent.h}{355}{\code {dirent.h}} +-\entry{dirent.h}{357}{\code {dirent.h}} +-\entry{unistd.h}{364}{\code {unistd.h}} +-\entry{unistd.h}{365}{\code {unistd.h}} +-\entry{unistd.h}{367}{\code {unistd.h}} +-\entry{unistd.h}{368}{\code {unistd.h}} +-\entry{stdio.h}{368}{\code {stdio.h}} +-\entry{mkdir}{369}{\code {mkdir}} +-\entry{sys/stat.h}{370}{\code {sys/stat.h}} +-\entry{ls}{370}{\code {ls}} +-\entry{sys/stat.h}{370}{\code {sys/stat.h}} +-\entry{sys/stat.h}{376}{\code {sys/stat.h}} +-\entry{chown}{377}{\code {chown}} +-\entry{chgrp}{377}{\code {chgrp}} +-\entry{unistd.h}{377}{\code {unistd.h}} +-\entry{sys/stat.h}{378}{\code {sys/stat.h}} +-\entry{umask}{381}{\code {umask}} +-\entry{sys/stat.h}{381}{\code {sys/stat.h}} +-\entry{unistd.h}{383}{\code {unistd.h}} +-\entry{unistd.h}{383}{\code {unistd.h}} +-\entry{time.h}{383}{\code {time.h}} +-\entry{utime.h}{384}{\code {utime.h}} +-\entry{sys/time.h}{385}{\code {sys/time.h}} +-\entry{sys/stat.h}{388}{\code {sys/stat.h}} +-\entry{stdio.h}{389}{\code {stdio.h}} +-\entry{unistd.h}{393}{\code {unistd.h}} +-\entry{sys/stat.h}{396}{\code {sys/stat.h}} +-\entry{sys/socket.h}{400}{\code {sys/socket.h}} +-\entry{sys/socket.h}{402}{\code {sys/socket.h}} +-\entry{sys/socket.h}{403}{\code {sys/socket.h}} +-\entry{sys/socket.h}{403}{\code {sys/socket.h}} +-\entry{sys/socket.h}{405}{\code {sys/socket.h}} +-\entry{sys/un.h}{406}{\code {sys/un.h}} +-\entry{sys/socket.h}{407}{\code {sys/socket.h}} +-\entry{netinet/in.h}{408}{\code {netinet/in.h}} +-\entry{netinet/in.h}{411}{\code {netinet/in.h}} +-\entry{arpa/inet.h}{411}{\code {arpa/inet.h}} +-\entry{/etc/hosts}{413}{\code {/etc/hosts}} +-\entry{netdb.h}{413}{\code {netdb.h}} +-\entry{netinet/in.h}{417}{\code {netinet/in.h}} +-\entry{/etc/services}{417}{\code {/etc/services}} +-\entry{netdb.h}{417}{\code {netdb.h}} +-\entry{netinet/in.h}{418}{\code {netinet/in.h}} +-\entry{/etc/protocols}{419}{\code {/etc/protocols}} +-\entry{netdb.h}{419}{\code {netdb.h}} +-\entry{sys/socket.h}{422}{\code {sys/socket.h}} +-\entry{sys/socket.h}{422}{\code {sys/socket.h}} +-\entry{sys/socket.h}{423}{\code {sys/socket.h}} +-\entry{sys/socket.h}{428}{\code {sys/socket.h}} +-\entry{sys/socket.h}{428}{\code {sys/socket.h}} +-\entry{sys/socket.h}{429}{\code {sys/socket.h}} +-\entry{sys/socket.h}{436}{\code {sys/socket.h}} +-\entry{sys/socket.h}{441}{\code {sys/socket.h}} +-\entry{sys/socket.h}{441}{\code {sys/socket.h}} +-\entry{/etc/networks}{443}{\code {/etc/networks}} +-\entry{netdb.h}{443}{\code {netdb.h}} +-\entry{unistd.h}{445}{\code {unistd.h}} +-\entry{termios.h}{447}{\code {termios.h}} +-\entry{stdlib.h}{468}{\code {stdlib.h}} +-\entry{math.h}{479}{\code {math.h}} +-\entry{complex.h}{479}{\code {complex.h}} +-\entry{stdlib.h}{508}{\code {stdlib.h}} +-\entry{stdlib.h}{509}{\code {stdlib.h}} +-\entry{stdlib.h}{511}{\code {stdlib.h}} +-\entry{stdint.h}{517}{\code {stdint.h}} +-\entry{stdlib.h}{518}{\code {stdlib.h}} +-\entry{math.h}{520}{\code {math.h}} +-\entry{math.h}{530}{\code {math.h}} +-\entry{stdlib.h}{530}{\code {stdlib.h}} +-\entry{math.h}{531}{\code {math.h}} +-\entry{math.h}{532}{\code {math.h}} +-\entry{complex.h}{538}{\code {complex.h}} +-\entry{complex.h}{539}{\code {complex.h}} +-\entry{stdlib.h}{540}{\code {stdlib.h}} +-\entry{wchar.h}{540}{\code {wchar.h}} +-\entry{stdlib.h}{544}{\code {stdlib.h}} +-\entry{time.h}{551}{\code {time.h}} +-\entry{sys/times.h}{552}{\code {sys/times.h}} +-\entry{time.h}{553}{\code {time.h}} +-\entry{sys/time.h}{554}{\code {sys/time.h}} +-\entry{sys/timex.h}{559}{\code {sys/timex.h}} +-\entry{time.h}{562}{\code {time.h}} +-\entry{time.h}{575}{\code {time.h}} +-\entry{/etc/localtime}{576}{\code {/etc/localtime}} +-\entry{localtime}{576}{\code {localtime}} +-\entry{/share/lib/zoneinfo}{576}{\code {/share/lib/zoneinfo}} +-\entry{zoneinfo}{576}{\code {zoneinfo}} +-\entry{unistd.h}{579}{\code {unistd.h}} +-\entry{sys/time.h}{579}{\code {sys/time.h}} +-\entry{sys/resource.h}{583}{\code {sys/resource.h}} +-\entry{sys/vtimes.h}{584}{\code {sys/vtimes.h}} +-\entry{sys/resource.h}{586}{\code {sys/resource.h}} +-\entry{ulimit.h}{588}{\code {ulimit.h}} +-\entry{sys/vlimit.h}{588}{\code {sys/vlimit.h}} +-\entry{sys/resource.h}{596}{\code {sys/resource.h}} +-\entry{setjmp.h}{602}{\code {setjmp.h}} +-\entry{setjmp.h}{603}{\code {setjmp.h}} +-\entry{signal.h}{613}{\code {signal.h}} +-\entry{kill}{616}{\code {kill}} +-\entry{string.h}{621}{\code {string.h}} +-\entry{stdio.h}{622}{\code {stdio.h}} +-\entry{signal.h}{622}{\code {signal.h}} +-\entry{signal.h}{624}{\code {signal.h}} +-\entry{signal.h}{627}{\code {signal.h}} +-\entry{signal.h}{639}{\code {signal.h}} +-\entry{signal.h}{640}{\code {signal.h}} +-\entry{signal.h}{644}{\code {signal.h}} +-\entry{signal.h}{645}{\code {signal.h}} +-\entry{signal.h}{647}{\code {signal.h}} +-\entry{signal.h}{654}{\code {signal.h}} +-\entry{unistd.h}{659}{\code {unistd.h}} +-\entry{argp.h}{666}{\code {argp.h}} +-\entry{stdlib.h}{691}{\code {stdlib.h}} +-\entry{stdlib.h}{697}{\code {stdlib.h}} +-\entry{stdlib.h}{699}{\code {stdlib.h}} +-\entry{unistd.h}{699}{\code {unistd.h}} +-\entry{sh}{701}{\code {sh}} +-\entry{stdlib.h}{701}{\code {stdlib.h}} +-\entry{sys/types.h}{702}{\code {sys/types.h}} +-\entry{unistd.h}{702}{\code {unistd.h}} +-\entry{unistd.h}{703}{\code {unistd.h}} +-\entry{unistd.h}{704}{\code {unistd.h}} +-\entry{sys/wait.h}{706}{\code {sys/wait.h}} +-\entry{sys/wait.h}{709}{\code {sys/wait.h}} +-\entry{sys/wait.h}{709}{\code {sys/wait.h}} +-\entry{stdio.h}{728}{\code {stdio.h}} +-\entry{unistd.h}{728}{\code {unistd.h}} +-\entry{sys/types.h}{728}{\code {sys/types.h}} +-\entry{-lbsd-compat}{729}{\code {-lbsd-compat}} +-\entry{bsd-compat}{729}{\code {bsd-compat}} +-\entry{unistd.h}{730}{\code {unistd.h}} +-\entry{sys/types.h}{730}{\code {sys/types.h}} +-\entry{unistd.h}{745}{\code {unistd.h}} +-\entry{sys/types.h}{745}{\code {sys/types.h}} +-\entry{unistd.h}{746}{\code {unistd.h}} +-\entry{sys/types.h}{746}{\code {sys/types.h}} +-\entry{unistd.h}{747}{\code {unistd.h}} +-\entry{sys/types.h}{747}{\code {sys/types.h}} +-\entry{grp.h}{748}{\code {grp.h}} +-\entry{grp.h}{748}{\code {grp.h}} +-\entry{stdio.h}{753}{\code {stdio.h}} +-\entry{unistd.h}{753}{\code {unistd.h}} +-\entry{utmp.h}{754}{\code {utmp.h}} +-\entry{utmpx.h}{758}{\code {utmpx.h}} +-\entry{utmp.h}{760}{\code {utmp.h}} +-\entry{/etc/passwd}{761}{\code {/etc/passwd}} +-\entry{pwd.h}{761}{\code {pwd.h}} +-\entry{/etc/group}{764}{\code {/etc/group}} +-\entry{grp.h}{764}{\code {grp.h}} +-\entry{hostname}{771}{\code {hostname}} +-\entry{hostid}{771}{\code {hostid}} +-\entry{unistd.h}{771}{\code {unistd.h}} +-\entry{sys/param.h}{772}{\code {sys/param.h}} +-\entry{sys/utsname.h}{773}{\code {sys/utsname.h}} +-\entry{limits.h}{787}{\code {limits.h}} +-\entry{unistd.h}{788}{\code {unistd.h}} +-\entry{limits.h}{799}{\code {limits.h}} +-\entry{unistd.h}{800}{\code {unistd.h}} +-\entry{unistd.h}{801}{\code {unistd.h}} +-\entry{execinfo.h}{817}{\code {execinfo.h}} +-\entry{assert.h}{841}{\code {assert.h}} +-\entry{stdarg.h}{844}{\code {stdarg.h}} +-\entry{stdarg.h}{846}{\code {stdarg.h}} +-\entry{varargs.h}{847}{\code {varargs.h}} +-\entry{stddef.h}{849}{\code {stddef.h}} +-\entry{limits.h}{850}{\code {limits.h}} +-\entry{float.h}{853}{\code {float.h}} +diff -u -udbrN glibc-2.3.2/manual/libc.pgs glibc-2.3.2-200304020432/manual/libc.pgs +--- glibc-2.3.2/manual/libc.pgs Tue Feb 25 11:34:58 2003 ++++ glibc-2.3.2-200304020432/manual/libc.pgs Thu Jan 1 01:00:00 1970 +@@ -1,106 +0,0 @@ +-\initial {-} +-\entry {\code {-lbsd-compat}}{8, 729} +-\initial {/} +-\entry {\code {/etc/group}}{764} +-\entry {\code {/etc/hosts}}{413} +-\entry {\code {/etc/localtime}}{576} +-\entry {\code {/etc/networks}}{443} +-\entry {\code {/etc/passwd}}{761} +-\entry {\code {/etc/protocols}}{419} +-\entry {\code {/etc/services}}{417} +-\entry {\code {/share/lib/zoneinfo}}{576} +-\initial {A} +-\entry {\code {argp.h}}{666} +-\entry {\code {argz.h}}{107} +-\entry {\code {arpa/inet.h}}{411} +-\entry {\code {assert.h}}{841} +-\initial {B} +-\entry {\code {bsd-compat}}{8, 729} +-\initial {C} +-\entry {\code {cd}}{351} +-\entry {\code {chgrp}}{377} +-\entry {\code {chown}}{377} +-\entry {\code {complex.h}}{479, 538, 539} +-\entry {\code {ctype.h}}{67, 69} +-\initial {D} +-\entry {\code {dirent.h}}{7, 353, 354, 355, 357} +-\initial {E} +-\entry {\code {envz.h}}{110} +-\entry {\code {errno.h}}{15, 16} +-\entry {\code {execinfo.h}}{817} +-\initial {F} +-\entry {\code {fcntl.h}}{7, 303, 336, 337, 339, 340, 346, 348} +-\entry {\code {float.h}}{853} +-\entry {\code {fnmatch.h}}{205} +-\initial {G} +-\entry {\code {gcc}}{2} +-\entry {\code {gconv.h}}{142} +-\entry {\code {grp.h}}{7, 748, 764} +-\initial {H} +-\entry {\code {hostid}}{771} +-\entry {\code {hostname}}{771} +-\initial {I} +-\entry {\code {iconv.h}}{133, 135} +-\initial {K} +-\entry {\code {kill}}{616} +-\entry {\code {ksh}}{206} +-\initial {L} +-\entry {\code {langinfo.h}}{162} +-\entry {\code {limits.h}}{7, 116, 787, 799, 850} +-\entry {\code {locale}}{155} +-\entry {\code {locale.h}}{155, 158} +-\entry {\code {localtime}}{576} +-\entry {\code {ls}}{370} +-\initial {M} +-\entry {\code {malloc.h}}{39, 41, 43} +-\entry {\code {math.h}}{479, 520, 530, 531, 532} +-\entry {\code {mcheck.h}}{39} +-\entry {\code {mkdir}}{369} +-\initial {N} +-\entry {\code {netdb.h}}{413, 417, 419, 443} +-\entry {\code {netinet/in.h}}{408, 411, 417, 418} +-\initial {O} +-\entry {\code {obstack.h}}{49} +-\initial {P} +-\entry {\code {printf.h}}{266, 267} +-\entry {\code {pwd.h}}{7, 761} +-\initial {S} +-\entry {\code {setjmp.h}}{602, 603} +-\entry {\code {sh}}{701} +-\entry {\code {signal.h}}{7, 613, 622, 624, 627, 639, 640, 644, 645, 647, 654} +-\entry {\code {stdarg.h}}{844, 846} +-\entry {\code {stddef.h}}{849} +-\entry {\code {stdint.h}}{517} +-\entry {\code {stdio.h}}{231, 232, 241, 243, 249, 259, 262, 279, 284, 287, 289, 290, 292, 295, 313, 368, 389, 622, 728, 753} +-\entry {\code {stdlib.h}}{34, 35, 36, 37, 38, 59, 116, 129, 196, 468, 508, 509, 511, 518, 530, 540, 544, 691, 697, 699, 701} +-\entry {\code {string.h}}{77, 79, 89, 92, 96, 100, 105, 621} +-\entry {\code {sys/param.h}}{772} +-\entry {\code {sys/resource.h}}{583, 586, 596} +-\entry {\code {sys/socket.h}}{400, 402, 403, 405, 407, 422, 423, 428, 429, 436, 441} +-\entry {\code {sys/stat.h}}{7, 370, 376, 378, 381, 388, 396} +-\entry {\code {sys/time.h}}{385, 554, 579} +-\entry {\code {sys/times.h}}{7, 552} +-\entry {\code {sys/timex.h}}{559} +-\entry {\code {sys/types.h}}{321, 702, 728, 730, 745, 746, 747} +-\entry {\code {sys/un.h}}{406} +-\entry {\code {sys/utsname.h}}{773} +-\entry {\code {sys/vlimit.h}}{588} +-\entry {\code {sys/vtimes.h}}{584} +-\entry {\code {sys/wait.h}}{706, 709} +-\initial {T} +-\entry {\code {termios.h}}{7, 447} +-\entry {\code {time.h}}{383, 551, 553, 562, 575} +-\initial {U} +-\entry {\code {ulimit.h}}{588} +-\entry {\code {umask}}{381} +-\entry {\code {unistd.h}}{303, 306, 313, 337, 351, 364, 365, 367, 368, 377, 383, 393, 445, 579, 659, 699, 702, 703, 704, 728, 730, 745, 746, 747, 753, 771, 788, 800, 801} +-\entry {\code {utime.h}}{384} +-\entry {\code {utmp.h}}{754, 760} +-\entry {\code {utmpx.h}}{758} +-\initial {V} +-\entry {\code {varargs.h}}{847} +-\initial {W} +-\entry {\code {wchar.h}}{79, 92, 112, 113, 116, 117, 118, 119, 120, 122, 123, 125, 241, 243, 540} +-\entry {\code {wctype.h}}{70, 71, 72, 74} +-\initial {Z} +-\entry {\code {zoneinfo}}{576} +diff -u -udbrN glibc-2.3.2/manual/libc.tp glibc-2.3.2-200304020432/manual/libc.tp +--- glibc-2.3.2/manual/libc.tp Tue Feb 25 11:35:07 2003 ++++ glibc-2.3.2-200304020432/manual/libc.tp Thu Jan 1 01:00:00 1970 +@@ -1,127 +0,0 @@ +-\entry{enum mcheck_status}{40}{\code {enum mcheck_status}} +-\entry{struct mallinfo}{43}{\code {struct mallinfo}} +-\entry{struct obstack}{49}{\code {struct obstack}} +-\entry{wctype_t}{70}{\code {wctype_t}} +-\entry{wctrans_t}{74}{\code {wctrans_t}} +-\entry{wchar_t}{112}{\code {wchar_t}} +-\entry{wint_t}{112}{\code {wint_t}} +-\entry{mbstate_t}{116}{\code {mbstate_t}} +-\entry{iconv_t}{132}{\code {iconv_t}} +-\entry{struct __gconv_step}{142}{\code {struct __gconv_step}} +-\entry{struct __gconv_step_data}{143}{\code {struct __gconv_step_data}} +-\entry{struct lconv}{158}{\code {struct lconv}} +-\entry{comparison_fn_t}{195}{\code {comparison_fn_t}} +-\entry{struct ENTRY}{200}{\code {struct ENTRY}} +-\entry{VISIT}{203}{\code {VISIT}} +-\entry{glob_t}{207}{\code {glob_t}} +-\entry{glob64_t}{208}{\code {glob64_t}} +-\entry{regex_t}{213}{\code {regex_t}} +-\entry{regmatch_t}{216}{\code {regmatch_t}} +-\entry{regoff_t}{217}{\code {regoff_t}} +-\entry{wordexp_t}{219}{\code {wordexp_t}} +-\entry{FILE}{231}{\code {FILE}} +-\entry{struct printf_info}{267}{\code {struct printf_info}} +-\entry{printf_function}{269}{\code {printf_function}} +-\entry{printf_arginfo_function}{269}{\code {printf_arginfo_function}} +-\entry{fpos_t}{287}{\code {fpos_t}} +-\entry{fpos64_t}{287}{\code {fpos64_t}} +-\entry{cookie_io_functions_t}{295}{\code {cookie_io_functions_t}} +-\entry{cookie_read_function}{297}{\code {cookie_read_function}} +-\entry{cookie_write_function}{297}{\code {cookie_write_function}} +-\entry{cookie_seek_function}{297}{\code {cookie_seek_function}} +-\entry{cookie_close_function}{297}{\code {cookie_close_function}} +-\entry{ssize_t}{306}{\code {ssize_t}} +-\entry{off_t}{312}{\code {off_t}} +-\entry{off64_t}{312}{\code {off64_t}} +-\entry{struct iovec}{316}{\code {struct iovec}} +-\entry{fd_set}{321}{\code {fd_set}} +-\entry{struct aiocb}{325}{\code {struct aiocb}} +-\entry{struct aiocb64}{326}{\code {struct aiocb64}} +-\entry{struct aioinit}{335}{\code {struct aioinit}} +-\entry{struct flock}{346}{\code {struct flock}} +-\entry{struct dirent}{353}{\code {struct dirent}} +-\entry{DIR}{354}{\code {DIR}} +-\entry{__ftw_func_t}{360}{\code {__ftw_func_t}} +-\entry{__ftw64_func_t}{361}{\code {__ftw64_func_t}} +-\entry{__nftw_func_t}{361}{\code {__nftw_func_t}} +-\entry{__nftw64_func_t}{361}{\code {__nftw64_func_t}} +-\entry{struct FTW}{361}{\code {struct FTW}} +-\entry{struct stat}{370}{\code {struct stat}} +-\entry{struct stat64}{372}{\code {struct stat64}} +-\entry{mode_t}{373}{\code {mode_t}} +-\entry{ino_t}{373}{\code {ino_t}} +-\entry{ino64_t}{373}{\code {ino64_t}} +-\entry{dev_t}{374}{\code {dev_t}} +-\entry{nlink_t}{374}{\code {nlink_t}} +-\entry{blkcnt_t}{374}{\code {blkcnt_t}} +-\entry{blkcnt64_t}{374}{\code {blkcnt64_t}} +-\entry{struct utimbuf}{384}{\code {struct utimbuf}} +-\entry{struct sockaddr}{402}{\code {struct sockaddr}} +-\entry{struct if_nameindex}{404}{\code {struct if_nameindex}} +-\entry{struct sockaddr_un}{406}{\code {struct sockaddr_un}} +-\entry{struct sockaddr_in}{408}{\code {struct sockaddr_in}} +-\entry{struct sockaddr_in6}{408}{\code {struct sockaddr_in6}} +-\entry{struct in_addr}{411}{\code {struct in_addr}} +-\entry{struct in6_addr}{411}{\code {struct in6_addr}} +-\entry{struct hostent}{413}{\code {struct hostent}} +-\entry{struct servent}{417}{\code {struct servent}} +-\entry{struct protoent}{419}{\code {struct protoent}} +-\entry{struct linger}{442}{\code {struct linger}} +-\entry{struct netent}{443}{\code {struct netent}} +-\entry{struct termios}{447}{\code {struct termios}} +-\entry{tcflag_t}{448}{\code {tcflag_t}} +-\entry{cc_t}{448}{\code {cc_t}} +-\entry{speed_t}{457}{\code {speed_t}} +-\entry{struct sgttyb}{464}{\code {struct sgttyb}} +-\entry{struct random_data}{510}{\code {struct random_data}} +-\entry{div_t}{518}{\code {div_t}} +-\entry{ldiv_t}{519}{\code {ldiv_t}} +-\entry{lldiv_t}{519}{\code {lldiv_t}} +-\entry{imaxdiv_t}{519}{\code {imaxdiv_t}} +-\entry{struct timeval}{550}{\code {struct timeval}} +-\entry{struct timespec}{550}{\code {struct timespec}} +-\entry{clock_t}{552}{\code {clock_t}} +-\entry{struct tms}{552}{\code {struct tms}} +-\entry{time_t}{553}{\code {time_t}} +-\entry{struct timezone}{554}{\code {struct timezone}} +-\entry{struct tm}{556}{\code {struct tm}} +-\entry{struct ntptimeval}{559}{\code {struct ntptimeval}} +-\entry{struct ntptimeval}{559}{\code {struct ntptimeval}} +-\entry{struct timex}{559}{\code {struct timex}} +-\entry{struct timex}{560}{\code {struct timex}} +-\entry{struct itimerval}{579}{\code {struct itimerval}} +-\entry{struct rusage}{583}{\code {struct rusage}} +-\entry{struct vtimes}{585}{\code {struct vtimes}} +-\entry{struct rlimit}{586}{\code {struct rlimit}} +-\entry{struct rlimit64}{587}{\code {struct rlimit64}} +-\entry{struct sched_param}{592}{\code {struct sched_param}} +-\entry{jmp_buf}{602}{\code {jmp_buf}} +-\entry{sigjmp_buf}{603}{\code {sigjmp_buf}} +-\entry{ucontext_t}{604}{\code {ucontext_t}} +-\entry{sighandler_t}{622}{\code {sighandler_t}} +-\entry{struct sigaction}{624}{\code {struct sigaction}} +-\entry{sig_atomic_t}{637}{\code {sig_atomic_t}} +-\entry{sigset_t}{644}{\code {sigset_t}} +-\entry{stack_t}{652}{\code {stack_t}} +-\entry{struct sigstack}{653}{\code {struct sigstack}} +-\entry{struct sigvec}{654}{\code {struct sigvec}} +-\entry{struct option}{662}{\code {struct option}} +-\entry{struct argp}{667}{\code {struct argp}} +-\entry{struct argp_option}{668}{\code {struct argp_option}} +-\entry{struct argp_state}{675}{\code {struct argp_state}} +-\entry{struct argp_child}{676}{\code {struct argp_child}} +-\entry{pid_t}{702}{\code {pid_t}} +-\entry{union wait}{709}{\code {union wait}} +-\entry{uid_t}{745}{\code {uid_t}} +-\entry{gid_t}{745}{\code {gid_t}} +-\entry{struct exit_status}{754}{\code {struct exit_status}} +-\entry{struct utmp}{754}{\code {struct utmp}} +-\entry{struct utmpx}{758}{\code {struct utmpx}} +-\entry{struct passwd}{761}{\code {struct passwd}} +-\entry{struct group}{764}{\code {struct group}} +-\entry{struct utsname}{773}{\code {struct utsname}} +-\entry{struct fstab}{775}{\code {struct fstab}} +-\entry{struct mntent}{777}{\code {struct mntent}} +-\entry{va_list}{846}{\code {va_list}} +-\entry{ptrdiff_t}{849}{\code {ptrdiff_t}} +-\entry{size_t}{849}{\code {size_t}} +diff -u -udbrN glibc-2.3.2/manual/libc.tps glibc-2.3.2-200304020432/manual/libc.tps +--- glibc-2.3.2/manual/libc.tps Tue Feb 25 11:34:58 2003 ++++ glibc-2.3.2-200304020432/manual/libc.tps Thu Jan 1 01:00:00 1970 +@@ -1,145 +0,0 @@ +-\initial {_} +-\entry {\code {__ftw_func_t}}{360} +-\entry {\code {__ftw64_func_t}}{361} +-\entry {\code {__nftw_func_t}}{361} +-\entry {\code {__nftw64_func_t}}{361} +-\initial {B} +-\entry {\code {blkcnt_t}}{374} +-\entry {\code {blkcnt64_t}}{374} +-\initial {C} +-\entry {\code {cc_t}}{448} +-\entry {\code {clock_t}}{552} +-\entry {\code {comparison_fn_t}}{195} +-\entry {\code {cookie_close_function}}{297} +-\entry {\code {cookie_io_functions_t}}{295} +-\entry {\code {cookie_read_function}}{297} +-\entry {\code {cookie_seek_function}}{297} +-\entry {\code {cookie_write_function}}{297} +-\initial {D} +-\entry {\code {dev_t}}{374} +-\entry {\code {DIR}}{354} +-\entry {\code {div_t}}{518} +-\initial {E} +-\entry {\code {enum mcheck_status}}{40} +-\initial {F} +-\entry {\code {fd_set}}{321} +-\entry {\code {FILE}}{231} +-\entry {\code {fpos_t}}{287} +-\entry {\code {fpos64_t}}{287} +-\initial {G} +-\entry {\code {gid_t}}{745} +-\entry {\code {glob_t}}{207} +-\entry {\code {glob64_t}}{208} +-\initial {I} +-\entry {\code {iconv_t}}{132} +-\entry {\code {imaxdiv_t}}{519} +-\entry {\code {ino_t}}{373} +-\entry {\code {ino64_t}}{373} +-\initial {J} +-\entry {\code {jmp_buf}}{602} +-\initial {L} +-\entry {\code {ldiv_t}}{519} +-\entry {\code {lldiv_t}}{519} +-\initial {M} +-\entry {\code {mbstate_t}}{116} +-\entry {\code {mode_t}}{373} +-\initial {N} +-\entry {\code {nlink_t}}{374} +-\initial {O} +-\entry {\code {off_t}}{312} +-\entry {\code {off64_t}}{312} +-\initial {P} +-\entry {\code {pid_t}}{702} +-\entry {\code {printf_arginfo_function}}{269} +-\entry {\code {printf_function}}{269} +-\entry {\code {ptrdiff_t}}{849} +-\initial {R} +-\entry {\code {regex_t}}{213} +-\entry {\code {regmatch_t}}{216} +-\entry {\code {regoff_t}}{217} +-\initial {S} +-\entry {\code {sig_atomic_t}}{637} +-\entry {\code {sighandler_t}}{622} +-\entry {\code {sigjmp_buf}}{603} +-\entry {\code {sigset_t}}{644} +-\entry {\code {size_t}}{849} +-\entry {\code {speed_t}}{457} +-\entry {\code {ssize_t}}{306} +-\entry {\code {stack_t}}{652} +-\entry {\code {struct __gconv_step}}{142} +-\entry {\code {struct __gconv_step_data}}{143} +-\entry {\code {struct aiocb}}{325} +-\entry {\code {struct aiocb64}}{326} +-\entry {\code {struct aioinit}}{335} +-\entry {\code {struct argp}}{667} +-\entry {\code {struct argp_child}}{676} +-\entry {\code {struct argp_option}}{668} +-\entry {\code {struct argp_state}}{675} +-\entry {\code {struct dirent}}{353} +-\entry {\code {struct ENTRY}}{200} +-\entry {\code {struct exit_status}}{754} +-\entry {\code {struct flock}}{346} +-\entry {\code {struct fstab}}{775} +-\entry {\code {struct FTW}}{361} +-\entry {\code {struct group}}{764} +-\entry {\code {struct hostent}}{413} +-\entry {\code {struct if_nameindex}}{404} +-\entry {\code {struct in_addr}}{411} +-\entry {\code {struct in6_addr}}{411} +-\entry {\code {struct iovec}}{316} +-\entry {\code {struct itimerval}}{579} +-\entry {\code {struct lconv}}{158} +-\entry {\code {struct linger}}{442} +-\entry {\code {struct mallinfo}}{43} +-\entry {\code {struct mntent}}{777} +-\entry {\code {struct netent}}{443} +-\entry {\code {struct ntptimeval}}{559} +-\entry {\code {struct obstack}}{49} +-\entry {\code {struct option}}{662} +-\entry {\code {struct passwd}}{761} +-\entry {\code {struct printf_info}}{267} +-\entry {\code {struct protoent}}{419} +-\entry {\code {struct random_data}}{510} +-\entry {\code {struct rlimit}}{586} +-\entry {\code {struct rlimit64}}{587} +-\entry {\code {struct rusage}}{583} +-\entry {\code {struct sched_param}}{592} +-\entry {\code {struct servent}}{417} +-\entry {\code {struct sgttyb}}{464} +-\entry {\code {struct sigaction}}{624} +-\entry {\code {struct sigstack}}{653} +-\entry {\code {struct sigvec}}{654} +-\entry {\code {struct sockaddr}}{402} +-\entry {\code {struct sockaddr_in}}{408} +-\entry {\code {struct sockaddr_in6}}{408} +-\entry {\code {struct sockaddr_un}}{406} +-\entry {\code {struct stat}}{370} +-\entry {\code {struct stat64}}{372} +-\entry {\code {struct termios}}{447} +-\entry {\code {struct timespec}}{550} +-\entry {\code {struct timeval}}{550} +-\entry {\code {struct timex}}{559, 560} +-\entry {\code {struct timezone}}{554} +-\entry {\code {struct tm}}{556} +-\entry {\code {struct tms}}{552} +-\entry {\code {struct utimbuf}}{384} +-\entry {\code {struct utmp}}{754} +-\entry {\code {struct utmpx}}{758} +-\entry {\code {struct utsname}}{773} +-\entry {\code {struct vtimes}}{585} +-\initial {T} +-\entry {\code {tcflag_t}}{448} +-\entry {\code {time_t}}{553} +-\initial {U} +-\entry {\code {ucontext_t}}{604} +-\entry {\code {uid_t}}{745} +-\entry {\code {union wait}}{709} +-\initial {V} +-\entry {\code {va_list}}{846} +-\entry {\code {VISIT}}{203} +-\initial {W} +-\entry {\code {wchar_t}}{112} +-\entry {\code {wctrans_t}}{74} +-\entry {\code {wctype_t}}{70} +-\entry {\code {wint_t}}{112} +-\entry {\code {wordexp_t}}{219} +diff -u -udbrN glibc-2.3.2/manual/libc.vr glibc-2.3.2-200304020432/manual/libc.vr +--- glibc-2.3.2/manual/libc.vr Tue Feb 25 11:35:07 2003 ++++ glibc-2.3.2-200304020432/manual/libc.vr Thu Jan 1 01:00:00 1970 +@@ -1,1073 +0,0 @@ +-\entry{_POSIX_SOURCE}{8}{\code {_POSIX_SOURCE}} +-\entry{_POSIX_C_SOURCE}{8}{\code {_POSIX_C_SOURCE}} +-\entry{_BSD_SOURCE}{8}{\code {_BSD_SOURCE}} +-\entry{_SVID_SOURCE}{8}{\code {_SVID_SOURCE}} +-\entry{_XOPEN_SOURCE}{8}{\code {_XOPEN_SOURCE}} +-\entry{_XOPEN_SOURCE_EXTENDED}{9}{\code {_XOPEN_SOURCE_EXTENDED}} +-\entry{_LARGEFILE_SOURCE}{9}{\code {_LARGEFILE_SOURCE}} +-\entry{_LARGEFILE64_SOURCE}{9}{\code {_LARGEFILE64_SOURCE}} +-\entry{_FILE_OFFSET_BITS}{9}{\code {_FILE_OFFSET_BITS}} +-\entry{_ISOC99_SOURCE}{10}{\code {_ISOC99_SOURCE}} +-\entry{_GNU_SOURCE}{10}{\code {_GNU_SOURCE}} +-\entry{_REENTRANT}{10}{\code {_REENTRANT}} +-\entry{_THREAD_SAFE}{10}{\code {_THREAD_SAFE}} +-\entry{errno}{15}{\code {errno}} +-\entry{EPERM}{16}{\code {EPERM}} +-\entry{ENOENT}{16}{\code {ENOENT}} +-\entry{ESRCH}{16}{\code {ESRCH}} +-\entry{EINTR}{16}{\code {EINTR}} +-\entry{EIO}{16}{\code {EIO}} +-\entry{ENXIO}{17}{\code {ENXIO}} +-\entry{E2BIG}{17}{\code {E2BIG}} +-\entry{ENOEXEC}{17}{\code {ENOEXEC}} +-\entry{EBADF}{17}{\code {EBADF}} +-\entry{ECHILD}{17}{\code {ECHILD}} +-\entry{EDEADLK}{17}{\code {EDEADLK}} +-\entry{ENOMEM}{17}{\code {ENOMEM}} +-\entry{EACCES}{17}{\code {EACCES}} +-\entry{EFAULT}{17}{\code {EFAULT}} +-\entry{ENOTBLK}{17}{\code {ENOTBLK}} +-\entry{EBUSY}{17}{\code {EBUSY}} +-\entry{EEXIST}{17}{\code {EEXIST}} +-\entry{EXDEV}{18}{\code {EXDEV}} +-\entry{ENODEV}{18}{\code {ENODEV}} +-\entry{ENOTDIR}{18}{\code {ENOTDIR}} +-\entry{EISDIR}{18}{\code {EISDIR}} +-\entry{EINVAL}{18}{\code {EINVAL}} +-\entry{EMFILE}{18}{\code {EMFILE}} +-\entry{ENFILE}{18}{\code {ENFILE}} +-\entry{ENOTTY}{18}{\code {ENOTTY}} +-\entry{ETXTBSY}{18}{\code {ETXTBSY}} +-\entry{EFBIG}{18}{\code {EFBIG}} +-\entry{ENOSPC}{18}{\code {ENOSPC}} +-\entry{ESPIPE}{18}{\code {ESPIPE}} +-\entry{EROFS}{19}{\code {EROFS}} +-\entry{EMLINK}{19}{\code {EMLINK}} +-\entry{EPIPE}{19}{\code {EPIPE}} +-\entry{EDOM}{19}{\code {EDOM}} +-\entry{ERANGE}{19}{\code {ERANGE}} +-\entry{EAGAIN}{19}{\code {EAGAIN}} +-\entry{EWOULDBLOCK}{19}{\code {EWOULDBLOCK}} +-\entry{EINPROGRESS}{20}{\code {EINPROGRESS}} +-\entry{EALREADY}{20}{\code {EALREADY}} +-\entry{ENOTSOCK}{20}{\code {ENOTSOCK}} +-\entry{EMSGSIZE}{20}{\code {EMSGSIZE}} +-\entry{EPROTOTYPE}{20}{\code {EPROTOTYPE}} +-\entry{ENOPROTOOPT}{20}{\code {ENOPROTOOPT}} +-\entry{EPROTONOSUPPORT}{20}{\code {EPROTONOSUPPORT}} +-\entry{ESOCKTNOSUPPORT}{20}{\code {ESOCKTNOSUPPORT}} +-\entry{EOPNOTSUPP}{20}{\code {EOPNOTSUPP}} +-\entry{EPFNOSUPPORT}{20}{\code {EPFNOSUPPORT}} +-\entry{EAFNOSUPPORT}{20}{\code {EAFNOSUPPORT}} +-\entry{EADDRINUSE}{20}{\code {EADDRINUSE}} +-\entry{EADDRNOTAVAIL}{21}{\code {EADDRNOTAVAIL}} +-\entry{ENETDOWN}{21}{\code {ENETDOWN}} +-\entry{ENETUNREACH}{21}{\code {ENETUNREACH}} +-\entry{ENETRESET}{21}{\code {ENETRESET}} +-\entry{ECONNABORTED}{21}{\code {ECONNABORTED}} +-\entry{ECONNRESET}{21}{\code {ECONNRESET}} +-\entry{ENOBUFS}{21}{\code {ENOBUFS}} +-\entry{EISCONN}{21}{\code {EISCONN}} +-\entry{ENOTCONN}{21}{\code {ENOTCONN}} +-\entry{EDESTADDRREQ}{21}{\code {EDESTADDRREQ}} +-\entry{ESHUTDOWN}{21}{\code {ESHUTDOWN}} +-\entry{ETOOMANYREFS}{21}{\code {ETOOMANYREFS}} +-\entry{ETIMEDOUT}{21}{\code {ETIMEDOUT}} +-\entry{ECONNREFUSED}{22}{\code {ECONNREFUSED}} +-\entry{ELOOP}{22}{\code {ELOOP}} +-\entry{ENAMETOOLONG}{22}{\code {ENAMETOOLONG}} +-\entry{EHOSTDOWN}{22}{\code {EHOSTDOWN}} +-\entry{EHOSTUNREACH}{22}{\code {EHOSTUNREACH}} +-\entry{ENOTEMPTY}{22}{\code {ENOTEMPTY}} +-\entry{EPROCLIM}{22}{\code {EPROCLIM}} +-\entry{EUSERS}{22}{\code {EUSERS}} +-\entry{EDQUOT}{22}{\code {EDQUOT}} +-\entry{ESTALE}{22}{\code {ESTALE}} +-\entry{EREMOTE}{22}{\code {EREMOTE}} +-\entry{EBADRPC}{22}{\code {EBADRPC}} +-\entry{ERPCMISMATCH}{22}{\code {ERPCMISMATCH}} +-\entry{EPROGUNAVAIL}{22}{\code {EPROGUNAVAIL}} +-\entry{EPROGMISMATCH}{23}{\code {EPROGMISMATCH}} +-\entry{EPROCUNAVAIL}{23}{\code {EPROCUNAVAIL}} +-\entry{ENOLCK}{23}{\code {ENOLCK}} +-\entry{EFTYPE}{23}{\code {EFTYPE}} +-\entry{EAUTH}{23}{\code {EAUTH}} +-\entry{ENEEDAUTH}{23}{\code {ENEEDAUTH}} +-\entry{ENOSYS}{23}{\code {ENOSYS}} +-\entry{ENOTSUP}{23}{\code {ENOTSUP}} +-\entry{EILSEQ}{23}{\code {EILSEQ}} +-\entry{EBACKGROUND}{23}{\code {EBACKGROUND}} +-\entry{EDIED}{24}{\code {EDIED}} +-\entry{ED}{24}{\code {ED}} +-\entry{EGREGIOUS}{24}{\code {EGREGIOUS}} +-\entry{EIEIO}{24}{\code {EIEIO}} +-\entry{EGRATUITOUS}{24}{\code {EGRATUITOUS}} +-\entry{EBADMSG}{24}{\code {EBADMSG}} +-\entry{EIDRM}{24}{\code {EIDRM}} +-\entry{EMULTIHOP}{24}{\code {EMULTIHOP}} +-\entry{ENODATA}{24}{\code {ENODATA}} +-\entry{ENOLINK}{24}{\code {ENOLINK}} +-\entry{ENOMSG}{24}{\code {ENOMSG}} +-\entry{ENOSR}{24}{\code {ENOSR}} +-\entry{ENOSTR}{24}{\code {ENOSTR}} +-\entry{EOVERFLOW}{24}{\code {EOVERFLOW}} +-\entry{EPROTO}{24}{\code {EPROTO}} +-\entry{ETIME}{24}{\code {ETIME}} +-\entry{ECANCELED}{24}{\code {ECANCELED}} +-\entry{ERESTART}{24}{\code {ERESTART}} +-\entry{ECHRNG}{24}{\code {ECHRNG}} +-\entry{EL2NSYNC}{24}{\code {EL2NSYNC}} +-\entry{EL3HLT}{24}{\code {EL3HLT}} +-\entry{EL3RST}{24}{\code {EL3RST}} +-\entry{ELNRNG}{25}{\code {ELNRNG}} +-\entry{EUNATCH}{25}{\code {EUNATCH}} +-\entry{ENOCSI}{25}{\code {ENOCSI}} +-\entry{EL2HLT}{25}{\code {EL2HLT}} +-\entry{EBADE}{25}{\code {EBADE}} +-\entry{EBADR}{25}{\code {EBADR}} +-\entry{EXFULL}{25}{\code {EXFULL}} +-\entry{ENOANO}{25}{\code {ENOANO}} +-\entry{EBADRQC}{25}{\code {EBADRQC}} +-\entry{EBADSLT}{25}{\code {EBADSLT}} +-\entry{EDEADLOCK}{25}{\code {EDEADLOCK}} +-\entry{EBFONT}{25}{\code {EBFONT}} +-\entry{ENONET}{25}{\code {ENONET}} +-\entry{ENOPKG}{25}{\code {ENOPKG}} +-\entry{EADV}{25}{\code {EADV}} +-\entry{ESRMNT}{25}{\code {ESRMNT}} +-\entry{ECOMM}{25}{\code {ECOMM}} +-\entry{EDOTDOT}{25}{\code {EDOTDOT}} +-\entry{ENOTUNIQ}{25}{\code {ENOTUNIQ}} +-\entry{EBADFD}{25}{\code {EBADFD}} +-\entry{EREMCHG}{25}{\code {EREMCHG}} +-\entry{ELIBACC}{25}{\code {ELIBACC}} +-\entry{ELIBBAD}{25}{\code {ELIBBAD}} +-\entry{ELIBSCN}{25}{\code {ELIBSCN}} +-\entry{ELIBMAX}{25}{\code {ELIBMAX}} +-\entry{ELIBEXEC}{25}{\code {ELIBEXEC}} +-\entry{ESTRPIPE}{25}{\code {ESTRPIPE}} +-\entry{EUCLEAN}{25}{\code {EUCLEAN}} +-\entry{ENOTNAM}{25}{\code {ENOTNAM}} +-\entry{ENAVAIL}{25}{\code {ENAVAIL}} +-\entry{EISNAM}{25}{\code {EISNAM}} +-\entry{EREMOTEIO}{25}{\code {EREMOTEIO}} +-\entry{ENOMEDIUM}{25}{\code {ENOMEDIUM}} +-\entry{EMEDIUMTYPE}{25}{\code {EMEDIUMTYPE}} +-\entry{program_invocation_name}{27}{\code {program_invocation_name}} +-\entry{program_invocation_short_name}{27}{\code {program_invocation_short_name}} +-\entry{error_print_progname}{29}{\code {error_print_progname}} +-\entry{error_message_count}{29}{\code {error_message_count}} +-\entry{error_one_per_line}{29}{\code {error_one_per_line}} +-\entry{__malloc_hook}{41}{\code {__malloc_hook}} +-\entry{__realloc_hook}{41}{\code {__realloc_hook}} +-\entry{__free_hook}{41}{\code {__free_hook}} +-\entry{__memalign_hook}{41}{\code {__memalign_hook}} +-\entry{__malloc_initialize_hook}{42}{\code {__malloc_initialize_hook}} +-\entry{obstack_alloc_failed_handler}{51}{\code {obstack_alloc_failed_handler}} +-\entry{WCHAR_MIN}{112}{\code {WCHAR_MIN}} +-\entry{WCHAR_MAX}{112}{\code {WCHAR_MAX}} +-\entry{WEOF}{113}{\code {WEOF}} +-\entry{MB_LEN_MAX}{116}{\code {MB_LEN_MAX}} +-\entry{MB_CUR_MAX}{116}{\code {MB_CUR_MAX}} +-\entry{(*__gconv_init_fct)}{145}{\code {(*__gconv_init_fct)}} +-\entry{(*__gconv_end_fct)}{147}{\code {(*__gconv_end_fct)}} +-\entry{(*__gconv_fct)}{148}{\code {(*__gconv_fct)}} +-\entry{LC_COLLATE}{154}{\code {LC_COLLATE}} +-\entry{LC_CTYPE}{154}{\code {LC_CTYPE}} +-\entry{LC_MONETARY}{154}{\code {LC_MONETARY}} +-\entry{LC_NUMERIC}{154}{\code {LC_NUMERIC}} +-\entry{LC_TIME}{154}{\code {LC_TIME}} +-\entry{LC_MESSAGES}{154}{\code {LC_MESSAGES}} +-\entry{LC_ALL}{155}{\code {LC_ALL}} +-\entry{LANG}{155}{\code {LANG}} +-\entry{LANGUAGE}{155}{\code {LANGUAGE}} +-\entry{CODESET}{162}{\code {CODESET}} +-\entry{ABDAY_1}{162}{\code {ABDAY_1}} +-\entry{ABDAY_2}{162}{\code {ABDAY_2}} +-\entry{ABDAY_3}{162}{\code {ABDAY_3}} +-\entry{ABDAY_4}{162}{\code {ABDAY_4}} +-\entry{ABDAY_5}{162}{\code {ABDAY_5}} +-\entry{ABDAY_6}{162}{\code {ABDAY_6}} +-\entry{ABDAY_7}{162}{\code {ABDAY_7}} +-\entry{DAY_1}{162}{\code {DAY_1}} +-\entry{DAY_2}{162}{\code {DAY_2}} +-\entry{DAY_3}{162}{\code {DAY_3}} +-\entry{DAY_4}{162}{\code {DAY_4}} +-\entry{DAY_5}{162}{\code {DAY_5}} +-\entry{DAY_6}{162}{\code {DAY_6}} +-\entry{DAY_7}{162}{\code {DAY_7}} +-\entry{ABMON_1}{162}{\code {ABMON_1}} +-\entry{ABMON_2}{162}{\code {ABMON_2}} +-\entry{ABMON_3}{162}{\code {ABMON_3}} +-\entry{ABMON_4}{162}{\code {ABMON_4}} +-\entry{ABMON_5}{162}{\code {ABMON_5}} +-\entry{ABMON_6}{162}{\code {ABMON_6}} +-\entry{ABMON_7}{162}{\code {ABMON_7}} +-\entry{ABMON_8}{162}{\code {ABMON_8}} +-\entry{ABMON_9}{162}{\code {ABMON_9}} +-\entry{ABMON_10}{162}{\code {ABMON_10}} +-\entry{ABMON_11}{162}{\code {ABMON_11}} +-\entry{ABMON_12}{162}{\code {ABMON_12}} +-\entry{MON_1}{162}{\code {MON_1}} +-\entry{MON_2}{163}{\code {MON_2}} +-\entry{MON_3}{163}{\code {MON_3}} +-\entry{MON_4}{163}{\code {MON_4}} +-\entry{MON_5}{163}{\code {MON_5}} +-\entry{MON_6}{163}{\code {MON_6}} +-\entry{MON_7}{163}{\code {MON_7}} +-\entry{MON_8}{163}{\code {MON_8}} +-\entry{MON_9}{163}{\code {MON_9}} +-\entry{MON_10}{163}{\code {MON_10}} +-\entry{MON_11}{163}{\code {MON_11}} +-\entry{MON_12}{163}{\code {MON_12}} +-\entry{AM_STR}{163}{\code {AM_STR}} +-\entry{PM_STR}{163}{\code {PM_STR}} +-\entry{D_T_FMT}{163}{\code {D_T_FMT}} +-\entry{D_FMT}{163}{\code {D_FMT}} +-\entry{T_FMT}{163}{\code {T_FMT}} +-\entry{T_FMT_AMPM}{163}{\code {T_FMT_AMPM}} +-\entry{ERA}{163}{\code {ERA}} +-\entry{ERA_YEAR}{163}{\code {ERA_YEAR}} +-\entry{ERA_D_T_FMT}{163}{\code {ERA_D_T_FMT}} +-\entry{ERA_D_FMT}{164}{\code {ERA_D_FMT}} +-\entry{ERA_T_FMT}{164}{\code {ERA_T_FMT}} +-\entry{ALT_DIGITS}{164}{\code {ALT_DIGITS}} +-\entry{INT_CURR_SYMBOL}{164}{\code {INT_CURR_SYMBOL}} +-\entry{CURRENCY_SYMBOL}{164}{\code {CURRENCY_SYMBOL}} +-\entry{CRNCYSTR}{164}{\code {CRNCYSTR}} +-\entry{MON_DECIMAL_POINT}{164}{\code {MON_DECIMAL_POINT}} +-\entry{MON_THOUSANDS_SEP}{164}{\code {MON_THOUSANDS_SEP}} +-\entry{MON_GROUPING}{164}{\code {MON_GROUPING}} +-\entry{POSITIVE_SIGN}{164}{\code {POSITIVE_SIGN}} +-\entry{NEGATIVE_SIGN}{164}{\code {NEGATIVE_SIGN}} +-\entry{INT_FRAC_DIGITS}{164}{\code {INT_FRAC_DIGITS}} +-\entry{FRAC_DIGITS}{164}{\code {FRAC_DIGITS}} +-\entry{P_CS_PRECEDES}{165}{\code {P_CS_PRECEDES}} +-\entry{P_SEP_BY_SPACE}{165}{\code {P_SEP_BY_SPACE}} +-\entry{N_CS_PRECEDES}{165}{\code {N_CS_PRECEDES}} +-\entry{N_SEP_BY_SPACE}{165}{\code {N_SEP_BY_SPACE}} +-\entry{P_SIGN_POSN}{165}{\code {P_SIGN_POSN}} +-\entry{N_SIGN_POSN}{165}{\code {N_SIGN_POSN}} +-\entry{INT_P_CS_PRECEDES}{165}{\code {INT_P_CS_PRECEDES}} +-\entry{INT_P_SEP_BY_SPACE}{165}{\code {INT_P_SEP_BY_SPACE}} +-\entry{INT_N_CS_PRECEDES}{165}{\code {INT_N_CS_PRECEDES}} +-\entry{INT_N_SEP_BY_SPACE}{165}{\code {INT_N_SEP_BY_SPACE}} +-\entry{INT_P_SIGN_POSN}{165}{\code {INT_P_SIGN_POSN}} +-\entry{INT_N_SIGN_POSN}{165}{\code {INT_N_SIGN_POSN}} +-\entry{DECIMAL_POINT}{165}{\code {DECIMAL_POINT}} +-\entry{RADIXCHAR}{165}{\code {RADIXCHAR}} +-\entry{THOUSANDS_SEP}{166}{\code {THOUSANDS_SEP}} +-\entry{THOUSEP}{166}{\code {THOUSEP}} +-\entry{GROUPING}{166}{\code {GROUPING}} +-\entry{YESEXPR}{166}{\code {YESEXPR}} +-\entry{NOEXPR}{166}{\code {NOEXPR}} +-\entry{YESSTR}{166}{\code {YESSTR}} +-\entry{NOSTR}{166}{\code {NOSTR}} +-\entry{GLOB_ABORTED}{209}{\code {GLOB_ABORTED}} +-\entry{GLOB_NOMATCH}{209}{\code {GLOB_NOMATCH}} +-\entry{GLOB_NOSPACE}{209}{\code {GLOB_NOSPACE}} +-\entry{GLOB_APPEND}{210}{\code {GLOB_APPEND}} +-\entry{GLOB_DOOFFS}{210}{\code {GLOB_DOOFFS}} +-\entry{GLOB_ERR}{210}{\code {GLOB_ERR}} +-\entry{GLOB_MARK}{210}{\code {GLOB_MARK}} +-\entry{GLOB_NOCHECK}{211}{\code {GLOB_NOCHECK}} +-\entry{GLOB_NOSORT}{211}{\code {GLOB_NOSORT}} +-\entry{GLOB_NOESCAPE}{211}{\code {GLOB_NOESCAPE}} +-\entry{GLOB_PERIOD}{211}{\code {GLOB_PERIOD}} +-\entry{GLOB_MAGCHAR}{211}{\code {GLOB_MAGCHAR}} +-\entry{GLOB_ALTDIRFUNC}{211}{\code {GLOB_ALTDIRFUNC}} +-\entry{GLOB_BRACE}{211}{\code {GLOB_BRACE}} +-\entry{GLOB_NOMAGIC}{212}{\code {GLOB_NOMAGIC}} +-\entry{GLOB_TILDE}{212}{\code {GLOB_TILDE}} +-\entry{GLOB_TILDE_CHECK}{212}{\code {GLOB_TILDE_CHECK}} +-\entry{GLOB_ONLYDIR}{212}{\code {GLOB_ONLYDIR}} +-\entry{stdin}{231}{\code {stdin}} +-\entry{stdout}{231}{\code {stdout}} +-\entry{stderr}{231}{\code {stderr}} +-\entry{FOPEN_MAX}{234}{\code {FOPEN_MAX}} +-\entry{FSETLOCKING_INTERNAL}{239}{\code {FSETLOCKING_INTERNAL}} +-\entry{FSETLOCKING_BYCALLER}{239}{\code {FSETLOCKING_BYCALLER}} +-\entry{FSETLOCKING_QUERY}{239}{\code {FSETLOCKING_QUERY}} +-\entry{NL_ARGMAX}{251}{\code {NL_ARGMAX}} +-\entry{PA_FLAG_MASK}{264}{\code {PA_FLAG_MASK}} +-\entry{PA_INT}{264}{\code {PA_INT}} +-\entry{PA_CHAR}{264}{\code {PA_CHAR}} +-\entry{PA_STRING}{264}{\code {PA_STRING}} +-\entry{PA_POINTER}{264}{\code {PA_POINTER}} +-\entry{PA_FLOAT}{264}{\code {PA_FLOAT}} +-\entry{PA_DOUBLE}{264}{\code {PA_DOUBLE}} +-\entry{PA_LAST}{264}{\code {PA_LAST}} +-\entry{PA_FLAG_PTR}{264}{\code {PA_FLAG_PTR}} +-\entry{PA_FLAG_SHORT}{265}{\code {PA_FLAG_SHORT}} +-\entry{PA_FLAG_LONG}{265}{\code {PA_FLAG_LONG}} +-\entry{PA_FLAG_LONG_LONG}{265}{\code {PA_FLAG_LONG_LONG}} +-\entry{PA_FLAG_LONG_DOUBLE}{265}{\code {PA_FLAG_LONG_DOUBLE}} +-\entry{EOF}{281}{\code {EOF}} +-\entry{WEOF}{282}{\code {WEOF}} +-\entry{SEEK_SET}{286}{\code {SEEK_SET}} +-\entry{SEEK_CUR}{286}{\code {SEEK_CUR}} +-\entry{SEEK_END}{286}{\code {SEEK_END}} +-\entry{L_SET}{286}{\code {L_SET}} +-\entry{L_INCR}{286}{\code {L_INCR}} +-\entry{L_XTND}{286}{\code {L_XTND}} +-\entry{_IOFBF}{290}{\code {_IOFBF}} +-\entry{_IOLBF}{291}{\code {_IOLBF}} +-\entry{_IONBF}{291}{\code {_IONBF}} +-\entry{BUFSIZ}{291}{\code {BUFSIZ}} +-\entry{MM_PRINT}{297}{\code {MM_PRINT}} +-\entry{MM_CONSOLE}{297}{\code {MM_CONSOLE}} +-\entry{MM_HARD}{297}{\code {MM_HARD}} +-\entry{MM_SOFT}{297}{\code {MM_SOFT}} +-\entry{MM_FIRM}{297}{\code {MM_FIRM}} +-\entry{MM_APPL}{297}{\code {MM_APPL}} +-\entry{MM_UTIL}{297}{\code {MM_UTIL}} +-\entry{MM_OPSYS}{297}{\code {MM_OPSYS}} +-\entry{MM_RECOVER}{298}{\code {MM_RECOVER}} +-\entry{MM_NRECOV}{298}{\code {MM_NRECOV}} +-\entry{MM_NULLLBL}{298}{\code {MM_NULLLBL}} +-\entry{MM_NULLSEV}{298}{\code {MM_NULLSEV}} +-\entry{MM_NULLMC}{298}{\code {MM_NULLMC}} +-\entry{MM_NULLTXT}{298}{\code {MM_NULLTXT}} +-\entry{MM_NULLACT}{298}{\code {MM_NULLACT}} +-\entry{MM_NULLTAG}{298}{\code {MM_NULLTAG}} +-\entry{MM_NOSEV}{298}{\code {MM_NOSEV}} +-\entry{MM_HALT}{298}{\code {MM_HALT}} +-\entry{MM_ERROR}{298}{\code {MM_ERROR}} +-\entry{MM_WARNING}{298}{\code {MM_WARNING}} +-\entry{MM_INFO}{299}{\code {MM_INFO}} +-\entry{STDIN_FILENO}{313}{\code {STDIN_FILENO}} +-\entry{STDOUT_FILENO}{313}{\code {STDOUT_FILENO}} +-\entry{STDERR_FILENO}{313}{\code {STDERR_FILENO}} +-\entry{_SC_PAGESIZE}{317}{\code {_SC_PAGESIZE}} +-\entry{PROT_READ}{317}{\code {PROT_READ}} +-\entry{PROT_WRITE}{317}{\code {PROT_WRITE}} +-\entry{PROT_EXEC}{317}{\code {PROT_EXEC}} +-\entry{MAP_PRIVATE}{317}{\code {MAP_PRIVATE}} +-\entry{MAP_SHARED}{317}{\code {MAP_SHARED}} +-\entry{MAP_FIXED}{318}{\code {MAP_FIXED}} +-\entry{MAP_ANONYMOUS}{318}{\code {MAP_ANONYMOUS}} +-\entry{MAP_ANON}{318}{\code {MAP_ANON}} +-\entry{MS_SYNC}{319}{\code {MS_SYNC}} +-\entry{MS_ASYNC}{319}{\code {MS_ASYNC}} +-\entry{FD_SETSIZE}{321}{\code {FD_SETSIZE}} +-\entry{LIO_READ}{326}{\code {LIO_READ}} +-\entry{LIO_WRITE}{326}{\code {LIO_WRITE}} +-\entry{LIO_NOP}{326}{\code {LIO_NOP}} +-\entry{F_DUPFD}{338}{\code {F_DUPFD}} +-\entry{F_GETFD}{339}{\code {F_GETFD}} +-\entry{F_SETFD}{339}{\code {F_SETFD}} +-\entry{FD_CLOEXEC}{339}{\code {FD_CLOEXEC}} +-\entry{O_RDONLY}{341}{\code {O_RDONLY}} +-\entry{O_WRONLY}{341}{\code {O_WRONLY}} +-\entry{O_RDWR}{341}{\code {O_RDWR}} +-\entry{O_READ}{341}{\code {O_READ}} +-\entry{O_WRITE}{341}{\code {O_WRITE}} +-\entry{O_EXEC}{341}{\code {O_EXEC}} +-\entry{O_ACCMODE}{341}{\code {O_ACCMODE}} +-\entry{O_CREAT}{342}{\code {O_CREAT}} +-\entry{O_EXCL}{342}{\code {O_EXCL}} +-\entry{O_NONBLOCK}{342}{\code {O_NONBLOCK}} +-\entry{O_NOCTTY}{342}{\code {O_NOCTTY}} +-\entry{O_IGNORE_CTTY}{342}{\code {O_IGNORE_CTTY}} +-\entry{O_NOLINK}{342}{\code {O_NOLINK}} +-\entry{O_NOTRANS}{342}{\code {O_NOTRANS}} +-\entry{O_TRUNC}{343}{\code {O_TRUNC}} +-\entry{O_SHLOCK}{343}{\code {O_SHLOCK}} +-\entry{O_EXLOCK}{343}{\code {O_EXLOCK}} +-\entry{O_APPEND}{343}{\code {O_APPEND}} +-\entry{O_NONBLOCK}{343}{\code {O_NONBLOCK}} +-\entry{O_NDELAY}{344}{\code {O_NDELAY}} +-\entry{O_ASYNC}{344}{\code {O_ASYNC}} +-\entry{O_FSYNC}{344}{\code {O_FSYNC}} +-\entry{O_SYNC}{344}{\code {O_SYNC}} +-\entry{O_NOATIME}{344}{\code {O_NOATIME}} +-\entry{F_GETFL}{344}{\code {F_GETFL}} +-\entry{F_SETFL}{344}{\code {F_SETFL}} +-\entry{F_GETLK}{346}{\code {F_GETLK}} +-\entry{F_SETLK}{347}{\code {F_SETLK}} +-\entry{F_SETLKW}{347}{\code {F_SETLKW}} +-\entry{F_RDLCK}{348}{\code {F_RDLCK}} +-\entry{F_WRLCK}{348}{\code {F_WRLCK}} +-\entry{F_UNLCK}{348}{\code {F_UNLCK}} +-\entry{F_GETOWN}{348}{\code {F_GETOWN}} +-\entry{F_SETOWN}{349}{\code {F_SETOWN}} +-\entry{PWD}{352}{\code {PWD}} +-\entry{DT_UNKNOWN}{353}{\code {DT_UNKNOWN}} +-\entry{DT_REG}{353}{\code {DT_REG}} +-\entry{DT_DIR}{354}{\code {DT_DIR}} +-\entry{DT_FIFO}{354}{\code {DT_FIFO}} +-\entry{DT_SOCK}{354}{\code {DT_SOCK}} +-\entry{DT_CHR}{354}{\code {DT_CHR}} +-\entry{DT_BLK}{354}{\code {DT_BLK}} +-\entry{FTW_F}{360}{\code {FTW_F}} +-\entry{FTW_D}{360}{\code {FTW_D}} +-\entry{FTW_NS}{360}{\code {FTW_NS}} +-\entry{FTW_DNR}{360}{\code {FTW_DNR}} +-\entry{FTW_SL}{360}{\code {FTW_SL}} +-\entry{FTW_DP}{361}{\code {FTW_DP}} +-\entry{FTW_SLN}{361}{\code {FTW_SLN}} +-\entry{FTW_PHYS}{363}{\code {FTW_PHYS}} +-\entry{FTW_MOUNT}{363}{\code {FTW_MOUNT}} +-\entry{FTW_CHDIR}{363}{\code {FTW_CHDIR}} +-\entry{FTW_DEPTH}{363}{\code {FTW_DEPTH}} +-\entry{MAXSYMLINKS}{365}{\code {MAXSYMLINKS}} +-\entry{S_IFMT}{376}{\code {S_IFMT}} +-\entry{S_IFDIR}{376}{\code {S_IFDIR}} +-\entry{S_IFCHR}{376}{\code {S_IFCHR}} +-\entry{S_IFBLK}{376}{\code {S_IFBLK}} +-\entry{S_IFREG}{376}{\code {S_IFREG}} +-\entry{S_IFLNK}{376}{\code {S_IFLNK}} +-\entry{S_IFSOCK}{376}{\code {S_IFSOCK}} +-\entry{S_IFIFO}{376}{\code {S_IFIFO}} +-\entry{S_IRUSR}{378}{\code {S_IRUSR}} +-\entry{S_IREAD}{378}{\code {S_IREAD}} +-\entry{S_IWUSR}{379}{\code {S_IWUSR}} +-\entry{S_IWRITE}{379}{\code {S_IWRITE}} +-\entry{S_IXUSR}{379}{\code {S_IXUSR}} +-\entry{S_IEXEC}{379}{\code {S_IEXEC}} +-\entry{S_IRWXU}{379}{\code {S_IRWXU}} +-\entry{S_IRGRP}{379}{\code {S_IRGRP}} +-\entry{S_IWGRP}{379}{\code {S_IWGRP}} +-\entry{S_IXGRP}{379}{\code {S_IXGRP}} +-\entry{S_IRWXG}{379}{\code {S_IRWXG}} +-\entry{S_IROTH}{379}{\code {S_IROTH}} +-\entry{S_IWOTH}{379}{\code {S_IWOTH}} +-\entry{S_IXOTH}{379}{\code {S_IXOTH}} +-\entry{S_IRWXO}{379}{\code {S_IRWXO}} +-\entry{S_ISUID}{379}{\code {S_ISUID}} +-\entry{S_ISGID}{379}{\code {S_ISGID}} +-\entry{S_ISVTX}{379}{\code {S_ISVTX}} +-\entry{R_OK}{383}{\code {R_OK}} +-\entry{W_OK}{383}{\code {W_OK}} +-\entry{X_OK}{383}{\code {X_OK}} +-\entry{F_OK}{383}{\code {F_OK}} +-\entry{L_tmpnam}{389}{\code {L_tmpnam}} +-\entry{TMP_MAX}{390}{\code {TMP_MAX}} +-\entry{P_tmpdir}{390}{\code {P_tmpdir}} +-\entry{SOCK_STREAM}{400}{\code {SOCK_STREAM}} +-\entry{SOCK_DGRAM}{400}{\code {SOCK_DGRAM}} +-\entry{SOCK_RAW}{401}{\code {SOCK_RAW}} +-\entry{AF_LOCAL}{402}{\code {AF_LOCAL}} +-\entry{AF_UNIX}{402}{\code {AF_UNIX}} +-\entry{AF_FILE}{402}{\code {AF_FILE}} +-\entry{AF_INET}{402}{\code {AF_INET}} +-\entry{AF_UNSPEC}{402}{\code {AF_UNSPEC}} +-\entry{IFNAMSIZ}{404}{\code {IFNAMSIZ}} +-\entry{PF_LOCAL}{405}{\code {PF_LOCAL}} +-\entry{PF_UNIX}{406}{\code {PF_UNIX}} +-\entry{PF_FILE}{406}{\code {PF_FILE}} +-\entry{PF_INET}{407}{\code {PF_INET}} +-\entry{PF_INET6}{407}{\code {PF_INET6}} +-\entry{INADDR_LOOPBACK}{411}{\code {INADDR_LOOPBACK}} +-\entry{INADDR_ANY}{411}{\code {INADDR_ANY}} +-\entry{INADDR_BROADCAST}{411}{\code {INADDR_BROADCAST}} +-\entry{INADDR_NONE}{411}{\code {INADDR_NONE}} +-\entry{in6addr_loopback}{411}{\code {in6addr_loopback}} +-\entry{in6addr_any}{411}{\code {in6addr_any}} +-\entry{h_errno}{414}{\code {h_errno}} +-\entry{HOST_NOT_FOUND}{414}{\code {HOST_NOT_FOUND}} +-\entry{TRY_AGAIN}{414}{\code {TRY_AGAIN}} +-\entry{NO_RECOVERY}{414}{\code {NO_RECOVERY}} +-\entry{NO_ADDRESS}{414}{\code {NO_ADDRESS}} +-\entry{IPPORT_RESERVED}{417}{\code {IPPORT_RESERVED}} +-\entry{IPPORT_USERRESERVED}{417}{\code {IPPORT_USERRESERVED}} +-\entry{PF_NS}{421}{\code {PF_NS}} +-\entry{PF_ISO}{421}{\code {PF_ISO}} +-\entry{PF_CCITT}{421}{\code {PF_CCITT}} +-\entry{PF_IMPLINK}{421}{\code {PF_IMPLINK}} +-\entry{PF_ROUTE}{421}{\code {PF_ROUTE}} +-\entry{MSG_OOB}{429}{\code {MSG_OOB}} +-\entry{MSG_PEEK}{429}{\code {MSG_PEEK}} +-\entry{MSG_DONTROUTE}{429}{\code {MSG_DONTROUTE}} +-\entry{SOL_SOCKET}{441}{\code {SOL_SOCKET}} +-\entry{NCCS}{448}{\code {NCCS}} +-\entry{TCSANOW}{448}{\code {TCSANOW}} +-\entry{TCSADRAIN}{448}{\code {TCSADRAIN}} +-\entry{TCSAFLUSH}{448}{\code {TCSAFLUSH}} +-\entry{TCSASOFT}{448}{\code {TCSASOFT}} +-\entry{INPCK}{450}{\code {INPCK}} +-\entry{IGNPAR}{451}{\code {IGNPAR}} +-\entry{PARMRK}{451}{\code {PARMRK}} +-\entry{ISTRIP}{451}{\code {ISTRIP}} +-\entry{IGNBRK}{451}{\code {IGNBRK}} +-\entry{BRKINT}{451}{\code {BRKINT}} +-\entry{IGNCR}{451}{\code {IGNCR}} +-\entry{ICRNL}{451}{\code {ICRNL}} +-\entry{INLCR}{451}{\code {INLCR}} +-\entry{IXOFF}{451}{\code {IXOFF}} +-\entry{IXON}{452}{\code {IXON}} +-\entry{IXANY}{452}{\code {IXANY}} +-\entry{IMAXBEL}{452}{\code {IMAXBEL}} +-\entry{OPOST}{452}{\code {OPOST}} +-\entry{ONLCR}{452}{\code {ONLCR}} +-\entry{OXTABS}{452}{\code {OXTABS}} +-\entry{ONOEOT}{452}{\code {ONOEOT}} +-\entry{CLOCAL}{453}{\code {CLOCAL}} +-\entry{HUPCL}{453}{\code {HUPCL}} +-\entry{CREAD}{453}{\code {CREAD}} +-\entry{CSTOPB}{453}{\code {CSTOPB}} +-\entry{PARENB}{453}{\code {PARENB}} +-\entry{PARODD}{453}{\code {PARODD}} +-\entry{CSIZE}{454}{\code {CSIZE}} +-\entry{CS5}{454}{\code {CS5}} +-\entry{CS6}{454}{\code {CS6}} +-\entry{CS7}{454}{\code {CS7}} +-\entry{CS8}{454}{\code {CS8}} +-\entry{CCTS_OFLOW}{454}{\code {CCTS_OFLOW}} +-\entry{CRTS_IFLOW}{454}{\code {CRTS_IFLOW}} +-\entry{MDMBUF}{454}{\code {MDMBUF}} +-\entry{CIGNORE}{454}{\code {CIGNORE}} +-\entry{ICANON}{454}{\code {ICANON}} +-\entry{ECHO}{455}{\code {ECHO}} +-\entry{ECHOE}{455}{\code {ECHOE}} +-\entry{ECHOPRT}{455}{\code {ECHOPRT}} +-\entry{ECHOK}{455}{\code {ECHOK}} +-\entry{ECHOKE}{455}{\code {ECHOKE}} +-\entry{ECHONL}{455}{\code {ECHONL}} +-\entry{ECHOCTL}{455}{\code {ECHOCTL}} +-\entry{ISIG}{455}{\code {ISIG}} +-\entry{IEXTEN}{456}{\code {IEXTEN}} +-\entry{NOFLSH}{456}{\code {NOFLSH}} +-\entry{TOSTOP}{456}{\code {TOSTOP}} +-\entry{ALTWERASE}{456}{\code {ALTWERASE}} +-\entry{FLUSHO}{456}{\code {FLUSHO}} +-\entry{NOKERNINFO}{456}{\code {NOKERNINFO}} +-\entry{PENDIN}{456}{\code {PENDIN}} +-\entry{B0}{458}{\code {B0}} +-\entry{B50}{458}{\code {B50}} +-\entry{B75}{458}{\code {B75}} +-\entry{B110}{458}{\code {B110}} +-\entry{B134}{458}{\code {B134}} +-\entry{B150}{458}{\code {B150}} +-\entry{B200}{458}{\code {B200}} +-\entry{B300}{458}{\code {B300}} +-\entry{B600}{458}{\code {B600}} +-\entry{B1200}{458}{\code {B1200}} +-\entry{B1800}{458}{\code {B1800}} +-\entry{B2400}{458}{\code {B2400}} +-\entry{B4800}{458}{\code {B4800}} +-\entry{B9600}{458}{\code {B9600}} +-\entry{B19200}{458}{\code {B19200}} +-\entry{B38400}{458}{\code {B38400}} +-\entry{B57600}{458}{\code {B57600}} +-\entry{B115200}{458}{\code {B115200}} +-\entry{B230400}{458}{\code {B230400}} +-\entry{B460800}{458}{\code {B460800}} +-\entry{EXTA}{458}{\code {EXTA}} +-\entry{EXTB}{458}{\code {EXTB}} +-\entry{_POSIX_VDISABLE}{458}{\code {_POSIX_VDISABLE}} +-\entry{VEOF}{458}{\code {VEOF}} +-\entry{VEOL}{459}{\code {VEOL}} +-\entry{VEOL2}{459}{\code {VEOL2}} +-\entry{VERASE}{459}{\code {VERASE}} +-\entry{VWERASE}{459}{\code {VWERASE}} +-\entry{VKILL}{460}{\code {VKILL}} +-\entry{VREPRINT}{460}{\code {VREPRINT}} +-\entry{VINTR}{460}{\code {VINTR}} +-\entry{VQUIT}{460}{\code {VQUIT}} +-\entry{VSUSP}{460}{\code {VSUSP}} +-\entry{VDSUSP}{461}{\code {VDSUSP}} +-\entry{VSTART}{461}{\code {VSTART}} +-\entry{VSTOP}{461}{\code {VSTOP}} +-\entry{VLNEXT}{462}{\code {VLNEXT}} +-\entry{VDISCARD}{462}{\code {VDISCARD}} +-\entry{VSTATUS}{462}{\code {VSTATUS}} +-\entry{VMIN}{463}{\code {VMIN}} +-\entry{VTIME}{463}{\code {VTIME}} +-\entry{TCIFLUSH}{465}{\code {TCIFLUSH}} +-\entry{TCOFLUSH}{465}{\code {TCOFLUSH}} +-\entry{TCIOFLUSH}{465}{\code {TCIOFLUSH}} +-\entry{TCOOFF}{466}{\code {TCOOFF}} +-\entry{TCOON}{466}{\code {TCOON}} +-\entry{TCIOFF}{466}{\code {TCIOFF}} +-\entry{TCION}{466}{\code {TCION}} +-\entry{EBADF}{466}{\code {EBADF}} +-\entry{ENOTTY}{466}{\code {ENOTTY}} +-\entry{EINVAL}{466}{\code {EINVAL}} +-\entry{LOG_USER}{474}{\code {LOG_USER}} +-\entry{LOG_MAIL}{474}{\code {LOG_MAIL}} +-\entry{LOG_DAEMON}{474}{\code {LOG_DAEMON}} +-\entry{LOG_AUTH}{474}{\code {LOG_AUTH}} +-\entry{LOG_SYSLOG}{474}{\code {LOG_SYSLOG}} +-\entry{LOG_LPR}{474}{\code {LOG_LPR}} +-\entry{LOG_NEWS}{474}{\code {LOG_NEWS}} +-\entry{LOG_UUCP}{475}{\code {LOG_UUCP}} +-\entry{LOG_CRON}{475}{\code {LOG_CRON}} +-\entry{LOG_AUTHPRIV}{475}{\code {LOG_AUTHPRIV}} +-\entry{LOG_FTP}{475}{\code {LOG_FTP}} +-\entry{LOG_LOCAL0}{475}{\code {LOG_LOCAL0}} +-\entry{LOG_LOCAL1}{475}{\code {LOG_LOCAL1}} +-\entry{LOG_LOCAL2}{475}{\code {LOG_LOCAL2}} +-\entry{LOG_LOCAL3}{475}{\code {LOG_LOCAL3}} +-\entry{LOG_LOCAL4}{475}{\code {LOG_LOCAL4}} +-\entry{LOG_LOCAL5}{475}{\code {LOG_LOCAL5}} +-\entry{LOG_LOCAL6}{475}{\code {LOG_LOCAL6}} +-\entry{LOG_LOCAL7}{475}{\code {LOG_LOCAL7}} +-\entry{LOG_EMERG}{475}{\code {LOG_EMERG}} +-\entry{LOG_ALERT}{475}{\code {LOG_ALERT}} +-\entry{LOG_CRIT}{475}{\code {LOG_CRIT}} +-\entry{LOG_ERR}{475}{\code {LOG_ERR}} +-\entry{LOG_WARNING}{475}{\code {LOG_WARNING}} +-\entry{LOG_NOTICE}{476}{\code {LOG_NOTICE}} +-\entry{LOG_INFO}{476}{\code {LOG_INFO}} +-\entry{LOG_DEBUG}{476}{\code {LOG_DEBUG}} +-\entry{M_E}{479}{\code {M_E}} +-\entry{M_LOG2E}{479}{\code {M_LOG2E}} +-\entry{M_LOG10E}{479}{\code {M_LOG10E}} +-\entry{M_LN2}{479}{\code {M_LN2}} +-\entry{M_LN10}{479}{\code {M_LN10}} +-\entry{M_PI}{479}{\code {M_PI}} +-\entry{M_PI_2}{479}{\code {M_PI_2}} +-\entry{M_PI_4}{479}{\code {M_PI_4}} +-\entry{M_1_PI}{479}{\code {M_1_PI}} +-\entry{M_2_PI}{479}{\code {M_2_PI}} +-\entry{M_2_SQRTPI}{479}{\code {M_2_SQRTPI}} +-\entry{M_SQRT2}{479}{\code {M_SQRT2}} +-\entry{M_SQRT1_2}{479}{\code {M_SQRT1_2}} +-\entry{PI}{480}{\code {PI}} +-\entry{FP_ILOGB0}{484}{\code {FP_ILOGB0}} +-\entry{FP_ILOGBNAN}{484}{\code {FP_ILOGBNAN}} +-\entry{signgam}{488}{\code {signgam}} +-\entry{RAND_MAX}{508}{\code {RAND_MAX}} +-\entry{FP_NAN}{521}{\code {FP_NAN}} +-\entry{FP_INFINITE}{521}{\code {FP_INFINITE}} +-\entry{FP_ZERO}{521}{\code {FP_ZERO}} +-\entry{FP_SUBNORMAL}{521}{\code {FP_SUBNORMAL}} +-\entry{FP_NORMAL}{521}{\code {FP_NORMAL}} +-\entry{INFINITY}{524}{\code {INFINITY}} +-\entry{NAN}{524}{\code {NAN}} +-\entry{FE_INEXACT}{525}{\code {FE_INEXACT}} +-\entry{FE_DIVBYZERO}{525}{\code {FE_DIVBYZERO}} +-\entry{FE_UNDERFLOW}{525}{\code {FE_UNDERFLOW}} +-\entry{FE_OVERFLOW}{525}{\code {FE_OVERFLOW}} +-\entry{FE_INVALID}{525}{\code {FE_INVALID}} +-\entry{HUGE_VAL}{527}{\code {HUGE_VAL}} +-\entry{HUGE_VALF}{527}{\code {HUGE_VALF}} +-\entry{HUGE_VALL}{527}{\code {HUGE_VALL}} +-\entry{FE_TONEAREST}{528}{\code {FE_TONEAREST}} +-\entry{FE_UPWARD}{528}{\code {FE_UPWARD}} +-\entry{FE_DOWNWARD}{528}{\code {FE_DOWNWARD}} +-\entry{FE_TOWARDZERO}{528}{\code {FE_TOWARDZERO}} +-\entry{FE_DFL_ENV}{529}{\code {FE_DFL_ENV}} +-\entry{FE_NOMASK_ENV}{529}{\code {FE_NOMASK_ENV}} +-\entry{FP_FAST_FMA}{538}{\code {FP_FAST_FMA}} +-\entry{_Complex_I}{538}{\code {_Complex_I}} +-\entry{I}{538}{\code {I}} +-\entry{CLOCKS_PER_SEC}{552}{\code {CLOCKS_PER_SEC}} +-\entry{CLK_TCK}{552}{\code {CLK_TCK}} +-\entry{getdate_err}{572}{\code {getdate_err}} +-\entry{tzname}{576}{\code {tzname}} +-\entry{timezone}{577}{\code {timezone}} +-\entry{daylight}{577}{\code {daylight}} +-\entry{ITIMER_REAL}{579}{\code {ITIMER_REAL}} +-\entry{ITIMER_VIRTUAL}{579}{\code {ITIMER_VIRTUAL}} +-\entry{ITIMER_PROF}{579}{\code {ITIMER_PROF}} +-\entry{RLIMIT_CPU}{587}{\code {RLIMIT_CPU}} +-\entry{RLIMIT_FSIZE}{587}{\code {RLIMIT_FSIZE}} +-\entry{RLIMIT_DATA}{587}{\code {RLIMIT_DATA}} +-\entry{RLIMIT_STACK}{587}{\code {RLIMIT_STACK}} +-\entry{RLIMIT_CORE}{587}{\code {RLIMIT_CORE}} +-\entry{RLIMIT_RSS}{587}{\code {RLIMIT_RSS}} +-\entry{RLIMIT_NOFILE}{588}{\code {RLIMIT_NOFILE}} +-\entry{RLIMIT_OFILE}{588}{\code {RLIMIT_OFILE}} +-\entry{RLIMIT_AS}{588}{\code {RLIMIT_AS}} +-\entry{RLIM_NLIMITS}{588}{\code {RLIM_NLIMITS}} +-\entry{RLIM_INFINITY}{588}{\code {RLIM_INFINITY}} +-\entry{PRIO_MIN}{596}{\code {PRIO_MIN}} +-\entry{PRIO_MAX}{596}{\code {PRIO_MAX}} +-\entry{PRIO_PROCESS}{597}{\code {PRIO_PROCESS}} +-\entry{PRIO_PGRP}{597}{\code {PRIO_PGRP}} +-\entry{PRIO_USER}{597}{\code {PRIO_USER}} +-\entry{_SC_PAGESIZE}{599}{\code {_SC_PAGESIZE}} +-\entry{_SC_PHYS_PAGES}{599}{\code {_SC_PHYS_PAGES}} +-\entry{_SC_AVPHYS_PAGES}{599}{\code {_SC_AVPHYS_PAGES}} +-\entry{_SC_NPROCESSORS_CONF}{600}{\code {_SC_NPROCESSORS_CONF}} +-\entry{_SC_NPROCESSORS_ONLN}{600}{\code {_SC_NPROCESSORS_ONLN}} +-\entry{NSIG}{613}{\code {NSIG}} +-\entry{COREFILE}{614}{\code {COREFILE}} +-\entry{SIGFPE}{614}{\code {SIGFPE}} +-\entry{FPE_INTOVF_TRAP}{614}{\code {FPE_INTOVF_TRAP}} +-\entry{FPE_INTDIV_TRAP}{614}{\code {FPE_INTDIV_TRAP}} +-\entry{FPE_SUBRNG_TRAP}{615}{\code {FPE_SUBRNG_TRAP}} +-\entry{FPE_FLTOVF_TRAP}{615}{\code {FPE_FLTOVF_TRAP}} +-\entry{FPE_FLTDIV_TRAP}{615}{\code {FPE_FLTDIV_TRAP}} +-\entry{FPE_FLTUND_TRAP}{615}{\code {FPE_FLTUND_TRAP}} +-\entry{FPE_DECOVF_TRAP}{615}{\code {FPE_DECOVF_TRAP}} +-\entry{SIGILL}{615}{\code {SIGILL}} +-\entry{SIGSEGV}{615}{\code {SIGSEGV}} +-\entry{SIGBUS}{615}{\code {SIGBUS}} +-\entry{SIGABRT}{616}{\code {SIGABRT}} +-\entry{SIGIOT}{616}{\code {SIGIOT}} +-\entry{SIGTRAP}{616}{\code {SIGTRAP}} +-\entry{SIGEMT}{616}{\code {SIGEMT}} +-\entry{SIGSYS}{616}{\code {SIGSYS}} +-\entry{SIGTERM}{616}{\code {SIGTERM}} +-\entry{SIGINT}{616}{\code {SIGINT}} +-\entry{SIGQUIT}{616}{\code {SIGQUIT}} +-\entry{SIGKILL}{617}{\code {SIGKILL}} +-\entry{SIGHUP}{617}{\code {SIGHUP}} +-\entry{SIGALRM}{617}{\code {SIGALRM}} +-\entry{SIGVTALRM}{617}{\code {SIGVTALRM}} +-\entry{SIGPROF}{618}{\code {SIGPROF}} +-\entry{SIGIO}{618}{\code {SIGIO}} +-\entry{SIGURG}{618}{\code {SIGURG}} +-\entry{SIGPOLL}{618}{\code {SIGPOLL}} +-\entry{SIGCHLD}{618}{\code {SIGCHLD}} +-\entry{SIGCLD}{618}{\code {SIGCLD}} +-\entry{SIGCONT}{619}{\code {SIGCONT}} +-\entry{SIGSTOP}{619}{\code {SIGSTOP}} +-\entry{SIGTSTP}{619}{\code {SIGTSTP}} +-\entry{SIGTTIN}{619}{\code {SIGTTIN}} +-\entry{SIGTTOU}{619}{\code {SIGTTOU}} +-\entry{SIGPIPE}{620}{\code {SIGPIPE}} +-\entry{SIGLOST}{620}{\code {SIGLOST}} +-\entry{SIGXCPU}{620}{\code {SIGXCPU}} +-\entry{SIGXFSZ}{620}{\code {SIGXFSZ}} +-\entry{SIGUSR1}{621}{\code {SIGUSR1}} +-\entry{SIGUSR2}{621}{\code {SIGUSR2}} +-\entry{SIGWINCH}{621}{\code {SIGWINCH}} +-\entry{SIGINFO}{621}{\code {SIGINFO}} +-\entry{sys_siglist}{622}{\code {sys_siglist}} +-\entry{SIG_DFL}{622}{\code {SIG_DFL}} +-\entry{SIG_IGN}{622}{\code {SIG_IGN}} +-\entry{SIG_ERR}{624}{\code {SIG_ERR}} +-\entry{SA_NOCLDSTOP}{627}{\code {SA_NOCLDSTOP}} +-\entry{SA_ONSTACK}{627}{\code {SA_ONSTACK}} +-\entry{SA_RESTART}{627}{\code {SA_RESTART}} +-\entry{SIG_BLOCK}{645}{\code {SIG_BLOCK}} +-\entry{SIG_UNBLOCK}{645}{\code {SIG_UNBLOCK}} +-\entry{SIG_SETMASK}{645}{\code {SIG_SETMASK}} +-\entry{SIGSTKSZ}{652}{\code {SIGSTKSZ}} +-\entry{MINSIGSTKSZ}{652}{\code {MINSIGSTKSZ}} +-\entry{SS_DISABLE}{653}{\code {SS_DISABLE}} +-\entry{SS_ONSTACK}{653}{\code {SS_ONSTACK}} +-\entry{SV_ONSTACK}{655}{\code {SV_ONSTACK}} +-\entry{SV_INTERRUPT}{655}{\code {SV_INTERRUPT}} +-\entry{SV_RESETHAND}{655}{\code {SV_RESETHAND}} +-\entry{opterr}{659}{\code {opterr}} +-\entry{optopt}{659}{\code {optopt}} +-\entry{optind}{659}{\code {optind}} +-\entry{optarg}{659}{\code {optarg}} +-\entry{argp_program_version}{667}{\code {argp_program_version}} +-\entry{argp_program_bug_address}{667}{\code {argp_program_bug_address}} +-\entry{argp_program_version_hook}{667}{\code {argp_program_version_hook}} +-\entry{argp_err_exit_status}{667}{\code {argp_err_exit_status}} +-\entry{OPTION_ARG_OPTIONAL}{670}{\code {OPTION_ARG_OPTIONAL}} +-\entry{OPTION_HIDDEN}{670}{\code {OPTION_HIDDEN}} +-\entry{OPTION_ALIAS}{670}{\code {OPTION_ALIAS}} +-\entry{OPTION_DOC}{670}{\code {OPTION_DOC}} +-\entry{OPTION_NO_USAGE}{670}{\code {OPTION_NO_USAGE}} +-\entry{ARGP_ERR_UNKNOWN}{671}{\code {ARGP_ERR_UNKNOWN}} +-\entry{ARGP_KEY_ARG}{672}{\code {ARGP_KEY_ARG}} +-\entry{ARGP_KEY_ARGS}{672}{\code {ARGP_KEY_ARGS}} +-\entry{ARGP_KEY_END}{672}{\code {ARGP_KEY_END}} +-\entry{ARGP_KEY_NO_ARGS}{672}{\code {ARGP_KEY_NO_ARGS}} +-\entry{ARGP_KEY_INIT}{672}{\code {ARGP_KEY_INIT}} +-\entry{ARGP_KEY_SUCCESS}{673}{\code {ARGP_KEY_SUCCESS}} +-\entry{ARGP_KEY_ERROR}{673}{\code {ARGP_KEY_ERROR}} +-\entry{ARGP_KEY_FINI}{673}{\code {ARGP_KEY_FINI}} +-\entry{ARGP_PARSE_ARGV0}{677}{\code {ARGP_PARSE_ARGV0}} +-\entry{ARGP_NO_ERRS}{677}{\code {ARGP_NO_ERRS}} +-\entry{ARGP_NO_ARGS}{677}{\code {ARGP_NO_ARGS}} +-\entry{ARGP_IN_ORDER}{677}{\code {ARGP_IN_ORDER}} +-\entry{ARGP_NO_HELP}{677}{\code {ARGP_NO_HELP}} +-\entry{ARGP_NO_EXIT}{677}{\code {ARGP_NO_EXIT}} +-\entry{ARGP_LONG_ONLY}{677}{\code {ARGP_LONG_ONLY}} +-\entry{ARGP_SILENT}{677}{\code {ARGP_SILENT}} +-\entry{ARGP_KEY_HELP_PRE_DOC}{678}{\code {ARGP_KEY_HELP_PRE_DOC}} +-\entry{ARGP_KEY_HELP_POST_DOC}{678}{\code {ARGP_KEY_HELP_POST_DOC}} +-\entry{ARGP_KEY_HELP_HEADER}{678}{\code {ARGP_KEY_HELP_HEADER}} +-\entry{ARGP_KEY_HELP_EXTRA}{678}{\code {ARGP_KEY_HELP_EXTRA}} +-\entry{ARGP_KEY_HELP_DUP_ARGS_NOTE}{678}{\code {ARGP_KEY_HELP_DUP_ARGS_NOTE}} +-\entry{ARGP_KEY_HELP_ARGS_DOC}{678}{\code {ARGP_KEY_HELP_ARGS_DOC}} +-\entry{ARGP_HELP_USAGE}{679}{\code {ARGP_HELP_USAGE}} +-\entry{ARGP_HELP_SHORT_USAGE}{679}{\code {ARGP_HELP_SHORT_USAGE}} +-\entry{ARGP_HELP_SEE}{679}{\code {ARGP_HELP_SEE}} +-\entry{ARGP_HELP_LONG}{679}{\code {ARGP_HELP_LONG}} +-\entry{ARGP_HELP_PRE_DOC}{679}{\code {ARGP_HELP_PRE_DOC}} +-\entry{ARGP_HELP_POST_DOC}{679}{\code {ARGP_HELP_POST_DOC}} +-\entry{ARGP_HELP_DOC}{679}{\code {ARGP_HELP_DOC}} +-\entry{ARGP_HELP_BUG_ADDR}{679}{\code {ARGP_HELP_BUG_ADDR}} +-\entry{ARGP_HELP_LONG_ONLY}{680}{\code {ARGP_HELP_LONG_ONLY}} +-\entry{ARGP_HELP_EXIT_ERR}{680}{\code {ARGP_HELP_EXIT_ERR}} +-\entry{ARGP_HELP_EXIT_OK}{680}{\code {ARGP_HELP_EXIT_OK}} +-\entry{ARGP_HELP_STD_ERR}{680}{\code {ARGP_HELP_STD_ERR}} +-\entry{ARGP_HELP_STD_USAGE}{680}{\code {ARGP_HELP_STD_USAGE}} +-\entry{ARGP_HELP_STD_HELP}{680}{\code {ARGP_HELP_STD_HELP}} +-\entry{environ}{693}{\code {environ}} +-\entry{EXIT_SUCCESS}{697}{\code {EXIT_SUCCESS}} +-\entry{EXIT_FAILURE}{698}{\code {EXIT_FAILURE}} +-\entry{L_ctermid}{728}{\code {L_ctermid}} +-\entry{aliases}{733}{\code {aliases}} +-\entry{ethers}{733}{\code {ethers}} +-\entry{group}{733}{\code {group}} +-\entry{hosts}{733}{\code {hosts}} +-\entry{netgroup}{733}{\code {netgroup}} +-\entry{networks}{733}{\code {networks}} +-\entry{protocols}{733}{\code {protocols}} +-\entry{passwd}{733}{\code {passwd}} +-\entry{rpc}{733}{\code {rpc}} +-\entry{services}{733}{\code {services}} +-\entry{shadow}{733}{\code {shadow}} +-\entry{NSS_STATUS_TRYAGAIN}{738}{\code {NSS_STATUS_TRYAGAIN}} +-\entry{NSS_STATUS_UNAVAIL}{738}{\code {NSS_STATUS_UNAVAIL}} +-\entry{NSS_STATUS_NOTFOUND}{738}{\code {NSS_STATUS_NOTFOUND}} +-\entry{NSS_STATUS_SUCCESS}{738}{\code {NSS_STATUS_SUCCESS}} +-\entry{L_cuserid}{753}{\code {L_cuserid}} +-\entry{EMPTY}{755}{\code {EMPTY}} +-\entry{RUN_LVL}{755}{\code {RUN_LVL}} +-\entry{BOOT_TIME}{755}{\code {BOOT_TIME}} +-\entry{OLD_TIME}{755}{\code {OLD_TIME}} +-\entry{NEW_TIME}{755}{\code {NEW_TIME}} +-\entry{INIT_PROCESS}{755}{\code {INIT_PROCESS}} +-\entry{LOGIN_PROCESS}{755}{\code {LOGIN_PROCESS}} +-\entry{USER_PROCESS}{755}{\code {USER_PROCESS}} +-\entry{DEAD_PROCESS}{755}{\code {DEAD_PROCESS}} +-\entry{ACCOUNTING}{755}{\code {ACCOUNTING}} +-\entry{_PATH_UTMP}{758}{\code {_PATH_UTMP}} +-\entry{_PATH_WTMP}{758}{\code {_PATH_WTMP}} +-\entry{EMPTY}{759}{\code {EMPTY}} +-\entry{RUN_LVL}{759}{\code {RUN_LVL}} +-\entry{BOOT_TIME}{759}{\code {BOOT_TIME}} +-\entry{OLD_TIME}{759}{\code {OLD_TIME}} +-\entry{NEW_TIME}{759}{\code {NEW_TIME}} +-\entry{INIT_PROCESS}{759}{\code {INIT_PROCESS}} +-\entry{LOGIN_PROCESS}{759}{\code {LOGIN_PROCESS}} +-\entry{USER_PROCESS}{759}{\code {USER_PROCESS}} +-\entry{DEAD_PROCESS}{759}{\code {DEAD_PROCESS}} +-\entry{_PATH_FSTAB}{775}{\code {_PATH_FSTAB}} +-\entry{_PATH_MNTTAB}{775}{\code {_PATH_MNTTAB}} +-\entry{_PATH_MOUNTED}{775}{\code {_PATH_MOUNTED}} +-\entry{FSTAB}{775}{\code {FSTAB}} +-\entry{MNTTAB}{775}{\code {MNTTAB}} +-\entry{MOUNTED}{775}{\code {MOUNTED}} +-\entry{FSTAB_RW}{776}{\code {FSTAB_RW}} +-\entry{FSTAB_RQ}{776}{\code {FSTAB_RQ}} +-\entry{FSTAB_RO}{776}{\code {FSTAB_RO}} +-\entry{FSTAB_SW}{776}{\code {FSTAB_SW}} +-\entry{FSTAB_XX}{776}{\code {FSTAB_XX}} +-\entry{MNTTYPE_IGNORE}{778}{\code {MNTTYPE_IGNORE}} +-\entry{MNTTYPE_NFS}{778}{\code {MNTTYPE_NFS}} +-\entry{MNTTYPE_SWAP}{778}{\code {MNTTYPE_SWAP}} +-\entry{MNTOPT_DEFAULTS}{778}{\code {MNTOPT_DEFAULTS}} +-\entry{MNTOPT_RO}{778}{\code {MNTOPT_RO}} +-\entry{MNTOPT_RW}{778}{\code {MNTOPT_RW}} +-\entry{MNTOPT_SUID}{778}{\code {MNTOPT_SUID}} +-\entry{MNTOPT_NOSUID}{778}{\code {MNTOPT_NOSUID}} +-\entry{MNTOPT_NOAUTO}{779}{\code {MNTOPT_NOAUTO}} +-\entry{ARG_MAX}{787}{\code {ARG_MAX}} +-\entry{CHILD_MAX}{787}{\code {CHILD_MAX}} +-\entry{OPEN_MAX}{787}{\code {OPEN_MAX}} +-\entry{STREAM_MAX}{787}{\code {STREAM_MAX}} +-\entry{TZNAME_MAX}{787}{\code {TZNAME_MAX}} +-\entry{NGROUPS_MAX}{788}{\code {NGROUPS_MAX}} +-\entry{SSIZE_MAX}{788}{\code {SSIZE_MAX}} +-\entry{RE_DUP_MAX}{788}{\code {RE_DUP_MAX}} +-\entry{_POSIX_JOB_CONTROL}{788}{\code {_POSIX_JOB_CONTROL}} +-\entry{_POSIX_SAVED_IDS}{788}{\code {_POSIX_SAVED_IDS}} +-\entry{_POSIX2_C_DEV}{789}{\code {_POSIX2_C_DEV}} +-\entry{_POSIX2_FORT_DEV}{789}{\code {_POSIX2_FORT_DEV}} +-\entry{_POSIX2_FORT_RUN}{789}{\code {_POSIX2_FORT_RUN}} +-\entry{_POSIX2_LOCALEDEF}{789}{\code {_POSIX2_LOCALEDEF}} +-\entry{_POSIX2_SW_DEV}{789}{\code {_POSIX2_SW_DEV}} +-\entry{_POSIX_VERSION}{789}{\code {_POSIX_VERSION}} +-\entry{_POSIX2_C_VERSION}{790}{\code {_POSIX2_C_VERSION}} +-\entry{_SC_ARG_MAX}{790}{\code {_SC_ARG_MAX}} +-\entry{_SC_CHILD_MAX}{790}{\code {_SC_CHILD_MAX}} +-\entry{_SC_OPEN_MAX}{790}{\code {_SC_OPEN_MAX}} +-\entry{_SC_STREAM_MAX}{790}{\code {_SC_STREAM_MAX}} +-\entry{_SC_TZNAME_MAX}{790}{\code {_SC_TZNAME_MAX}} +-\entry{_SC_NGROUPS_MAX}{790}{\code {_SC_NGROUPS_MAX}} +-\entry{_SC_JOB_CONTROL}{791}{\code {_SC_JOB_CONTROL}} +-\entry{_SC_SAVED_IDS}{791}{\code {_SC_SAVED_IDS}} +-\entry{_SC_VERSION}{791}{\code {_SC_VERSION}} +-\entry{_SC_CLK_TCK}{791}{\code {_SC_CLK_TCK}} +-\entry{_SC_CHARCLASS_NAME_MAX}{791}{\code {_SC_CHARCLASS_NAME_MAX}} +-\entry{_SC_REALTIME_SIGNALS}{791}{\code {_SC_REALTIME_SIGNALS}} +-\entry{_SC_PRIORITY_SCHEDULING}{791}{\code {_SC_PRIORITY_SCHEDULING}} +-\entry{_SC_TIMERS}{791}{\code {_SC_TIMERS}} +-\entry{_SC_ASYNCHRONOUS_IO}{791}{\code {_SC_ASYNCHRONOUS_IO}} +-\entry{_SC_PRIORITIZED_IO}{791}{\code {_SC_PRIORITIZED_IO}} +-\entry{_SC_SYNCHRONIZED_IO}{791}{\code {_SC_SYNCHRONIZED_IO}} +-\entry{_SC_FSYNC}{791}{\code {_SC_FSYNC}} +-\entry{_SC_MAPPED_FILES}{791}{\code {_SC_MAPPED_FILES}} +-\entry{_SC_MEMLOCK}{791}{\code {_SC_MEMLOCK}} +-\entry{_SC_MEMLOCK_RANGE}{791}{\code {_SC_MEMLOCK_RANGE}} +-\entry{_SC_MEMORY_PROTECTION}{791}{\code {_SC_MEMORY_PROTECTION}} +-\entry{_SC_MESSAGE_PASSING}{791}{\code {_SC_MESSAGE_PASSING}} +-\entry{_SC_SEMAPHORES}{791}{\code {_SC_SEMAPHORES}} +-\entry{_SC_SHARED_MEMORY_OBJECTS}{792}{\code {_SC_SHARED_MEMORY_OBJECTS}} +-\entry{_SC_AIO_LISTIO_MAX}{792}{\code {_SC_AIO_LISTIO_MAX}} +-\entry{_SC_AIO_MAX}{792}{\code {_SC_AIO_MAX}} +-\entry{_SC_AIO_PRIO_DELTA_MAX}{792}{\code {_SC_AIO_PRIO_DELTA_MAX}} +-\entry{_SC_DELAYTIMER_MAX}{792}{\code {_SC_DELAYTIMER_MAX}} +-\entry{_SC_MQ_OPEN_MAX}{792}{\code {_SC_MQ_OPEN_MAX}} +-\entry{_SC_MQ_PRIO_MAX}{792}{\code {_SC_MQ_PRIO_MAX}} +-\entry{_SC_RTSIG_MAX}{792}{\code {_SC_RTSIG_MAX}} +-\entry{_SC_SEM_NSEMS_MAX}{792}{\code {_SC_SEM_NSEMS_MAX}} +-\entry{_SC_SEM_VALUE_MAX}{792}{\code {_SC_SEM_VALUE_MAX}} +-\entry{_SC_SIGQUEUE_MAX}{792}{\code {_SC_SIGQUEUE_MAX}} +-\entry{_SC_TIMER_MAX}{792}{\code {_SC_TIMER_MAX}} +-\entry{_SC_PII}{792}{\code {_SC_PII}} +-\entry{_SC_PII_XTI}{792}{\code {_SC_PII_XTI}} +-\entry{_SC_PII_SOCKET}{792}{\code {_SC_PII_SOCKET}} +-\entry{_SC_PII_INTERNET}{792}{\code {_SC_PII_INTERNET}} +-\entry{_SC_PII_OSI}{792}{\code {_SC_PII_OSI}} +-\entry{_SC_SELECT}{792}{\code {_SC_SELECT}} +-\entry{_SC_UIO_MAXIOV}{792}{\code {_SC_UIO_MAXIOV}} +-\entry{_SC_PII_INTERNET_STREAM}{793}{\code {_SC_PII_INTERNET_STREAM}} +-\entry{_SC_PII_INTERNET_DGRAM}{793}{\code {_SC_PII_INTERNET_DGRAM}} +-\entry{_SC_PII_OSI_COTS}{793}{\code {_SC_PII_OSI_COTS}} +-\entry{_SC_PII_OSI_CLTS}{793}{\code {_SC_PII_OSI_CLTS}} +-\entry{_SC_PII_OSI_M}{793}{\code {_SC_PII_OSI_M}} +-\entry{_SC_T_IOV_MAX}{793}{\code {_SC_T_IOV_MAX}} +-\entry{_SC_THREADS}{793}{\code {_SC_THREADS}} +-\entry{_SC_THREAD_SAFE_FUNCTIONS}{793}{\code {_SC_THREAD_SAFE_FUNCTIONS}} +-\entry{_SC_GETGR_R_SIZE_MAX}{793}{\code {_SC_GETGR_R_SIZE_MAX}} +-\entry{_SC_GETPW_R_SIZE_MAX}{793}{\code {_SC_GETPW_R_SIZE_MAX}} +-\entry{_SC_LOGIN_NAME_MAX}{793}{\code {_SC_LOGIN_NAME_MAX}} +-\entry{_SC_TTY_NAME_MAX}{793}{\code {_SC_TTY_NAME_MAX}} +-\entry{_SC_THREAD_DESTRUCTOR_ITERATIONS}{793}{\code {_SC_THREAD_DESTRUCTOR_ITERATIONS}} +-\entry{_SC_THREAD_KEYS_MAX}{793}{\code {_SC_THREAD_KEYS_MAX}} +-\entry{_SC_THREAD_STACK_MIN}{793}{\code {_SC_THREAD_STACK_MIN}} +-\entry{_SC_THREAD_THREADS_MAX}{793}{\code {_SC_THREAD_THREADS_MAX}} +-\entry{_SC_THREAD_ATTR_STACKADDR}{793}{\code {_SC_THREAD_ATTR_STACKADDR}} +-\entry{_SC_THREAD_ATTR_STACKSIZE}{793}{\code {_SC_THREAD_ATTR_STACKSIZE}} +-\entry{_SC_THREAD_PRIORITY_SCHEDULING}{794}{\code {_SC_THREAD_PRIORITY_SCHEDULING}} +-\entry{_SC_THREAD_PRIO_INHERIT}{794}{\code {_SC_THREAD_PRIO_INHERIT}} +-\entry{_SC_THREAD_PRIO_PROTECT}{794}{\code {_SC_THREAD_PRIO_PROTECT}} +-\entry{_SC_THREAD_PROCESS_SHARED}{794}{\code {_SC_THREAD_PROCESS_SHARED}} +-\entry{_SC_2_C_DEV}{794}{\code {_SC_2_C_DEV}} +-\entry{_SC_2_FORT_DEV}{794}{\code {_SC_2_FORT_DEV}} +-\entry{_SC_2_FORT_RUN}{794}{\code {_SC_2_FORT_RUN}} +-\entry{_SC_2_LOCALEDEF}{794}{\code {_SC_2_LOCALEDEF}} +-\entry{_SC_2_SW_DEV}{794}{\code {_SC_2_SW_DEV}} +-\entry{_SC_BC_BASE_MAX}{794}{\code {_SC_BC_BASE_MAX}} +-\entry{_SC_BC_DIM_MAX}{794}{\code {_SC_BC_DIM_MAX}} +-\entry{_SC_BC_SCALE_MAX}{794}{\code {_SC_BC_SCALE_MAX}} +-\entry{_SC_BC_STRING_MAX}{794}{\code {_SC_BC_STRING_MAX}} +-\entry{_SC_COLL_WEIGHTS_MAX}{794}{\code {_SC_COLL_WEIGHTS_MAX}} +-\entry{_SC_EXPR_NEST_MAX}{794}{\code {_SC_EXPR_NEST_MAX}} +-\entry{_SC_LINE_MAX}{794}{\code {_SC_LINE_MAX}} +-\entry{_SC_EQUIV_CLASS_MAX}{795}{\code {_SC_EQUIV_CLASS_MAX}} +-\entry{_SC_VERSION}{795}{\code {_SC_VERSION}} +-\entry{_SC_2_VERSION}{795}{\code {_SC_2_VERSION}} +-\entry{_SC_PAGESIZE}{795}{\code {_SC_PAGESIZE}} +-\entry{_SC_NPROCESSORS_CONF}{795}{\code {_SC_NPROCESSORS_CONF}} +-\entry{_SC_NPROCESSORS_ONLN}{795}{\code {_SC_NPROCESSORS_ONLN}} +-\entry{_SC_PHYS_PAGES}{795}{\code {_SC_PHYS_PAGES}} +-\entry{_SC_AVPHYS_PAGES}{795}{\code {_SC_AVPHYS_PAGES}} +-\entry{_SC_ATEXIT_MAX}{795}{\code {_SC_ATEXIT_MAX}} +-\entry{_SC_XOPEN_VERSION}{795}{\code {_SC_XOPEN_VERSION}} +-\entry{_SC_XOPEN_XCU_VERSION}{795}{\code {_SC_XOPEN_XCU_VERSION}} +-\entry{_SC_XOPEN_UNIX}{795}{\code {_SC_XOPEN_UNIX}} +-\entry{_SC_XOPEN_REALTIME}{795}{\code {_SC_XOPEN_REALTIME}} +-\entry{_SC_XOPEN_REALTIME_THREADS}{795}{\code {_SC_XOPEN_REALTIME_THREADS}} +-\entry{_SC_XOPEN_LEGACY}{795}{\code {_SC_XOPEN_LEGACY}} +-\entry{_SC_XOPEN_CRYPT}{795}{\code {_SC_XOPEN_CRYPT}} +-\entry{_SC_XOPEN_ENH_I18N}{795}{\code {_SC_XOPEN_ENH_I18N}} +-\entry{_SC_XOPEN_SHM}{796}{\code {_SC_XOPEN_SHM}} +-\entry{_SC_XOPEN_XPG2}{796}{\code {_SC_XOPEN_XPG2}} +-\entry{_SC_XOPEN_XPG3}{796}{\code {_SC_XOPEN_XPG3}} +-\entry{_SC_XOPEN_XPG4}{796}{\code {_SC_XOPEN_XPG4}} +-\entry{_SC_CHAR_BIT}{796}{\code {_SC_CHAR_BIT}} +-\entry{_SC_CHAR_MAX}{796}{\code {_SC_CHAR_MAX}} +-\entry{_SC_CHAR_MIN}{796}{\code {_SC_CHAR_MIN}} +-\entry{_SC_INT_MAX}{796}{\code {_SC_INT_MAX}} +-\entry{_SC_INT_MIN}{796}{\code {_SC_INT_MIN}} +-\entry{_SC_LONG_BIT}{796}{\code {_SC_LONG_BIT}} +-\entry{_SC_WORD_BIT}{796}{\code {_SC_WORD_BIT}} +-\entry{_SC_MB_LEN_MAX}{796}{\code {_SC_MB_LEN_MAX}} +-\entry{_SC_NZERO}{796}{\code {_SC_NZERO}} +-\entry{SC_SSIZE_MAX}{796}{\code {SC_SSIZE_MAX}} +-\entry{_SC_SCHAR_MAX}{796}{\code {_SC_SCHAR_MAX}} +-\entry{_SC_SCHAR_MIN}{796}{\code {_SC_SCHAR_MIN}} +-\entry{_SC_SHRT_MAX}{797}{\code {_SC_SHRT_MAX}} +-\entry{_SC_SHRT_MIN}{797}{\code {_SC_SHRT_MIN}} +-\entry{_SC_UCHAR_MAX}{797}{\code {_SC_UCHAR_MAX}} +-\entry{_SC_UINT_MAX}{797}{\code {_SC_UINT_MAX}} +-\entry{_SC_ULONG_MAX}{797}{\code {_SC_ULONG_MAX}} +-\entry{_SC_USHRT_MAX}{797}{\code {_SC_USHRT_MAX}} +-\entry{_SC_NL_ARGMAX}{797}{\code {_SC_NL_ARGMAX}} +-\entry{_SC_NL_LANGMAX}{797}{\code {_SC_NL_LANGMAX}} +-\entry{_SC_NL_MSGMAX}{797}{\code {_SC_NL_MSGMAX}} +-\entry{_SC_NL_NMAX}{797}{\code {_SC_NL_NMAX}} +-\entry{_SC_NL_SETMAX}{797}{\code {_SC_NL_SETMAX}} +-\entry{_SC_NL_TEXTMAX}{797}{\code {_SC_NL_TEXTMAX}} +-\entry{LINK_MAX}{799}{\code {LINK_MAX}} +-\entry{MAX_CANON}{800}{\code {MAX_CANON}} +-\entry{MAX_INPUT}{800}{\code {MAX_INPUT}} +-\entry{NAME_MAX}{800}{\code {NAME_MAX}} +-\entry{PATH_MAX}{800}{\code {PATH_MAX}} +-\entry{PIPE_BUF}{800}{\code {PIPE_BUF}} +-\entry{MAXNAMLEN}{800}{\code {MAXNAMLEN}} +-\entry{FILENAME_MAX}{800}{\code {FILENAME_MAX}} +-\entry{_POSIX_CHOWN_RESTRICTED}{801}{\code {_POSIX_CHOWN_RESTRICTED}} +-\entry{_POSIX_NO_TRUNC}{801}{\code {_POSIX_NO_TRUNC}} +-\entry{_POSIX_VDISABLE}{801}{\code {_POSIX_VDISABLE}} +-\entry{BC_BASE_MAX}{804}{\code {BC_BASE_MAX}} +-\entry{BC_DIM_MAX}{804}{\code {BC_DIM_MAX}} +-\entry{BC_SCALE_MAX}{804}{\code {BC_SCALE_MAX}} +-\entry{BC_STRING_MAX}{804}{\code {BC_STRING_MAX}} +-\entry{COLL_WEIGHTS_MAX}{804}{\code {COLL_WEIGHTS_MAX}} +-\entry{EXPR_NEST_MAX}{804}{\code {EXPR_NEST_MAX}} +-\entry{LINE_MAX}{804}{\code {LINE_MAX}} +-\entry{EQUIV_CLASS_MAX}{804}{\code {EQUIV_CLASS_MAX}} +-\entry{DES_ENCRYPT}{814}{\code {DES_ENCRYPT}} +-\entry{DES_DECRYPT}{814}{\code {DES_DECRYPT}} +-\entry{DES_HW}{814}{\code {DES_HW}} +-\entry{DES_SW}{814}{\code {DES_SW}} +-\entry{DESERR_NONE}{814}{\code {DESERR_NONE}} +-\entry{DESERR_NOHWDEVICE}{814}{\code {DESERR_NOHWDEVICE}} +-\entry{DESERR_HWERROR}{814}{\code {DESERR_HWERROR}} +-\entry{DESERR_BADPARAM}{814}{\code {DESERR_BADPARAM}} +-\entry{SEM_VALUE_MAX}{831}{\code {SEM_VALUE_MAX}} +-\entry{NDEBUG}{841}{\code {NDEBUG}} +-\entry{NULL}{848}{\code {NULL}} +-\entry{SCHAR_MIN}{850}{\code {SCHAR_MIN}} +-\entry{SCHAR_MAX}{850}{\code {SCHAR_MAX}} +-\entry{UCHAR_MAX}{850}{\code {UCHAR_MAX}} +-\entry{CHAR_MIN}{850}{\code {CHAR_MIN}} +-\entry{CHAR_MAX}{850}{\code {CHAR_MAX}} +-\entry{SHRT_MIN}{850}{\code {SHRT_MIN}} +-\entry{SHRT_MAX}{851}{\code {SHRT_MAX}} +-\entry{USHRT_MAX}{851}{\code {USHRT_MAX}} +-\entry{INT_MIN}{851}{\code {INT_MIN}} +-\entry{INT_MAX}{851}{\code {INT_MAX}} +-\entry{UINT_MAX}{851}{\code {UINT_MAX}} +-\entry{LONG_MIN}{851}{\code {LONG_MIN}} +-\entry{LONG_MAX}{851}{\code {LONG_MAX}} +-\entry{ULONG_MAX}{851}{\code {ULONG_MAX}} +-\entry{LONG_LONG_MIN}{851}{\code {LONG_LONG_MIN}} +-\entry{LONG_LONG_MAX}{851}{\code {LONG_LONG_MAX}} +-\entry{ULONG_LONG_MAX}{851}{\code {ULONG_LONG_MAX}} +-\entry{WCHAR_MAX}{851}{\code {WCHAR_MAX}} +-\entry{FLT_ROUNDS}{853}{\code {FLT_ROUNDS}} +-\entry{FLT_RADIX}{854}{\code {FLT_RADIX}} +-\entry{FLT_MANT_DIG}{854}{\code {FLT_MANT_DIG}} +-\entry{DBL_MANT_DIG}{854}{\code {DBL_MANT_DIG}} +-\entry{LDBL_MANT_DIG}{854}{\code {LDBL_MANT_DIG}} +-\entry{FLT_DIG}{854}{\code {FLT_DIG}} +-\entry{DBL_DIG}{854}{\code {DBL_DIG}} +-\entry{LDBL_DIG}{854}{\code {LDBL_DIG}} +-\entry{FLT_MIN_EXP}{854}{\code {FLT_MIN_EXP}} +-\entry{DBL_MIN_EXP}{854}{\code {DBL_MIN_EXP}} +-\entry{LDBL_MIN_EXP}{855}{\code {LDBL_MIN_EXP}} +-\entry{FLT_MIN_10_EXP}{855}{\code {FLT_MIN_10_EXP}} +-\entry{DBL_MIN_10_EXP}{855}{\code {DBL_MIN_10_EXP}} +-\entry{LDBL_MIN_10_EXP}{855}{\code {LDBL_MIN_10_EXP}} +-\entry{FLT_MAX_EXP}{855}{\code {FLT_MAX_EXP}} +-\entry{DBL_MAX_EXP}{855}{\code {DBL_MAX_EXP}} +-\entry{LDBL_MAX_EXP}{855}{\code {LDBL_MAX_EXP}} +-\entry{FLT_MAX_10_EXP}{855}{\code {FLT_MAX_10_EXP}} +-\entry{DBL_MAX_10_EXP}{855}{\code {DBL_MAX_10_EXP}} +-\entry{LDBL_MAX_10_EXP}{855}{\code {LDBL_MAX_10_EXP}} +-\entry{FLT_MAX}{855}{\code {FLT_MAX}} +-\entry{DBL_MAX}{855}{\code {DBL_MAX}} +-\entry{LDBL_MAX}{855}{\code {LDBL_MAX}} +-\entry{FLT_MIN}{855}{\code {FLT_MIN}} +-\entry{DBL_MIN}{855}{\code {DBL_MIN}} +-\entry{LDBL_MIN}{855}{\code {LDBL_MIN}} +-\entry{FLT_EPSILON}{856}{\code {FLT_EPSILON}} +-\entry{DBL_EPSILON}{856}{\code {DBL_EPSILON}} +-\entry{LDBL_EPSILON}{856}{\code {LDBL_EPSILON}} +diff -u -udbrN glibc-2.3.2/manual/libc.vrs glibc-2.3.2-200304020432/manual/libc.vrs +--- glibc-2.3.2/manual/libc.vrs Tue Feb 25 11:34:58 2003 ++++ glibc-2.3.2-200304020432/manual/libc.vrs Thu Jan 1 01:00:00 1970 +@@ -1,1074 +0,0 @@ +-\initial {(} +-\entry {\code {(*__gconv_end_fct)}}{147} +-\entry {\code {(*__gconv_fct)}}{148} +-\entry {\code {(*__gconv_init_fct)}}{145} +-\initial {_} +-\entry {\code {__free_hook}}{41} +-\entry {\code {__malloc_hook}}{41} +-\entry {\code {__malloc_initialize_hook}}{42} +-\entry {\code {__memalign_hook}}{41} +-\entry {\code {__realloc_hook}}{41} +-\entry {\code {_BSD_SOURCE}}{8} +-\entry {\code {_Complex_I}}{538} +-\entry {\code {_FILE_OFFSET_BITS}}{9} +-\entry {\code {_GNU_SOURCE}}{10} +-\entry {\code {_IOFBF}}{290} +-\entry {\code {_IOLBF}}{291} +-\entry {\code {_IONBF}}{291} +-\entry {\code {_ISOC99_SOURCE}}{10} +-\entry {\code {_LARGEFILE_SOURCE}}{9} +-\entry {\code {_LARGEFILE64_SOURCE}}{9} +-\entry {\code {_PATH_FSTAB}}{775} +-\entry {\code {_PATH_MNTTAB}}{775} +-\entry {\code {_PATH_MOUNTED}}{775} +-\entry {\code {_PATH_UTMP}}{758} +-\entry {\code {_PATH_WTMP}}{758} +-\entry {\code {_POSIX_C_SOURCE}}{8} +-\entry {\code {_POSIX_CHOWN_RESTRICTED}}{801} +-\entry {\code {_POSIX_JOB_CONTROL}}{788} +-\entry {\code {_POSIX_NO_TRUNC}}{801} +-\entry {\code {_POSIX_SAVED_IDS}}{788} +-\entry {\code {_POSIX_SOURCE}}{8} +-\entry {\code {_POSIX_VDISABLE}}{458, 801} +-\entry {\code {_POSIX_VERSION}}{789} +-\entry {\code {_POSIX2_C_DEV}}{789} +-\entry {\code {_POSIX2_C_VERSION}}{790} +-\entry {\code {_POSIX2_FORT_DEV}}{789} +-\entry {\code {_POSIX2_FORT_RUN}}{789} +-\entry {\code {_POSIX2_LOCALEDEF}}{789} +-\entry {\code {_POSIX2_SW_DEV}}{789} +-\entry {\code {_REENTRANT}}{10} +-\entry {\code {_SC_2_C_DEV}}{794} +-\entry {\code {_SC_2_FORT_DEV}}{794} +-\entry {\code {_SC_2_FORT_RUN}}{794} +-\entry {\code {_SC_2_LOCALEDEF}}{794} +-\entry {\code {_SC_2_SW_DEV}}{794} +-\entry {\code {_SC_2_VERSION}}{795} +-\entry {\code {_SC_AIO_LISTIO_MAX}}{792} +-\entry {\code {_SC_AIO_MAX}}{792} +-\entry {\code {_SC_AIO_PRIO_DELTA_MAX}}{792} +-\entry {\code {_SC_ARG_MAX}}{790} +-\entry {\code {_SC_ASYNCHRONOUS_IO}}{791} +-\entry {\code {_SC_ATEXIT_MAX}}{795} +-\entry {\code {_SC_AVPHYS_PAGES}}{599, 795} +-\entry {\code {_SC_BC_BASE_MAX}}{794} +-\entry {\code {_SC_BC_DIM_MAX}}{794} +-\entry {\code {_SC_BC_SCALE_MAX}}{794} +-\entry {\code {_SC_BC_STRING_MAX}}{794} +-\entry {\code {_SC_CHAR_BIT}}{796} +-\entry {\code {_SC_CHAR_MAX}}{796} +-\entry {\code {_SC_CHAR_MIN}}{796} +-\entry {\code {_SC_CHARCLASS_NAME_MAX}}{791} +-\entry {\code {_SC_CHILD_MAX}}{790} +-\entry {\code {_SC_CLK_TCK}}{791} +-\entry {\code {_SC_COLL_WEIGHTS_MAX}}{794} +-\entry {\code {_SC_DELAYTIMER_MAX}}{792} +-\entry {\code {_SC_EQUIV_CLASS_MAX}}{795} +-\entry {\code {_SC_EXPR_NEST_MAX}}{794} +-\entry {\code {_SC_FSYNC}}{791} +-\entry {\code {_SC_GETGR_R_SIZE_MAX}}{793} +-\entry {\code {_SC_GETPW_R_SIZE_MAX}}{793} +-\entry {\code {_SC_INT_MAX}}{796} +-\entry {\code {_SC_INT_MIN}}{796} +-\entry {\code {_SC_JOB_CONTROL}}{791} +-\entry {\code {_SC_LINE_MAX}}{794} +-\entry {\code {_SC_LOGIN_NAME_MAX}}{793} +-\entry {\code {_SC_LONG_BIT}}{796} +-\entry {\code {_SC_MAPPED_FILES}}{791} +-\entry {\code {_SC_MB_LEN_MAX}}{796} +-\entry {\code {_SC_MEMLOCK}}{791} +-\entry {\code {_SC_MEMLOCK_RANGE}}{791} +-\entry {\code {_SC_MEMORY_PROTECTION}}{791} +-\entry {\code {_SC_MESSAGE_PASSING}}{791} +-\entry {\code {_SC_MQ_OPEN_MAX}}{792} +-\entry {\code {_SC_MQ_PRIO_MAX}}{792} +-\entry {\code {_SC_NGROUPS_MAX}}{790} +-\entry {\code {_SC_NL_ARGMAX}}{797} +-\entry {\code {_SC_NL_LANGMAX}}{797} +-\entry {\code {_SC_NL_MSGMAX}}{797} +-\entry {\code {_SC_NL_NMAX}}{797} +-\entry {\code {_SC_NL_SETMAX}}{797} +-\entry {\code {_SC_NL_TEXTMAX}}{797} +-\entry {\code {_SC_NPROCESSORS_CONF}}{600, 795} +-\entry {\code {_SC_NPROCESSORS_ONLN}}{600, 795} +-\entry {\code {_SC_NZERO}}{796} +-\entry {\code {_SC_OPEN_MAX}}{790} +-\entry {\code {_SC_PAGESIZE}}{317, 599, 795} +-\entry {\code {_SC_PHYS_PAGES}}{599, 795} +-\entry {\code {_SC_PII}}{792} +-\entry {\code {_SC_PII_INTERNET}}{792} +-\entry {\code {_SC_PII_INTERNET_DGRAM}}{793} +-\entry {\code {_SC_PII_INTERNET_STREAM}}{793} +-\entry {\code {_SC_PII_OSI}}{792} +-\entry {\code {_SC_PII_OSI_CLTS}}{793} +-\entry {\code {_SC_PII_OSI_COTS}}{793} +-\entry {\code {_SC_PII_OSI_M}}{793} +-\entry {\code {_SC_PII_SOCKET}}{792} +-\entry {\code {_SC_PII_XTI}}{792} +-\entry {\code {_SC_PRIORITIZED_IO}}{791} +-\entry {\code {_SC_PRIORITY_SCHEDULING}}{791} +-\entry {\code {_SC_REALTIME_SIGNALS}}{791} +-\entry {\code {_SC_RTSIG_MAX}}{792} +-\entry {\code {_SC_SAVED_IDS}}{791} +-\entry {\code {_SC_SCHAR_MAX}}{796} +-\entry {\code {_SC_SCHAR_MIN}}{796} +-\entry {\code {_SC_SELECT}}{792} +-\entry {\code {_SC_SEM_NSEMS_MAX}}{792} +-\entry {\code {_SC_SEM_VALUE_MAX}}{792} +-\entry {\code {_SC_SEMAPHORES}}{791} +-\entry {\code {_SC_SHARED_MEMORY_OBJECTS}}{792} +-\entry {\code {_SC_SHRT_MAX}}{797} +-\entry {\code {_SC_SHRT_MIN}}{797} +-\entry {\code {_SC_SIGQUEUE_MAX}}{792} +-\entry {\code {_SC_STREAM_MAX}}{790} +-\entry {\code {_SC_SYNCHRONIZED_IO}}{791} +-\entry {\code {_SC_T_IOV_MAX}}{793} +-\entry {\code {_SC_THREAD_ATTR_STACKADDR}}{793} +-\entry {\code {_SC_THREAD_ATTR_STACKSIZE}}{793} +-\entry {\code {_SC_THREAD_DESTRUCTOR_ITERATIONS}}{793} +-\entry {\code {_SC_THREAD_KEYS_MAX}}{793} +-\entry {\code {_SC_THREAD_PRIO_INHERIT}}{794} +-\entry {\code {_SC_THREAD_PRIO_PROTECT}}{794} +-\entry {\code {_SC_THREAD_PRIORITY_SCHEDULING}}{794} +-\entry {\code {_SC_THREAD_PROCESS_SHARED}}{794} +-\entry {\code {_SC_THREAD_SAFE_FUNCTIONS}}{793} +-\entry {\code {_SC_THREAD_STACK_MIN}}{793} +-\entry {\code {_SC_THREAD_THREADS_MAX}}{793} +-\entry {\code {_SC_THREADS}}{793} +-\entry {\code {_SC_TIMER_MAX}}{792} +-\entry {\code {_SC_TIMERS}}{791} +-\entry {\code {_SC_TTY_NAME_MAX}}{793} +-\entry {\code {_SC_TZNAME_MAX}}{790} +-\entry {\code {_SC_UCHAR_MAX}}{797} +-\entry {\code {_SC_UINT_MAX}}{797} +-\entry {\code {_SC_UIO_MAXIOV}}{792} +-\entry {\code {_SC_ULONG_MAX}}{797} +-\entry {\code {_SC_USHRT_MAX}}{797} +-\entry {\code {_SC_VERSION}}{791, 795} +-\entry {\code {_SC_WORD_BIT}}{796} +-\entry {\code {_SC_XOPEN_CRYPT}}{795} +-\entry {\code {_SC_XOPEN_ENH_I18N}}{795} +-\entry {\code {_SC_XOPEN_LEGACY}}{795} +-\entry {\code {_SC_XOPEN_REALTIME}}{795} +-\entry {\code {_SC_XOPEN_REALTIME_THREADS}}{795} +-\entry {\code {_SC_XOPEN_SHM}}{796} +-\entry {\code {_SC_XOPEN_UNIX}}{795} +-\entry {\code {_SC_XOPEN_VERSION}}{795} +-\entry {\code {_SC_XOPEN_XCU_VERSION}}{795} +-\entry {\code {_SC_XOPEN_XPG2}}{796} +-\entry {\code {_SC_XOPEN_XPG3}}{796} +-\entry {\code {_SC_XOPEN_XPG4}}{796} +-\entry {\code {_SVID_SOURCE}}{8} +-\entry {\code {_THREAD_SAFE}}{10} +-\entry {\code {_XOPEN_SOURCE}}{8} +-\entry {\code {_XOPEN_SOURCE_EXTENDED}}{9} +-\initial {A} +-\entry {\code {ABDAY_1}}{162} +-\entry {\code {ABDAY_2}}{162} +-\entry {\code {ABDAY_3}}{162} +-\entry {\code {ABDAY_4}}{162} +-\entry {\code {ABDAY_5}}{162} +-\entry {\code {ABDAY_6}}{162} +-\entry {\code {ABDAY_7}}{162} +-\entry {\code {ABMON_1}}{162} +-\entry {\code {ABMON_10}}{162} +-\entry {\code {ABMON_11}}{162} +-\entry {\code {ABMON_12}}{162} +-\entry {\code {ABMON_2}}{162} +-\entry {\code {ABMON_3}}{162} +-\entry {\code {ABMON_4}}{162} +-\entry {\code {ABMON_5}}{162} +-\entry {\code {ABMON_6}}{162} +-\entry {\code {ABMON_7}}{162} +-\entry {\code {ABMON_8}}{162} +-\entry {\code {ABMON_9}}{162} +-\entry {\code {ACCOUNTING}}{755} +-\entry {\code {AF_FILE}}{402} +-\entry {\code {AF_INET}}{402} +-\entry {\code {AF_LOCAL}}{402} +-\entry {\code {AF_UNIX}}{402} +-\entry {\code {AF_UNSPEC}}{402} +-\entry {\code {aliases}}{733} +-\entry {\code {ALT_DIGITS}}{164} +-\entry {\code {ALTWERASE}}{456} +-\entry {\code {AM_STR}}{163} +-\entry {\code {ARG_MAX}}{787} +-\entry {\code {argp_err_exit_status}}{667} +-\entry {\code {ARGP_ERR_UNKNOWN}}{671} +-\entry {\code {ARGP_HELP_BUG_ADDR}}{679} +-\entry {\code {ARGP_HELP_DOC}}{679} +-\entry {\code {ARGP_HELP_EXIT_ERR}}{680} +-\entry {\code {ARGP_HELP_EXIT_OK}}{680} +-\entry {\code {ARGP_HELP_LONG}}{679} +-\entry {\code {ARGP_HELP_LONG_ONLY}}{680} +-\entry {\code {ARGP_HELP_POST_DOC}}{679} +-\entry {\code {ARGP_HELP_PRE_DOC}}{679} +-\entry {\code {ARGP_HELP_SEE}}{679} +-\entry {\code {ARGP_HELP_SHORT_USAGE}}{679} +-\entry {\code {ARGP_HELP_STD_ERR}}{680} +-\entry {\code {ARGP_HELP_STD_HELP}}{680} +-\entry {\code {ARGP_HELP_STD_USAGE}}{680} +-\entry {\code {ARGP_HELP_USAGE}}{679} +-\entry {\code {ARGP_IN_ORDER}}{677} +-\entry {\code {ARGP_KEY_ARG}}{672} +-\entry {\code {ARGP_KEY_ARGS}}{672} +-\entry {\code {ARGP_KEY_END}}{672} +-\entry {\code {ARGP_KEY_ERROR}}{673} +-\entry {\code {ARGP_KEY_FINI}}{673} +-\entry {\code {ARGP_KEY_HELP_ARGS_DOC}}{678} +-\entry {\code {ARGP_KEY_HELP_DUP_ARGS_NOTE}}{678} +-\entry {\code {ARGP_KEY_HELP_EXTRA}}{678} +-\entry {\code {ARGP_KEY_HELP_HEADER}}{678} +-\entry {\code {ARGP_KEY_HELP_POST_DOC}}{678} +-\entry {\code {ARGP_KEY_HELP_PRE_DOC}}{678} +-\entry {\code {ARGP_KEY_INIT}}{672} +-\entry {\code {ARGP_KEY_NO_ARGS}}{672} +-\entry {\code {ARGP_KEY_SUCCESS}}{673} +-\entry {\code {ARGP_LONG_ONLY}}{677} +-\entry {\code {ARGP_NO_ARGS}}{677} +-\entry {\code {ARGP_NO_ERRS}}{677} +-\entry {\code {ARGP_NO_EXIT}}{677} +-\entry {\code {ARGP_NO_HELP}}{677} +-\entry {\code {ARGP_PARSE_ARGV0}}{677} +-\entry {\code {argp_program_bug_address}}{667} +-\entry {\code {argp_program_version}}{667} +-\entry {\code {argp_program_version_hook}}{667} +-\entry {\code {ARGP_SILENT}}{677} +-\initial {B} +-\entry {\code {B0}}{458} +-\entry {\code {B110}}{458} +-\entry {\code {B115200}}{458} +-\entry {\code {B1200}}{458} +-\entry {\code {B134}}{458} +-\entry {\code {B150}}{458} +-\entry {\code {B1800}}{458} +-\entry {\code {B19200}}{458} +-\entry {\code {B200}}{458} +-\entry {\code {B230400}}{458} +-\entry {\code {B2400}}{458} +-\entry {\code {B300}}{458} +-\entry {\code {B38400}}{458} +-\entry {\code {B460800}}{458} +-\entry {\code {B4800}}{458} +-\entry {\code {B50}}{458} +-\entry {\code {B57600}}{458} +-\entry {\code {B600}}{458} +-\entry {\code {B75}}{458} +-\entry {\code {B9600}}{458} +-\entry {\code {BC_BASE_MAX}}{804} +-\entry {\code {BC_DIM_MAX}}{804} +-\entry {\code {BC_SCALE_MAX}}{804} +-\entry {\code {BC_STRING_MAX}}{804} +-\entry {\code {BOOT_TIME}}{755, 759} +-\entry {\code {BRKINT}}{451} +-\entry {\code {BUFSIZ}}{291} +-\initial {C} +-\entry {\code {CCTS_OFLOW}}{454} +-\entry {\code {CHAR_MAX}}{850} +-\entry {\code {CHAR_MIN}}{850} +-\entry {\code {CHILD_MAX}}{787} +-\entry {\code {CIGNORE}}{454} +-\entry {\code {CLK_TCK}}{552} +-\entry {\code {CLOCAL}}{453} +-\entry {\code {CLOCKS_PER_SEC}}{552} +-\entry {\code {CODESET}}{162} +-\entry {\code {COLL_WEIGHTS_MAX}}{804} +-\entry {\code {COREFILE}}{614} +-\entry {\code {CREAD}}{453} +-\entry {\code {CRNCYSTR}}{164} +-\entry {\code {CRTS_IFLOW}}{454} +-\entry {\code {CS5}}{454} +-\entry {\code {CS6}}{454} +-\entry {\code {CS7}}{454} +-\entry {\code {CS8}}{454} +-\entry {\code {CSIZE}}{454} +-\entry {\code {CSTOPB}}{453} +-\entry {\code {CURRENCY_SYMBOL}}{164} +-\initial {D} +-\entry {\code {D_FMT}}{163} +-\entry {\code {D_T_FMT}}{163} +-\entry {\code {DAY_1}}{162} +-\entry {\code {DAY_2}}{162} +-\entry {\code {DAY_3}}{162} +-\entry {\code {DAY_4}}{162} +-\entry {\code {DAY_5}}{162} +-\entry {\code {DAY_6}}{162} +-\entry {\code {DAY_7}}{162} +-\entry {\code {daylight}}{577} +-\entry {\code {DBL_DIG}}{854} +-\entry {\code {DBL_EPSILON}}{856} +-\entry {\code {DBL_MANT_DIG}}{854} +-\entry {\code {DBL_MAX}}{855} +-\entry {\code {DBL_MAX_10_EXP}}{855} +-\entry {\code {DBL_MAX_EXP}}{855} +-\entry {\code {DBL_MIN}}{855} +-\entry {\code {DBL_MIN_10_EXP}}{855} +-\entry {\code {DBL_MIN_EXP}}{854} +-\entry {\code {DEAD_PROCESS}}{755, 759} +-\entry {\code {DECIMAL_POINT}}{165} +-\entry {\code {DES_DECRYPT}}{814} +-\entry {\code {DES_ENCRYPT}}{814} +-\entry {\code {DES_HW}}{814} +-\entry {\code {DES_SW}}{814} +-\entry {\code {DESERR_BADPARAM}}{814} +-\entry {\code {DESERR_HWERROR}}{814} +-\entry {\code {DESERR_NOHWDEVICE}}{814} +-\entry {\code {DESERR_NONE}}{814} +-\entry {\code {DT_BLK}}{354} +-\entry {\code {DT_CHR}}{354} +-\entry {\code {DT_DIR}}{354} +-\entry {\code {DT_FIFO}}{354} +-\entry {\code {DT_REG}}{353} +-\entry {\code {DT_SOCK}}{354} +-\entry {\code {DT_UNKNOWN}}{353} +-\initial {E} +-\entry {\code {E2BIG}}{17} +-\entry {\code {EACCES}}{17} +-\entry {\code {EADDRINUSE}}{20} +-\entry {\code {EADDRNOTAVAIL}}{21} +-\entry {\code {EADV}}{25} +-\entry {\code {EAFNOSUPPORT}}{20} +-\entry {\code {EAGAIN}}{19} +-\entry {\code {EALREADY}}{20} +-\entry {\code {EAUTH}}{23} +-\entry {\code {EBACKGROUND}}{23} +-\entry {\code {EBADE}}{25} +-\entry {\code {EBADF}}{17, 466} +-\entry {\code {EBADFD}}{25} +-\entry {\code {EBADMSG}}{24} +-\entry {\code {EBADR}}{25} +-\entry {\code {EBADRPC}}{22} +-\entry {\code {EBADRQC}}{25} +-\entry {\code {EBADSLT}}{25} +-\entry {\code {EBFONT}}{25} +-\entry {\code {EBUSY}}{17} +-\entry {\code {ECANCELED}}{24} +-\entry {\code {ECHILD}}{17} +-\entry {\code {ECHO}}{455} +-\entry {\code {ECHOCTL}}{455} +-\entry {\code {ECHOE}}{455} +-\entry {\code {ECHOK}}{455} +-\entry {\code {ECHOKE}}{455} +-\entry {\code {ECHONL}}{455} +-\entry {\code {ECHOPRT}}{455} +-\entry {\code {ECHRNG}}{24} +-\entry {\code {ECOMM}}{25} +-\entry {\code {ECONNABORTED}}{21} +-\entry {\code {ECONNREFUSED}}{22} +-\entry {\code {ECONNRESET}}{21} +-\entry {\code {ED}}{24} +-\entry {\code {EDEADLK}}{17} +-\entry {\code {EDEADLOCK}}{25} +-\entry {\code {EDESTADDRREQ}}{21} +-\entry {\code {EDIED}}{24} +-\entry {\code {EDOM}}{19} +-\entry {\code {EDOTDOT}}{25} +-\entry {\code {EDQUOT}}{22} +-\entry {\code {EEXIST}}{17} +-\entry {\code {EFAULT}}{17} +-\entry {\code {EFBIG}}{18} +-\entry {\code {EFTYPE}}{23} +-\entry {\code {EGRATUITOUS}}{24} +-\entry {\code {EGREGIOUS}}{24} +-\entry {\code {EHOSTDOWN}}{22} +-\entry {\code {EHOSTUNREACH}}{22} +-\entry {\code {EIDRM}}{24} +-\entry {\code {EIEIO}}{24} +-\entry {\code {EILSEQ}}{23} +-\entry {\code {EINPROGRESS}}{20} +-\entry {\code {EINTR}}{16} +-\entry {\code {EINVAL}}{18, 466} +-\entry {\code {EIO}}{16} +-\entry {\code {EISCONN}}{21} +-\entry {\code {EISDIR}}{18} +-\entry {\code {EISNAM}}{25} +-\entry {\code {EL2HLT}}{25} +-\entry {\code {EL2NSYNC}}{24} +-\entry {\code {EL3HLT}}{24} +-\entry {\code {EL3RST}}{24} +-\entry {\code {ELIBACC}}{25} +-\entry {\code {ELIBBAD}}{25} +-\entry {\code {ELIBEXEC}}{25} +-\entry {\code {ELIBMAX}}{25} +-\entry {\code {ELIBSCN}}{25} +-\entry {\code {ELNRNG}}{25} +-\entry {\code {ELOOP}}{22} +-\entry {\code {EMEDIUMTYPE}}{25} +-\entry {\code {EMFILE}}{18} +-\entry {\code {EMLINK}}{19} +-\entry {\code {EMPTY}}{755, 759} +-\entry {\code {EMSGSIZE}}{20} +-\entry {\code {EMULTIHOP}}{24} +-\entry {\code {ENAMETOOLONG}}{22} +-\entry {\code {ENAVAIL}}{25} +-\entry {\code {ENEEDAUTH}}{23} +-\entry {\code {ENETDOWN}}{21} +-\entry {\code {ENETRESET}}{21} +-\entry {\code {ENETUNREACH}}{21} +-\entry {\code {ENFILE}}{18} +-\entry {\code {ENOANO}}{25} +-\entry {\code {ENOBUFS}}{21} +-\entry {\code {ENOCSI}}{25} +-\entry {\code {ENODATA}}{24} +-\entry {\code {ENODEV}}{18} +-\entry {\code {ENOENT}}{16} +-\entry {\code {ENOEXEC}}{17} +-\entry {\code {ENOLCK}}{23} +-\entry {\code {ENOLINK}}{24} +-\entry {\code {ENOMEDIUM}}{25} +-\entry {\code {ENOMEM}}{17} +-\entry {\code {ENOMSG}}{24} +-\entry {\code {ENONET}}{25} +-\entry {\code {ENOPKG}}{25} +-\entry {\code {ENOPROTOOPT}}{20} +-\entry {\code {ENOSPC}}{18} +-\entry {\code {ENOSR}}{24} +-\entry {\code {ENOSTR}}{24} +-\entry {\code {ENOSYS}}{23} +-\entry {\code {ENOTBLK}}{17} +-\entry {\code {ENOTCONN}}{21} +-\entry {\code {ENOTDIR}}{18} +-\entry {\code {ENOTEMPTY}}{22} +-\entry {\code {ENOTNAM}}{25} +-\entry {\code {ENOTSOCK}}{20} +-\entry {\code {ENOTSUP}}{23} +-\entry {\code {ENOTTY}}{18, 466} +-\entry {\code {ENOTUNIQ}}{25} +-\entry {\code {environ}}{693} +-\entry {\code {ENXIO}}{17} +-\entry {\code {EOF}}{281} +-\entry {\code {EOPNOTSUPP}}{20} +-\entry {\code {EOVERFLOW}}{24} +-\entry {\code {EPERM}}{16} +-\entry {\code {EPFNOSUPPORT}}{20} +-\entry {\code {EPIPE}}{19} +-\entry {\code {EPROCLIM}}{22} +-\entry {\code {EPROCUNAVAIL}}{23} +-\entry {\code {EPROGMISMATCH}}{23} +-\entry {\code {EPROGUNAVAIL}}{22} +-\entry {\code {EPROTO}}{24} +-\entry {\code {EPROTONOSUPPORT}}{20} +-\entry {\code {EPROTOTYPE}}{20} +-\entry {\code {EQUIV_CLASS_MAX}}{804} +-\entry {\code {ERA}}{163} +-\entry {\code {ERA_D_FMT}}{164} +-\entry {\code {ERA_D_T_FMT}}{163} +-\entry {\code {ERA_T_FMT}}{164} +-\entry {\code {ERA_YEAR}}{163} +-\entry {\code {ERANGE}}{19} +-\entry {\code {EREMCHG}}{25} +-\entry {\code {EREMOTE}}{22} +-\entry {\code {EREMOTEIO}}{25} +-\entry {\code {ERESTART}}{24} +-\entry {\code {EROFS}}{19} +-\entry {\code {ERPCMISMATCH}}{22} +-\entry {\code {errno}}{15} +-\entry {\code {error_message_count}}{29} +-\entry {\code {error_one_per_line}}{29} +-\entry {\code {error_print_progname}}{29} +-\entry {\code {ESHUTDOWN}}{21} +-\entry {\code {ESOCKTNOSUPPORT}}{20} +-\entry {\code {ESPIPE}}{18} +-\entry {\code {ESRCH}}{16} +-\entry {\code {ESRMNT}}{25} +-\entry {\code {ESTALE}}{22} +-\entry {\code {ESTRPIPE}}{25} +-\entry {\code {ethers}}{733} +-\entry {\code {ETIME}}{24} +-\entry {\code {ETIMEDOUT}}{21} +-\entry {\code {ETOOMANYREFS}}{21} +-\entry {\code {ETXTBSY}}{18} +-\entry {\code {EUCLEAN}}{25} +-\entry {\code {EUNATCH}}{25} +-\entry {\code {EUSERS}}{22} +-\entry {\code {EWOULDBLOCK}}{19} +-\entry {\code {EXDEV}}{18} +-\entry {\code {EXFULL}}{25} +-\entry {\code {EXIT_FAILURE}}{698} +-\entry {\code {EXIT_SUCCESS}}{697} +-\entry {\code {EXPR_NEST_MAX}}{804} +-\entry {\code {EXTA}}{458} +-\entry {\code {EXTB}}{458} +-\initial {F} +-\entry {\code {F_DUPFD}}{338} +-\entry {\code {F_GETFD}}{339} +-\entry {\code {F_GETFL}}{344} +-\entry {\code {F_GETLK}}{346} +-\entry {\code {F_GETOWN}}{348} +-\entry {\code {F_OK}}{383} +-\entry {\code {F_RDLCK}}{348} +-\entry {\code {F_SETFD}}{339} +-\entry {\code {F_SETFL}}{344} +-\entry {\code {F_SETLK}}{347} +-\entry {\code {F_SETLKW}}{347} +-\entry {\code {F_SETOWN}}{349} +-\entry {\code {F_UNLCK}}{348} +-\entry {\code {F_WRLCK}}{348} +-\entry {\code {FD_CLOEXEC}}{339} +-\entry {\code {FD_SETSIZE}}{321} +-\entry {\code {FE_DFL_ENV}}{529} +-\entry {\code {FE_DIVBYZERO}}{525} +-\entry {\code {FE_DOWNWARD}}{528} +-\entry {\code {FE_INEXACT}}{525} +-\entry {\code {FE_INVALID}}{525} +-\entry {\code {FE_NOMASK_ENV}}{529} +-\entry {\code {FE_OVERFLOW}}{525} +-\entry {\code {FE_TONEAREST}}{528} +-\entry {\code {FE_TOWARDZERO}}{528} +-\entry {\code {FE_UNDERFLOW}}{525} +-\entry {\code {FE_UPWARD}}{528} +-\entry {\code {FILENAME_MAX}}{800} +-\entry {\code {FLT_DIG}}{854} +-\entry {\code {FLT_EPSILON}}{856} +-\entry {\code {FLT_MANT_DIG}}{854} +-\entry {\code {FLT_MAX}}{855} +-\entry {\code {FLT_MAX_10_EXP}}{855} +-\entry {\code {FLT_MAX_EXP}}{855} +-\entry {\code {FLT_MIN}}{855} +-\entry {\code {FLT_MIN_10_EXP}}{855} +-\entry {\code {FLT_MIN_EXP}}{854} +-\entry {\code {FLT_RADIX}}{854} +-\entry {\code {FLT_ROUNDS}}{853} +-\entry {\code {FLUSHO}}{456} +-\entry {\code {FOPEN_MAX}}{234} +-\entry {\code {FP_FAST_FMA}}{538} +-\entry {\code {FP_ILOGB0}}{484} +-\entry {\code {FP_ILOGBNAN}}{484} +-\entry {\code {FP_INFINITE}}{521} +-\entry {\code {FP_NAN}}{521} +-\entry {\code {FP_NORMAL}}{521} +-\entry {\code {FP_SUBNORMAL}}{521} +-\entry {\code {FP_ZERO}}{521} +-\entry {\code {FPE_DECOVF_TRAP}}{615} +-\entry {\code {FPE_FLTDIV_TRAP}}{615} +-\entry {\code {FPE_FLTOVF_TRAP}}{615} +-\entry {\code {FPE_FLTUND_TRAP}}{615} +-\entry {\code {FPE_INTDIV_TRAP}}{614} +-\entry {\code {FPE_INTOVF_TRAP}}{614} +-\entry {\code {FPE_SUBRNG_TRAP}}{615} +-\entry {\code {FRAC_DIGITS}}{164} +-\entry {\code {FSETLOCKING_BYCALLER}}{239} +-\entry {\code {FSETLOCKING_INTERNAL}}{239} +-\entry {\code {FSETLOCKING_QUERY}}{239} +-\entry {\code {FSTAB}}{775} +-\entry {\code {FSTAB_RO}}{776} +-\entry {\code {FSTAB_RQ}}{776} +-\entry {\code {FSTAB_RW}}{776} +-\entry {\code {FSTAB_SW}}{776} +-\entry {\code {FSTAB_XX}}{776} +-\entry {\code {FTW_CHDIR}}{363} +-\entry {\code {FTW_D}}{360} +-\entry {\code {FTW_DEPTH}}{363} +-\entry {\code {FTW_DNR}}{360} +-\entry {\code {FTW_DP}}{361} +-\entry {\code {FTW_F}}{360} +-\entry {\code {FTW_MOUNT}}{363} +-\entry {\code {FTW_NS}}{360} +-\entry {\code {FTW_PHYS}}{363} +-\entry {\code {FTW_SL}}{360} +-\entry {\code {FTW_SLN}}{361} +-\initial {G} +-\entry {\code {getdate_err}}{572} +-\entry {\code {GLOB_ABORTED}}{209} +-\entry {\code {GLOB_ALTDIRFUNC}}{211} +-\entry {\code {GLOB_APPEND}}{210} +-\entry {\code {GLOB_BRACE}}{211} +-\entry {\code {GLOB_DOOFFS}}{210} +-\entry {\code {GLOB_ERR}}{210} +-\entry {\code {GLOB_MAGCHAR}}{211} +-\entry {\code {GLOB_MARK}}{210} +-\entry {\code {GLOB_NOCHECK}}{211} +-\entry {\code {GLOB_NOESCAPE}}{211} +-\entry {\code {GLOB_NOMAGIC}}{212} +-\entry {\code {GLOB_NOMATCH}}{209} +-\entry {\code {GLOB_NOSORT}}{211} +-\entry {\code {GLOB_NOSPACE}}{209} +-\entry {\code {GLOB_ONLYDIR}}{212} +-\entry {\code {GLOB_PERIOD}}{211} +-\entry {\code {GLOB_TILDE}}{212} +-\entry {\code {GLOB_TILDE_CHECK}}{212} +-\entry {\code {group}}{733} +-\entry {\code {GROUPING}}{166} +-\initial {H} +-\entry {\code {h_errno}}{414} +-\entry {\code {HOST_NOT_FOUND}}{414} +-\entry {\code {hosts}}{733} +-\entry {\code {HUGE_VAL}}{527} +-\entry {\code {HUGE_VALF}}{527} +-\entry {\code {HUGE_VALL}}{527} +-\entry {\code {HUPCL}}{453} +-\initial {I} +-\entry {\code {I}}{538} +-\entry {\code {ICANON}}{454} +-\entry {\code {ICRNL}}{451} +-\entry {\code {IEXTEN}}{456} +-\entry {\code {IFNAMSIZ}}{404} +-\entry {\code {IGNBRK}}{451} +-\entry {\code {IGNCR}}{451} +-\entry {\code {IGNPAR}}{451} +-\entry {\code {IMAXBEL}}{452} +-\entry {\code {in6addr_any}}{411} +-\entry {\code {in6addr_loopback}}{411} +-\entry {\code {INADDR_ANY}}{411} +-\entry {\code {INADDR_BROADCAST}}{411} +-\entry {\code {INADDR_LOOPBACK}}{411} +-\entry {\code {INADDR_NONE}}{411} +-\entry {\code {INFINITY}}{524} +-\entry {\code {INIT_PROCESS}}{755, 759} +-\entry {\code {INLCR}}{451} +-\entry {\code {INPCK}}{450} +-\entry {\code {INT_CURR_SYMBOL}}{164} +-\entry {\code {INT_FRAC_DIGITS}}{164} +-\entry {\code {INT_MAX}}{851} +-\entry {\code {INT_MIN}}{851} +-\entry {\code {INT_N_CS_PRECEDES}}{165} +-\entry {\code {INT_N_SEP_BY_SPACE}}{165} +-\entry {\code {INT_N_SIGN_POSN}}{165} +-\entry {\code {INT_P_CS_PRECEDES}}{165} +-\entry {\code {INT_P_SEP_BY_SPACE}}{165} +-\entry {\code {INT_P_SIGN_POSN}}{165} +-\entry {\code {IPPORT_RESERVED}}{417} +-\entry {\code {IPPORT_USERRESERVED}}{417} +-\entry {\code {ISIG}}{455} +-\entry {\code {ISTRIP}}{451} +-\entry {\code {ITIMER_PROF}}{579} +-\entry {\code {ITIMER_REAL}}{579} +-\entry {\code {ITIMER_VIRTUAL}}{579} +-\entry {\code {IXANY}}{452} +-\entry {\code {IXOFF}}{451} +-\entry {\code {IXON}}{452} +-\initial {L} +-\entry {\code {L_ctermid}}{728} +-\entry {\code {L_cuserid}}{753} +-\entry {\code {L_INCR}}{286} +-\entry {\code {L_SET}}{286} +-\entry {\code {L_tmpnam}}{389} +-\entry {\code {L_XTND}}{286} +-\entry {\code {LANG}}{155} +-\entry {\code {LANGUAGE}}{155} +-\entry {\code {LC_ALL}}{155} +-\entry {\code {LC_COLLATE}}{154} +-\entry {\code {LC_CTYPE}}{154} +-\entry {\code {LC_MESSAGES}}{154} +-\entry {\code {LC_MONETARY}}{154} +-\entry {\code {LC_NUMERIC}}{154} +-\entry {\code {LC_TIME}}{154} +-\entry {\code {LDBL_DIG}}{854} +-\entry {\code {LDBL_EPSILON}}{856} +-\entry {\code {LDBL_MANT_DIG}}{854} +-\entry {\code {LDBL_MAX}}{855} +-\entry {\code {LDBL_MAX_10_EXP}}{855} +-\entry {\code {LDBL_MAX_EXP}}{855} +-\entry {\code {LDBL_MIN}}{855} +-\entry {\code {LDBL_MIN_10_EXP}}{855} +-\entry {\code {LDBL_MIN_EXP}}{855} +-\entry {\code {LINE_MAX}}{804} +-\entry {\code {LINK_MAX}}{799} +-\entry {\code {LIO_NOP}}{326} +-\entry {\code {LIO_READ}}{326} +-\entry {\code {LIO_WRITE}}{326} +-\entry {\code {LOG_ALERT}}{475} +-\entry {\code {LOG_AUTH}}{474} +-\entry {\code {LOG_AUTHPRIV}}{475} +-\entry {\code {LOG_CRIT}}{475} +-\entry {\code {LOG_CRON}}{475} +-\entry {\code {LOG_DAEMON}}{474} +-\entry {\code {LOG_DEBUG}}{476} +-\entry {\code {LOG_EMERG}}{475} +-\entry {\code {LOG_ERR}}{475} +-\entry {\code {LOG_FTP}}{475} +-\entry {\code {LOG_INFO}}{476} +-\entry {\code {LOG_LOCAL0}}{475} +-\entry {\code {LOG_LOCAL1}}{475} +-\entry {\code {LOG_LOCAL2}}{475} +-\entry {\code {LOG_LOCAL3}}{475} +-\entry {\code {LOG_LOCAL4}}{475} +-\entry {\code {LOG_LOCAL5}}{475} +-\entry {\code {LOG_LOCAL6}}{475} +-\entry {\code {LOG_LOCAL7}}{475} +-\entry {\code {LOG_LPR}}{474} +-\entry {\code {LOG_MAIL}}{474} +-\entry {\code {LOG_NEWS}}{474} +-\entry {\code {LOG_NOTICE}}{476} +-\entry {\code {LOG_SYSLOG}}{474} +-\entry {\code {LOG_USER}}{474} +-\entry {\code {LOG_UUCP}}{475} +-\entry {\code {LOG_WARNING}}{475} +-\entry {\code {LOGIN_PROCESS}}{755, 759} +-\entry {\code {LONG_LONG_MAX}}{851} +-\entry {\code {LONG_LONG_MIN}}{851} +-\entry {\code {LONG_MAX}}{851} +-\entry {\code {LONG_MIN}}{851} +-\initial {M} +-\entry {\code {M_1_PI}}{479} +-\entry {\code {M_2_PI}}{479} +-\entry {\code {M_2_SQRTPI}}{479} +-\entry {\code {M_E}}{479} +-\entry {\code {M_LN10}}{479} +-\entry {\code {M_LN2}}{479} +-\entry {\code {M_LOG10E}}{479} +-\entry {\code {M_LOG2E}}{479} +-\entry {\code {M_PI}}{479} +-\entry {\code {M_PI_2}}{479} +-\entry {\code {M_PI_4}}{479} +-\entry {\code {M_SQRT1_2}}{479} +-\entry {\code {M_SQRT2}}{479} +-\entry {\code {MAP_ANON}}{318} +-\entry {\code {MAP_ANONYMOUS}}{318} +-\entry {\code {MAP_FIXED}}{318} +-\entry {\code {MAP_PRIVATE}}{317} +-\entry {\code {MAP_SHARED}}{317} +-\entry {\code {MAX_CANON}}{800} +-\entry {\code {MAX_INPUT}}{800} +-\entry {\code {MAXNAMLEN}}{800} +-\entry {\code {MAXSYMLINKS}}{365} +-\entry {\code {MB_CUR_MAX}}{116} +-\entry {\code {MB_LEN_MAX}}{116} +-\entry {\code {MDMBUF}}{454} +-\entry {\code {MINSIGSTKSZ}}{652} +-\entry {\code {MM_APPL}}{297} +-\entry {\code {MM_CONSOLE}}{297} +-\entry {\code {MM_ERROR}}{298} +-\entry {\code {MM_FIRM}}{297} +-\entry {\code {MM_HALT}}{298} +-\entry {\code {MM_HARD}}{297} +-\entry {\code {MM_INFO}}{299} +-\entry {\code {MM_NOSEV}}{298} +-\entry {\code {MM_NRECOV}}{298} +-\entry {\code {MM_NULLACT}}{298} +-\entry {\code {MM_NULLLBL}}{298} +-\entry {\code {MM_NULLMC}}{298} +-\entry {\code {MM_NULLSEV}}{298} +-\entry {\code {MM_NULLTAG}}{298} +-\entry {\code {MM_NULLTXT}}{298} +-\entry {\code {MM_OPSYS}}{297} +-\entry {\code {MM_PRINT}}{297} +-\entry {\code {MM_RECOVER}}{298} +-\entry {\code {MM_SOFT}}{297} +-\entry {\code {MM_UTIL}}{297} +-\entry {\code {MM_WARNING}}{298} +-\entry {\code {MNTOPT_DEFAULTS}}{778} +-\entry {\code {MNTOPT_NOAUTO}}{779} +-\entry {\code {MNTOPT_NOSUID}}{778} +-\entry {\code {MNTOPT_RO}}{778} +-\entry {\code {MNTOPT_RW}}{778} +-\entry {\code {MNTOPT_SUID}}{778} +-\entry {\code {MNTTAB}}{775} +-\entry {\code {MNTTYPE_IGNORE}}{778} +-\entry {\code {MNTTYPE_NFS}}{778} +-\entry {\code {MNTTYPE_SWAP}}{778} +-\entry {\code {MON_1}}{162} +-\entry {\code {MON_10}}{163} +-\entry {\code {MON_11}}{163} +-\entry {\code {MON_12}}{163} +-\entry {\code {MON_2}}{163} +-\entry {\code {MON_3}}{163} +-\entry {\code {MON_4}}{163} +-\entry {\code {MON_5}}{163} +-\entry {\code {MON_6}}{163} +-\entry {\code {MON_7}}{163} +-\entry {\code {MON_8}}{163} +-\entry {\code {MON_9}}{163} +-\entry {\code {MON_DECIMAL_POINT}}{164} +-\entry {\code {MON_GROUPING}}{164} +-\entry {\code {MON_THOUSANDS_SEP}}{164} +-\entry {\code {MOUNTED}}{775} +-\entry {\code {MS_ASYNC}}{319} +-\entry {\code {MS_SYNC}}{319} +-\entry {\code {MSG_DONTROUTE}}{429} +-\entry {\code {MSG_OOB}}{429} +-\entry {\code {MSG_PEEK}}{429} +-\initial {N} +-\entry {\code {N_CS_PRECEDES}}{165} +-\entry {\code {N_SEP_BY_SPACE}}{165} +-\entry {\code {N_SIGN_POSN}}{165} +-\entry {\code {NAME_MAX}}{800} +-\entry {\code {NAN}}{524} +-\entry {\code {NCCS}}{448} +-\entry {\code {NDEBUG}}{841} +-\entry {\code {NEGATIVE_SIGN}}{164} +-\entry {\code {netgroup}}{733} +-\entry {\code {networks}}{733} +-\entry {\code {NEW_TIME}}{755, 759} +-\entry {\code {NGROUPS_MAX}}{788} +-\entry {\code {NL_ARGMAX}}{251} +-\entry {\code {NO_ADDRESS}}{414} +-\entry {\code {NO_RECOVERY}}{414} +-\entry {\code {NOEXPR}}{166} +-\entry {\code {NOFLSH}}{456} +-\entry {\code {NOKERNINFO}}{456} +-\entry {\code {NOSTR}}{166} +-\entry {\code {NSIG}}{613} +-\entry {\code {NSS_STATUS_NOTFOUND}}{738} +-\entry {\code {NSS_STATUS_SUCCESS}}{738} +-\entry {\code {NSS_STATUS_TRYAGAIN}}{738} +-\entry {\code {NSS_STATUS_UNAVAIL}}{738} +-\entry {\code {NULL}}{848} +-\initial {O} +-\entry {\code {O_ACCMODE}}{341} +-\entry {\code {O_APPEND}}{343} +-\entry {\code {O_ASYNC}}{344} +-\entry {\code {O_CREAT}}{342} +-\entry {\code {O_EXCL}}{342} +-\entry {\code {O_EXEC}}{341} +-\entry {\code {O_EXLOCK}}{343} +-\entry {\code {O_FSYNC}}{344} +-\entry {\code {O_IGNORE_CTTY}}{342} +-\entry {\code {O_NDELAY}}{344} +-\entry {\code {O_NOATIME}}{344} +-\entry {\code {O_NOCTTY}}{342} +-\entry {\code {O_NOLINK}}{342} +-\entry {\code {O_NONBLOCK}}{342, 343} +-\entry {\code {O_NOTRANS}}{342} +-\entry {\code {O_RDONLY}}{341} +-\entry {\code {O_RDWR}}{341} +-\entry {\code {O_READ}}{341} +-\entry {\code {O_SHLOCK}}{343} +-\entry {\code {O_SYNC}}{344} +-\entry {\code {O_TRUNC}}{343} +-\entry {\code {O_WRITE}}{341} +-\entry {\code {O_WRONLY}}{341} +-\entry {\code {obstack_alloc_failed_handler}}{51} +-\entry {\code {OLD_TIME}}{755, 759} +-\entry {\code {ONLCR}}{452} +-\entry {\code {ONOEOT}}{452} +-\entry {\code {OPEN_MAX}}{787} +-\entry {\code {OPOST}}{452} +-\entry {\code {optarg}}{659} +-\entry {\code {opterr}}{659} +-\entry {\code {optind}}{659} +-\entry {\code {OPTION_ALIAS}}{670} +-\entry {\code {OPTION_ARG_OPTIONAL}}{670} +-\entry {\code {OPTION_DOC}}{670} +-\entry {\code {OPTION_HIDDEN}}{670} +-\entry {\code {OPTION_NO_USAGE}}{670} +-\entry {\code {optopt}}{659} +-\entry {\code {OXTABS}}{452} +-\initial {P} +-\entry {\code {P_CS_PRECEDES}}{165} +-\entry {\code {P_SEP_BY_SPACE}}{165} +-\entry {\code {P_SIGN_POSN}}{165} +-\entry {\code {P_tmpdir}}{390} +-\entry {\code {PA_CHAR}}{264} +-\entry {\code {PA_DOUBLE}}{264} +-\entry {\code {PA_FLAG_LONG}}{265} +-\entry {\code {PA_FLAG_LONG_DOUBLE}}{265} +-\entry {\code {PA_FLAG_LONG_LONG}}{265} +-\entry {\code {PA_FLAG_MASK}}{264} +-\entry {\code {PA_FLAG_PTR}}{264} +-\entry {\code {PA_FLAG_SHORT}}{265} +-\entry {\code {PA_FLOAT}}{264} +-\entry {\code {PA_INT}}{264} +-\entry {\code {PA_LAST}}{264} +-\entry {\code {PA_POINTER}}{264} +-\entry {\code {PA_STRING}}{264} +-\entry {\code {PARENB}}{453} +-\entry {\code {PARMRK}}{451} +-\entry {\code {PARODD}}{453} +-\entry {\code {passwd}}{733} +-\entry {\code {PATH_MAX}}{800} +-\entry {\code {PENDIN}}{456} +-\entry {\code {PF_CCITT}}{421} +-\entry {\code {PF_FILE}}{406} +-\entry {\code {PF_IMPLINK}}{421} +-\entry {\code {PF_INET}}{407} +-\entry {\code {PF_INET6}}{407} +-\entry {\code {PF_ISO}}{421} +-\entry {\code {PF_LOCAL}}{405} +-\entry {\code {PF_NS}}{421} +-\entry {\code {PF_ROUTE}}{421} +-\entry {\code {PF_UNIX}}{406} +-\entry {\code {PI}}{480} +-\entry {\code {PIPE_BUF}}{800} +-\entry {\code {PM_STR}}{163} +-\entry {\code {POSITIVE_SIGN}}{164} +-\entry {\code {PRIO_MAX}}{596} +-\entry {\code {PRIO_MIN}}{596} +-\entry {\code {PRIO_PGRP}}{597} +-\entry {\code {PRIO_PROCESS}}{597} +-\entry {\code {PRIO_USER}}{597} +-\entry {\code {program_invocation_name}}{27} +-\entry {\code {program_invocation_short_name}}{27} +-\entry {\code {PROT_EXEC}}{317} +-\entry {\code {PROT_READ}}{317} +-\entry {\code {PROT_WRITE}}{317} +-\entry {\code {protocols}}{733} +-\entry {\code {PWD}}{352} +-\initial {R} +-\entry {\code {R_OK}}{383} +-\entry {\code {RADIXCHAR}}{165} +-\entry {\code {RAND_MAX}}{508} +-\entry {\code {RE_DUP_MAX}}{788} +-\entry {\code {RLIM_INFINITY}}{588} +-\entry {\code {RLIM_NLIMITS}}{588} +-\entry {\code {RLIMIT_AS}}{588} +-\entry {\code {RLIMIT_CORE}}{587} +-\entry {\code {RLIMIT_CPU}}{587} +-\entry {\code {RLIMIT_DATA}}{587} +-\entry {\code {RLIMIT_FSIZE}}{587} +-\entry {\code {RLIMIT_NOFILE}}{588} +-\entry {\code {RLIMIT_OFILE}}{588} +-\entry {\code {RLIMIT_RSS}}{587} +-\entry {\code {RLIMIT_STACK}}{587} +-\entry {\code {rpc}}{733} +-\entry {\code {RUN_LVL}}{755, 759} +-\initial {S} +-\entry {\code {S_IEXEC}}{379} +-\entry {\code {S_IFBLK}}{376} +-\entry {\code {S_IFCHR}}{376} +-\entry {\code {S_IFDIR}}{376} +-\entry {\code {S_IFIFO}}{376} +-\entry {\code {S_IFLNK}}{376} +-\entry {\code {S_IFMT}}{376} +-\entry {\code {S_IFREG}}{376} +-\entry {\code {S_IFSOCK}}{376} +-\entry {\code {S_IREAD}}{378} +-\entry {\code {S_IRGRP}}{379} +-\entry {\code {S_IROTH}}{379} +-\entry {\code {S_IRUSR}}{378} +-\entry {\code {S_IRWXG}}{379} +-\entry {\code {S_IRWXO}}{379} +-\entry {\code {S_IRWXU}}{379} +-\entry {\code {S_ISGID}}{379} +-\entry {\code {S_ISUID}}{379} +-\entry {\code {S_ISVTX}}{379} +-\entry {\code {S_IWGRP}}{379} +-\entry {\code {S_IWOTH}}{379} +-\entry {\code {S_IWRITE}}{379} +-\entry {\code {S_IWUSR}}{379} +-\entry {\code {S_IXGRP}}{379} +-\entry {\code {S_IXOTH}}{379} +-\entry {\code {S_IXUSR}}{379} +-\entry {\code {SA_NOCLDSTOP}}{627} +-\entry {\code {SA_ONSTACK}}{627} +-\entry {\code {SA_RESTART}}{627} +-\entry {\code {SC_SSIZE_MAX}}{796} +-\entry {\code {SCHAR_MAX}}{850} +-\entry {\code {SCHAR_MIN}}{850} +-\entry {\code {SEEK_CUR}}{286} +-\entry {\code {SEEK_END}}{286} +-\entry {\code {SEEK_SET}}{286} +-\entry {\code {SEM_VALUE_MAX}}{831} +-\entry {\code {services}}{733} +-\entry {\code {shadow}}{733} +-\entry {\code {SHRT_MAX}}{851} +-\entry {\code {SHRT_MIN}}{850} +-\entry {\code {SIG_BLOCK}}{645} +-\entry {\code {SIG_DFL}}{622} +-\entry {\code {SIG_ERR}}{624} +-\entry {\code {SIG_IGN}}{622} +-\entry {\code {SIG_SETMASK}}{645} +-\entry {\code {SIG_UNBLOCK}}{645} +-\entry {\code {SIGABRT}}{616} +-\entry {\code {SIGALRM}}{617} +-\entry {\code {SIGBUS}}{615} +-\entry {\code {SIGCHLD}}{618} +-\entry {\code {SIGCLD}}{618} +-\entry {\code {SIGCONT}}{619} +-\entry {\code {SIGEMT}}{616} +-\entry {\code {SIGFPE}}{614} +-\entry {\code {SIGHUP}}{617} +-\entry {\code {SIGILL}}{615} +-\entry {\code {SIGINFO}}{621} +-\entry {\code {SIGINT}}{616} +-\entry {\code {SIGIO}}{618} +-\entry {\code {SIGIOT}}{616} +-\entry {\code {SIGKILL}}{617} +-\entry {\code {SIGLOST}}{620} +-\entry {\code {signgam}}{488} +-\entry {\code {SIGPIPE}}{620} +-\entry {\code {SIGPOLL}}{618} +-\entry {\code {SIGPROF}}{618} +-\entry {\code {SIGQUIT}}{616} +-\entry {\code {SIGSEGV}}{615} +-\entry {\code {SIGSTKSZ}}{652} +-\entry {\code {SIGSTOP}}{619} +-\entry {\code {SIGSYS}}{616} +-\entry {\code {SIGTERM}}{616} +-\entry {\code {SIGTRAP}}{616} +-\entry {\code {SIGTSTP}}{619} +-\entry {\code {SIGTTIN}}{619} +-\entry {\code {SIGTTOU}}{619} +-\entry {\code {SIGURG}}{618} +-\entry {\code {SIGUSR1}}{621} +-\entry {\code {SIGUSR2}}{621} +-\entry {\code {SIGVTALRM}}{617} +-\entry {\code {SIGWINCH}}{621} +-\entry {\code {SIGXCPU}}{620} +-\entry {\code {SIGXFSZ}}{620} +-\entry {\code {SOCK_DGRAM}}{400} +-\entry {\code {SOCK_RAW}}{401} +-\entry {\code {SOCK_STREAM}}{400} +-\entry {\code {SOL_SOCKET}}{441} +-\entry {\code {SS_DISABLE}}{653} +-\entry {\code {SS_ONSTACK}}{653} +-\entry {\code {SSIZE_MAX}}{788} +-\entry {\code {stderr}}{231} +-\entry {\code {STDERR_FILENO}}{313} +-\entry {\code {stdin}}{231} +-\entry {\code {STDIN_FILENO}}{313} +-\entry {\code {stdout}}{231} +-\entry {\code {STDOUT_FILENO}}{313} +-\entry {\code {STREAM_MAX}}{787} +-\entry {\code {SV_INTERRUPT}}{655} +-\entry {\code {SV_ONSTACK}}{655} +-\entry {\code {SV_RESETHAND}}{655} +-\entry {\code {sys_siglist}}{622} +-\initial {T} +-\entry {\code {T_FMT}}{163} +-\entry {\code {T_FMT_AMPM}}{163} +-\entry {\code {TCIFLUSH}}{465} +-\entry {\code {TCIOFF}}{466} +-\entry {\code {TCIOFLUSH}}{465} +-\entry {\code {TCION}}{466} +-\entry {\code {TCOFLUSH}}{465} +-\entry {\code {TCOOFF}}{466} +-\entry {\code {TCOON}}{466} +-\entry {\code {TCSADRAIN}}{448} +-\entry {\code {TCSAFLUSH}}{448} +-\entry {\code {TCSANOW}}{448} +-\entry {\code {TCSASOFT}}{448} +-\entry {\code {THOUSANDS_SEP}}{166} +-\entry {\code {THOUSEP}}{166} +-\entry {\code {timezone}}{577} +-\entry {\code {TMP_MAX}}{390} +-\entry {\code {TOSTOP}}{456} +-\entry {\code {TRY_AGAIN}}{414} +-\entry {\code {tzname}}{576} +-\entry {\code {TZNAME_MAX}}{787} +-\initial {U} +-\entry {\code {UCHAR_MAX}}{850} +-\entry {\code {UINT_MAX}}{851} +-\entry {\code {ULONG_LONG_MAX}}{851} +-\entry {\code {ULONG_MAX}}{851} +-\entry {\code {USER_PROCESS}}{755, 759} +-\entry {\code {USHRT_MAX}}{851} +-\initial {V} +-\entry {\code {VDISCARD}}{462} +-\entry {\code {VDSUSP}}{461} +-\entry {\code {VEOF}}{458} +-\entry {\code {VEOL}}{459} +-\entry {\code {VEOL2}}{459} +-\entry {\code {VERASE}}{459} +-\entry {\code {VINTR}}{460} +-\entry {\code {VKILL}}{460} +-\entry {\code {VLNEXT}}{462} +-\entry {\code {VMIN}}{463} +-\entry {\code {VQUIT}}{460} +-\entry {\code {VREPRINT}}{460} +-\entry {\code {VSTART}}{461} +-\entry {\code {VSTATUS}}{462} +-\entry {\code {VSTOP}}{461} +-\entry {\code {VSUSP}}{460} +-\entry {\code {VTIME}}{463} +-\entry {\code {VWERASE}}{459} +-\initial {W} +-\entry {\code {W_OK}}{383} +-\entry {\code {WCHAR_MAX}}{112, 851} +-\entry {\code {WCHAR_MIN}}{112} +-\entry {\code {WEOF}}{113, 282} +-\initial {X} +-\entry {\code {X_OK}}{383} +-\initial {Y} +-\entry {\code {YESEXPR}}{166} +-\entry {\code {YESSTR}}{166} +diff -u -udbrN glibc-2.3.2/manual/libcbook.texi glibc-2.3.2-200304020432/manual/libcbook.texi +--- glibc-2.3.2/manual/libcbook.texi Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/manual/libcbook.texi Sat Feb 18 02:12:54 1995 +@@ -0,0 +1,3 @@ ++\input texinfo ++@finalout ++@include libc.texinfo +diff -u -udbrN glibc-2.3.2/manual/libm-err.texi glibc-2.3.2-200304020432/manual/libm-err.texi +--- glibc-2.3.2/manual/libm-err.texi Mon Nov 5 21:54:48 2001 ++++ glibc-2.3.2-200304020432/manual/libm-err.texi Thu Jan 1 01:00:00 1970 +@@ -1,801 +0,0 @@ +-@multitable {nexttowardf} {1000 + i 1000} {1000 + i 1000} {1000 + i 1000} {1000 + i 1000} {1000 + i 1000} +-@item Function @tab Alpha @tab ARM @tab Generic @tab ix86 @tab IA64 +-@item acosf @tab - @tab - @tab - @tab - @tab - +-@item acos @tab - @tab - @tab - @tab - @tab - +-@item acosl @tab - @tab - @tab - @tab 1150 @tab - +-@item acoshf @tab - @tab - @tab - @tab - @tab - +-@item acosh @tab - @tab - @tab - @tab - @tab - +-@item acoshl @tab - @tab - @tab - @tab 1 @tab - +-@item asinf @tab 2 @tab 2 @tab - @tab - @tab - +-@item asin @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item asinl @tab - @tab - @tab - @tab 1 @tab - +-@item asinhf @tab - @tab - @tab - @tab - @tab - +-@item asinh @tab - @tab - @tab - @tab - @tab - +-@item asinhl @tab - @tab - @tab - @tab 656 @tab 14 +-@item atanf @tab - @tab - @tab - @tab - @tab - +-@item atan @tab - @tab - @tab - @tab - @tab - +-@item atanl @tab - @tab - @tab - @tab 549 @tab - +-@item atanhf @tab - @tab - @tab - @tab - @tab - +-@item atanh @tab 1 @tab 1 @tab - @tab 1 @tab - +-@item atanhl @tab - @tab - @tab - @tab 1605 @tab - +-@item atan2f @tab 4 @tab - @tab - @tab - @tab - +-@item atan2 @tab - @tab - @tab - @tab - @tab - +-@item atan2l @tab - @tab - @tab - @tab 549 @tab - +-@item cabsf @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item cabs @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item cabsl @tab - @tab - @tab - @tab 560 @tab 1 +-@item cacosf @tab 1 + i 1 @tab 1 + i 1 @tab - @tab 1 + i 2 @tab 1 + i 2 +-@item cacos @tab 1 + i 0 @tab 1 + i 0 @tab - @tab 1 + i 0 @tab 1 + i 0 +-@item cacosl @tab - @tab - @tab - @tab 151 + i 329 @tab 1 + i 1 +-@item cacoshf @tab 7 + i 3 @tab 7 + i 3 @tab - @tab 4 + i 4 @tab 7 + i 0 +-@item cacosh @tab 1 + i 1 @tab 1 + i 1 @tab - @tab 1 + i 1 @tab 1 + i 1 +-@item cacoshl @tab - @tab - @tab - @tab 328 + i 151 @tab 7 + i 1 +-@item cargf @tab - @tab - @tab - @tab - @tab - +-@item carg @tab - @tab - @tab - @tab - @tab - +-@item cargl @tab - @tab - @tab - @tab - @tab - +-@item casinf @tab 2 + i 1 @tab 2 + i 1 @tab - @tab 2 + i 2 @tab 2 + i 2 +-@item casin @tab 3 + i 0 @tab 3 + i 0 @tab - @tab 3 + i 0 @tab 3 + i 0 +-@item casinl @tab - @tab - @tab - @tab 603 + i 329 @tab 0 + i 1 +-@item casinhf @tab 1 + i 6 @tab 1 + i 6 @tab - @tab 1 + i 6 @tab 1 + i 6 +-@item casinh @tab 5 + i 3 @tab 5 + i 3 @tab - @tab 5 + i 3 @tab 5 + i 3 +-@item casinhl @tab - @tab - @tab - @tab 892 + i 12 @tab 5 + i 5 +-@item catanf @tab 4 + i 1 @tab 4 + i 1 @tab - @tab 0 + i 1 @tab 0 + i 1 +-@item catan @tab 0 + i 1 @tab 0 + i 1 @tab - @tab 0 + i 1 @tab 0 + i 1 +-@item catanl @tab - @tab - @tab - @tab 251 + i 474 @tab 1 + i 0 +-@item catanhf @tab 1 + i 6 @tab 1 + i 6 @tab - @tab 1 + i 0 @tab - +-@item catanh @tab 4 + i 1 @tab 4 + i 1 @tab - @tab 2 + i 0 @tab 4 + i 0 +-@item catanhl @tab - @tab - @tab - @tab 66 + i 447 @tab 1 + i 0 +-@item cbrtf @tab - @tab - @tab - @tab - @tab - +-@item cbrt @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item cbrtl @tab - @tab - @tab - @tab 716 @tab - +-@item ccosf @tab 0 + i 1 @tab 0 + i 1 @tab - @tab 1 + i 1 @tab 1 + i 1 +-@item ccos @tab 1 + i 1 @tab 1 + i 1 @tab - @tab 1 + i 1 @tab 1 + i 1 +-@item ccosl @tab - @tab - @tab - @tab 5 + i 1901 @tab 0 + i 1 +-@item ccoshf @tab 1 + i 1 @tab 1 + i 1 @tab - @tab 1 + i 1 @tab 1 + i 1 +-@item ccosh @tab 1 + i 1 @tab 1 + i 1 @tab - @tab 1 + i 1 @tab 1 + i 1 +-@item ccoshl @tab - @tab - @tab - @tab 1467 + i 1183 @tab 1 + i 1 +-@item ceilf @tab - @tab - @tab - @tab - @tab - +-@item ceil @tab - @tab - @tab - @tab - @tab - +-@item ceill @tab - @tab - @tab - @tab - @tab - +-@item cexpf @tab 1 + i 1 @tab 1 + i 1 @tab - @tab 1 + i 0 @tab 1 + i 1 +-@item cexp @tab 1 + i 0 @tab 1 + i 0 @tab - @tab - @tab 1 + i 0 +-@item cexpl @tab - @tab - @tab - @tab 940 + i 1067 @tab 2 + i 0 +-@item cimagf @tab - @tab - @tab - @tab - @tab - +-@item cimag @tab - @tab - @tab - @tab - @tab - +-@item cimagl @tab - @tab - @tab - @tab - @tab - +-@item clogf @tab 0 + i 3 @tab 0 + i 3 @tab - @tab - @tab - +-@item clog @tab 0 + i 1 @tab 0 + i 1 @tab - @tab - @tab - +-@item clogl @tab - @tab - @tab - @tab 0 + i 1 @tab - +-@item clog10f @tab 1 + i 5 @tab 1 + i 5 @tab - @tab 1 + i 1 @tab 1 + i 1 +-@item clog10 @tab 1 + i 1 @tab 1 + i 1 @tab - @tab 2 + i 1 @tab 2 + i 1 +-@item clog10l @tab - @tab - @tab - @tab 1403 + i 186 @tab 1 + i 2 +-@item conjf @tab - @tab - @tab - @tab - @tab - +-@item conj @tab - @tab - @tab - @tab - @tab - +-@item conjl @tab - @tab - @tab - @tab - @tab - +-@item copysignf @tab - @tab - @tab - @tab - @tab - +-@item copysign @tab - @tab - @tab - @tab - @tab - +-@item copysignl @tab - @tab - @tab - @tab - @tab - +-@item cosf @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item cos @tab 2 @tab 2 @tab - @tab 2 @tab 2 +-@item cosl @tab - @tab - @tab - @tab 529 @tab 0.5 +-@item coshf @tab - @tab - @tab - @tab - @tab - +-@item cosh @tab - @tab - @tab - @tab - @tab - +-@item coshl @tab - @tab - @tab - @tab 309 @tab 2 +-@item cpowf @tab 4 + i 2 @tab 4 + i 2 @tab - @tab 4 + i 2.5333 @tab 5 + i 2.5333 +-@item cpow @tab 1 + i 1.1031 @tab 1 + i 1.1031 @tab - @tab 1 + i 1.104 @tab 1 + i 1.1031 +-@item cpowl @tab - @tab - @tab - @tab 2 + i 9 @tab 1 + i 4 +-@item cprojf @tab - @tab - @tab - @tab - @tab - +-@item cproj @tab - @tab - @tab - @tab - @tab - +-@item cprojl @tab - @tab - @tab - @tab - @tab - +-@item crealf @tab - @tab - @tab - @tab - @tab - +-@item creal @tab - @tab - @tab - @tab - @tab - +-@item creall @tab - @tab - @tab - @tab - @tab - +-@item csinf @tab 0 + i 1 @tab 0 + i 1 @tab - @tab - @tab - +-@item csin @tab - @tab - @tab - @tab - @tab - +-@item csinl @tab - @tab - @tab - @tab 966 + i 168 @tab 0 + i 1 +-@item csinhf @tab 1 + i 1 @tab 1 + i 1 @tab - @tab 1 + i 1 @tab 1 + i 1 +-@item csinh @tab 0 + i 1 @tab 0 + i 1 @tab - @tab 1 + i 1 @tab 1 + i 1 +-@item csinhl @tab - @tab - @tab - @tab 413 + i 477 @tab 2 + i 2 +-@item csqrtf @tab 1 + i 1 @tab 1 + i 1 @tab - @tab - @tab 1 + i 1 +-@item csqrt @tab 1 + i 0 @tab 1 + i 0 @tab - @tab 1 + i 0 @tab 1 + i 0 +-@item csqrtl @tab - @tab - @tab - @tab 237 + i 128 @tab - +-@item ctanf @tab 1 + i 1 @tab 1 + i 1 @tab - @tab 1 + i 1 @tab 1 + i 1 +-@item ctan @tab 1 + i 1 @tab 1 + i 1 @tab - @tab 1 + i 1 @tab 1 + i 1 +-@item ctanl @tab - @tab - @tab - @tab 690 + i 367 @tab 436 + i 1 +-@item ctanhf @tab 2 + i 1 @tab 2 + i 1 @tab - @tab 1 + i 1 @tab 1 + i 1 +-@item ctanh @tab 2 + i 2 @tab 2 + i 2 @tab - @tab 0 + i 1 @tab 0 + i 1 +-@item ctanhl @tab - @tab - @tab - @tab 286 + i 3074 @tab 1 + i 24 +-@item erff @tab - @tab - @tab - @tab - @tab - +-@item erf @tab - @tab - @tab - @tab - @tab - +-@item erfl @tab - @tab - @tab - @tab - @tab - +-@item erfcf @tab 12 @tab 12 @tab - @tab 12 @tab 12 +-@item erfc @tab 24 @tab 24 @tab - @tab 24 @tab 24 +-@item erfcl @tab - @tab - @tab - @tab 36 @tab 12 +-@item expf @tab - @tab - @tab - @tab - @tab - +-@item exp @tab - @tab - @tab - @tab - @tab - +-@item expl @tab - @tab - @tab - @tab 754 @tab - +-@item exp10f @tab 2 @tab 2 @tab - @tab - @tab 2 +-@item exp10 @tab 6 @tab 6 @tab - @tab 1 @tab 6 +-@item exp10l @tab - @tab - @tab - @tab 1182 @tab 3 +-@item exp2f @tab - @tab - @tab - @tab - @tab - +-@item exp2 @tab - @tab - @tab - @tab - @tab - +-@item exp2l @tab - @tab - @tab - @tab 462 @tab - +-@item expm1f @tab 1 @tab 1 @tab - @tab - @tab - +-@item expm1 @tab - @tab - @tab - @tab - @tab - +-@item expm1l @tab - @tab - @tab - @tab 825 @tab 1 +-@item fabsf @tab - @tab - @tab - @tab - @tab - +-@item fabs @tab - @tab - @tab - @tab - @tab - +-@item fabsl @tab - @tab - @tab - @tab - @tab - +-@item fdimf @tab - @tab - @tab - @tab - @tab - +-@item fdim @tab - @tab - @tab - @tab - @tab - +-@item fdiml @tab - @tab - @tab - @tab - @tab - +-@item floorf @tab - @tab - @tab - @tab - @tab - +-@item floor @tab - @tab - @tab - @tab - @tab - +-@item floorl @tab - @tab - @tab - @tab - @tab - +-@item fmaf @tab - @tab - @tab - @tab - @tab - +-@item fma @tab - @tab - @tab - @tab - @tab - +-@item fmal @tab - @tab - @tab - @tab - @tab - +-@item fmaxf @tab - @tab - @tab - @tab - @tab - +-@item fmax @tab - @tab - @tab - @tab - @tab - +-@item fmaxl @tab - @tab - @tab - @tab - @tab - +-@item fminf @tab - @tab - @tab - @tab - @tab - +-@item fmin @tab - @tab - @tab - @tab - @tab - +-@item fminl @tab - @tab - @tab - @tab - @tab - +-@item fmodf @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item fmod @tab 2 @tab 2 @tab - @tab 2 @tab 2 +-@item fmodl @tab - @tab - @tab - @tab 4096 @tab 1 +-@item frexpf @tab - @tab - @tab - @tab - @tab - +-@item frexp @tab - @tab - @tab - @tab - @tab - +-@item frexpl @tab - @tab - @tab - @tab - @tab - +-@item gammaf @tab - @tab - @tab - @tab - @tab - +-@item gamma @tab - @tab - @tab - @tab 1 @tab - +-@item gammal @tab - @tab - @tab - @tab 1 @tab 1 +-@item hypotf @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item hypot @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item hypotl @tab - @tab - @tab - @tab 560 @tab 1 +-@item ilogbf @tab - @tab - @tab - @tab - @tab - +-@item ilogb @tab - @tab - @tab - @tab - @tab - +-@item ilogbl @tab - @tab - @tab - @tab - @tab - +-@item j0f @tab 2 @tab 2 @tab - @tab 1 @tab 1 +-@item j0 @tab 2 @tab 2 @tab - @tab 2 @tab 2 +-@item j0l @tab - @tab - @tab - @tab 1 @tab 2 +-@item j1f @tab 2 @tab 2 @tab - @tab 1 @tab 2 +-@item j1 @tab 1 @tab 1 @tab - @tab 2 @tab 1 +-@item j1l @tab - @tab - @tab - @tab 2 @tab - +-@item jnf @tab 4 @tab 4 @tab - @tab 2 @tab 4 +-@item jn @tab 6 @tab 6 @tab - @tab 5 @tab 6 +-@item jnl @tab - @tab - @tab - @tab 2 @tab 2 +-@item lgammaf @tab 2 @tab 2 @tab - @tab 2 @tab 2 +-@item lgamma @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item lgammal @tab - @tab - @tab - @tab 1 @tab 1 +-@item lrintf @tab - @tab - @tab - @tab - @tab - +-@item lrint @tab - @tab - @tab - @tab - @tab - +-@item lrintl @tab - @tab - @tab - @tab - @tab - +-@item llrintf @tab - @tab - @tab - @tab - @tab - +-@item llrint @tab - @tab - @tab - @tab - @tab - +-@item llrintl @tab - @tab - @tab - @tab - @tab - +-@item logf @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item log @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item logl @tab - @tab - @tab - @tab 2341 @tab 1 +-@item log10f @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item log10 @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item log10l @tab - @tab - @tab - @tab 2033 @tab 1 +-@item log1pf @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item log1p @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item log1pl @tab - @tab - @tab - @tab 585 @tab 1 +-@item log2f @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item log2 @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item log2l @tab - @tab - @tab - @tab 1688 @tab - +-@item logbf @tab - @tab - @tab - @tab - @tab - +-@item logb @tab - @tab - @tab - @tab - @tab - +-@item logbl @tab - @tab - @tab - @tab - @tab - +-@item lroundf @tab - @tab - @tab - @tab - @tab - +-@item lround @tab - @tab - @tab - @tab - @tab - +-@item lroundl @tab - @tab - @tab - @tab - @tab - +-@item llroundf @tab - @tab - @tab - @tab - @tab - +-@item llround @tab - @tab - @tab - @tab - @tab - +-@item llroundl @tab - @tab - @tab - @tab - @tab - +-@item modff @tab - @tab - @tab - @tab - @tab - +-@item modf @tab - @tab - @tab - @tab - @tab - +-@item modfl @tab - @tab - @tab - @tab - @tab - +-@item nearbyintf @tab - @tab - @tab - @tab - @tab - +-@item nearbyint @tab - @tab - @tab - @tab - @tab - +-@item nearbyintl @tab - @tab - @tab - @tab - @tab - +-@item nextafterf @tab - @tab - @tab - @tab - @tab - +-@item nextafter @tab - @tab - @tab - @tab - @tab - +-@item nextafterl @tab - @tab - @tab - @tab - @tab - +-@item nexttowardf @tab - @tab - @tab - @tab - @tab - +-@item nexttoward @tab - @tab - @tab - @tab - @tab - +-@item nexttowardl @tab - @tab - @tab - @tab - @tab - +-@item powf @tab - @tab - @tab - @tab - @tab - +-@item pow @tab - @tab - @tab - @tab - @tab - +-@item powl @tab - @tab - @tab - @tab 725 @tab 1 +-@item remainderf @tab - @tab - @tab - @tab - @tab - +-@item remainder @tab - @tab - @tab - @tab - @tab - +-@item remainderl @tab - @tab - @tab - @tab - @tab - +-@item remquof @tab - @tab - @tab - @tab - @tab - +-@item remquo @tab - @tab - @tab - @tab - @tab - +-@item remquol @tab - @tab - @tab - @tab - @tab - +-@item rintf @tab - @tab - @tab - @tab - @tab - +-@item rint @tab - @tab - @tab - @tab - @tab - +-@item rintl @tab - @tab - @tab - @tab - @tab - +-@item roundf @tab - @tab - @tab - @tab - @tab - +-@item round @tab - @tab - @tab - @tab - @tab - +-@item roundl @tab - @tab - @tab - @tab - @tab - +-@item scalbf @tab - @tab - @tab - @tab - @tab - +-@item scalb @tab - @tab - @tab - @tab - @tab - +-@item scalbl @tab - @tab - @tab - @tab - @tab - +-@item scalbnf @tab - @tab - @tab - @tab - @tab - +-@item scalbn @tab - @tab - @tab - @tab - @tab - +-@item scalbnl @tab - @tab - @tab - @tab - @tab - +-@item scalblnf @tab - @tab - @tab - @tab - @tab - +-@item scalbln @tab - @tab - @tab - @tab - @tab - +-@item scalblnl @tab - @tab - @tab - @tab - @tab - +-@item sinf @tab - @tab - @tab - @tab - @tab - +-@item sin @tab - @tab - @tab - @tab - @tab - +-@item sinl @tab - @tab - @tab - @tab 627 @tab 1 +-@item sincosf @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item sincos @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item sincosl @tab - @tab - @tab - @tab 627 @tab 1 +-@item sinhf @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item sinh @tab 1 @tab 1 @tab - @tab - @tab - +-@item sinhl @tab - @tab - @tab - @tab 1029 @tab 1 +-@item sqrtf @tab - @tab - @tab - @tab - @tab - +-@item sqrt @tab - @tab - @tab - @tab - @tab - +-@item sqrtl @tab - @tab - @tab - @tab 489 @tab - +-@item tanf @tab - @tab - @tab - @tab - @tab - +-@item tan @tab 0.5 @tab 0.5 @tab - @tab 0.5 @tab 0.5 +-@item tanl @tab - @tab - @tab - @tab 1401 @tab 1 +-@item tanhf @tab 1 @tab 1 @tab - @tab - @tab 1 +-@item tanh @tab 1 @tab 1 @tab - @tab - @tab 1 +-@item tanhl @tab - @tab - @tab - @tab 521 @tab 1 +-@item tgammaf @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item tgamma @tab 1 @tab 1 @tab - @tab 2 @tab 1 +-@item tgammal @tab - @tab - @tab - @tab 2 @tab 1 +-@item truncf @tab - @tab - @tab - @tab - @tab - +-@item trunc @tab - @tab - @tab - @tab - @tab - +-@item truncl @tab - @tab - @tab - @tab - @tab - +-@item y0f @tab 1 @tab 1 @tab - @tab 1 @tab 1 +-@item y0 @tab 2 @tab 2 @tab - @tab 3 @tab 2 +-@item y0l @tab - @tab - @tab - @tab 2 @tab 2 +-@item y1f @tab 2 @tab 2 @tab - @tab 2 @tab 2 +-@item y1 @tab 3 @tab 3 @tab - @tab 3 @tab 3 +-@item y1l @tab - @tab - @tab - @tab 2 @tab 1 +-@item ynf @tab 2 @tab 2 @tab - @tab 3 @tab 2 +-@item yn @tab 3 @tab 3 @tab - @tab 6 @tab 3 +-@item ynl @tab - @tab - @tab - @tab 7 @tab 7 +-@end multitable +-@multitable {nexttowardf} {1000 + i 1000} {1000 + i 1000} {1000 + i 1000} {1000 + i 1000} {1000 + i 1000} +-@item Function @tab M68k @tab MIPS @tab PowerPC @tab S/390 @tab SH4 +-@item acosf @tab - @tab - @tab - @tab - @tab - +-@item acos @tab - @tab - @tab - @tab - @tab - +-@item acosl @tab 1 @tab - @tab - @tab - @tab - +-@item acoshf @tab - @tab - @tab - @tab - @tab - +-@item acosh @tab - @tab - @tab - @tab - @tab - +-@item acoshl @tab 1 @tab - @tab - @tab - @tab - +-@item asinf @tab - @tab 2 @tab 2 @tab 2 @tab 2 +-@item asin @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item asinl @tab 1 @tab - @tab - @tab - @tab - +-@item asinhf @tab - @tab - @tab - @tab - @tab - +-@item asinh @tab - @tab - @tab - @tab - @tab - +-@item asinhl @tab 14 @tab - @tab - @tab - @tab - +-@item atanf @tab - @tab - @tab - @tab - @tab - +-@item atan @tab - @tab - @tab - @tab - @tab - +-@item atanl @tab - @tab - @tab - @tab - @tab - +-@item atanhf @tab - @tab - @tab - @tab - @tab - +-@item atanh @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item atanhl @tab - @tab - @tab - @tab - @tab - +-@item atan2f @tab - @tab 4 @tab 4 @tab 4 @tab 4 +-@item atan2 @tab - @tab - @tab - @tab - @tab - +-@item atan2l @tab - @tab - @tab - @tab - @tab - +-@item cabsf @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item cabs @tab - @tab 1 @tab 1 @tab 1 @tab 1 +-@item cabsl @tab 1 @tab - @tab - @tab - @tab - +-@item cacosf @tab 1 + i 2 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item cacos @tab 1 + i 0 @tab 1 + i 0 @tab 1 + i 0 @tab 1 + i 0 @tab 1 + i 0 +-@item cacosl @tab 1 + i 1 @tab - @tab - @tab - @tab - +-@item cacoshf @tab 7 + i 0 @tab 7 + i 3 @tab 7 + i 3 @tab 7 + i 3 @tab 7 + i 3 +-@item cacosh @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item cacoshl @tab 6 + i 2 @tab - @tab - @tab - @tab - +-@item cargf @tab - @tab - @tab - @tab - @tab - +-@item carg @tab - @tab - @tab - @tab - @tab - +-@item cargl @tab - @tab - @tab - @tab - @tab - +-@item casinf @tab 2 + i 2 @tab 2 + i 1 @tab 2 + i 1 @tab 2 + i 1 @tab 2 + i 1 +-@item casin @tab 3 + i 0 @tab 3 + i 0 @tab 3 + i 0 @tab 3 + i 0 @tab 3 + i 0 +-@item casinl @tab 0 + i 1 @tab - @tab - @tab - @tab - +-@item casinhf @tab 19 + i 2 @tab 1 + i 6 @tab 1 + i 6 @tab 1 + i 6 @tab 1 + i 6 +-@item casinh @tab 6 + i 13 @tab 5 + i 3 @tab 5 + i 3 @tab 5 + i 3 @tab 5 + i 3 +-@item casinhl @tab 5 + i 6 @tab - @tab - @tab - @tab - +-@item catanf @tab 0 + i 1 @tab 4 + i 1 @tab 4 + i 1 @tab 4 + i 1 @tab 4 + i 1 +-@item catan @tab 0 + i 1 @tab 0 + i 1 @tab 0 + i 1 @tab 0 + i 1 @tab 0 + i 1 +-@item catanl @tab 1 + i 0 @tab - @tab - @tab - @tab - +-@item catanhf @tab - @tab 1 + i 6 @tab 0 + i 6 @tab 1 + i 6 @tab 1 + i 6 +-@item catanh @tab - @tab 4 + i 1 @tab 4 + i 1 @tab 4 + i 1 @tab 4 + i 1 +-@item catanhl @tab 1 + i 0 @tab - @tab - @tab - @tab - +-@item cbrtf @tab - @tab - @tab - @tab - @tab - +-@item cbrt @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item cbrtl @tab 1 @tab - @tab - @tab - @tab - +-@item ccosf @tab 1 + i 1 @tab 0 + i 1 @tab 0 + i 1 @tab 0 + i 1 @tab 0 + i 1 +-@item ccos @tab 0 + i 1 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item ccosl @tab 0 + i 1 @tab - @tab - @tab - @tab - +-@item ccoshf @tab 3 + i 1 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item ccosh @tab 1 + i 0 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item ccoshl @tab 1 + i 2 @tab - @tab - @tab - @tab - +-@item ceilf @tab - @tab - @tab - @tab - @tab - +-@item ceil @tab - @tab - @tab - @tab - @tab - +-@item ceill @tab - @tab - @tab - @tab - @tab - +-@item cexpf @tab 3 + i 2 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item cexp @tab - @tab 1 + i 0 @tab 1 + i 0 @tab 1 + i 0 @tab 1 + i 0 +-@item cexpl @tab 2 + i 0 @tab - @tab - @tab - @tab - +-@item cimagf @tab - @tab - @tab - @tab - @tab - +-@item cimag @tab - @tab - @tab - @tab - @tab - +-@item cimagl @tab - @tab - @tab - @tab - @tab - +-@item clogf @tab - @tab 0 + i 3 @tab 0 + i 3 @tab 0 + i 3 @tab 0 + i 3 +-@item clog @tab - @tab 0 + i 1 @tab 0 + i 1 @tab 0 + i 1 @tab 0 + i 1 +-@item clogl @tab - @tab - @tab - @tab - @tab - +-@item clog10f @tab 1 + i 1 @tab 1 + i 5 @tab 1 + i 5 @tab 1 + i 5 @tab 1 + i 5 +-@item clog10 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item clog10l @tab 1 + i 3 @tab - @tab - @tab - @tab - +-@item conjf @tab - @tab - @tab - @tab - @tab - +-@item conj @tab - @tab - @tab - @tab - @tab - +-@item conjl @tab - @tab - @tab - @tab - @tab - +-@item copysignf @tab - @tab - @tab - @tab - @tab - +-@item copysign @tab - @tab - @tab - @tab - @tab - +-@item copysignl @tab - @tab - @tab - @tab - @tab - +-@item cosf @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item cos @tab 2 @tab 2 @tab 2 @tab 2 @tab 2 +-@item cosl @tab 1 @tab - @tab - @tab - @tab - +-@item coshf @tab - @tab - @tab - @tab - @tab - +-@item cosh @tab - @tab - @tab - @tab - @tab - +-@item coshl @tab 2 @tab - @tab - @tab - @tab - +-@item cpowf @tab 1 + i 6 @tab 4 + i 2 @tab 4 + i 2 @tab 4 + i 2 @tab 4 + i 2 +-@item cpow @tab 1 + i 2 @tab 1 + i 1.1031 @tab 1 + i 2 @tab 1 + i 1.1031 @tab 1 + i 1.1031 +-@item cpowl @tab 5 + i 2 @tab - @tab - @tab - @tab - +-@item cprojf @tab - @tab - @tab - @tab - @tab - +-@item cproj @tab - @tab - @tab - @tab - @tab - +-@item cprojl @tab - @tab - @tab - @tab - @tab - +-@item crealf @tab - @tab - @tab - @tab - @tab - +-@item creal @tab - @tab - @tab - @tab - @tab - +-@item creall @tab - @tab - @tab - @tab - @tab - +-@item csinf @tab 1 + i 1 @tab 0 + i 1 @tab 0 + i 1 @tab 0 + i 1 @tab 0 + i 1 +-@item csin @tab - @tab - @tab - @tab - @tab - +-@item csinl @tab - @tab - @tab - @tab - @tab - +-@item csinhf @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item csinh @tab - @tab 0 + i 1 @tab 0 + i 1 @tab 0 + i 1 @tab 0 + i 1 +-@item csinhl @tab 1 + i 2 @tab - @tab - @tab - @tab - +-@item csqrtf @tab 1 + i 0 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item csqrt @tab - @tab 1 + i 0 @tab 1 + i 0 @tab 1 + i 0 @tab 1 + i 0 +-@item csqrtl @tab - @tab - @tab - @tab - @tab - +-@item ctanf @tab 1 + i 0 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item ctan @tab 1 + i 0 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item ctanl @tab 439 + i 2 @tab - @tab - @tab - @tab - +-@item ctanhf @tab 1 + i 0 @tab 2 + i 1 @tab 2 + i 1 @tab 2 + i 1 @tab 2 + i 1 +-@item ctanh @tab 0 + i 1 @tab 2 + i 2 @tab 2 + i 2 @tab 2 + i 2 @tab 2 + i 2 +-@item ctanhl @tab 2 + i 25 @tab - @tab - @tab - @tab - +-@item erff @tab - @tab - @tab - @tab - @tab - +-@item erf @tab - @tab - @tab - @tab - @tab - +-@item erfl @tab - @tab - @tab - @tab - @tab - +-@item erfcf @tab 11 @tab 12 @tab 12 @tab 12 @tab 12 +-@item erfc @tab 24 @tab 24 @tab 24 @tab 24 @tab 24 +-@item erfcl @tab 12 @tab - @tab - @tab - @tab - +-@item expf @tab - @tab - @tab - @tab - @tab - +-@item exp @tab - @tab - @tab - @tab - @tab - +-@item expl @tab - @tab - @tab - @tab - @tab - +-@item exp10f @tab - @tab 2 @tab 2 @tab 2 @tab 2 +-@item exp10 @tab 1 @tab 6 @tab 6 @tab 6 @tab 6 +-@item exp10l @tab 1 @tab - @tab - @tab - @tab - +-@item exp2f @tab - @tab - @tab - @tab - @tab - +-@item exp2 @tab - @tab - @tab - @tab - @tab - +-@item exp2l @tab - @tab - @tab - @tab - @tab - +-@item expm1f @tab - @tab 1 @tab 1 @tab 1 @tab 1 +-@item expm1 @tab - @tab - @tab - @tab - @tab - +-@item expm1l @tab 1 @tab - @tab - @tab - @tab - +-@item fabsf @tab - @tab - @tab - @tab - @tab - +-@item fabs @tab - @tab - @tab - @tab - @tab - +-@item fabsl @tab - @tab - @tab - @tab - @tab - +-@item fdimf @tab - @tab - @tab - @tab - @tab - +-@item fdim @tab - @tab - @tab - @tab - @tab - +-@item fdiml @tab - @tab - @tab - @tab - @tab - +-@item floorf @tab - @tab - @tab - @tab - @tab - +-@item floor @tab - @tab - @tab - @tab - @tab - +-@item floorl @tab - @tab - @tab - @tab - @tab - +-@item fmaf @tab - @tab - @tab - @tab - @tab - +-@item fma @tab - @tab - @tab - @tab - @tab - +-@item fmal @tab - @tab - @tab - @tab - @tab - +-@item fmaxf @tab - @tab - @tab - @tab - @tab - +-@item fmax @tab - @tab - @tab - @tab - @tab - +-@item fmaxl @tab - @tab - @tab - @tab - @tab - +-@item fminf @tab - @tab - @tab - @tab - @tab - +-@item fmin @tab - @tab - @tab - @tab - @tab - +-@item fminl @tab - @tab - @tab - @tab - @tab - +-@item fmodf @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item fmod @tab 2 @tab 2 @tab 2 @tab 2 @tab 2 +-@item fmodl @tab 1 @tab - @tab - @tab - @tab - +-@item frexpf @tab - @tab - @tab - @tab - @tab - +-@item frexp @tab - @tab - @tab - @tab - @tab - +-@item frexpl @tab - @tab - @tab - @tab - @tab - +-@item gammaf @tab - @tab - @tab - @tab - @tab - +-@item gamma @tab - @tab - @tab - @tab - @tab - +-@item gammal @tab 1 @tab - @tab - @tab - @tab - +-@item hypotf @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item hypot @tab - @tab 1 @tab 1 @tab 1 @tab 1 +-@item hypotl @tab 1 @tab - @tab - @tab - @tab - +-@item ilogbf @tab - @tab - @tab - @tab - @tab - +-@item ilogb @tab - @tab - @tab - @tab - @tab - +-@item ilogbl @tab - @tab - @tab - @tab - @tab - +-@item j0f @tab 1 @tab 2 @tab 1 @tab 2 @tab 2 +-@item j0 @tab 1 @tab 2 @tab 2 @tab 2 @tab 2 +-@item j0l @tab 1 @tab - @tab - @tab - @tab - +-@item j1f @tab 2 @tab 2 @tab 2 @tab 2 @tab 2 +-@item j1 @tab - @tab 1 @tab 1 @tab 1 @tab 1 +-@item j1l @tab 2 @tab - @tab - @tab - @tab - +-@item jnf @tab 11 @tab 4 @tab 4 @tab 4 @tab 4 +-@item jn @tab 4 @tab 6 @tab 6 @tab 6 @tab 6 +-@item jnl @tab 2 @tab - @tab - @tab - @tab - +-@item lgammaf @tab 2 @tab 2 @tab 2 @tab 2 @tab 2 +-@item lgamma @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item lgammal @tab 1 @tab - @tab - @tab - @tab - +-@item lrintf @tab - @tab - @tab - @tab - @tab - +-@item lrint @tab - @tab - @tab - @tab - @tab - +-@item lrintl @tab - @tab - @tab - @tab - @tab - +-@item llrintf @tab - @tab - @tab - @tab - @tab - +-@item llrint @tab - @tab - @tab - @tab - @tab - +-@item llrintl @tab - @tab - @tab - @tab - @tab - +-@item logf @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item log @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item logl @tab 2 @tab - @tab - @tab - @tab - +-@item log10f @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item log10 @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item log10l @tab 1 @tab - @tab - @tab - @tab - +-@item log1pf @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item log1p @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item log1pl @tab 2 @tab - @tab - @tab - @tab - +-@item log2f @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item log2 @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item log2l @tab 1 @tab - @tab - @tab - @tab - +-@item logbf @tab - @tab - @tab - @tab - @tab - +-@item logb @tab - @tab - @tab - @tab - @tab - +-@item logbl @tab - @tab - @tab - @tab - @tab - +-@item lroundf @tab - @tab - @tab - @tab - @tab - +-@item lround @tab - @tab - @tab - @tab - @tab - +-@item lroundl @tab - @tab - @tab - @tab - @tab - +-@item llroundf @tab - @tab - @tab - @tab - @tab - +-@item llround @tab - @tab - @tab - @tab - @tab - +-@item llroundl @tab - @tab - @tab - @tab - @tab - +-@item modff @tab - @tab - @tab - @tab - @tab - +-@item modf @tab - @tab - @tab - @tab - @tab - +-@item modfl @tab - @tab - @tab - @tab - @tab - +-@item nearbyintf @tab - @tab - @tab - @tab - @tab - +-@item nearbyint @tab - @tab - @tab - @tab - @tab - +-@item nearbyintl @tab - @tab - @tab - @tab - @tab - +-@item nextafterf @tab - @tab - @tab - @tab - @tab - +-@item nextafter @tab - @tab - @tab - @tab - @tab - +-@item nextafterl @tab - @tab - @tab - @tab - @tab - +-@item nexttowardf @tab - @tab - @tab - @tab - @tab - +-@item nexttoward @tab - @tab - @tab - @tab - @tab - +-@item nexttowardl @tab - @tab - @tab - @tab - @tab - +-@item powf @tab - @tab - @tab - @tab - @tab - +-@item pow @tab - @tab - @tab - @tab - @tab - +-@item powl @tab 1 @tab - @tab - @tab - @tab - +-@item remainderf @tab - @tab - @tab - @tab - @tab - +-@item remainder @tab - @tab - @tab - @tab - @tab - +-@item remainderl @tab - @tab - @tab - @tab - @tab - +-@item remquof @tab - @tab - @tab - @tab - @tab - +-@item remquo @tab - @tab - @tab - @tab - @tab - +-@item remquol @tab - @tab - @tab - @tab - @tab - +-@item rintf @tab - @tab - @tab - @tab - @tab - +-@item rint @tab - @tab - @tab - @tab - @tab - +-@item rintl @tab - @tab - @tab - @tab - @tab - +-@item roundf @tab - @tab - @tab - @tab - @tab - +-@item round @tab - @tab - @tab - @tab - @tab - +-@item roundl @tab - @tab - @tab - @tab - @tab - +-@item scalbf @tab - @tab - @tab - @tab - @tab - +-@item scalb @tab - @tab - @tab - @tab - @tab - +-@item scalbl @tab - @tab - @tab - @tab - @tab - +-@item scalbnf @tab - @tab - @tab - @tab - @tab - +-@item scalbn @tab - @tab - @tab - @tab - @tab - +-@item scalbnl @tab - @tab - @tab - @tab - @tab - +-@item scalblnf @tab - @tab - @tab - @tab - @tab - +-@item scalbln @tab - @tab - @tab - @tab - @tab - +-@item scalblnl @tab - @tab - @tab - @tab - @tab - +-@item sinf @tab - @tab - @tab - @tab - @tab - +-@item sin @tab - @tab - @tab - @tab - @tab - +-@item sinl @tab 1 @tab - @tab - @tab - @tab - +-@item sincosf @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item sincos @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item sincosl @tab 1 @tab - @tab - @tab - @tab - +-@item sinhf @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item sinh @tab - @tab 1 @tab 1 @tab 1 @tab 1 +-@item sinhl @tab - @tab - @tab - @tab - @tab - +-@item sqrtf @tab - @tab - @tab - @tab - @tab - +-@item sqrt @tab - @tab - @tab - @tab - @tab - +-@item sqrtl @tab - @tab - @tab - @tab - @tab - +-@item tanf @tab - @tab - @tab - @tab - @tab - +-@item tan @tab 1 @tab 0.5 @tab 1 @tab 0.5 @tab 0.5 +-@item tanl @tab 1 @tab - @tab - @tab - @tab - +-@item tanhf @tab - @tab 1 @tab 1 @tab 1 @tab 1 +-@item tanh @tab - @tab 1 @tab 1 @tab 1 @tab 1 +-@item tanhl @tab - @tab - @tab - @tab - @tab - +-@item tgammaf @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item tgamma @tab 1 @tab 1 @tab 1 @tab 1 @tab 1 +-@item tgammal @tab 1 @tab - @tab - @tab - @tab - +-@item truncf @tab - @tab - @tab - @tab - @tab - +-@item trunc @tab - @tab - @tab - @tab - @tab - +-@item truncl @tab - @tab - @tab - @tab - @tab - +-@item y0f @tab 2 @tab 1 @tab 1 @tab 1 @tab 1 +-@item y0 @tab 2 @tab 2 @tab 2 @tab 2 @tab 2 +-@item y0l @tab 2 @tab - @tab - @tab - @tab - +-@item y1f @tab 2 @tab 2 @tab 2 @tab 2 @tab 2 +-@item y1 @tab 1 @tab 3 @tab 3 @tab 3 @tab 3 +-@item y1l @tab 2 @tab - @tab - @tab - @tab - +-@item ynf @tab 2 @tab 2 @tab 2 @tab 2 @tab 2 +-@item yn @tab 6 @tab 3 @tab 3 @tab 3 @tab 3 +-@item ynl @tab 7 @tab - @tab - @tab - @tab - +-@end multitable +-@multitable {nexttowardf} {1000 + i 1000} {1000 + i 1000} {1000 + i 1000} +-@item Function @tab Sparc 32-bit @tab Sparc 64-bit @tab x86_64/fpu +-@item acosf @tab - @tab - @tab - +-@item acos @tab - @tab - @tab - +-@item acosl @tab - @tab 1 @tab - +-@item acoshf @tab - @tab - @tab - +-@item acosh @tab - @tab - @tab - +-@item acoshl @tab - @tab - @tab - +-@item asinf @tab 2 @tab 2 @tab - +-@item asin @tab 1 @tab 1 @tab 1 +-@item asinl @tab - @tab - @tab 1 +-@item asinhf @tab - @tab - @tab - +-@item asinh @tab - @tab - @tab - +-@item asinhl @tab - @tab - @tab 15 +-@item atanf @tab - @tab - @tab - +-@item atan @tab - @tab - @tab - +-@item atanl @tab - @tab 1 @tab - +-@item atanhf @tab - @tab - @tab - +-@item atanh @tab 1 @tab 1 @tab 1 +-@item atanhl @tab - @tab - @tab 1 +-@item atan2f @tab 4.0000 @tab 4 @tab 4 +-@item atan2 @tab - @tab - @tab - +-@item atan2l @tab - @tab 1 @tab - +-@item cabsf @tab 1 @tab 1 @tab 1 +-@item cabs @tab 1 @tab 1 @tab 1 +-@item cabsl @tab - @tab - @tab 1 +-@item cacosf @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item cacos @tab 1 + i 0 @tab 1 + i 0 @tab 1 + i 0 +-@item cacosl @tab - @tab 0 + i 3 @tab 1 + i 1 +-@item cacoshf @tab 7 + i 3 @tab 7 + i 3 @tab 7 + i 3 +-@item cacosh @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item cacoshl @tab - @tab 5 + i 1 @tab 6 + i 1 +-@item cargf @tab - @tab - @tab - +-@item carg @tab - @tab - @tab - +-@item cargl @tab - @tab - @tab - +-@item casinf @tab 2 + i 1 @tab 2 + i 1 @tab 2 + i 1 +-@item casin @tab 3 + i 0 @tab 3 + i 0 @tab 3 + i 0 +-@item casinl @tab - @tab 1 + i 3 @tab 0 + i 1 +-@item casinhf @tab 1 + i 6 @tab 1 + i 6 @tab 1 + i 6 +-@item casinh @tab 5 + i 3 @tab 5 + i 3 @tab 5 + i 3 +-@item casinhl @tab - @tab 4 + i 2 @tab 5 + i 5 +-@item catanf @tab 4 + i 1 @tab 4 + i 1 @tab 4 + i 1 +-@item catan @tab 0 + i 1 @tab 0 + i 1 @tab 0 + i 1 +-@item catanl @tab - @tab 0 + i 1 @tab 1 + i 0 +-@item catanhf @tab 1 + i 6 @tab 1 + i 6 @tab 1 + i 6 +-@item catanh @tab 4 + i 1 @tab 4 + i 1 @tab 4 + i 0 +-@item catanhl @tab - @tab - @tab 1 + i 0 +-@item cbrtf @tab - @tab - @tab - +-@item cbrt @tab 1 @tab 1 @tab 1 +-@item cbrtl @tab - @tab - @tab 948 +-@item ccosf @tab 0 + i 1 @tab 0 + i 1 @tab 0 + i 1 +-@item ccos @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item ccosl @tab - @tab - @tab 0 + i 1 +-@item ccoshf @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item ccosh @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item ccoshl @tab - @tab - @tab 1 + i 1 +-@item ceilf @tab - @tab - @tab - +-@item ceil @tab - @tab - @tab - +-@item ceill @tab - @tab - @tab - +-@item cexpf @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item cexp @tab 1 + i 0 @tab 1 + i 0 @tab 1 + i 0 +-@item cexpl @tab - @tab 1 + i 1 @tab 2 + i 1 +-@item cimagf @tab - @tab - @tab - +-@item cimag @tab - @tab - @tab - +-@item cimagl @tab - @tab - @tab - +-@item clogf @tab 0 + i 3 @tab 0 + i 3 @tab 0 + i 3 +-@item clog @tab 0 + i 1 @tab 0 + i 1 @tab - +-@item clogl @tab - @tab - @tab - +-@item clog10f @tab 1 + i 5 @tab 1 + i 5 @tab 1 + i 5 +-@item clog10 @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item clog10l @tab - @tab - @tab 1 + i 3 +-@item conjf @tab - @tab - @tab - +-@item conj @tab - @tab - @tab - +-@item conjl @tab - @tab - @tab - +-@item copysignf @tab - @tab - @tab - +-@item copysign @tab - @tab - @tab - +-@item copysignl @tab - @tab - @tab - +-@item cosf @tab 1 @tab 1 @tab 1 +-@item cos @tab 2 @tab 2 @tab 2 +-@item cosl @tab - @tab 1 @tab 0.5 +-@item coshf @tab - @tab - @tab - +-@item cosh @tab - @tab - @tab - +-@item coshl @tab - @tab - @tab 2 +-@item cpowf @tab 4 + i 2 @tab 4 + i 2 @tab 4 + i 2 +-@item cpow @tab 1 + i 1.1031 @tab 1 + i 1.1031 @tab 1 + i 1.1031 +-@item cpowl @tab - @tab 3 + i 0.9006 @tab 1 + i 2 +-@item cprojf @tab - @tab - @tab - +-@item cproj @tab - @tab - @tab - +-@item cprojl @tab - @tab - @tab - +-@item crealf @tab - @tab - @tab - +-@item creal @tab - @tab - @tab - +-@item creall @tab - @tab - @tab - +-@item csinf @tab 0 + i 1 @tab 0 + i 1 @tab 0 + i 1 +-@item csin @tab - @tab - @tab - +-@item csinl @tab - @tab - @tab 0 + i 2 +-@item csinhf @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item csinh @tab 0 + i 1 @tab 0 + i 1 @tab 0 + i 1 +-@item csinhl @tab - @tab - @tab 2 + i 2 +-@item csqrtf @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item csqrt @tab 1 + i 0 @tab 1 + i 0 @tab 1 + i 0 +-@item csqrtl @tab - @tab 1 + i 1 @tab - +-@item ctanf @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item ctan @tab 1 + i 1 @tab 1 + i 1 @tab 1 + i 1 +-@item ctanl @tab - @tab - @tab 439 + i 2 +-@item ctanhf @tab 2 + i 1 @tab 2 + i 1 @tab 2 + i 1 +-@item ctanh @tab 2 + i 2 @tab 2 + i 2 @tab 2 + i 2 +-@item ctanhl @tab - @tab - @tab 5 + i 25 +-@item erff @tab - @tab - @tab - +-@item erf @tab - @tab - @tab - +-@item erfl @tab - @tab - @tab - +-@item erfcf @tab 12 @tab 12 @tab 12 +-@item erfc @tab 24 @tab 24 @tab 24 +-@item erfcl @tab - @tab - @tab 36 +-@item expf @tab - @tab - @tab - +-@item exp @tab - @tab - @tab - +-@item expl @tab - @tab - @tab - +-@item exp10f @tab 2 @tab 2 @tab 2 +-@item exp10 @tab 6 @tab 6 @tab 6 +-@item exp10l @tab - @tab 1 @tab 3 +-@item exp2f @tab - @tab - @tab - +-@item exp2 @tab - @tab - @tab - +-@item exp2l @tab - @tab - @tab - +-@item expm1f @tab 1 @tab 1 @tab 1 +-@item expm1 @tab - @tab 1 @tab 1 +-@item expm1l @tab - @tab - @tab 1 +-@item fabsf @tab - @tab - @tab - +-@item fabs @tab - @tab - @tab - +-@item fabsl @tab - @tab - @tab - +-@item fdimf @tab - @tab - @tab - +-@item fdim @tab - @tab - @tab - +-@item fdiml @tab - @tab - @tab - +-@item floorf @tab - @tab - @tab - +-@item floor @tab - @tab - @tab - +-@item floorl @tab - @tab - @tab - +-@item fmaf @tab - @tab - @tab - +-@item fma @tab - @tab - @tab - +-@item fmal @tab - @tab - @tab - +-@item fmaxf @tab - @tab - @tab - +-@item fmax @tab - @tab - @tab - +-@item fmaxl @tab - @tab - @tab - +-@item fminf @tab - @tab - @tab - +-@item fmin @tab - @tab - @tab - +-@item fminl @tab - @tab - @tab - +-@item fmodf @tab 1 @tab 1 @tab 1 +-@item fmod @tab 2 @tab 2 @tab 2 +-@item fmodl @tab - @tab 2 @tab 1 +-@item frexpf @tab - @tab - @tab - +-@item frexp @tab - @tab - @tab - +-@item frexpl @tab - @tab - @tab - +-@item gammaf @tab - @tab - @tab - +-@item gamma @tab - @tab - @tab - +-@item gammal @tab - @tab - @tab 1 +-@item hypotf @tab 1 @tab 1 @tab 1 +-@item hypot @tab 1 @tab 1 @tab 1 +-@item hypotl @tab - @tab - @tab 1 +-@item ilogbf @tab - @tab - @tab - +-@item ilogb @tab - @tab - @tab - +-@item ilogbl @tab - @tab - @tab - +-@item j0f @tab 2 @tab 2 @tab 2 +-@item j0 @tab 2 @tab 2 @tab 2 +-@item j0l @tab - @tab - @tab - +-@item j1f @tab 2 @tab 2 @tab 2 +-@item j1 @tab 1 @tab 1 @tab 1 +-@item j1l @tab - @tab - @tab 2 +-@item jnf @tab 4 @tab 4 @tab 4 +-@item jn @tab 6 @tab 6 @tab 6 +-@item jnl @tab - @tab - @tab 2 +-@item lgammaf @tab 2 @tab 2 @tab 2 +-@item lgamma @tab 1 @tab 1 @tab 1 +-@item lgammal @tab - @tab - @tab 1 +-@item lrintf @tab - @tab - @tab - +-@item lrint @tab - @tab - @tab - +-@item lrintl @tab - @tab - @tab - +-@item llrintf @tab - @tab - @tab - +-@item llrint @tab - @tab - @tab - +-@item llrintl @tab - @tab - @tab - +-@item logf @tab 1 @tab 1 @tab 1 +-@item log @tab 1 @tab 1 @tab 1 +-@item logl @tab - @tab 1 @tab 1 +-@item log10f @tab 1 @tab 1 @tab 1 +-@item log10 @tab 1 @tab 1 @tab 1 +-@item log10l @tab - @tab - @tab 1 +-@item log1pf @tab 1 @tab 1 @tab 1 +-@item log1p @tab 1 @tab 1 @tab 1 +-@item log1pl @tab - @tab 1 @tab 1 +-@item log2f @tab 1 @tab 1 @tab 1 +-@item log2 @tab 1 @tab 1 @tab 1 +-@item log2l @tab - @tab - @tab - +-@item logbf @tab - @tab - @tab - +-@item logb @tab - @tab - @tab - +-@item logbl @tab - @tab - @tab - +-@item lroundf @tab - @tab - @tab - +-@item lround @tab - @tab - @tab - +-@item lroundl @tab - @tab - @tab - +-@item llroundf @tab - @tab - @tab - +-@item llround @tab - @tab - @tab - +-@item llroundl @tab - @tab - @tab - +-@item modff @tab - @tab - @tab - +-@item modf @tab - @tab - @tab - +-@item modfl @tab - @tab - @tab - +-@item nearbyintf @tab - @tab - @tab - +-@item nearbyint @tab - @tab - @tab - +-@item nearbyintl @tab - @tab - @tab - +-@item nextafterf @tab - @tab - @tab - +-@item nextafter @tab - @tab - @tab - +-@item nextafterl @tab - @tab - @tab - +-@item nexttowardf @tab - @tab - @tab - +-@item nexttoward @tab - @tab - @tab - +-@item nexttowardl @tab - @tab - @tab - +-@item powf @tab - @tab - @tab - +-@item pow @tab - @tab - @tab - +-@item powl @tab - @tab - @tab - +-@item remainderf @tab - @tab - @tab - +-@item remainder @tab - @tab - @tab - +-@item remainderl @tab - @tab - @tab - +-@item remquof @tab - @tab - @tab - +-@item remquo @tab - @tab - @tab - +-@item remquol @tab - @tab - @tab - +-@item rintf @tab - @tab - @tab - +-@item rint @tab - @tab - @tab - +-@item rintl @tab - @tab - @tab - +-@item roundf @tab - @tab - @tab - +-@item round @tab - @tab - @tab - +-@item roundl @tab - @tab - @tab - +-@item scalbf @tab - @tab - @tab - +-@item scalb @tab - @tab - @tab - +-@item scalbl @tab - @tab - @tab - +-@item scalbnf @tab - @tab - @tab - +-@item scalbn @tab - @tab - @tab - +-@item scalbnl @tab - @tab - @tab - +-@item scalblnf @tab - @tab - @tab - +-@item scalbln @tab - @tab - @tab - +-@item scalblnl @tab - @tab - @tab - +-@item sinf @tab - @tab - @tab - +-@item sin @tab - @tab - @tab - +-@item sinl @tab - @tab - @tab 1 +-@item sincosf @tab 1 @tab 1 @tab 1 +-@item sincos @tab 1 @tab 1 @tab 1 +-@item sincosl @tab - @tab 1 @tab 1 +-@item sinhf @tab 1 @tab 1 @tab 1 +-@item sinh @tab 1 @tab 1 @tab 1 +-@item sinhl @tab - @tab - @tab 1 +-@item sqrtf @tab - @tab - @tab - +-@item sqrt @tab - @tab - @tab - +-@item sqrtl @tab - @tab 1 @tab - +-@item tanf @tab - @tab - @tab - +-@item tan @tab 0.5 @tab 0.5 @tab 0.5 +-@item tanl @tab - @tab 1 @tab 1 +-@item tanhf @tab 1 @tab 1 @tab 1 +-@item tanh @tab 1 @tab 1 @tab 1 +-@item tanhl @tab - @tab - @tab 1 +-@item tgammaf @tab 1 @tab 1 @tab 1 +-@item tgamma @tab 1 @tab 1 @tab 1 +-@item tgammal @tab - @tab - @tab 2 +-@item truncf @tab - @tab - @tab - +-@item trunc @tab - @tab - @tab - +-@item truncl @tab - @tab - @tab - +-@item y0f @tab 1 @tab 1 @tab 1 +-@item y0 @tab 2 @tab 2 @tab 2 +-@item y0l @tab - @tab - @tab 2 +-@item y1f @tab 2 @tab 2 @tab 2 +-@item y1 @tab 3 @tab 3 @tab 3 +-@item y1l @tab - @tab - @tab 2 +-@item ynf @tab 2 @tab 2 @tab 2 +-@item yn @tab 3 @tab 3 @tab 3 +-@item ynl @tab - @tab - @tab 7 +-@end multitable +diff -u -udbrN glibc-2.3.2/manual/longopt.c.texi glibc-2.3.2-200304020432/manual/longopt.c.texi +--- glibc-2.3.2/manual/longopt.c.texi Sat Aug 4 17:06:06 2001 ++++ glibc-2.3.2-200304020432/manual/longopt.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,98 +0,0 @@ +-#include +-#include +-#include +- +-/* @r{Flag set by @samp{--verbose}.} */ +-static int verbose_flag; +- +-int +-main (argc, argv) +- int argc; +- char **argv; +-@{ +- int c; +- +- while (1) +- @{ +- static struct option long_options[] = +- @{ +- /* @r{These options set a flag.} */ +- @{"verbose", no_argument, &verbose_flag, 1@}, +- @{"brief", no_argument, &verbose_flag, 0@}, +- /* @r{These options don't set a flag. +- We distinguish them by their indices.} */ +- @{"add", no_argument, 0, 'a'@}, +- @{"append", no_argument, 0, 'b'@}, +- @{"delete", required_argument, 0, 'd'@}, +- @{"create", required_argument, 0, 'c'@}, +- @{"file", required_argument, 0, 'f'@}, +- @{0, 0, 0, 0@} +- @}; +- /* @r{@code{getopt_long} stores the option index here.} */ +- int option_index = 0; +- +- c = getopt_long (argc, argv, "abc:d:f:", +- long_options, &option_index); +- +- /* @r{Detect the end of the options.} */ +- if (c == -1) +- break; +- +- switch (c) +- @{ +- case 0: +- /* @r{If this option set a flag, do nothing else now.} */ +- if (long_options[option_index].flag != 0) +- break; +- printf ("option %s", long_options[option_index].name); +- if (optarg) +- printf (" with arg %s", optarg); +- printf ("\n"); +- break; +- +- case 'a': +- puts ("option -a\n"); +- break; +- +- case 'b': +- puts ("option -b\n"); +- break; +- +- case 'c': +- printf ("option -c with value `%s'\n", optarg); +- break; +- +- case 'd': +- printf ("option -d with value `%s'\n", optarg); +- break; +- +- case 'f': +- printf ("option -f with value `%s'\n", optarg); +- break; +- +- case '?': +- /* @r{@code{getopt_long} already printed an error message.} */ +- break; +- +- default: +- abort (); +- @} +- @} +- +- /* @r{Instead of reporting @samp{--verbose} +- and @samp{--brief} as they are encountered, +- we report the final status resulting from them.} */ +- if (verbose_flag) +- puts ("verbose flag is set"); +- +- /* @r{Print any remaining command line arguments (not options).} */ +- if (optind < argc) +- @{ +- printf ("non-option ARGV-elements: "); +- while (optind < argc) +- printf ("%s ", argv[optind++]); +- putchar ('\n'); +- @} +- +- exit (0); +-@} +diff -u -udbrN glibc-2.3.2/manual/memopen.c.texi glibc-2.3.2-200304020432/manual/memopen.c.texi +--- glibc-2.3.2/manual/memopen.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/memopen.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,17 +0,0 @@ +-#include +- +-static char buffer[] = "foobar"; +- +-int +-main (void) +-@{ +- int ch; +- FILE *stream; +- +- stream = fmemopen (buffer, strlen (buffer), "r"); +- while ((ch = fgetc (stream)) != EOF) +- printf ("Got %c\n", ch); +- fclose (stream); +- +- return 0; +-@} +diff -u -udbrN glibc-2.3.2/manual/memstrm.c.texi glibc-2.3.2-200304020432/manual/memstrm.c.texi +--- glibc-2.3.2/manual/memstrm.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/memstrm.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,19 +0,0 @@ +-#include +- +-int +-main (void) +-@{ +- char *bp; +- size_t size; +- FILE *stream; +- +- stream = open_memstream (&bp, &size); +- fprintf (stream, "hello"); +- fflush (stream); +- printf ("buf = `%s', size = %d\n", bp, size); +- fprintf (stream, ", world"); +- fclose (stream); +- printf ("buf = `%s', size = %d\n", bp, size); +- +- return 0; +-@} +diff -u -udbrN glibc-2.3.2/manual/mkfsock.c.texi glibc-2.3.2-200304020432/manual/mkfsock.c.texi +--- glibc-2.3.2/manual/mkfsock.c.texi Mon Apr 22 21:30:58 2002 ++++ glibc-2.3.2-200304020432/manual/mkfsock.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,46 +0,0 @@ +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-int +-make_named_socket (const char *filename) +-@{ +- struct sockaddr_un name; +- int sock; +- size_t size; +- +- /* @r{Create the socket.} */ +- sock = socket (PF_LOCAL, SOCK_DGRAM, 0); +- if (sock < 0) +- @{ +- perror ("socket"); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Bind a name to the socket.} */ +- name.sun_family = AF_LOCAL; +- strncpy (name.sun_path, filename, sizeof (name.sun_path)); +- name.sun_path[sizeof (name.sun_path) - 1] = '\0'; +- +- /* @r{The size of the address is +- the offset of the start of the filename, +- plus its length, +- plus one for the terminating null byte. +- Alternatively you can just do: +- size = SUN_LEN (&name); +-} */ +- size = (offsetof (struct sockaddr_un, sun_path) +- + strlen (name.sun_path) + 1); +- +- if (bind (sock, (struct sockaddr *) &name, size) < 0) +- @{ +- perror ("bind"); +- exit (EXIT_FAILURE); +- @} +- +- return sock; +-@} +diff -u -udbrN glibc-2.3.2/manual/mkisock.c.texi glibc-2.3.2-200304020432/manual/mkisock.c.texi +--- glibc-2.3.2/manual/mkisock.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/mkisock.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,31 +0,0 @@ +-#include +-#include +-#include +-#include +- +-int +-make_socket (uint16_t port) +-@{ +- int sock; +- struct sockaddr_in name; +- +- /* @r{Create the socket.} */ +- sock = socket (PF_INET, SOCK_STREAM, 0); +- if (sock < 0) +- @{ +- perror ("socket"); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Give the socket a name.} */ +- name.sin_family = AF_INET; +- name.sin_port = htons (port); +- name.sin_addr.s_addr = htonl (INADDR_ANY); +- if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0) +- @{ +- perror ("bind"); +- exit (EXIT_FAILURE); +- @} +- +- return sock; +-@} +diff -u -udbrN glibc-2.3.2/manual/mygetpass.c.texi glibc-2.3.2-200304020432/manual/mygetpass.c.texi +--- glibc-2.3.2/manual/mygetpass.c.texi Tue Apr 18 06:13:59 2000 ++++ glibc-2.3.2-200304020432/manual/mygetpass.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,25 +0,0 @@ +-#include +-#include +- +-ssize_t +-my_getpass (char **lineptr, size_t *n, FILE *stream) +-@{ +- struct termios old, new; +- int nread; +- +- /* @r{Turn echoing off and fail if we can't.} */ +- if (tcgetattr (fileno (stream), &old) != 0) +- return -1; +- new = old; +- new.c_lflag &= ~ECHO; +- if (tcsetattr (fileno (stream), TCSAFLUSH, &new) != 0) +- return -1; +- +- /* @r{Read the password.} */ +- nread = getline (lineptr, n, stream); +- +- /* @r{Restore terminal.} */ +- (void) tcsetattr (fileno (stream), TCSAFLUSH, &old); +- +- return nread; +-@} +diff -u -udbrN glibc-2.3.2/manual/pipe.c.texi glibc-2.3.2-200304020432/manual/pipe.c.texi +--- glibc-2.3.2/manual/pipe.c.texi Sat Oct 30 08:39:31 1999 ++++ glibc-2.3.2-200304020432/manual/pipe.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,70 +0,0 @@ +-#include +-#include +-#include +-#include +- +-/* @r{Read characters from the pipe and echo them to @code{stdout}.} */ +- +-void +-read_from_pipe (int file) +-@{ +- FILE *stream; +- int c; +- stream = fdopen (file, "r"); +- while ((c = fgetc (stream)) != EOF) +- putchar (c); +- fclose (stream); +-@} +- +-/* @r{Write some random text to the pipe.} */ +- +-void +-write_to_pipe (int file) +-@{ +- FILE *stream; +- stream = fdopen (file, "w"); +- fprintf (stream, "hello, world!\n"); +- fprintf (stream, "goodbye, world!\n"); +- fclose (stream); +-@} +- +-int +-main (void) +-@{ +- pid_t pid; +- int mypipe[2]; +- +-@group +- /* @r{Create the pipe.} */ +- if (pipe (mypipe)) +- @{ +- fprintf (stderr, "Pipe failed.\n"); +- return EXIT_FAILURE; +- @} +-@end group +- +- /* @r{Create the child process.} */ +- pid = fork (); +- if (pid == (pid_t) 0) +- @{ +- /* @r{This is the child process. +- Close other end first.} */ +- close (mypipe[1]); +- read_from_pipe (mypipe[0]); +- return EXIT_SUCCESS; +- @} +- else if (pid < (pid_t) 0) +- @{ +- /* @r{The fork failed.} */ +- fprintf (stderr, "Fork failed.\n"); +- return EXIT_FAILURE; +- @} +- else +- @{ +- /* @r{This is the parent process. +- Close other end first.} */ +- close (mypipe[0]); +- write_to_pipe (mypipe[1]); +- return EXIT_SUCCESS; +- @} +-@} +diff -u -udbrN glibc-2.3.2/manual/popen.c.texi glibc-2.3.2-200304020432/manual/popen.c.texi +--- glibc-2.3.2/manual/popen.c.texi Wed Aug 2 21:25:17 2000 ++++ glibc-2.3.2-200304020432/manual/popen.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,38 +0,0 @@ +-#include +-#include +- +-void +-write_data (FILE * stream) +-@{ +- int i; +- for (i = 0; i < 100; i++) +- fprintf (stream, "%d\n", i); +- if (ferror (stream)) +- @{ +- fprintf (stderr, "Output to stream failed.\n"); +- exit (EXIT_FAILURE); +- @} +-@} +- +-@group +-int +-main (void) +-@{ +- FILE *output; +- +- output = popen ("more", "w"); +- if (!output) +- @{ +- fprintf (stderr, +- "incorrect parameters or too many files.\n"); +- return EXIT_FAILURE; +- @} +- write_data (output); +- if (pclose (output) != 0) +- @{ +- fprintf (stderr, +- "Could not run more or other error.\n"); +- @} +- return EXIT_SUCCESS; +-@} +-@end group +diff -u -udbrN glibc-2.3.2/manual/rprintf.c.texi glibc-2.3.2-200304020432/manual/rprintf.c.texi +--- glibc-2.3.2/manual/rprintf.c.texi Mon Jan 11 19:57:12 1999 ++++ glibc-2.3.2-200304020432/manual/rprintf.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,67 +0,0 @@ +-#include +-#include +-#include +- +-@group +-typedef struct +-@{ +- char *name; +-@} +-Widget; +-@end group +- +-int +-print_widget (FILE *stream, +- const struct printf_info *info, +- const void *const *args) +-@{ +- const Widget *w; +- char *buffer; +- int len; +- +- /* @r{Format the output into a string.} */ +- w = *((const Widget **) (args[0])); +- len = asprintf (&buffer, "", w, w->name); +- if (len == -1) +- return -1; +- +- /* @r{Pad to the minimum field width and print to the stream.} */ +- len = fprintf (stream, "%*s", +- (info->left ? -info->width : info->width), +- buffer); +- +- /* @r{Clean up and return.} */ +- free (buffer); +- return len; +-@} +- +- +-int +-print_widget_arginfo (const struct printf_info *info, size_t n, +- int *argtypes) +-@{ +- /* @r{We always take exactly one argument and this is a pointer to the +- structure..} */ +- if (n > 0) +- argtypes[0] = PA_POINTER; +- return 1; +-@} +- +- +-int +-main (void) +-@{ +- /* @r{Make a widget to print.} */ +- Widget mywidget; +- mywidget.name = "mywidget"; +- +- /* @r{Register the print function for widgets.} */ +- register_printf_function ('W', print_widget, print_widget_arginfo); +- +- /* @r{Now print the widget.} */ +- printf ("|%W|\n", &mywidget); +- printf ("|%35W|\n", &mywidget); +- printf ("|%-35W|\n", &mywidget); +- +- return 0; +-@} +diff -u -udbrN glibc-2.3.2/manual/search.c.texi glibc-2.3.2-200304020432/manual/search.c.texi +--- glibc-2.3.2/manual/search.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/search.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,93 +0,0 @@ +-#include +-#include +-#include +- +-/* @r{Define an array of critters to sort.} */ +- +-struct critter +- @{ +- const char *name; +- const char *species; +- @}; +- +-struct critter muppets[] = +- @{ +- @{"Kermit", "frog"@}, +- @{"Piggy", "pig"@}, +- @{"Gonzo", "whatever"@}, +- @{"Fozzie", "bear"@}, +- @{"Sam", "eagle"@}, +- @{"Robin", "frog"@}, +- @{"Animal", "animal"@}, +- @{"Camilla", "chicken"@}, +- @{"Sweetums", "monster"@}, +- @{"Dr. Strangepork", "pig"@}, +- @{"Link Hogthrob", "pig"@}, +- @{"Zoot", "human"@}, +- @{"Dr. Bunsen Honeydew", "human"@}, +- @{"Beaker", "human"@}, +- @{"Swedish Chef", "human"@} +- @}; +- +-int count = sizeof (muppets) / sizeof (struct critter); +- +- +- +-/* @r{This is the comparison function used for sorting and searching.} */ +- +-int +-critter_cmp (const struct critter *c1, const struct critter *c2) +-@{ +- return strcmp (c1->name, c2->name); +-@} +- +- +-/* @r{Print information about a critter.} */ +- +-void +-print_critter (const struct critter *c) +-@{ +- printf ("%s, the %s\n", c->name, c->species); +-@} +- +- +-@group +-/* @r{Do the lookup into the sorted array.} */ +- +-void +-find_critter (const char *name) +-@{ +- struct critter target, *result; +- target.name = name; +- result = bsearch (&target, muppets, count, sizeof (struct critter), +- critter_cmp); +- if (result) +- print_critter (result); +- else +- printf ("Couldn't find %s.\n", name); +-@} +-@end group +- +-/* @r{Main program.} */ +- +-int +-main (void) +-@{ +- int i; +- +- for (i = 0; i < count; i++) +- print_critter (&muppets[i]); +- printf ("\n"); +- +- qsort (muppets, count, sizeof (struct critter), critter_cmp); +- +- for (i = 0; i < count; i++) +- print_critter (&muppets[i]); +- printf ("\n"); +- +- find_critter ("Kermit"); +- find_critter ("Gonzo"); +- find_critter ("Janice"); +- +- return 0; +-@} +diff -u -udbrN glibc-2.3.2/manual/select.c.texi glibc-2.3.2-200304020432/manual/select.c.texi +--- glibc-2.3.2/manual/select.c.texi Mon Nov 18 20:37:19 2002 ++++ glibc-2.3.2-200304020432/manual/select.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,41 +0,0 @@ +-@group +-#include +-#include +-#include +-#include +-#include +-@end group +- +-@group +-int +-input_timeout (int filedes, unsigned int seconds) +-@{ +- fd_set set; +- struct timeval timeout; +-@end group +- +- /* @r{Initialize the file descriptor set.} */ +- FD_ZERO (&set); +- FD_SET (filedes, &set); +- +- /* @r{Initialize the timeout data structure.} */ +- timeout.tv_sec = seconds; +- timeout.tv_usec = 0; +- +-@group +- /* @r{@code{select} returns 0 if timeout, 1 if input available, -1 if error.} */ +- return TEMP_FAILURE_RETRY (select (FD_SETSIZE, +- &set, NULL, NULL, +- &timeout)); +-@} +-@end group +- +-@group +-int +-main (void) +-@{ +- fprintf (stderr, "select returned %d.\n", +- input_timeout (STDIN_FILENO, 5)); +- return 0; +-@} +-@end group +diff -u -udbrN glibc-2.3.2/manual/setjmp.c.texi glibc-2.3.2-200304020432/manual/setjmp.c.texi +--- glibc-2.3.2/manual/setjmp.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/setjmp.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,32 +0,0 @@ +-#include +-#include +-#include +- +-jmp_buf main_loop; +- +-void +-abort_to_main_loop (int status) +-@{ +- longjmp (main_loop, status); +-@} +- +-int +-main (void) +-@{ +- while (1) +- if (setjmp (main_loop)) +- puts ("Back at main loop...."); +- else +- do_command (); +-@} +- +- +-void +-do_command (void) +-@{ +- char buffer[128]; +- if (fgets (buffer, 128, stdin) == NULL) +- abort_to_main_loop (-1); +- else +- exit (EXIT_SUCCESS); +-@} +diff -u -udbrN glibc-2.3.2/manual/sigh1.c.texi glibc-2.3.2-200304020432/manual/sigh1.c.texi +--- glibc-2.3.2/manual/sigh1.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/sigh1.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,36 +0,0 @@ +-#include +-#include +-#include +- +-/* @r{This flag controls termination of the main loop.} */ +-volatile sig_atomic_t keep_going = 1; +- +-/* @r{The signal handler just clears the flag and re-enables itself.} */ +-void +-catch_alarm (int sig) +-@{ +- keep_going = 0; +- signal (sig, catch_alarm); +-@} +- +-void +-do_stuff (void) +-@{ +- puts ("Doing stuff while waiting for alarm...."); +-@} +- +-int +-main (void) +-@{ +- /* @r{Establish a handler for SIGALRM signals.} */ +- signal (SIGALRM, catch_alarm); +- +- /* @r{Set an alarm to go off in a little while.} */ +- alarm (2); +- +- /* @r{Check the flag once in a while to see when to quit.} */ +- while (keep_going) +- do_stuff (); +- +- return EXIT_SUCCESS; +-@} +diff -u -udbrN glibc-2.3.2/manual/sigusr.c.texi glibc-2.3.2-200304020432/manual/sigusr.c.texi +--- glibc-2.3.2/manual/sigusr.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/sigusr.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,61 +0,0 @@ +-@group +-#include +-#include +-#include +-#include +-@end group +- +-/* @r{When a @code{SIGUSR1} signal arrives, set this variable.} */ +-volatile sig_atomic_t usr_interrupt = 0; +- +-void +-synch_signal (int sig) +-@{ +- usr_interrupt = 1; +-@} +- +-/* @r{The child process executes this function.} */ +-void +-child_function (void) +-@{ +- /* @r{Perform initialization.} */ +- printf ("I'm here!!! My pid is %d.\n", (int) getpid ()); +- +- /* @r{Let parent know you're done.} */ +- kill (getppid (), SIGUSR1); +- +- /* @r{Continue with execution.} */ +- puts ("Bye, now...."); +- exit (0); +-@} +- +-int +-main (void) +-@{ +- struct sigaction usr_action; +- sigset_t block_mask; +- pid_t child_id; +- +- /* @r{Establish the signal handler.} */ +- sigfillset (&block_mask); +- usr_action.sa_handler = synch_signal; +- usr_action.sa_mask = block_mask; +- usr_action.sa_flags = 0; +- sigaction (SIGUSR1, &usr_action, NULL); +- +- /* @r{Create the child process.} */ +- child_id = fork (); +- if (child_id == 0) +- child_function (); /* @r{Does not return.} */ +- +-@group +- /* @r{Busy wait for the child to send a signal.} */ +- while (!usr_interrupt) +- ; +-@end group +- +- /* @r{Now continue execution.} */ +- puts ("That's all, folks!"); +- +- return 0; +-@} +diff -u -udbrN glibc-2.3.2/manual/stpcpy.c.texi glibc-2.3.2-200304020432/manual/stpcpy.c.texi +--- glibc-2.3.2/manual/stpcpy.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/stpcpy.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,13 +0,0 @@ +-#include +-#include +- +-int +-main (void) +-@{ +- char buffer[10]; +- char *to = buffer; +- to = stpcpy (to, "foo"); +- to = stpcpy (to, "bar"); +- puts (buffer); +- return 0; +-@} +diff -u -udbrN glibc-2.3.2/manual/strdupa.c.texi glibc-2.3.2-200304020432/manual/strdupa.c.texi +--- glibc-2.3.2/manual/strdupa.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/strdupa.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,19 +0,0 @@ +-#include +-#include +-#include +- +-const char path[] = _PATH_STDPATH; +- +-int +-main (void) +-@{ +- char *wr_path = strdupa (path); +- char *cp = strtok (wr_path, ":"); +- +- while (cp != NULL) +- @{ +- puts (cp); +- cp = strtok (NULL, ":"); +- @} +- return 0; +-@} +diff -u -udbrN glibc-2.3.2/manual/strftim.c.texi glibc-2.3.2-200304020432/manual/strftim.c.texi +--- glibc-2.3.2/manual/strftim.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/strftim.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,31 +0,0 @@ +-#include +-#include +- +-#define SIZE 256 +- +-int +-main (void) +-@{ +- char buffer[SIZE]; +- time_t curtime; +- struct tm *loctime; +- +- /* @r{Get the current time.} */ +- curtime = time (NULL); +- +- /* @r{Convert it to local time representation.} */ +- loctime = localtime (&curtime); +- +- /* @r{Print out the date and time in the standard format.} */ +- fputs (asctime (loctime), stdout); +- +-@group +- /* @r{Print it out in a nice format.} */ +- strftime (buffer, SIZE, "Today is %A, %B %d.\n", loctime); +- fputs (buffer, stdout); +- strftime (buffer, SIZE, "The time is %I:%M %p.\n", loctime); +- fputs (buffer, stdout); +- +- return 0; +-@} +-@end group +diff -u -udbrN glibc-2.3.2/manual/strncat.c.texi glibc-2.3.2-200304020432/manual/strncat.c.texi +--- glibc-2.3.2/manual/strncat.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/strncat.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,14 +0,0 @@ +-#include +-#include +- +-#define SIZE 10 +- +-static char buffer[SIZE]; +- +-main () +-@{ +- strncpy (buffer, "hello", SIZE); +- puts (buffer); +- strncat (buffer, ", world", SIZE - strlen (buffer) - 1); +- puts (buffer); +-@} +diff -u -udbrN glibc-2.3.2/manual/subopt.c.texi glibc-2.3.2-200304020432/manual/subopt.c.texi +--- glibc-2.3.2/manual/subopt.c.texi Sat Apr 22 09:29:06 2000 ++++ glibc-2.3.2-200304020432/manual/subopt.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,78 +0,0 @@ +-#include +-#include +-#include +- +-int do_all; +-const char *type; +-int read_size; +-int write_size; +-int read_only; +- +-enum +-@{ +- RO_OPTION = 0, +- RW_OPTION, +- READ_SIZE_OPTION, +- WRITE_SIZE_OPTION, +- THE_END +-@}; +- +-const char *mount_opts[] = +-@{ +- [RO_OPTION] = "ro", +- [RW_OPTION] = "rw", +- [READ_SIZE_OPTION] = "rsize", +- [WRITE_SIZE_OPTION] = "wsize", +- [THE_END] = NULL +-@}; +- +-int +-main (int argc, char *argv[]) +-@{ +- char *subopts, *value; +- int opt; +- +- while ((opt = getopt (argc, argv, "at:o:")) != -1) +- switch (opt) +- @{ +- case 'a': +- do_all = 1; +- break; +- case 't': +- type = optarg; +- break; +- case 'o': +- subopts = optarg; +- while (*subopts != '\0') +- switch (getsubopt (&subopts, mount_opts, &value)) +- @{ +- case RO_OPTION: +- read_only = 1; +- break; +- case RW_OPTION: +- read_only = 0; +- break; +- case READ_SIZE_OPTION: +- if (value == NULL) +- abort (); +- read_size = atoi (value); +- break; +- case WRITE_SIZE_OPTION: +- if (value == NULL) +- abort (); +- write_size = atoi (value); +- break; +- default: +- /* @r{Unknown suboption.} */ +- printf ("Unknown suboption `%s'\n", value); +- break; +- @} +- break; +- default: +- abort (); +- @} +- +- /* @r{Do the real work.} */ +- +- return 0; +-@} +diff -u -udbrN glibc-2.3.2/manual/swapcontext.c.texi glibc-2.3.2-200304020432/manual/swapcontext.c.texi +--- glibc-2.3.2/manual/swapcontext.c.texi Mon Apr 9 00:26:17 2001 ++++ glibc-2.3.2-200304020432/manual/swapcontext.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,99 +0,0 @@ +-#include +-#include +-#include +-#include +-#include +- +-/* @r{Set by the signal handler.} */ +-static volatile int expired; +- +-/* @r{The contexts.} */ +-static ucontext_t uc[3]; +- +-/* @r{We do only a certain number of switches.} */ +-static int switches; +- +- +-/* @r{This is the function doing the work. It is just a +- skeleton, real code has to be filled in.} */ +-static void +-f (int n) +-@{ +- int m = 0; +- while (1) +- @{ +- /* @r{This is where the work would be done.} */ +- if (++m % 100 == 0) +- @{ +- putchar ('.'); +- fflush (stdout); +- @} +- +- /* @r{Regularly the @var{expire} variable must be checked.} */ +- if (expired) +- @{ +- /* @r{We do not want the program to run forever.} */ +- if (++switches == 20) +- return; +- +- printf ("\nswitching from %d to %d\n", n, 3 - n); +- expired = 0; +- /* @r{Switch to the other context, saving the current one.} */ +- swapcontext (&uc[n], &uc[3 - n]); +- @} +- @} +-@} +- +-/* @r{This is the signal handler which simply set the variable.} */ +-void +-handler (int signal) +-@{ +- expired = 1; +-@} +- +- +-int +-main (void) +-@{ +- struct sigaction sa; +- struct itimerval it; +- char st1[8192]; +- char st2[8192]; +- +- /* @r{Initialize the data structures for the interval timer.} */ +- sa.sa_flags = SA_RESTART; +- sigfillset (&sa.sa_mask); +- sa.sa_handler = handler; +- it.it_interval.tv_sec = 0; +- it.it_interval.tv_usec = 1; +- it.it_value = it.it_interval; +- +- /* @r{Install the timer and get the context we can manipulate.} */ +- if (sigaction (SIGPROF, &sa, NULL) < 0 +- || setitimer (ITIMER_PROF, &it, NULL) < 0 +- || getcontext (&uc[1]) == -1 +- || getcontext (&uc[2]) == -1) +- abort (); +- +- /* @r{Create a context with a separate stack which causes the +- function @code{f} to be call with the parameter @code{1}. +- Note that the @code{uc_link} points to the main context +- which will cause the program to terminate once the function +- return.} */ +- uc[1].uc_link = &uc[0]; +- uc[1].uc_stack.ss_sp = st1; +- uc[1].uc_stack.ss_size = sizeof st1; +- makecontext (&uc[1], (void (*) (void)) f, 1, 1); +- +- /* @r{Similarly, but @code{2} is passed as the parameter to @code{f}.} */ +- uc[2].uc_link = &uc[0]; +- uc[2].uc_stack.ss_sp = st2; +- uc[2].uc_stack.ss_size = sizeof st2; +- makecontext (&uc[2], (void (*) (void)) f, 1, 2); +- +- /* @r{Start running.} */ +- swapcontext (&uc[0], &uc[1]); +- putchar ('\n'); +- +- return 0; +-@} +diff -u -udbrN glibc-2.3.2/manual/termios.c.texi glibc-2.3.2-200304020432/manual/termios.c.texi +--- glibc-2.3.2/manual/termios.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/termios.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,60 +0,0 @@ +-#include +-#include +-#include +-#include +- +-/* @r{Use this variable to remember original terminal attributes.} */ +- +-struct termios saved_attributes; +- +-void +-reset_input_mode (void) +-@{ +- tcsetattr (STDIN_FILENO, TCSANOW, &saved_attributes); +-@} +- +-void +-set_input_mode (void) +-@{ +- struct termios tattr; +- char *name; +- +- /* @r{Make sure stdin is a terminal.} */ +- if (!isatty (STDIN_FILENO)) +- @{ +- fprintf (stderr, "Not a terminal.\n"); +- exit (EXIT_FAILURE); +- @} +- +- /* @r{Save the terminal attributes so we can restore them later.} */ +- tcgetattr (STDIN_FILENO, &saved_attributes); +- atexit (reset_input_mode); +- +-@group +- /* @r{Set the funny terminal modes.} */ +- tcgetattr (STDIN_FILENO, &tattr); +- tattr.c_lflag &= ~(ICANON|ECHO); /* @r{Clear ICANON and ECHO.} */ +- tattr.c_cc[VMIN] = 1; +- tattr.c_cc[VTIME] = 0; +- tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr); +-@} +-@end group +- +-int +-main (void) +-@{ +- char c; +- +- set_input_mode (); +- +- while (1) +- @{ +- read (STDIN_FILENO, &c, 1); +- if (c == '\004') /* @r{@kbd{C-d}} */ +- break; +- else +- putchar (c); +- @} +- +- return EXIT_SUCCESS; +-@} +diff -u -udbrN glibc-2.3.2/manual/testopt.c.texi glibc-2.3.2-200304020432/manual/testopt.c.texi +--- glibc-2.3.2/manual/testopt.c.texi Wed Dec 9 23:51:53 1998 ++++ glibc-2.3.2-200304020432/manual/testopt.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,51 +0,0 @@ +-@group +-#include +-#include +- +-int +-main (int argc, char **argv) +-@{ +- int aflag = 0; +- int bflag = 0; +- char *cvalue = NULL; +- int index; +- int c; +- +- opterr = 0; +-@end group +- +-@group +- while ((c = getopt (argc, argv, "abc:")) != -1) +- switch (c) +- @{ +- case 'a': +- aflag = 1; +- break; +- case 'b': +- bflag = 1; +- break; +- case 'c': +- cvalue = optarg; +- break; +- case '?': +- if (isprint (optopt)) +- fprintf (stderr, "Unknown option `-%c'.\n", optopt); +- else +- fprintf (stderr, +- "Unknown option character `\\x%x'.\n", +- optopt); +- return 1; +- default: +- abort (); +- @} +-@end group +- +-@group +- printf ("aflag = %d, bflag = %d, cvalue = %s\n", +- aflag, bflag, cvalue); +- +- for (index = optind; index < argc; index++) +- printf ("Non-option argument %s\n", argv[index]); +- return 0; +-@} +-@end group +diff -u -udbrN glibc-2.3.2/manual/testpass.c.texi glibc-2.3.2-200304020432/manual/testpass.c.texi +--- glibc-2.3.2/manual/testpass.c.texi Tue Apr 18 06:13:59 2000 ++++ glibc-2.3.2-200304020432/manual/testpass.c.texi Thu Jan 1 01:00:00 1970 +@@ -1,26 +0,0 @@ +-#include +-#include +-#include +-#include +- +-int +-main(void) +-@{ +- /* @r{Hashed form of "GNU libc manual".} */ +- const char *const pass = "$1$/iSaq7rB$EoUw5jJPPvAPECNaaWzMK/"; +- +- char *result; +- int ok; +- +-@group +- /* @r{Read in the user's password and encrypt it, +- passing the expected password in as the salt.} */ +- result = crypt(getpass("Password:"), pass); +-@end group +- +- /* @r{Test the result.} */ +- ok = strcmp (result, pass) == 0; +- +- puts(ok ? "Access granted." : "Access denied."); +- return ok ? 0 : 1; +-@} +diff -u -udbrN glibc-2.3.2/math/libm-test.inc glibc-2.3.2-200304020432/math/libm-test.inc +--- glibc-2.3.2/math/libm-test.inc Sat Feb 15 07:55:23 2003 ++++ glibc-2.3.2-200304020432/math/libm-test.inc Sat Mar 22 07:13:35 2003 +@@ -1537,7 +1537,7 @@ + TEST_c_c (ccos, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (ccos, 0.75L, 1.25L, 1.38173873063425888530729933139078645L, -1.09193013555397466170919531722024128L); +- TEST_c_c (ccos, -2, -3, -4.1896256909688072301L, -9.1092278937553365979L); ++ TEST_c_c (ccos, -2, -3, -4.18962569096880723013255501961597373L, -9.10922789375533659797919726277886212L); + + END (ccos, complex); + } +@@ -1606,7 +1606,7 @@ + + TEST_c_c (ccosh, 0.75L, 1.25L, 0.408242591877968807788852146397499084L, 0.780365930845853240391326216300863152L); + +- TEST_c_c (ccosh, -2, -3, -3.7245455049153225654L, 0.5118225699873846088L); ++ TEST_c_c (ccosh, -2, -3, -3.72454550491532256547397070325597253L, 0.511822569987384608834463849801875634L); + + END (ccosh, complex); + } +@@ -1836,7 +1836,7 @@ + TEST_c_c (clog10, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (clog10, 0.75L, 1.25L, 0.163679467193165171449476605077428975L, 0.447486970040493067069984724340855636L); +- TEST_c_c (clog10, -2, -3, 0.5569716761534183846L, -0.9375544629863747085L); ++ TEST_c_c (clog10, -2, -3, 0.556971676153418384603252578971164214L, -0.937554462986374708541507952140189646L); + + END (clog10, complex); + } +@@ -2072,7 +2072,7 @@ + TEST_c_c (csin, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (csin, 0.75L, 1.25L, 1.28722291002649188575873510790565441L, 1.17210635989270256101081285116138863L); +- TEST_c_c (csin, -2, -3, -9.1544991469114295734L, 4.1689069599665643507L); ++ TEST_c_c (csin, -2, -3, -9.15449914691142957346729954460983256L, 4.16890695996656435075481305885375484L); + + END (csin, complex); + } +@@ -2140,7 +2140,7 @@ + TEST_c_c (csinh, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (csinh, 0.75L, 1.25L, 0.259294854551162779153349830618433028L, 1.22863452409509552219214606515777594L); +- TEST_c_c (csinh, -2, -3, 3.5905645899857799520L, -0.5309210862485198052L); ++ TEST_c_c (csinh, -2, -3, 3.59056458998577995201256544779481679L, -0.530921086248519805267040090660676560L); + + END (csinh, complex); + } +@@ -2264,7 +2264,7 @@ + TEST_c_c (ctan, nan_value, nan_value, nan_value, nan_value); + + TEST_c_c (ctan, 0.75L, 1.25L, 0.160807785916206426725166058173438663L, 0.975363285031235646193581759755216379L); +- TEST_c_c (ctan, -2, -3, 0.0037640256415042482L, -1.0032386273536098014L); ++ TEST_c_c (ctan, -2, -3, 0.376402564150424829275122113032269084e-2L, -1.00323862735360980144635859782192726L); + + END (ctan, complex); + } +@@ -2323,7 +2323,7 @@ + TEST_c_c (ctanh, 0, M_PI_4l, 0.0, 1.0); + + TEST_c_c (ctanh, 0.75L, 1.25L, 1.37260757053378320258048606571226857L, 0.385795952609750664177596760720790220L); +- TEST_c_c (ctanh, -2, -3, -0.9653858790221331242L, 0.0098843750383224937L); ++ TEST_c_c (ctanh, -2, -3, -0.965385879022133124278480269394560686L, 0.988437503832249372031403430350121098e-2L); + + END (ctanh, complex); + } +@@ -3067,8 +3067,8 @@ + + TEST_f_f1 (lgamma, 0.5, M_LOG_SQRT_PIl, 1); + TEST_f_f1 (lgamma, -0.5, M_LOG_2_SQRT_PIl, -1); +- TEST_f_f1 (lgamma, 0.7L, 0.26086724653166651439L, 1); +- TEST_f_f1 (lgamma, 1.2L, -0.853740900033158497197e-1L, 1); ++ TEST_f_f1 (lgamma, 0.7L, 0.260867246531666514385732417016759578L, 1); ++ TEST_f_f1 (lgamma, 1.2L, -0.853740900033158497197028392998854470e-1L, 1); + + END (lgamma); + } +@@ -4078,8 +4078,8 @@ + TEST_f_f (tgamma, 1, 1); + TEST_f_f (tgamma, 4, 6); + +- TEST_f_f (tgamma, 0.7L, 1.29805533264755778568L); +- TEST_f_f (tgamma, 1.2L, 0.91816874239976061064L); ++ TEST_f_f (tgamma, 0.7L, 1.29805533264755778568117117915281162L); ++ TEST_f_f (tgamma, 1.2L, 0.918168742399760610640951655185830401L); + + END (tgamma); + } +diff -u -udbrN glibc-2.3.2/math/tgmath.h glibc-2.3.2-200304020432/math/tgmath.h +--- glibc-2.3.2/math/tgmath.h Sat Jul 7 21:21:06 2001 ++++ glibc-2.3.2-200304020432/math/tgmath.h Mon Mar 3 20:39:31 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ++/* Copyright (C) 1997, 1998, 1999, 2000, 2001, 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 +@@ -74,6 +74,17 @@ + __tgmres = __tgml(Fct) (Val); \ + __tgmres; })) + ++# define __TGMATH_UNARY_REAL_RET_ONLY(Val, RetType, Fct) \ ++ (__extension__ ({ RetType __tgmres; \ ++ if (sizeof (Val) == sizeof (double) \ ++ || __builtin_classify_type (Val) != 8) \ ++ __tgmres = Fct (Val); \ ++ else if (sizeof (Val) == sizeof (float)) \ ++ __tgmres = Fct##f (Val); \ ++ else \ ++ __tgmres = __tgml(Fct) (Val); \ ++ __tgmres; })) ++ + # define __TGMATH_BINARY_FIRST_REAL_ONLY(Val1, Val2, Fct) \ + (__extension__ ({ __tgmath_real_type (Val1) __tgmres; \ + if (sizeof (Val1) == sizeof (double) \ +@@ -345,13 +356,13 @@ + + /* Round X to nearest integral value according to current rounding + direction. */ +-#define lrint(Val) __TGMATH_UNARY_REAL_ONLY (Val, lrint) +-#define llrint(Val) __TGMATH_UNARY_REAL_ONLY (Val, llrint) ++#define lrint(Val) __TGMATH_UNARY_REAL_RET_ONLY (Val, long int, lrint) ++#define llrint(Val) __TGMATH_UNARY_REAL_RET_ONLY (Val, long long int, llrint) + + /* Round X to nearest integral value, rounding halfway cases away from + zero. */ +-#define lround(Val) __TGMATH_UNARY_REAL_ONLY (Val, lround) +-#define llround(Val) __TGMATH_UNARY_REAL_ONLY (Val, llround) ++#define lround(Val) __TGMATH_UNARY_REAL_RET_ONLY (Val, long int, lround) ++#define llround(Val) __TGMATH_UNARY_REAL_RET_ONLY (Val, long long int, llround) + + + /* Return X with its signed changed to Y's. */ +diff -u -udbrN glibc-2.3.2/misc/Makefile glibc-2.3.2-200304020432/misc/Makefile +--- glibc-2.3.2/misc/Makefile Tue Aug 27 06:52:37 2002 ++++ glibc-2.3.2-200304020432/misc/Makefile Mon Mar 3 20:32:52 2003 +@@ -1,4 +1,4 @@ +-# Copyright (C) 1991-1999, 2000, 2001, 2002 Free Software Foundation, Inc. ++# Copyright (C) 1991-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 +@@ -52,7 +52,7 @@ + chflags fchflags \ + insremque getttyent getusershell getpass ttyslot \ + syslog syscall daemon \ +- mmap mmap64 munmap mprotect msync madvise mincore \ ++ mmap mmap64 munmap mprotect msync madvise mincore remap_file_pages\ + mlock munlock mlockall munlockall \ + efgcvt efgcvt_r qefgcvt qefgcvt_r \ + hsearch hsearch_r tsearch lsearch \ +diff -u -udbrN glibc-2.3.2/misc/Versions glibc-2.3.2-200304020432/misc/Versions +--- glibc-2.3.2/misc/Versions Wed Dec 18 23:49:52 2002 ++++ glibc-2.3.2-200304020432/misc/Versions Mon Mar 3 10:47:42 2003 +@@ -127,6 +127,9 @@ + # s* + setxattr; + } ++ GLIBC_2.3.3 { ++ remap_file_pages; ++ } + GLIBC_PRIVATE { + # functions which have an additional interface since they are + # cancelable. +diff -u -udbrN glibc-2.3.2/misc/sys/mman.h glibc-2.3.2-200304020432/misc/sys/mman.h +--- glibc-2.3.2/misc/sys/mman.h Sat Jul 7 21:21:06 2001 ++++ glibc-2.3.2-200304020432/misc/sys/mman.h Mon Mar 3 10:45:34 2003 +@@ -1,5 +1,5 @@ + /* Definitions for BSD-style memory management. +- Copyright (C) 1994-1999, 2000 Free Software Foundation, Inc. ++ Copyright (C) 1994-1999, 2000, 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 +@@ -124,7 +124,13 @@ + The status is returned in a vector of bytes. The least significant + bit of each byte is 1 if the referenced page is in memory, otherwise + it is zero. */ +-extern int mincore (void *__start, size_t __len, unsigned char *__vec); ++extern int mincore (void *__start, size_t __len, unsigned char *__vec) ++ __THROW; ++ ++/* Remap arbitrary pages of a shared backing store within an existing ++ VMA. */ ++extern int remap_file_pages (void *__start, size_t __size, int __prot, ++ size_t __pgoff, int __flags) __THROW; + #endif + + +diff -u -udbrN glibc-2.3.2/nis/nis_table.c glibc-2.3.2-200304020432/nis/nis_table.c +--- glibc-2.3.2/nis/nis_table.c Sat Jul 7 21:21:06 2001 ++++ glibc-2.3.2-200304020432/nis/nis_table.c Sun Mar 16 04:36:21 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (c) 1997, 1998, 1999 Free Software Foundation, Inc. ++/* Copyright (c) 1997, 1998, 1999, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Thorsten Kukuk , 1997. + +@@ -30,7 +30,7 @@ + struct ib_request *ibreq = calloc (1, sizeof (ib_request)); + char buf[strlen (name) + 1]; + nis_attr *search_val = NULL; +- int search_len = 0; ++ size_t search_len = 0; + char *cptr; + size_t size = 0; + +diff -u -udbrN glibc-2.3.2/nis/nss_nis/nis-alias.c glibc-2.3.2-200304020432/nis/nss_nis/nis-alias.c +--- glibc-2.3.2/nis/nss_nis/nis-alias.c Sat Jan 18 11:21:02 2003 ++++ glibc-2.3.2-200304020432/nis/nss_nis/nis-alias.c Sun Mar 16 04:36:21 2003 +@@ -214,7 +214,7 @@ + char *p; + size_t namlen = strlen (name); + char name2[namlen + 1]; +- int i; ++ size_t i; + + if (name == NULL) + { +diff -u -udbrN glibc-2.3.2/nis/nss_nis/nis-hosts.c glibc-2.3.2-200304020432/nis/nss_nis/nis-hosts.c +--- glibc-2.3.2/nis/nss_nis/nis-hosts.c Sat Jan 18 11:40:11 2003 ++++ glibc-2.3.2-200304020432/nis/nss_nis/nis-hosts.c Sun Mar 16 04:36:21 2003 +@@ -261,7 +261,7 @@ + /* Convert name to lowercase. */ + size_t namlen = strlen (name); + char name2[namlen + 1]; +- int i; ++ size_t i; + + for (i = 0; i < namlen; ++i) + name2[i] = tolower (name[i]); +diff -u -udbrN glibc-2.3.2/nis/nss_nis/nis-network.c glibc-2.3.2-200304020432/nis/nss_nis/nis-network.c +--- glibc-2.3.2/nis/nss_nis/nis-network.c Sun Jan 19 20:06:27 2003 ++++ glibc-2.3.2-200304020432/nis/nss_nis/nis-network.c Sun Mar 16 04:36:21 2003 +@@ -181,7 +181,7 @@ + /* Convert name to lowercase. */ + size_t namlen = strlen (name); + char name2[namlen + 1]; +- int i; ++ size_t i; + + for (i = 0; i < namlen; ++i) + name2[i] = _tolower (name[i]); +diff -u -udbrN glibc-2.3.2/nscd/cache.c glibc-2.3.2-200304020432/nscd/cache.c +--- glibc-2.3.2/nscd/cache.c Sat Jul 7 21:21:07 2001 ++++ glibc-2.3.2-200304020432/nscd/cache.c Fri Mar 21 08:45:55 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (c) 1998, 1999 Free Software Foundation, Inc. ++/* Copyright (c) 1998, 1999, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1998. + +@@ -17,7 +17,7 @@ + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +-#include ++#include + #include + #include + #include +@@ -39,7 +39,7 @@ + + This function must be called with the read-lock held. */ + struct hashentry * +-cache_search (int type, void *key, size_t len, struct database *table, ++cache_search (request_type type, void *key, size_t len, struct database *table, + uid_t owner) + { + unsigned long int hash = __nis_hash (key, len) % table->module; +@@ -101,8 +101,8 @@ + /* Put the new entry in the first position. */ + do + newp->next = table->array[hash]; +- while (! compare_and_swap ((volatile long int *) &table->array[hash], +- (long int) newp->next, (long int) newp)); ++ while (atomic_compare_and_exchange_bool_acq (&table->array[hash], newp, ++ newp->next)); + + /* Update the statistics. */ + if (data == (void *) -1) +diff -u -udbrN glibc-2.3.2/nscd/nscd.h glibc-2.3.2-200304020432/nscd/nscd.h +--- glibc-2.3.2/nscd/nscd.h Sat Jul 7 21:21:07 2001 ++++ glibc-2.3.2-200304020432/nscd/nscd.h Sun Mar 16 02:03:43 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (c) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ++/* Copyright (c) 1998, 1999, 2000, 2001, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Thorsten Kukuk , 1998. + +@@ -118,7 +118,7 @@ + extern int receive_print_stats (void) __attribute__ ((__noreturn__)); + + /* cache.c */ +-extern struct hashentry *cache_search (int type, void *key, size_t len, ++extern struct hashentry *cache_search (request_type, void *key, size_t len, + struct database *table, uid_t owner); + extern void cache_add (int type, void *key, size_t len, + const void *packet, size_t iovtotal, void *data, +diff -u -udbrN glibc-2.3.2/nscd/nscd_getgr_r.c glibc-2.3.2-200304020432/nscd/nscd_getgr_r.c +--- glibc-2.3.2/nscd/nscd_getgr_r.c Wed Jan 15 11:42:36 2003 ++++ glibc-2.3.2-200304020432/nscd/nscd_getgr_r.c Sun Mar 16 04:22:23 2003 +@@ -114,8 +114,8 @@ + vec[1].iov_base = (void *) key; + vec[1].iov_len = keylen; + +- nbytes = (size_t) TEMP_FAILURE_RETRY (__writev (sock, vec, 2)); +- if (nbytes != sizeof (request_header) + keylen) ++ nbytes = TEMP_FAILURE_RETRY (__writev (sock, vec, 2)); ++ if (nbytes != (ssize_t) (sizeof (request_header) + keylen)) + { + __close (sock); + return -1; +@@ -123,7 +123,7 @@ + + nbytes = TEMP_FAILURE_RETRY (__read (sock, &gr_resp, + sizeof (gr_response_header))); +- if (nbytes != sizeof (gr_response_header)) ++ if (nbytes != (ssize_t) sizeof (gr_response_header)) + { + __close (sock); + return -1; +@@ -143,7 +143,7 @@ + char *p = buffer; + size_t total_len; + uintptr_t align; +- size_t cnt; ++ nscd_ssize_t cnt; + + /* Now allocate the buffer the array for the group members. We must + align the pointer. */ +diff -u -udbrN glibc-2.3.2/nscd/nscd_getpw_r.c glibc-2.3.2-200304020432/nscd/nscd_getpw_r.c +--- glibc-2.3.2/nscd/nscd_getpw_r.c Wed Jan 15 11:44:16 2003 ++++ glibc-2.3.2-200304020432/nscd/nscd_getpw_r.c Sun Mar 16 04:22:23 2003 +@@ -113,8 +113,8 @@ + vec[1].iov_base = (void *) key; + vec[1].iov_len = keylen; + +- nbytes = (size_t) TEMP_FAILURE_RETRY (__writev (sock, vec, 2)); +- if (nbytes != sizeof (request_header) + keylen) ++ nbytes = TEMP_FAILURE_RETRY (__writev (sock, vec, 2)); ++ if (nbytes != (ssize_t) (sizeof (request_header) + keylen)) + { + __close (sock); + return -1; +@@ -122,7 +122,7 @@ + + nbytes = TEMP_FAILURE_RETRY (__read (sock, &pw_resp, + sizeof (pw_response_header))); +- if (nbytes != sizeof (pw_response_header)) ++ if (nbytes != (ssize_t) sizeof (pw_response_header)) + { + __close (sock); + return -1; +@@ -173,7 +173,7 @@ + + __close (sock); + +- return nbytes == total ? 0 : -1; ++ return nbytes == (ssize_t) total ? 0 : -1; + } + else + { +diff -u -udbrN glibc-2.3.2/nss/db-Makefile glibc-2.3.2-200304020432/nss/db-Makefile +--- glibc-2.3.2/nss/db-Makefile Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/nss/db-Makefile Fri Jul 6 06:55:37 2001 +@@ -0,0 +1,139 @@ ++# Makefile to (re-)generate db versions of system database files. ++# Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++# This file is part of the GNU C Library. ++# Contributed by Ulrich Drepper , 1996. ++# ++ ++# 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. ++ ++DATABASES = $(wildcard /etc/passwd /etc/group /etc/ethers /etc/protocols \ ++ /etc/rpc /etc/services /etc/shadow /etc/netgroup) ++ ++VAR_DB = /var/db ++ ++AWK = awk ++MAKEDB = makedb --quiet ++ ++all: $(patsubst %,$(VAR_DB)/%.db,$(notdir $(DATABASES))) ++ ++ ++$(VAR_DB)/passwd.db: /etc/passwd ++ @echo -n "$(patsubst %.db,%,$(@F))... " ++ @$(AWK) 'BEGIN { FS=":"; OFS=":"; cnt=0 } \ ++ /^[ \t]*$$/ { next } \ ++ /^[ \t]*#/ { next } \ ++ { printf "0%u ", cnt++; print } \ ++ /^[^#]/ { printf ".%s ", $$1; print; \ ++ printf "=%s ", $$3; print }' $^ | \ ++ $(MAKEDB) -o $@ - ++ @echo "done." ++ ++$(VAR_DB)/group.db: /etc/group ++ @echo -n "$(patsubst %.db,%,$(@F))... " ++ @$(AWK) 'BEGIN { FS=":"; OFS=":"; cnt=0 } \ ++ /^[ \t]*$$/ { next } \ ++ /^[ \t]*#/ { next } \ ++ { printf "0%u ", cnt++; print } \ ++ /^[^#]/ { printf ".%s ", $$1; print; \ ++ printf "=%s ", $$3; print }' $^ | \ ++ $(MAKEDB) -o $@ - ++ @echo "done." ++ ++$(VAR_DB)/ethers.db: /etc/ethers ++ @echo -n "$(patsubst %.db,%,$(@F))... " ++ @$(AWK) 'BEGIN { cnt=0 } \ ++ /^[ \t]*$$/ { next } \ ++ /^[ \t]*#/ { next } \ ++ { printf "0%u ", cnt++; print } \ ++ /^[^#]/ { printf ".%s ", $$1; print; \ ++ printf "=%s ", $$2; print }' $^ | \ ++ $(MAKEDB) -o $@ - ++ @echo "done." ++ ++$(VAR_DB)/protocols.db: /etc/protocols ++ @echo -n "$(patsubst %.db,%,$(@F))... " ++ @$(AWK) 'BEGIN { cnt=0 } \ ++ /^[ \t]*$$/ { next } \ ++ /^[ \t]*#/ { next } \ ++ { printf "0%u ", cnt++; print } \ ++ /^[^#]/ { printf ".%s ", $$1; print; \ ++ printf "=%s ", $$2; print; \ ++ for (i = 3; i <= NF && !($$i ~ /^#/); ++i) \ ++ { printf ".%s ", $$i; print } }' $^ | \ ++ $(MAKEDB) -o $@ - ++ @echo "done." ++ ++$(VAR_DB)/rpc.db: /etc/rpc ++ @echo -n "$(patsubst %.db,%,$(@F))... " ++ @$(AWK) 'BEGIN { cnt=0 } \ ++ /^[ \t]*$$/ { next } \ ++ /^[ \t]*#/ { next } \ ++ { printf "0%u ", cnt++; print } \ ++ /^[^#]/ { printf ".%s ", $$1; print; \ ++ printf "=%s ", $$2; print; \ ++ for (i = 3; i <= NF && !($$i ~ /^#/); ++i) \ ++ { printf ".%s ", $$i; print } }' $^ | \ ++ $(MAKEDB) -o $@ - ++ @echo "done." ++ ++$(VAR_DB)/services.db: /etc/services ++ @echo -n "$(patsubst %.db,%,$(@F))... " ++ @$(AWK) 'BEGIN { FS="[ \t/]+"; cnt=0 } \ ++ /^[ \t]*$$/ { next } \ ++ /^[ \t]*#/ { next } \ ++ { printf "0%u ", cnt++; print } \ ++ /^[^#]/ { printf ".%s/%s ", $$1, $$3; print; \ ++ printf ".%s/ ", $$1; print; \ ++ printf "=%s/%s ", $$2, $$3; print; \ ++ printf "=%s/ ", $$2; print; \ ++ for (i = 4; i <= NF && !($$i ~ /^#/); ++i) \ ++ { printf ".%s/%s ", $$i, $$3; print; \ ++ printf ".%s/ ", $$i; print } }' $^ | \ ++ $(MAKEDB) -o $@ - ++ @echo "done." ++ ++$(VAR_DB)/shadow.db: /etc/shadow ++ @echo -n "$(patsubst %.db,%,$(@F))... " ++ @$(AWK) 'BEGIN { FS=":"; OFS=":"; cnt=0 } \ ++ /^[ \t]*$$/ { next } \ ++ /^[ \t]*#/ { next } \ ++ { printf "0%u ", cnt++; print } \ ++ /^[^#]/ { printf ".%s ", $$1; print }' $^ | \ ++ (umask 077 && $(MAKEDB) -o $@ -) ++ @echo "done." ++ @if chgrp shadow $@ 2>/dev/null; then \ ++ chmod g+r $@; \ ++ else \ ++ chown 0 $@; chgrp 0 $@; chmod 600 $@; \ ++ echo; \ ++ echo "Warning: The shadow password database $@"; \ ++ echo "has been set to be readable only by root. You may want"; \ ++ echo "to make it readable by the \`shadow' group depending"; \ ++ echo "on your configuration."; \ ++ echo; \ ++ fi ++ ++$(VAR_DB)/netgroup.db: /etc/netgroup ++ @echo -n "$(patsubst %.db,%,$(@F))... " ++ @$(AWK) 'BEGIN { cnt=0 } \ ++ /^[ \t]*$$/ { next } \ ++ /^[ \t]*#/ { next } \ ++ { printf "0%u ", cnt++; print } \ ++ /^[^#]/ { end=sub(/\\/, " "); \ ++ gsub(/[ \t]+/, " "); \ ++ if(end == 1) printf "%s", $$0; else print }' $^ | \ ++ $(MAKEDB) -o $@ - ++ @echo "done." +diff -u -udbrN glibc-2.3.2/nss/makedb.c glibc-2.3.2-200304020432/nss/makedb.c +--- glibc-2.3.2/nss/makedb.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/nss/makedb.c Fri Jul 6 06:55:37 2001 +@@ -0,0 +1,389 @@ ++/* Create simple DB database from textual input. ++ Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper , 1996. ++ ++ 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include "nss_db/dummy-db.h" ++ ++/* Get libc version number. */ ++#include "../version.h" ++ ++#define PACKAGE _libc_intl_domainname ++ ++/* If non-zero convert key to lower case. */ ++static int to_lowercase; ++ ++/* If non-zero print content of input file, one entry per line. */ ++static int do_undo; ++ ++/* If non-zero do not print informational messages. */ ++static int be_quiet; ++ ++/* Name of output file. */ ++static const char *output_name; ++ ++/* Name and version of program. */ ++static void print_version (FILE *stream, struct argp_state *state); ++void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version; ++ ++/* Definitions of arguments for argp functions. */ ++static const struct argp_option options[] = ++{ ++ { "fold-case", 'f', NULL, 0, N_("Convert key to lower case") }, ++ { "output", 'o', N_("NAME"), 0, N_("Write output to file NAME") }, ++ { "quiet", 'q', NULL, 0, ++ N_("Do not print messages while building database") }, ++ { "undo", 'u', NULL, 0, ++ N_("Print content of database file, one entry a line") }, ++ { NULL, 0, NULL, 0, NULL } ++}; ++ ++/* Short description of program. */ ++static const char doc[] = N_("Create simple DB database from textual input."); ++ ++/* Strings for arguments in help texts. */ ++static const char args_doc[] = N_("\ ++INPUT-FILE OUTPUT-FILE\n-o OUTPUT-FILE INPUT-FILE\n-u INPUT-FILE"); ++ ++/* Prototype for option handler. */ ++static error_t parse_opt (int key, char *arg, struct argp_state *state); ++ ++/* Function to print some extra text in the help message. */ ++static char *more_help (int key, const char *text, void *input); ++ ++/* Data structure to communicate with argp functions. */ ++static struct argp argp = ++{ ++ options, parse_opt, args_doc, doc, NULL, more_help ++}; ++ ++ ++/* Prototypes for local functions. */ ++static int process_input (FILE *input, const char *inname, NSS_DB *output, ++ int to_lowercase, int be_quiet); ++static int print_database (NSS_DB *db); ++ ++ ++int ++main (int argc, char *argv[]) ++{ ++ const char *input_name; ++ FILE *input_file; ++ NSS_DB *db_file; ++ int status; ++ int remaining; ++ int mode = 0666; ++ ++ /* Set locale via LC_ALL. */ ++ setlocale (LC_ALL, ""); ++ ++ /* Set the text message domain. */ ++ textdomain (_libc_intl_domainname); ++ ++ /* Initialize local variables. */ ++ input_name = NULL; ++ ++ /* Parse and process arguments. */ ++ argp_parse (&argp, argc, argv, 0, &remaining, NULL); ++ ++ /* Determine file names. */ ++ if (do_undo || output_name != NULL) ++ { ++ if (remaining + 1 != argc) ++ { ++ wrong_arguments: ++ error (0, 0, gettext ("wrong number of arguments")); ++ argp_help (&argp, stdout, ARGP_HELP_SEE, ++ program_invocation_short_name); ++ exit (1); ++ } ++ input_name = argv[remaining]; ++ } ++ else ++ { ++ if (remaining + 2 != argc) ++ goto wrong_arguments; ++ ++ input_name = argv[remaining++]; ++ output_name = argv[remaining]; ++ } ++ ++ /* First load the shared object to initialize version dependend ++ variables. */ ++ if (load_db () != NSS_STATUS_SUCCESS) ++ error (EXIT_FAILURE, 0, gettext ("No usable database library found.")); ++ ++ /* Special handling if we are asked to print the database. */ ++ if (do_undo) ++ { ++ dbopen (input_name, db_rdonly, 0666, &db_file); ++ if (db_file == NULL) ++ error (EXIT_FAILURE, 0, gettext ("cannot open database file `%s': %s"), ++ input_name, ++ (errno == EINVAL ? gettext ("incorrectly formatted file") ++ : strerror (errno))); ++ ++ status = print_database (db_file); ++ ++ db_file->close (db_file->db, 0); ++ ++ return status; ++ } ++ ++ /* Open input file. */ ++ if (strcmp (input_name, "-") == 0 || strcmp (input_name, "/dev/stdin") == 0) ++ input_file = stdin; ++ else ++ { ++ struct stat st; ++ ++ input_file = fopen (input_name, "r"); ++ if (input_file == NULL) ++ error (EXIT_FAILURE, errno, gettext ("cannot open input file `%s'"), ++ input_name); ++ ++ /* Get the access rights from the source file. The output file should ++ have the same. */ ++ if (fstat (fileno (input_file), &st) >= 0) ++ mode = st.st_mode & ACCESSPERMS; ++ } ++ ++ /* Open output file. This must not be standard output so we don't ++ handle "-" and "/dev/stdout" special. */ ++ dbopen (output_name, DB_CREATE | db_truncate, mode, &db_file); ++ if (db_file == NULL) ++ error (EXIT_FAILURE, errno, gettext ("cannot open output file `%s'"), ++ output_name); ++ ++ /* Start the real work. */ ++ status = process_input (input_file, input_name, db_file, to_lowercase, ++ be_quiet); ++ ++ /* Close files. */ ++ if (input_file != stdin) ++ fclose (input_file); ++ db_file->close (db_file->db, 0); ++ ++ return status; ++} ++ ++ ++/* Handle program arguments. */ ++static error_t ++parse_opt (int key, char *arg, struct argp_state *state) ++{ ++ switch (key) ++ { ++ case 'f': ++ to_lowercase = 1; ++ break; ++ case 'o': ++ output_name = arg; ++ break; ++ case 'q': ++ be_quiet = 1; ++ break; ++ case 'u': ++ do_undo = 1; ++ break; ++ default: ++ return ARGP_ERR_UNKNOWN; ++ } ++ return 0; ++} ++ ++ ++static char * ++more_help (int key, const char *text, void *input) ++{ ++ switch (key) ++ { ++ case ARGP_KEY_HELP_EXTRA: ++ /* We print some extra information. */ ++ return strdup (gettext ("\ ++Report bugs using the `glibcbug' script to .\n")); ++ default: ++ break; ++ } ++ return (char *) text; ++} ++ ++/* Print the version information. */ ++static void ++print_version (FILE *stream, struct argp_state *state) ++{ ++ fprintf (stream, "makedb (GNU %s) %s\n", PACKAGE, VERSION); ++ fprintf (stream, gettext ("\ ++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\ ++"), "2000"); ++ fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper"); ++} ++ ++ ++static int ++process_input (input, inname, output, to_lowercase, be_quiet) ++ FILE *input; ++ const char *inname; ++ NSS_DB *output; ++ int to_lowercase; ++ int be_quiet; ++{ ++ char *line; ++ size_t linelen; ++ int status; ++ size_t linenr; ++ ++ line = NULL; ++ linelen = 0; ++ status = EXIT_SUCCESS; ++ linenr = 0; ++ ++ while (!feof (input)) ++ { ++ DBT key; ++ DBT val; ++ char *cp; ++ int n; ++ ++ n = getline (&line, &linelen, input); ++ if (n < 0) ++ /* This means end of file or some bug. */ ++ break; ++ if (n == 0) ++ /* Short read. Probably interrupted system call. */ ++ continue; ++ ++ ++linenr; ++ ++ if (line[n - 1] == '\n') ++ /* Remove trailing newline. */ ++ line[--n] = '\0'; ++ ++ cp = line; ++ while (isspace (*cp)) ++ ++cp; ++ ++ if (*cp == '#') ++ /* First non-space character in line '#': it's a comment. */ ++ continue; ++ ++ key.data = cp; ++ while (*cp != '\0' && !isspace (*cp)) ++ { ++ if (to_lowercase) ++ *cp = tolower (*cp); ++ ++cp; ++ } ++ ++ if (key.data == cp) ++ /* It's an empty line. */ ++ continue; ++ ++ key.size = cp - (char *) key.data; ++ key.flags = 0; ++ ++ while (isspace (*cp)) ++ ++cp; ++ ++ val.data = cp; ++ val.size = (&line[n] - cp) + 1; ++ val.flags = 0; ++ ++ /* Store the value. */ ++ status = output->put (output->db, NULL, &key, &val, db_nooverwrite); ++ if (status != 0) ++ { ++ if (status == db_keyexist) ++ { ++ if (!be_quiet) ++ error_at_line (0, 0, inname, linenr, ++ gettext ("duplicate key")); ++ /* This is no real error. Just give a warning. */ ++ status = 0; ++ continue; ++ } ++ else ++ error (0, status, gettext ("while writing database file")); ++ ++ status = EXIT_FAILURE; ++ ++ clearerr (input); ++ break; ++ } ++ } ++ ++ if (ferror (input)) ++ { ++ error (0, 0, gettext ("problems while reading `%s'"), inname); ++ status = EXIT_FAILURE; ++ } ++ ++ return status; ++} ++ ++ ++static int ++print_database (db) ++ NSS_DB *db; ++{ ++ DBT key; ++ DBT val; ++ NSS_DBC *cursor; ++ int status; ++ ++ status = db->cursor (db->db, NULL, &cursor); ++ if (status != 0) ++ { ++ error (0, status, gettext ("while reading database")); ++ return EXIT_FAILURE; ++ } ++ ++ key.flags = 0; ++ val.flags = 0; ++ status = cursor->c_get (cursor->cursor, &key, &val, db_first); ++ while (status == 0) ++ { ++ printf ("%.*s %s\n", (int) key.size, (char *) key.data, ++ (char *) val.data); ++ ++ status = cursor->c_get (cursor->cursor, &key, &val, db_next); ++ } ++ ++ if (status != db_notfound) ++ { ++ error (0, status, gettext ("while reading database")); ++ return EXIT_FAILURE; ++ } ++ ++ return EXIT_SUCCESS; ++} +diff -u -udbrN glibc-2.3.2/nss/nss_db/db-XXX.c glibc-2.3.2-200304020432/nss/nss_db/db-XXX.c +--- glibc-2.3.2/nss/nss_db/db-XXX.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/nss/nss_db/db-XXX.c Fri Jul 6 06:55:38 2001 +@@ -0,0 +1,261 @@ ++/* Common code for DB-based databases in nss_db module. ++ Copyright (C) 1996, 1997, 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. */ ++ ++#include ++#include ++#include ++#include "nsswitch.h" ++#include "nss_db.h" ++ ++/* These symbols are defined by the including source file: ++ ++ ENTNAME -- database name of the structure and functions (hostent, pwent). ++ STRUCTURE -- struct name, define only if not ENTNAME (passwd, group). ++ DATABASE -- database file name, ("hosts", "passwd") ++ ++ NEED_H_ERRNO - defined iff an arg `int *herrnop' is used. ++*/ ++ ++#define ENTNAME_r CONCAT(ENTNAME,_r) ++ ++#include ++#define DBFILE _PATH_VARDB DATABASE ".db" ++ ++#ifdef NEED_H_ERRNO ++#define H_ERRNO_PROTO , int *herrnop ++#define H_ERRNO_ARG , herrnop ++#define H_ERRNO_SET(val) (*herrnop = (val)) ++#else ++#define H_ERRNO_PROTO ++#define H_ERRNO_ARG ++#define H_ERRNO_SET(val) ((void) 0) ++#endif ++ ++/* Locks the static variables in this file. */ ++__libc_lock_define_initialized (static, lock) ++ ++/* Maintenance of the shared handle open on the database. */ ++ ++static NSS_DB *db; ++static int keep_db; ++static int entidx; ++ ++ ++/* Open the database. */ ++enum nss_status ++CONCAT(_nss_db_set,ENTNAME) (int stayopen) ++{ ++ enum nss_status status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_setent (DBFILE, &db); ++ ++ /* Remember STAYOPEN flag. */ ++ if (db != NULL) ++ keep_db |= stayopen; ++ /* Reset the sequential index. */ ++ entidx = 0; ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++ ++/* Close it again. */ ++enum nss_status ++CONCAT(_nss_db_end,ENTNAME) (void) ++{ ++ __libc_lock_lock (lock); ++ ++ internal_endent (&db); ++ ++ /* Reset STAYOPEN flag. */ ++ keep_db = 0; ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++/* Do a database lookup for KEY. */ ++static enum nss_status ++lookup (DBT *key, struct STRUCTURE *result, ++ void *buffer, size_t buflen, int *errnop H_ERRNO_PROTO EXTRA_ARGS_DECL) ++{ ++ char *p; ++ enum nss_status status; ++ int err; ++ DBT value; ++ ++ /* Open the database. */ ++ if (db == NULL) ++ { ++ status = internal_setent (DBFILE, &db); ++ if (status != NSS_STATUS_SUCCESS) ++ { ++ *errnop = errno; ++ H_ERRNO_SET (NETDB_INTERNAL); ++ return status; ++ } ++ } ++ ++ /* Succeed iff it matches a value that parses correctly. */ ++ value.flags = 0; ++ err = DL_CALL_FCT (db->get, (db->db, NULL, key, &value, 0)); ++ if (err != 0) ++ { ++ if (err == db_notfound) ++ { ++ H_ERRNO_SET (HOST_NOT_FOUND); ++ status = NSS_STATUS_NOTFOUND; ++ } ++ else ++ { ++ *errnop = err; ++ H_ERRNO_SET (NETDB_INTERNAL); ++ status = NSS_STATUS_UNAVAIL; ++ } ++ } ++ else if (buflen < value.size) ++ { ++ /* No room to copy the data to. */ ++ *errnop = ERANGE; ++ H_ERRNO_SET (NETDB_INTERNAL); ++ status = NSS_STATUS_TRYAGAIN; ++ } ++ else ++ { ++ /* Copy the result to a safe place. */ ++ p = (char *) memcpy (buffer, value.data, value.size); ++ ++ /* Skip leading blanks. */ ++ while (isspace (*p)) ++ ++p; ++ ++ err = parse_line (p, result, buffer, buflen, errnop EXTRA_ARGS); ++ ++ if (err == 0) ++ { ++ /* If the key begins with '0' we are trying to get the next ++ entry. We want to ignore unparsable lines in this case. */ ++ if (((char *) key->data)[0] == '0') ++ { ++ /* Super magical return value. We need to tell our caller ++ that it should continue looping. This value cannot ++ happen in other cases. */ ++ status = NSS_STATUS_RETURN; ++ } ++ else ++ { ++ H_ERRNO_SET (HOST_NOT_FOUND); ++ status = NSS_STATUS_NOTFOUND; ++ } ++ } ++ else if (err < 0) ++ { ++ H_ERRNO_SET (NETDB_INTERNAL); ++ status = NSS_STATUS_TRYAGAIN; ++ } ++ else ++ status = NSS_STATUS_SUCCESS; ++ } ++ ++ if (! keep_db) ++ internal_endent (&db); ++ ++ return status; ++} ++ ++ ++/* Macro for defining lookup functions for this DB-based database. ++ ++ NAME is the name of the lookup; e.g. `pwnam'. ++ ++ KEYPATTERN gives `printf' args to construct a key string; ++ e.g. `(".%s", name)'. ++ ++ KEYSIZE gives the allocation size of a buffer to construct it in; ++ e.g. `1 + strlen (name)'. ++ ++ PROTO describes the arguments for the lookup key; ++ e.g. `const char *name'. ++ ++ BREAK_IF_MATCH is ignored, but used by ../nss_files/files-XXX.c. */ ++ ++#define DB_LOOKUP(name, keysize, keypattern, break_if_match, proto...) \ ++enum nss_status \ ++_nss_db_get##name##_r (proto, \ ++ struct STRUCTURE *result, \ ++ char *buffer, size_t buflen, int *errnop H_ERRNO_PROTO)\ ++{ \ ++ DBT key; \ ++ enum nss_status status; \ ++ const size_t size = (keysize) + 1; \ ++ key.data = __alloca (size); \ ++ key.size = KEYPRINTF keypattern; \ ++ key.flags = 0; \ ++ __libc_lock_lock (lock); \ ++ status = lookup (&key, result, buffer, buflen, errnop H_ERRNO_ARG \ ++ EXTRA_ARGS_VALUE); \ ++ __libc_lock_unlock (lock); \ ++ return status; \ ++} ++ ++#define KEYPRINTF(pattern, args...) snprintf (key.data, size, pattern ,##args) ++ ++ ++ ++ ++/* Return the next entry from the database file, doing locking. */ ++enum nss_status ++CONCAT(_nss_db_get,ENTNAME_r) (struct STRUCTURE *result, char *buffer, ++ size_t buflen, int *errnop H_ERRNO_PROTO) ++{ ++ /* Return next entry in host file. */ ++ enum nss_status status; ++ char buf[20]; ++ DBT key; ++ ++ __libc_lock_lock (lock); ++ ++ /* Loop until we find a valid entry or hit EOF. See above for the ++ special meaning of the status value. */ ++ do ++ { ++ key.size = snprintf (key.data = buf, sizeof buf, "0%u", entidx++); ++ key.flags = 0; ++ status = lookup (&key, result, buffer, buflen, errnop H_ERRNO_ARG ++ EXTRA_ARGS_VALUE); ++ if (status == NSS_STATUS_TRYAGAIN ++#ifdef NEED_H_ERRNO ++ && *herrnop == NETDB_INTERNAL ++#endif ++ && *errnop == ERANGE) ++ /* Give the user a chance to get the same entry with a larger ++ buffer. */ ++ --entidx; ++ } ++ while (status == NSS_STATUS_RETURN); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} +diff -u -udbrN glibc-2.3.2/nss/nss_db/db-alias.c glibc-2.3.2-200304020432/nss/nss_db/db-alias.c +--- glibc-2.3.2/nss/nss_db/db-alias.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/nss/nss_db/db-alias.c Fri Jul 6 06:55:38 2001 +@@ -0,0 +1,215 @@ ++/* Mail alias file parser in nss_db module. ++ Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper , 1996. ++ ++ 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 ++#include ++ ++#include "nsswitch.h" ++#include "nss_db.h" ++ ++/* Locks the static variables in this file. */ ++__libc_lock_define_initialized (static, lock) ++ ++/* Maintenance of the shared handle open on the database. */ ++ ++static NSS_DB *db; ++static int keep_db; ++static unsigned int entidx; /* Index for `getaliasent_r'. */ ++ ++ ++/* Open database. */ ++enum nss_status ++_nss_db_setaliasent (int stayopen) ++{ ++ enum nss_status status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_setent (_PATH_VARDB "aliases.db", &db); ++ ++ /* Remember STAYOPEN flag. */ ++ if (db != NULL) ++ keep_db |= stayopen; ++ ++ /* Reset the sequential index. */ ++ entidx = 0; ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++ ++/* Close it again. */ ++enum nss_status ++_nss_db_endaliasent (void) ++{ ++ __libc_lock_lock (lock); ++ ++ internal_endent (&db); ++ ++ /* Reset STAYOPEN flag. */ ++ keep_db = 0; ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++/* We provide the parse function here. The parser in libnss_files ++ cannot be used. The generation of the db file already resolved all ++ :include: statements so we simply have to parse the list and store ++ the result. */ ++static enum nss_status ++lookup (DBT *key, struct aliasent *result, char *buffer, ++ size_t buflen, int *errnop) ++{ ++ enum nss_status status; ++ DBT value; ++ ++ /* Open the database. */ ++ if (db == NULL) ++ { ++ status = internal_setent (_PATH_VARDB "aliases.db", &db); ++ if (status != NSS_STATUS_SUCCESS) ++ { ++ *errnop = errno; ++ return status; ++ } ++ } ++ ++ value.flags = 0; ++ if (DL_CALL_FCT (db->get, (db->db, NULL, key, &value, 0)) == 0) ++ { ++ const char *src = value.data; ++ char *cp; ++ size_t cnt; ++ ++ result->alias_members_len = 0; ++ ++ /* We now have to fill the BUFFER with all the information. */ ++ if (buflen < key->size + 1) ++ { ++ no_more_room: ++ *errnop = ERANGE; ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ buffer = stpncpy (buffer, key->data, key->size) + 1; ++ buflen -= key->size + 1; ++ ++ while (*src != '\0') ++ { ++ const char *end, *upto; ++ while (isspace (*src)) ++ ++src; ++ ++ end = strchr (src, ','); ++ if (end == NULL) ++ end = strchr (src, '\0'); ++ for (upto = end; upto > src && isspace (upto[-1]); --upto); ++ ++ if (upto != src) ++ { ++ if ((upto - src) + __alignof__ (char *) > buflen) ++ goto no_more_room; ++ buffer = stpncpy (buffer, src, upto - src) + 1; ++ buflen -= (upto - src) + __alignof (char *); ++ ++result->alias_members_len; ++ } ++ src = end + (*end != '\0'); ++ } ++ ++ /* Now prepare the return. Provide string pointers for the ++ currently selected aliases. */ ++ ++ /* Adjust the pointer so it is aligned for storing pointers. */ ++ buffer += __alignof__ (char *) - 1; ++ buffer -= ((buffer - (char *) 0) % __alignof__ (char *)); ++ result->alias_members = (char **) buffer; ++ ++ /* Compute addresses of alias entry strings. */ ++ cp = result->alias_name; ++ for (cnt = 0; cnt < result->alias_members_len; ++cnt) ++ { ++ cp = strchr (cp, '\0') + 1; ++ result->alias_members[cnt] = cp; ++ } ++ ++ status = (result->alias_members_len == 0 ++ ? NSS_STATUS_RETURN : NSS_STATUS_SUCCESS); ++ } ++ else ++ status = NSS_STATUS_NOTFOUND; ++ ++ if (! keep_db) ++ internal_endent (&db); ++ ++ return status; ++} ++ ++enum nss_status ++_nss_db_getaliasent_r (struct aliasent *result, char *buffer, size_t buflen, ++ int *errnop) ++{ ++ /* Return next entry in alias file. */ ++ enum nss_status status; ++ char buf[20]; ++ DBT key; ++ ++ __libc_lock_lock (lock); ++ key.size = snprintf (key.data = buf, sizeof buf, "0%u", entidx++); ++ key.flags = 0; ++ status = lookup (&key, result, buffer, buflen, errnop); ++ if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE) ++ /* Give the user a chance to get the same entry with a larger buffer. */ ++ --entidx; ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++ ++enum nss_status ++_nss_db_getaliasbyname_r (const char *name, struct aliasent *result, ++ char *buffer, size_t buflen, int *errnop) ++{ ++ DBT key; ++ enum nss_status status; ++ ++ key.size = 1 + strlen (name); ++ ++ key.data = __alloca (key.size); ++ ((char *) key.data)[0] = '.'; ++ memcpy (&((char *) key.data)[1], name, key.size - 1); ++ key.flags = 0; ++ ++ __libc_lock_lock (lock); ++ status = lookup (&key, result, buffer, buflen, errnop); ++ __libc_lock_unlock (lock); ++ ++ return status; ++} +diff -u -udbrN glibc-2.3.2/nss/nss_db/db-netgrp.c glibc-2.3.2-200304020432/nss/nss_db/db-netgrp.c +--- glibc-2.3.2/nss/nss_db/db-netgrp.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/nss/nss_db/db-netgrp.c Fri Jul 6 06:55:38 2001 +@@ -0,0 +1,103 @@ ++/* Netgroup file parser in nss_db modules. ++ Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper , 1996. ++ ++ 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 ++ ++#include "nsswitch.h" ++#include "nss_db.h" ++ ++ ++#define DBFILE _PATH_VARDB "netgroup.db" ++ ++ ++/* Locks the static variables in this file. */ ++__libc_lock_define_initialized (static, lock) ++ ++/* Maintenance of the shared handle open on the database. */ ++static NSS_DB *db; ++static char *entry; ++static char *cursor; ++ ++enum nss_status ++_nss_db_setnetgrent (const char *group) ++{ ++ enum nss_status status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_setent (DBFILE, &db); ++ ++ if (status == NSS_STATUS_SUCCESS) ++ { ++ DBT key = { data: (void *) group, size: strlen (group), flags: 0 }; ++ DBT value; ++ ++ value.flags = 0; ++ if (DL_CALL_FCT (db->get, (db->db, NULL, &key, &value, 0)) != 0) ++ status = NSS_STATUS_NOTFOUND; ++ else ++ cursor = entry = value.data; ++ } ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++ ++} ++ ++ ++enum nss_status ++_nss_db_endnetgrent (void) ++{ ++ __libc_lock_lock (lock); ++ ++ internal_endent (&db); ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++ ++extern enum nss_status _nss_netgroup_parseline (char **cursor, ++ struct __netgrent *result, ++ char *buffer, size_t buflen, ++ int *errnop); ++ ++enum nss_status ++_nss_db_getnetgrent_r (struct __netgrent *result, char *buffer, size_t buflen, ++ int *errnop) ++{ ++ int status; ++ ++ __libc_lock_lock (lock); ++ ++ status = _nss_netgroup_parseline (&cursor, result, buffer, buflen, errnop); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} +diff -u -udbrN glibc-2.3.2/nss/nss_db/db-open.c glibc-2.3.2-200304020432/nss/nss_db/db-open.c +--- glibc-2.3.2/nss/nss_db/db-open.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/nss/nss_db/db-open.c Fri Jul 6 06:55:38 2001 +@@ -0,0 +1,389 @@ ++/* Common database routines for nss_db. ++ Copyright (C) 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. */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "dummy-db.h" ++#include "nss_db.h" ++ ++/* This file contains the functions used to open and close the databases ++ read by the rest of libnss_db. Not all of them are thread safe; ++ make sure the caller does the appropriate locking. ++ ++ We dynamically load the database library, so that it does not have ++ to be present when glibc is compiled. Once loaded, the database ++ library is never never unloaded again until the libnss_db module is ++ unloaded (from the free_mem routine in nsswitch.c) -- we catch the ++ unload by providing a shlib destructor. (XXX Does that actually ++ work?) */ ++ ++/* Handle for the shared Berkeley DB library. If non-null, the ++ database library is completely loaded and ready to be used by ++ multithreaded code. */ ++static void *libdb_handle; ++ ++/* The version of the Berkeley DB library we are using. */ ++enum { ++ nodb, ++ db24, ++ db27, ++ db30 ++} libdb_version; ++ ++/* Pointer to the db_open function. For use with DB 2.x. */ ++static int (*libdb_db_open) (const char *, int, ++ uint32_t, int, void *, void *, void **); ++ ++/* Pointer to the db_create function. For use with DB 3.x. */ ++static int (*libdb_db_create) (void *, void *, uint32_t); ++ ++/* Constants which vary from version to version are actually variables ++ here. */ ++int db_first; ++int db_next; ++int db_nooverwrite; ++int db_truncate; ++int db_rdonly; ++/* Variables which keep track of the error values. */ ++int db_keyexist; ++int db_notfound; ++ ++/* Locks the static variables in this file. */ ++__libc_lock_define_initialized (static, lock) ++ ++/* Dynamically load the database library. Return zero if successful, ++ non-zero if no suitable version of the library could be loaded. ++ Must be called with the above lock held if it might run in a ++ multithreaded context. ++ ++ We try currently: ++ - libdb.so.3: the name used by glibc 2.1 ++ - libdb-3.0.so: the name used by db-3.0.x ++ and maybe others in the future. */ ++ ++enum nss_status ++load_db (void) ++{ ++ static const char *libnames[] = { "libdb.so.3", "libdb-3.0.so" }; ++ int x; ++ ++ for (x = 0; x < sizeof (libnames) / sizeof (libnames[0]); ++x) ++ { ++ libdb_handle = dlopen (libnames[x], RTLD_LAZY); ++ if (libdb_handle == NULL) ++ continue; ++ ++ /* DB 3.0 has db_create instead of db_open. */ ++ libdb_db_create = dlsym (libdb_handle, "db_create"); ++ ++ if (libdb_db_create == NULL) ++ /* DB 2.x uses db_open. */ ++ libdb_db_open = dlsym (libdb_handle, "db_open"); ++ ++ if (libdb_db_open != NULL || libdb_db_create != NULL) ++ { ++ /* Alright, we got a library. Now find out which version it is. */ ++ const char *(*db_version) (int *, int *, int *); ++ ++ db_version = dlsym (libdb_handle, "db_version"); ++ if (db_version != NULL) ++ { ++ /* Call the function and get the information. */ ++ int major, minor, subminor; ++ ++ DL_CALL_FCT (db_version, (&major, &minor, &subminor)); ++ switch (major) ++ { ++ case 2: ++ /* Sanity check: Do we have db_open? */ ++ if (libdb_db_open != NULL) ++ { ++ if (minor < 6 || (minor == 6 && subminor < 4)) ++ { ++ libdb_version = db24; ++ db_first = DB24_FIRST; ++ db_next = DB24_NEXT; ++ db_nooverwrite = DB24_NOOVERWRITE; ++ db_truncate = DB24_TRUNCATE; ++ } ++ else ++ { ++ libdb_version = db27; ++ db_first = DB27_FIRST; ++ db_next = DB27_NEXT; ++ db_nooverwrite = DB27_NOOVERWRITE; ++ db_truncate = DB27_TRUNCATE; ++ } ++ db_keyexist = DB2x_KEYEXIST; ++ db_notfound = DB2x_NOTFOUND; ++ db_rdonly = DB2x_RDONLY; ++ } ++ break; ++ ++ case 3: ++ /* Sanity check: Do we have db_create? */ ++ if (libdb_db_create != NULL) ++ { ++ libdb_version = db30; ++ db_first = DB30_FIRST; ++ db_next = DB30_NEXT; ++ db_keyexist = DB30_KEYEXIST; ++ db_notfound = DB30_NOTFOUND; ++ db_rdonly = DB30_RDONLY; ++ } ++ break; ++ ++ default: ++ break; ++ } ++ } ++ ++ if (libdb_version != nodb) ++ return NSS_STATUS_SUCCESS; ++ ++ /* Clear variables. */ ++ libdb_db_open = NULL; ++ libdb_db_create = NULL; ++ } ++ ++ dlclose (libdb_handle); ++ } ++ ++ (void) dlerror (); ++ return NSS_STATUS_UNAVAIL; ++} ++ ++/* Set the `FD_CLOEXEC' flag of FD. Return 0 on success, or -1 on ++ error with `errno' set. */ ++static int ++set_cloexec_flag (int fd) ++{ ++ int oldflags = fcntl (fd, F_GETFD, 0); ++ ++ if (oldflags < 0) ++ return oldflags; ++ ++ oldflags |= FD_CLOEXEC; ++ ++ return fcntl (fd, F_SETFD, oldflags); ++} ++ ++/* Make sure we don't use the library anymore once we are shutting down. */ ++static void __attribute__ ((destructor)) ++unload_db (void) ++{ ++ if (libdb_handle != NULL) ++ { ++ libdb_db_open = NULL; ++ libdb_db_create = NULL; ++ libdb_version = nodb; ++ dlclose (libdb_handle); ++ } ++} ++ ++/* Open the database stored in FILE. If succesful, store the database ++ handle in *DBP and return NSS_STATUS_SUCCESS. On failure, return ++ the appropriate lookup status. */ ++enum nss_status ++internal_setent (const char *file, NSS_DB **dbp) ++{ ++ enum nss_status status = NSS_STATUS_SUCCESS; ++ ++ if (*dbp == NULL) ++ { ++ if (libdb_db_open == NULL && libdb_db_create == NULL) ++ { ++ __libc_lock_lock (lock); ++ ++ if (libdb_db_open == NULL && libdb_db_create == NULL) ++ status = load_db (); ++ ++ __libc_lock_unlock (lock); ++ } ++ ++ if (status == NSS_STATUS_SUCCESS) ++ status = dbopen (file, db_rdonly, 0, dbp); ++ } ++ ++ return status; ++} ++ ++ ++/* Close the database *DBP. */ ++void ++internal_endent (NSS_DB **dbp) ++{ ++ NSS_DB *db = *dbp; ++ ++ if (db != NULL) ++ { ++ DL_CALL_FCT (db->close, (db->db, 0)); ++ *dbp = NULL; ++ } ++} ++ ++/* Allocate a cursor for database DB and transaction TXN. On success, ++ store the cursor in *DBCP and return zero. Otherwise return an ++ error value. */ ++int ++db_cursor (void *db, void *txn, NSS_DBC **dbcp) ++{ ++ NSS_DBC *dbc; ++ int ret; ++ ++ dbc = (NSS_DBC *) malloc (sizeof (NSS_DBC)); ++ if (dbc == NULL) ++ return ENOMEM; ++ ++ switch (libdb_version) ++ { ++ case db24: ++ ret = ((struct db24 *) db)->cursor (db, txn, &dbc->cursor); ++ ++ if (ret == 0) ++ dbc->c_get = ((struct dbc24 *) dbc->cursor)->c_get; ++ break; ++ ++ case db27: ++ ret = ((struct db27 *) db)->cursor (db, txn, &dbc->cursor, 0); ++ ++ if (ret == 0) ++ dbc->c_get = ((struct dbc27 *) dbc->cursor)->c_get; ++ break; ++ ++ case db30: ++ ret = ((struct db30 *) db)->cursor (db, txn, &dbc->cursor, 0); ++ ++ if (ret == 0) ++ dbc->c_get = ((struct dbc30 *) dbc->cursor)->c_get; ++ break; ++ ++ default: ++ abort (); ++ } ++ ++ if (ret != 0) ++ { ++ free (dbc); ++ return ret; ++ } ++ ++ *dbcp = dbc; ++ ++ return 0; ++} ++ ++ ++/* Open the database in FNAME, for access specified by FLAGS. If ++ opening the database causes the file FNAME to be created, it is ++ created with MODE. If succesful, store the database handle in *DBP ++ and return NSS_STATUS_SUCCESS. On failure, return the appropriate ++ lookup status. */ ++int ++dbopen (const char *fname, int oper, int mode, NSS_DB **dbp) ++{ ++ int err; ++ int fd; ++ NSS_DB *db; ++ ++ /* Construct the object we pass up. */ ++ db = (NSS_DB *) calloc (1, sizeof (NSS_DB)); ++ if (db == NULL) ++ return NSS_STATUS_UNAVAIL; ++ ++ /* Initialize the object. */ ++ db->cursor = db_cursor; ++ ++ /* Actually open the database. */ ++ switch (libdb_version) ++ { ++ case db24: ++ case db27: ++ err = DL_CALL_FCT (libdb_db_open, ++ (fname, DB_BTREE, oper, mode, NULL, NULL, &db->db)); ++ if (err != 0) ++ goto fail; ++ ++ if (libdb_version) ++ { ++ db->close = ((struct db24 *) db->db)->close; ++ db->fd = ((struct db24 *) db->db)->fd; ++ db->get = ((struct db24 *) db->db)->get; ++ db->put = ((struct db24 *) db->db)->put; ++ } ++ else ++ { ++ db->close = ((struct db27 *) db->db)->close; ++ db->fd = ((struct db27 *) db->db)->fd; ++ db->get = ((struct db27 *) db->db)->get; ++ db->put = ((struct db27 *) db->db)->put; ++ } ++ break; ++ ++ case db30: ++ err = DL_CALL_FCT (libdb_db_create, (db->db, NULL, 0)); ++ if (err != 0) ++ goto fail; ++ ++ db->close = ((struct db30 *) db->db)->close; ++ db->fd = ((struct db30 *) db->db)->fd; ++ db->get = ((struct db30 *) db->db)->get; ++ db->put = ((struct db30 *) db->db)->put; ++ ++ err = ((struct db30 *) db->db)->open (db->db, fname, NULL, DB_BTREE, ++ oper, mode); ++ if (err != 0) ++ goto fail; ++ break; ++ ++ default: ++ abort (); ++ } ++ ++ /* We have to make sure the file is `closed on exec'. */ ++ err = DL_CALL_FCT (db->fd, (db->db, &fd)); ++ if (err != 0) ++ goto fail; ++ if (set_cloexec_flag (fd) < 0) ++ goto fail; ++ ++ *dbp = db; ++ ++ return NSS_STATUS_UNAVAIL; ++ ++ fail: ++ /* Something went wrong. Close the database if necessary. */ ++ if (db) ++ { ++ if (db->db && db->close) ++ DL_CALL_FCT (db->close, (db->db, 0)); ++ free (db); ++ } ++ ++ /* Make sure `errno' is set. */ ++ if (err) ++ __set_errno (err); ++ ++ return err == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; ++} +diff -u -udbrN glibc-2.3.2/nss/nss_db/dummy-db.h glibc-2.3.2-200304020432/nss/nss_db/dummy-db.h +--- glibc-2.3.2/nss/nss_db/dummy-db.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/nss/nss_db/dummy-db.h Fri Jul 6 06:55:38 2001 +@@ -0,0 +1,333 @@ ++/* Constants and structures from the various Berkeley DB releases. ++ Copyright (C) 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. */ ++ ++#include ++ ++#include "nss_db.h" ++ ++/* This file contains dummy definitions for various constants and ++ structures from the Berkeley release. We only provide those ++ definitions that are actually needed. In case of the structures, ++ we're only interested in the function pointers, since that's the ++ interface to the database. Unfortunately the structures have been ++ changed several times. */ ++ ++/* The value for the btree database type has not been changed (yet?). */ ++#define DB_BTREE (1) ++ ++/* Permission flags for all 2.x releases. */ ++#define DB2x_RDONLY 0x010000 ++ ++/* The error values for all 2.x releases. */ ++#define DB2x_KEYEXIST ( -3) ++#define DB2x_NOTFOUND ( -7) ++ ++/* For all 2.x releases up to 2.6.3 we can use the same definitions. ++ We'll refer to them as 2.4 since that's the version distributed ++ with glibc 2.1. */ ++ ++/* Access methods from version 2.4. */ ++#define DB24_FIRST 0x000020 ++#define DB24_NEXT 0x000800 ++#define DB24_NOOVERWRITE 0x001000 ++ ++/* Permission flags from version 2.4. */ ++#define DB24_TRUNCATE 0x080000 ++ ++/* The DB structure from version 2.4. */ ++struct db24 ++{ ++ void *mutexp; ++ enum { dummy24 } type; ++ void *dbenv; ++ void *mp_dbenv; ++ void *master; ++ void *internal; ++ void *mp; ++ void *mpf; ++ struct ++ { ++ void *tqh_first; ++ void **tqh_last; ++ } curs_queue; ++ struct { ++ void *lh_first; ++ } handleq; ++ struct { ++ void *le_next; ++ void **le_prev; ++ } links; ++ uint32_t log_fileid; ++ void *txn; ++ uint32_t locker; ++ struct db24_dbt { ++ void *data; ++ uint32_t size; ++ uint32_t ulen; ++ uint32_t dlen; ++ uint32_t doff; ++ uint32_t flags; ++ } lock_dbt; ++ struct{ ++ uint32_t pgno; ++ uint8_t fileid[20]; ++ } lock; ++ size_t pgsize; ++ void *db_malloc; ++ /* Functions. */ ++ int (*close) (void *, uint32_t); ++ int (*cursor) (void *, void *, void **); ++ int (*del) (void *, void *, DBT *, uint32_t); ++ int (*fd) (void *, int *); ++ int (*get) (void *, void *, DBT *, DBT *, uint32_t); ++ int (*put) (void *, void *, DBT *, DBT *, uint32_t); ++ int (*stat) (void *, void *, void *(*)(size_t), uint32_t); ++ int (*sync) (void *, uint32_t); ++ uint32_t flags; ++}; ++ ++/* The DBC structure for the 2.4 release. */ ++struct dbc24 ++{ ++ void *dbp; ++ void *txn; ++ struct ++ { ++ void *tqe_next; ++ void **tqe_prev; ++ } links; ++ void *internal; ++ void *c_close; ++ void *c_del; ++ int (*c_get) (void *, DBT *, DBT *, uint32_t); ++ void *c_put; ++}; ++ ++/* The 2.7 release is slighty different. */ ++ ++/* Access methods from version 2.7. */ ++#define DB27_FIRST 7 ++#define DB27_NEXT 15 ++#define DB27_NOOVERWRITE 17 ++ ++/* Permission flags from version 2.7. */ ++#define DB27_TRUNCATE 0x020000 ++ ++/* The DB structure from version 2.7. */ ++struct db27 ++{ ++ void *mutexp; ++ enum { dummy27 } type; ++ int byteswapped; ++ int saved_open_fd; ++ void *dbenv; ++ void *mp_dbenv; ++ void *internal; ++ void *mp; ++ void *mpf; ++ struct ++ { ++ void *tqh_first; ++ void **tqh_last; ++ } free_queue; ++ struct ++ { ++ void *tqh_first; ++ void **tqh_last; ++ } active_queue; ++ uint8_t fileid[20]; ++ uint32_t log_fileid; ++ size_t pgsize; ++ void *db_malloc; ++ void *dup_compare; ++ void *h_hash; ++ /* Functions. */ ++ int (*am_close) (void *); ++ int (*close) (void *, uint32_t); ++ int (*cursor) (void *, void *, void **, uint32_t); ++ int (*del) (void *, void *, DBT *, uint32_t); ++ int (*fd) (void *, int *); ++ int (*get) (void *, void *, DBT *, DBT *, uint32_t); ++ int (*join) (void *, void **, uint32_t, void **); ++ int (*put) (void *, void *, DBT *, DBT *, uint32_t); ++ int (*stat) (void *, void *, void *(*)(size_t), uint32_t); ++ int (*sync) (void *, uint32_t); ++ uint32_t flags; ++}; ++ ++/* The DBC structure for version 2.7. */ ++struct dbc27 ++{ ++ void *dbp; ++ void *txn; ++ struct ++ { ++ void *tqe_next; ++ void **tqe_prev; ++ } links; ++ uint32_t lid; ++ uint32_t locker; ++ DBT lock_dbt; ++ struct{ ++ uint32_t pgno; ++ uint8_t fileid[20]; ++ } lock; ++ size_t mylock; ++ DBT rkey; ++ DBT rdata; ++ void *c_am_close; ++ void *c_am_destroy; ++ void *c_close; ++ void *c_del; ++ int (*c_get) (void *, DBT *, DBT *, uint32_t); ++ void *c_put; ++ void *internal; ++ uint32_t flags; ++}; ++ ++/* Version 3.0 is mostly incompatible with 2.x. */ ++ ++/* Access methods from version 3.0. */ ++#define DB30_FIRST 9 ++#define DB30_NEXT 17 ++#define DB30_NOOVERWRITE 20 ++ ++/* Error values from version 3.0. */ ++#define DB30_KEYEXIST (-30997) ++#define DB30_NOTFOUND (-30994) ++ ++/* Permission flags from version 3.0. */ ++#define DB30_RDONLY 0x000010 ++#define DB30_TRUNCATE 0x020000 ++ ++/* The DB structure from version 3.0. */ ++struct db30 ++{ ++ size_t pgsize; ++ void (*db_feedback) (void *, int, int); ++ void *(*db_malloc) (size_t); ++ void *(*db_realloc) (void *, size_t); ++ int (*dup_compare) (const DBT *, const DBT *); ++ void *dbenv; ++ enum { dummy30 } type; ++ void *mpf; ++ void *mutexp; ++ u_int8_t fileid[20]; ++ int32_t log_fileid; ++ void *open_txn; ++ void *saved_open_fhp; ++ struct ++ { ++ void *tqh_first; ++ void **tqh_last; ++ } free_queue; ++ struct ++ { ++ void *tqh_first; ++ void **tqh_last; ++ } active_queue; ++ void *bt_internal; ++ void *cj_internal; ++ void *h_internal; ++ void *q_internal; ++ void *xa_internal; ++ /* Functions. */ ++ int (*close) (void *, uint32_t); ++ int (*cursor) (void *, void *, void **, uint32_t); ++ int (*del) (void *, void *, DBT *, uint32_t); ++ void (*err) (void *, int, const char *, ...); ++ void (*errx) (void *, const char *, ...); ++ int (*fd) (void *, int *); ++ int (*get) (void *, void *, DBT *, DBT *, uint32_t); ++ int (*get_byteswapped) (void *); ++ int (*get_type) (void *); ++ int (*join) (void *, void **, void **, uint32_t); ++ int (*open) (void *, const char *, const char *, int, uint32_t, int); ++ int (*put) (void *, void *, DBT *, DBT *, uint32_t); ++ int (*remove) (void *, const char *, const char *, uint32_t); ++ int (*set_cachesize) (void *, uint32_t, uint32_t, int); ++ int (*set_dup_compare) (void *, int (*)(const DBT *, const DBT *)); ++ void (*set_errcall) (void *, void (*)(const char *, char *)); ++ void (*set_errfile) (void *, void *); ++ void (*set_errpfx) (void *, const char *); ++ void (*set_feedback) (void *, void (*)(void *, int, int)); ++ int (*set_flags) (void *, uint32_t); ++ int (*set_lorder) (void *, int); ++ int (*set_malloc) (void *, void *(*)(size_t)); ++ int (*set_pagesize) (void *, uint32_t); ++ void (*set_paniccall) (void *, void (*)(void *, int)); ++ int (*set_realloc) (void *, void *(*)(void *, size_t)); ++ int (*stat) (void *, void *, void *(*)(size_t), uint32_t); ++ int (*sync) (void *, uint32_t); ++ int (*upgrade) (void *, const char *, uint32_t); ++ ++ int (*set_bt_compare) (void *, int (*)(const DBT *, const DBT *)); ++ int (*set_bt_maxkey) (void *, uint32_t); ++ int (*set_bt_minkey) (void *, uint32_t); ++ int (*set_bt_prefix) (void *, size_t (*)(const DBT *, const DBT *)); ++ ++ int (*set_h_ffactor) (void *, uint32_t); ++ int (*set_h_hash) (void *, uint32_t (*)(const void *, uint32_t)); ++ int (*set_h_nelem) (void *, uint32_t); ++ ++ int (*set_re_delim) (void *, int); ++ int (*set_re_len) (void *, uint32_t); ++ int (*set_re_pad) (void *, int); ++ int (*set_re_source) (void *, const char *); ++ ++ uint32_t am_ok; ++ uint32_t flags; ++}; ++ ++/* The DBC structure from version 3.0. */ ++struct dbc30 ++{ ++ void *dbp; ++ void *txn; ++ struct ++ { ++ void *tqe_next; ++ void **tqe_prev; ++ } links; ++ uint32_t lid; /* Default process' locker id. */ ++ uint32_t locker; /* Locker for this operation. */ ++ DBT lock_dbt; /* DBT referencing lock. */ ++ struct ++ { ++ uint32_t pgno; ++ uint8_t fileid[20]; ++ } lock; ++ struct ++ { ++ size_t off; ++ uint32_t ndx; ++ uint32_t gen; ++ } mylock; ++ DBT rkey; ++ DBT rdata; ++ int (*c_close) (void *); ++ int (*c_del) (void *, uint32_t); ++ int (*c_dup) (void *, void **, uint32_t); ++ int (*c_get) (void *, DBT *, DBT *, uint32_t); ++ int (*c_put) (void *, DBT *, DBT *, uint32_t); ++ int (*c_am_close) (void *); ++ int (*c_am_destroy) (void *); ++ void *internal; ++ uint32_t flags; ++}; +diff -u -udbrN glibc-2.3.2/nss/nss_db/nss_db.h glibc-2.3.2-200304020432/nss/nss_db/nss_db.h +--- glibc-2.3.2/nss/nss_db/nss_db.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/nss/nss_db/nss_db.h Fri Jul 6 06:55:38 2001 +@@ -0,0 +1,94 @@ ++/* Common database open/close routines for nss_db. ++ Copyright (C) 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 _NSS_DB_H ++#define _NSS_DB_H 1 ++ ++#include ++#include ++ ++/* Variables which keep track of the error values. */ ++extern int db_keyexist; ++extern int db_notfound; ++ ++/* This flag is the same for all versions of the Berkeley DB library. */ ++#define DB_CREATE 0x000001 ++ ++/* But constants which vary from version to version are actually ++ variables here. */ ++extern int db_first; ++extern int db_next; ++extern int db_nooverwrite; ++extern int db_truncate; ++extern int db_rdonly; ++ ++/* The `DBT' type is the same in all versions we support. */ ++typedef struct ++{ ++ void *data; ++ uint32_t size; ++ uint32_t ulen; ++ uint32_t dlen; ++ uint32_t doff; ++ uint32_t flags; ++} DBT; ++ ++/* But the cursor object is very different from version to version. */ ++typedef struct ++{ ++ void *cursor; ++ int (*c_get) (void *, DBT *, DBT *, uint32_t); ++} NSS_DBC; ++ ++/* We need a helper function for it. */ ++extern int db_cursor (void *db, void *txn, NSS_DBC **dbcp); ++ ++/* This is the wrapper we put around the `DB' structures to provide a ++ uniform interface to the higher-level functions. */ ++typedef struct ++{ ++ void *db; ++ int (*close) (void *, uint32_t); ++ int (*cursor) (void *, void *, NSS_DBC **); ++ int (*fd) (void *, int *); ++ int (*get) (void *, void *, DBT *, DBT *, uint32_t); ++ int (*put) (void *, void *, DBT *, DBT *, uint32_t); ++} NSS_DB; ++ ++/* Open the database stored in FILE. If succesful, store the database ++ handle in *DBP and return NSS_STATUS_SUCCESS. On failure, return ++ the appropriate lookup status. */ ++extern enum nss_status internal_setent (const char *file, NSS_DB **dbp); ++ ++/* Close the database *DBP. */ ++extern void internal_endent (NSS_DB **dbp); ++ ++/* Dynamically load the Berkeley DB library. Return zero if ++ successful, non-zero if no suitable version of the library could be ++ loaded. */ ++extern enum nss_status load_db (void); ++ ++/* Open the database in FNAME, for access specified by FLAGS. If ++ opening the database causes the file FNAME to be created, it is ++ created with MODE. If succesful, store the database handle in *DBP ++ and return NSS_STATUS_SUCCESS. On failure, return the appropriate ++ lookup status. */ ++extern int dbopen (const char *fname, int oper, int mode, NSS_DB **dbp); ++ ++#endif /* nss_db.h */ +diff -u -udbrN glibc-2.3.2/nss/nss_files/files-hosts.c glibc-2.3.2-200304020432/nss/nss_files/files-hosts.c +--- glibc-2.3.2/nss/nss_files/files-hosts.c Wed Feb 12 08:37:22 2003 ++++ glibc-2.3.2-200304020432/nss/nss_files/files-hosts.c Sun Mar 16 04:31:40 2003 +@@ -280,7 +280,7 @@ + + DB_LOOKUP (hostbyaddr, ,, + { +- if (result->h_length == len ++ if (result->h_length == (int) len + && ! memcmp (addr, result->h_addr_list[0], len)) + break; + }, const void *addr, socklen_t len, int af) +Binary files glibc-2.3.2/po/be.mo and glibc-2.3.2-200304020432/po/be.mo differ +Binary files glibc-2.3.2/po/ca.mo and glibc-2.3.2-200304020432/po/ca.mo differ +diff -u -udbrN glibc-2.3.2/po/ca.po glibc-2.3.2-200304020432/po/ca.po +--- glibc-2.3.2/po/ca.po Mon Nov 4 07:56:29 2002 ++++ glibc-2.3.2-200304020432/po/ca.po Sun Mar 9 23:51:17 2003 +@@ -1,12 +1,12 @@ + # Catalan messages for GNU libc. + # Copyright (C) 2002 Free Software Foundation, Inc. +-# Ivan Vilata i Balaguer , 1998, 1999, 2000, 2001, 2002. ++# Ivan Vilata i Balaguer , 1998, 1999, 2000, 2001, 2002, 2003. + # + msgid "" + msgstr "" +-"Project-Id-Version: libc 2.3.1\n" +-"POT-Creation-Date: 2002-10-02 17:22-0700\n" +-"PO-Revision-Date: 2002-10-29 18:59+0100\n" ++"Project-Id-Version: libc 2.3.2\n" ++"POT-Creation-Date: 2003-02-22 15:34-0800\n" ++"PO-Revision-Date: 2003-03-09 23:39+0100\n" + "Last-Translator: Ivan Vilata i Balaguer \n" + "Language-Team: Catalan \n" + "MIME-Version: 1.0\n" +@@ -267,8 +267,8 @@ + + #: iconv/iconv_prog.c:241 + #, c-format +-msgid "conversions from `%s' and to `%s' are not supported" +-msgstr "les conversions des de «%s» i cap a «%s» no són suportades" ++msgid "conversion from `%s' and to `%s' are not supported" ++msgstr "la conversió des de «%s» cap a «%s» no és suportada" + + #: iconv/iconv_prog.c:246 + #, c-format +@@ -293,15 +293,15 @@ + msgid "error while closing output file" + msgstr "error en tancar el fitxer d'eixida" + +-#: iconv/iconv_prog.c:407 iconv/iconvconfig.c:355 locale/programs/locale.c:268 ++#: iconv/iconv_prog.c:407 iconv/iconvconfig.c:357 locale/programs/locale.c:274 + #: locale/programs/localedef.c:372 catgets/gencat.c:233 + #: malloc/memusagestat.c:602 debug/pcprofiledump.c:199 + msgid "Report bugs using the `glibcbug' script to .\n" + msgstr "Informeu dels errors amb el guió «glibcbug» a .\n" + +-#: iconv/iconv_prog.c:421 iconv/iconvconfig.c:369 locale/programs/locale.c:281 +-#: locale/programs/localedef.c:386 catgets/gencat.c:246 posix/getconf.c:904 +-#: nss/getent.c:74 nscd/nscd.c:279 nscd/nscd_nischeck.c:90 elf/ldconfig.c:259 ++#: iconv/iconv_prog.c:421 iconv/iconvconfig.c:371 locale/programs/locale.c:287 ++#: locale/programs/localedef.c:386 catgets/gencat.c:246 posix/getconf.c:910 ++#: nss/getent.c:74 nscd/nscd.c:330 nscd/nscd_nischeck.c:90 elf/ldconfig.c:271 + #: elf/sprof.c:349 + #, c-format + msgid "" +@@ -314,9 +314,9 @@ + "de còpia. No hi ha CAP garantia; ni tan sols de COMERCIABILITAT o\n" + "ADEQUACIÓ A UN PROPÒSIT PARTICULAR.\n" + +-#: iconv/iconv_prog.c:426 iconv/iconvconfig.c:374 locale/programs/locale.c:286 +-#: locale/programs/localedef.c:391 catgets/gencat.c:251 posix/getconf.c:909 +-#: nss/getent.c:79 nscd/nscd.c:284 nscd/nscd_nischeck.c:95 elf/ldconfig.c:264 ++#: iconv/iconv_prog.c:426 iconv/iconvconfig.c:376 locale/programs/locale.c:292 ++#: locale/programs/localedef.c:391 catgets/gencat.c:251 posix/getconf.c:915 ++#: nss/getent.c:79 nscd/nscd.c:335 nscd/nscd_nischeck.c:95 elf/ldconfig.c:276 + #: elf/sprof.c:355 + #, c-format + msgid "Written by %s.\n" +@@ -370,15 +370,15 @@ + msgid "Prefix used for all file accesses" + msgstr "Prefix a usar en tots els accessos a fitxer" + +-#: iconv/iconvconfig.c:325 locale/programs/localedef.c:292 ++#: iconv/iconvconfig.c:327 locale/programs/localedef.c:292 + msgid "no output file produced because warning were issued" + msgstr "no hi ha fitxer d'eixida perquè s'han produït avisos" + +-#: iconv/iconvconfig.c:403 ++#: iconv/iconvconfig.c:405 + msgid "while inserting in search tree" + msgstr "en inserir en l'arbre de recerca" + +-#: iconv/iconvconfig.c:1202 ++#: iconv/iconvconfig.c:1204 + msgid "cannot generate output file" + msgstr "no s'ha pogut generar el fitxer d'eixida" + +@@ -1295,7 +1295,7 @@ + msgid "unterminated symbolic name" + msgstr "el nom simbòlic no és terminat" + +-#: locale/programs/linereader.c:537 catgets/gencat.c:1166 ++#: locale/programs/linereader.c:537 catgets/gencat.c:1195 + msgid "invalid escape sequence" + msgstr "la seqüència d'escapada no és vàlida" + +@@ -1325,41 +1325,41 @@ + msgid "trailing garbage at end of line" + msgstr "fem al final de la línia" + +-#: locale/programs/locale.c:73 ++#: locale/programs/locale.c:75 + msgid "System information:" + msgstr "Informació del sistema:" + +-#: locale/programs/locale.c:75 ++#: locale/programs/locale.c:77 + msgid "Write names of available locales" + msgstr "Mostra els noms dels locales disponibles" + +-#: locale/programs/locale.c:77 ++#: locale/programs/locale.c:79 + msgid "Write names of available charmaps" + msgstr "Mostra els noms dels mapes de caràcters disponibles" + + # ivb (2001/10/30) + # ivb Aquesta línia dóna pas a un conjunt d'opcions que modif. l'eixida. +-#: locale/programs/locale.c:78 ++#: locale/programs/locale.c:80 + msgid "Modify output format:" + msgstr "Modificadors del format de l'eixida:" + +-#: locale/programs/locale.c:79 ++#: locale/programs/locale.c:81 + msgid "Write names of selected categories" + msgstr "Mostra els noms de les categories seleccionades" + +-#: locale/programs/locale.c:80 ++#: locale/programs/locale.c:82 + msgid "Write names of selected keywords" + msgstr "Mostra els noms de les paraules clau seleccionades" + +-#: locale/programs/locale.c:81 ++#: locale/programs/locale.c:83 + msgid "Print more information" + msgstr "Mostra més informació" + +-#: locale/programs/locale.c:86 ++#: locale/programs/locale.c:88 + msgid "Get locale-specific information." + msgstr "Obté la informació específica d'un locale." + +-#: locale/programs/locale.c:89 ++#: locale/programs/locale.c:91 + msgid "" + "NAME\n" + "[-a|-m]" +@@ -1367,7 +1367,7 @@ + "NOM\n" + "[-a|-m]" + +-#: locale/programs/locale.c:488 ++#: locale/programs/locale.c:512 + msgid "while preparing output" + msgstr "en preparar l'eixida" + +@@ -1504,16 +1504,16 @@ + msgid "cannot create temporary file" + msgstr "no s'ha pogut crear un fitxer temporal" + +-#: locale/programs/locarchive.c:118 locale/programs/locarchive.c:302 ++#: locale/programs/locarchive.c:118 locale/programs/locarchive.c:305 + msgid "cannot initialize archive file" + msgstr "no s'ha pogut iniciar el fitxer arxiu" + +-#: locale/programs/locarchive.c:125 locale/programs/locarchive.c:309 ++#: locale/programs/locarchive.c:125 locale/programs/locarchive.c:312 + msgid "cannot resize archive file" + msgstr "no s'ha pogut redimensionar el fitxer arxiu" + +-#: locale/programs/locarchive.c:134 locale/programs/locarchive.c:318 +-#: locale/programs/locarchive.c:508 ++#: locale/programs/locarchive.c:134 locale/programs/locarchive.c:321 ++#: locale/programs/locarchive.c:511 + msgid "cannot map archive header" + msgstr "no s'ha pogut mapar la capçalera de l'arxiu" + +@@ -1531,92 +1531,92 @@ + msgid "cannot map locale archive file" + msgstr "no s'ha pogut mapar el fitxer arxiu de locales" + +-#: locale/programs/locarchive.c:326 ++#: locale/programs/locarchive.c:329 + msgid "cannot lock new archive" + msgstr "no s'ha pogut blocar el nou arxiu" + +-#: locale/programs/locarchive.c:377 ++#: locale/programs/locarchive.c:380 + msgid "cannot extend locale archive file" + msgstr "no s'ha pogut estendre el fitxer arxiu de locales" + +-#: locale/programs/locarchive.c:386 ++#: locale/programs/locarchive.c:389 + msgid "cannot change mode of resized locale archive" + msgstr "no s'ha pogut canviar el mode de l'arxiu de locales redimensionat" + +-#: locale/programs/locarchive.c:394 ++#: locale/programs/locarchive.c:397 + msgid "cannot rename new archive" + msgstr "no s'ha pogut reanomenar el nou arxiu" + +-#: locale/programs/locarchive.c:447 ++#: locale/programs/locarchive.c:450 + #, c-format + msgid "cannot open locale archive \"%s\"" + msgstr "no s'ha pogut obrir l'arxiu «%s» de locales" + +-#: locale/programs/locarchive.c:452 ++#: locale/programs/locarchive.c:455 + #, c-format + msgid "cannot stat locale archive \"%s\"" + msgstr "ha fallat stat() sobre l'arxiu «%s» de locales" + +-#: locale/programs/locarchive.c:471 ++#: locale/programs/locarchive.c:474 + #, c-format + msgid "cannot lock locale archive \"%s\"" + msgstr "no s'ha pogut blocar l'arxiu «%s» de locales" + +-#: locale/programs/locarchive.c:494 ++#: locale/programs/locarchive.c:497 + msgid "cannot read archive header" + msgstr "no s'ha pogut llegir la capçalera de l'arxiu" + +-#: locale/programs/locarchive.c:554 ++#: locale/programs/locarchive.c:557 + #, c-format + msgid "locale '%s' already exists" + msgstr "el locale «%s» ja existeix" + +-#: locale/programs/locarchive.c:784 locale/programs/locarchive.c:799 +-#: locale/programs/locarchive.c:811 locale/programs/locarchive.c:823 ++#: locale/programs/locarchive.c:788 locale/programs/locarchive.c:803 ++#: locale/programs/locarchive.c:815 locale/programs/locarchive.c:827 + #: locale/programs/locfile.c:343 + msgid "cannot add to locale archive" + msgstr "no s'ha pogut afegir a l'arxiu de locales" + + # ivb (2002/10/21) + # ivb El fitxer conté àlies de diversos locales (locale.alias). +-#: locale/programs/locarchive.c:976 ++#: locale/programs/locarchive.c:982 + #, c-format + msgid "locale alias file `%s' not found" + msgstr "no s'ha trobat el fitxer «%s» d'àlies de locales" + + # ivb (2002/10/21) + # ivb És un missatge, no un error. +-#: locale/programs/locarchive.c:1118 ++#: locale/programs/locarchive.c:1126 + #, c-format + msgid "Adding %s\n" + msgstr "S'està afegint «%s»\n" + +-#: locale/programs/locarchive.c:1124 ++#: locale/programs/locarchive.c:1132 + #, c-format + msgid "stat of \"%s\" failed: %s: ignored" + msgstr "ha fallat stat() sobre «%s»: %s: es descarta" + +-#: locale/programs/locarchive.c:1130 ++#: locale/programs/locarchive.c:1138 + #, c-format + msgid "\"%s\" is no directory; ignored" + msgstr "«%s» no és un directori: es descarta" + +-#: locale/programs/locarchive.c:1137 ++#: locale/programs/locarchive.c:1145 + #, c-format + msgid "cannot open directory \"%s\": %s: ignored" + msgstr "no s'ha pogut obrir el directori «%s»: %s: es descarta" + +-#: locale/programs/locarchive.c:1209 ++#: locale/programs/locarchive.c:1217 + #, c-format + msgid "incomplete set of locale files in \"%s\"" + msgstr "el joc de fitxers de locale en «%s» no és complet" + +-#: locale/programs/locarchive.c:1273 ++#: locale/programs/locarchive.c:1281 + #, c-format + msgid "cannot read all files in \"%s\": ignored" + msgstr "no s'han pogut llegir tots els fitxers de «%s»: es descarta" + +-#: locale/programs/locarchive.c:1343 ++#: locale/programs/locarchive.c:1351 + #, c-format + msgid "locale \"%s\" not in archive" + msgstr "el locale «%s» no es troba en l'arxiu" +@@ -1687,8 +1687,8 @@ + msgid "upper limit in range is not smaller then lower limit" + msgstr "el límit superior del rang no és menor que l'inferior" + +-#: locale/programs/xmalloc.c:70 malloc/obstack.c:500 malloc/obstack.c:503 +-#: posix/getconf.c:996 ++#: locale/programs/xmalloc.c:70 malloc/obstack.c:505 malloc/obstack.c:508 ++#: posix/getconf.c:1002 + msgid "memory exhausted" + msgstr "la memòria s'ha exhaurit" + +@@ -1714,7 +1714,7 @@ + msgid "Another string for testing." + msgstr "Altra cadena de prova." + +-#: catgets/gencat.c:111 catgets/gencat.c:115 nscd/nscd.c:79 ++#: catgets/gencat.c:111 catgets/gencat.c:115 nscd/nscd.c:84 + msgid "NAME" + msgstr "NOM" + +@@ -1758,7 +1758,7 @@ + msgid "duplicate set definition" + msgstr "la definició del joc de missatges és duplicada" + +-#: catgets/gencat.c:446 catgets/gencat.c:619 catgets/gencat.c:648 ++#: catgets/gencat.c:446 catgets/gencat.c:623 catgets/gencat.c:677 + msgid "this is the first definition" + msgstr "aquesta és la primera definició" + +@@ -1776,44 +1776,44 @@ + msgid "unknown directive `%s': line ignored" + msgstr "la directiva «%s» no és coneguda: es descarta la línia" + +-#: catgets/gencat.c:617 ++#: catgets/gencat.c:621 + msgid "duplicated message number" + msgstr "el número de missatge és duplicat" + +-#: catgets/gencat.c:645 ++#: catgets/gencat.c:674 + msgid "duplicated message identifier" + msgstr "l'identificador de missatge és duplicat" + +-#: catgets/gencat.c:702 ++#: catgets/gencat.c:731 + msgid "invalid character: message ignored" + msgstr "el caràcter no és vàlid: es descarta el missatge" + +-#: catgets/gencat.c:745 ++#: catgets/gencat.c:774 + msgid "invalid line" + msgstr "la línia no és vàlida" + +-#: catgets/gencat.c:799 ++#: catgets/gencat.c:828 + msgid "malformed line ignored" + msgstr "es descarta la línia malmesa" + +-#: catgets/gencat.c:963 catgets/gencat.c:1004 ++#: catgets/gencat.c:992 catgets/gencat.c:1033 + #, c-format + msgid "cannot open output file `%s'" + msgstr "no s'ha pogut obrir el fitxer d'eixida «%s»" + +-#: catgets/gencat.c:1188 ++#: catgets/gencat.c:1217 + msgid "unterminated message" + msgstr "el missatge no és terminat" + +-#: catgets/gencat.c:1212 ++#: catgets/gencat.c:1241 + msgid "while opening old catalog file" + msgstr "en obrir el fitxer antic de catàleg" + +-#: catgets/gencat.c:1303 ++#: catgets/gencat.c:1332 + msgid "conversion modules not available" + msgstr "els mòduls de conversió no es troben disponibles" + +-#: catgets/gencat.c:1329 ++#: catgets/gencat.c:1358 + msgid "cannot determine escape character" + msgstr "no s'ha pogut determinar el caràcter d'escapada" + +@@ -1821,7 +1821,7 @@ + msgid "makecontext: does not know how to handle more than 8 arguments\n" + msgstr "makecontext: no es poden tractar més de 8 arguments\n" + +-#: stdio-common/../sysdeps/gnu/errlist.c:12 posix/regcomp.c:178 ++#: stdio-common/../sysdeps/gnu/errlist.c:12 posix/regcomp.c:133 + #: nis/nis_error.c:29 nis/ypclnt.c:787 nis/ypclnt.c:861 + msgid "Success" + msgstr "Èxit" +@@ -3024,23 +3024,23 @@ + msgid "%s%sUnknown signal %d\n" + msgstr "%s%sSenyal desconegut %d\n" + +-#: malloc/mcheck.c:296 ++#: malloc/mcheck.c:346 + msgid "memory is consistent, library is buggy\n" + msgstr "la memòria és consistent; la biblioteca té errors\n" + +-#: malloc/mcheck.c:299 ++#: malloc/mcheck.c:349 + msgid "memory clobbered before allocated block\n" + msgstr "s'ha sobreescrit la memòria d'abans del bloc reservat\n" + +-#: malloc/mcheck.c:302 ++#: malloc/mcheck.c:352 + msgid "memory clobbered past end of allocated block\n" + msgstr "s'ha sobreescrit la memòria de després del bloc reservat\n" + +-#: malloc/mcheck.c:305 ++#: malloc/mcheck.c:355 + msgid "block freed twice\n" + msgstr "s'ha alliberat el bloc dues voltes\n" + +-#: malloc/mcheck.c:308 ++#: malloc/mcheck.c:358 + msgid "bogus mcheck_status, library is buggy\n" + msgstr "el valor d'«mcheck_status» és estrany; la biblioteca té errors\n" + +@@ -3076,6 +3076,10 @@ + msgid "DATAFILE [OUTFILE]" + msgstr "FITXERDADES [FITXEREIXIDA]" + ++#: string/strerror.c:43 posix/../sysdeps/posix/gai_strerror.c:57 ++msgid "Unknown error" ++msgstr "Error desconegut" ++ + #: string/strsignal.c:69 + #, c-format + msgid "Real-time signal %d" +@@ -3102,7 +3106,7 @@ + msgid "%s: Memory exhausted: %s\n" + msgstr "%s: La memòria s'ha exhaurit: %s\n" + +-#: timezone/zic.c:390 misc/error.c:120 ++#: timezone/zic.c:390 misc/error.c:127 misc/error.c:155 + msgid "Unknown system error" + msgstr "Error desconegut del sistema" + +@@ -3507,27 +3511,23 @@ + msgid "Interrupted by a signal" + msgstr "Interromput per un senyal" + +-#: posix/../sysdeps/posix/gai_strerror.c:57 +-msgid "Unknown error" +-msgstr "Error desconegut" +- +-#: posix/getconf.c:883 ++#: posix/getconf.c:889 + #, c-format + msgid "Usage: %s [-v specification] variable_name [pathname]\n" + msgstr "Forma d'ús: %s [-v especificació] nom_de_la_variable [camí]\n" + +-#: posix/getconf.c:941 ++#: posix/getconf.c:947 + #, c-format + msgid "unknown specification \"%s\"" + msgstr "l'especificació «%s» no és coneguda" + + # ivb (2001/11/01) + # ivb Es refereix a variables de configuració -> femení. +-#: posix/getconf.c:968 posix/getconf.c:984 ++#: posix/getconf.c:974 posix/getconf.c:990 + msgid "undefined" + msgstr "indefinida" + +-#: posix/getconf.c:1006 ++#: posix/getconf.c:1012 + #, c-format + msgid "Unrecognized variable `%s'" + msgstr "La variable «%s» no és reconeguda" +@@ -3589,71 +3589,71 @@ + msgid "%s: option `-W %s' doesn't allow an argument\n" + msgstr "%s: l'opció «-W %s» no admet arguments\n" + +-#: posix/regcomp.c:181 ++#: posix/regcomp.c:136 + msgid "No match" + msgstr "No hi ha cap coincidència" + +-#: posix/regcomp.c:184 ++#: posix/regcomp.c:139 + msgid "Invalid regular expression" + msgstr "L'expressió regular no és vàlida" + +-#: posix/regcomp.c:187 ++#: posix/regcomp.c:142 + msgid "Invalid collation character" + msgstr "El caràcter d'ordenació no és vàlid" + +-#: posix/regcomp.c:190 ++#: posix/regcomp.c:145 + msgid "Invalid character class name" + msgstr "El nom de la classe de caràcters no és vàlid" + +-#: posix/regcomp.c:193 ++#: posix/regcomp.c:148 + msgid "Trailing backslash" + msgstr "Hi ha una barra invertida sobrant al final" + +-#: posix/regcomp.c:196 ++#: posix/regcomp.c:151 + msgid "Invalid back reference" + msgstr "La referència cap enrere no és vàlida" + +-#: posix/regcomp.c:199 ++#: posix/regcomp.c:154 + msgid "Unmatched [ or [^" + msgstr "[ o [^ desaparellat" + +-#: posix/regcomp.c:202 ++#: posix/regcomp.c:157 + msgid "Unmatched ( or \\(" + msgstr "( o \\( desaparellat" + +-#: posix/regcomp.c:205 ++#: posix/regcomp.c:160 + msgid "Unmatched \\{" + msgstr "\\{ desaparellat" + +-#: posix/regcomp.c:208 ++#: posix/regcomp.c:163 + msgid "Invalid content of \\{\\}" + msgstr "El contingut de \\{\\} no és vàlid" + +-#: posix/regcomp.c:211 ++#: posix/regcomp.c:166 + msgid "Invalid range end" + msgstr "El final del rang no és vàlid" + +-#: posix/regcomp.c:214 ++#: posix/regcomp.c:169 + msgid "Memory exhausted" + msgstr "La memòria s'ha exhaurit" + +-#: posix/regcomp.c:217 ++#: posix/regcomp.c:172 + msgid "Invalid preceding regular expression" + msgstr "L'expressió regular precedent és incorrecta" + +-#: posix/regcomp.c:220 ++#: posix/regcomp.c:175 + msgid "Premature end of regular expression" + msgstr "Fí prematur de l'expressió regular" + +-#: posix/regcomp.c:223 ++#: posix/regcomp.c:178 + msgid "Regular expression too big" + msgstr "L'expressió regular és massa llarga" + +-#: posix/regcomp.c:226 ++#: posix/regcomp.c:181 + msgid "Unmatched ) or \\)" + msgstr ") o \\) desaparellat" + +-#: posix/regcomp.c:673 ++#: posix/regcomp.c:615 + msgid "No previous regular expression" + msgstr "No hi ha expressió regular prèvia" + +@@ -3812,24 +3812,24 @@ + msgid "Service configuration to be used" + msgstr "Configuració a usar del servei" + +-#: nss/getent.c:136 nss/getent.c:305 ++#: nss/getent.c:136 nss/getent.c:308 + #, c-format + msgid "Enumeration not supported on %s\n" + msgstr "No es suporta l'enumeració sobre «%s»\n" + +-#: nss/getent.c:729 ++#: nss/getent.c:732 + msgid "getent - get entries from administrative database." + msgstr "getent - obté les entrades de les bases de dades d'administració." + +-#: nss/getent.c:730 ++#: nss/getent.c:733 + msgid "Supported databases:" + msgstr "Bases de dades suportades:" + +-#: nss/getent.c:787 nscd/nscd.c:119 nscd/nscd_nischeck.c:64 ++#: nss/getent.c:790 nscd/nscd.c:124 nscd/nscd_nischeck.c:64 + msgid "wrong number of arguments" + msgstr "el nombre d'arguments és incorrecte" + +-#: nss/getent.c:797 ++#: nss/getent.c:800 + #, c-format + msgid "Unknown database: %s\n" + msgstr "La base de dades no és coneguda: %s\n" +@@ -3866,70 +3866,74 @@ + msgid "invalid pointer size" + msgstr "el tamany del punter no és vàlid" + +-#: inet/rcmd.c:174 inet/rcmd.c:177 ++#: inet/rcmd.c:163 inet/rcmd.c:166 ++msgid "rcmd: Cannot allocate memory\n" ++msgstr "rcmd: No s'ha pogut reservar memòria\n" ++ ++#: inet/rcmd.c:185 inet/rcmd.c:188 + msgid "rcmd: socket: All ports in use\n" + msgstr "rcmd: socket: Tots els ports estan sent usats\n" + +-#: inet/rcmd.c:211 ++#: inet/rcmd.c:222 + #, c-format + msgid "connect to address %s: " + msgstr "connexió amb l'adreça «%s»: " + +-#: inet/rcmd.c:229 ++#: inet/rcmd.c:240 + #, c-format + msgid "Trying %s...\n" + msgstr "S'està provant amb «%s»...\n" + +-#: inet/rcmd.c:278 ++#: inet/rcmd.c:289 + #, c-format + msgid "rcmd: write (setting up stderr): %m\n" + msgstr "rcmd: write (en preparar l'eixida estàndard d'errors): %m\n" + +-#: inet/rcmd.c:299 ++#: inet/rcmd.c:310 + #, c-format + msgid "rcmd: poll (setting up stderr): %m\n" + msgstr "rcmd: poll (en preparar l'exida estàndard d'errors): %m\n" + +-#: inet/rcmd.c:302 ++#: inet/rcmd.c:313 + msgid "poll: protocol failure in circuit setup\n" + msgstr "poll: fallada del protocol en configurar el circuit\n" + +-#: inet/rcmd.c:346 ++#: inet/rcmd.c:358 + msgid "socket: protocol failure in circuit setup\n" + msgstr "socket: fallada del protocol en configurar el circuit\n" + +-#: inet/rcmd.c:368 ++#: inet/rcmd.c:387 + #, c-format + msgid "rcmd: %s: short read" + msgstr "rcmd: %s: lectura incompleta" + +-#: inet/rcmd.c:524 ++#: inet/rcmd.c:549 + msgid "lstat failed" + msgstr "ha fallat lstat()" + + # ivb (2001/10/31) + # ivb Cal tenir en compte que «ordinary» a l'anglés és cosa pler diferent ;) +-#: inet/rcmd.c:526 ++#: inet/rcmd.c:551 + msgid "not regular file" + msgstr "no és un fitxer ordinari" + +-#: inet/rcmd.c:531 ++#: inet/rcmd.c:556 + msgid "cannot open" + msgstr "no s'ha pogut obrir" + +-#: inet/rcmd.c:533 ++#: inet/rcmd.c:558 + msgid "fstat failed" + msgstr "ha fallat fstat()" + +-#: inet/rcmd.c:535 ++#: inet/rcmd.c:560 + msgid "bad owner" + msgstr "el propietari no és vàlid" + +-#: inet/rcmd.c:537 ++#: inet/rcmd.c:562 + msgid "writeable by other than owner" + msgstr "és modificable per altres que no en són el propietari" + +-#: inet/rcmd.c:539 ++#: inet/rcmd.c:564 + msgid "hard linked somewhere" + msgstr "té un enllaç fort en altre lloc" + +@@ -4146,109 +4150,109 @@ + msgid "Cannot receive reply to broadcast" + msgstr "No s'ha pogut rebre una resposta a la difusió" + +-#: sunrpc/rpc_main.c:289 ++#: sunrpc/rpc_main.c:288 + #, c-format + msgid "%s: output would overwrite %s\n" + msgstr "%s: l'eixida sobreescriuria «%s»\n" + +-#: sunrpc/rpc_main.c:296 ++#: sunrpc/rpc_main.c:295 + #, c-format + msgid "%s: unable to open %s: %m\n" + msgstr "%s: no s'ha pogut obrir «%s»: %m\n" + +-#: sunrpc/rpc_main.c:308 ++#: sunrpc/rpc_main.c:307 + #, c-format + msgid "%s: while writing output %s: %m" + msgstr "%s: en escriure en l'eixida «%s»: %m" + +-#: sunrpc/rpc_main.c:343 ++#: sunrpc/rpc_main.c:342 + #, c-format + msgid "cannot find C preprocessor: %s \n" + msgstr "no s'ha pogut trobar el preprocessador de C: %s\n" + +-#: sunrpc/rpc_main.c:351 ++#: sunrpc/rpc_main.c:350 + msgid "cannot find any C preprocessor (cpp)\n" + msgstr "no s'ha pogut trobar cap preprocessador de C (cpp)\n" + +-#: sunrpc/rpc_main.c:420 ++#: sunrpc/rpc_main.c:419 + #, c-format + msgid "%s: C preprocessor failed with signal %d\n" + msgstr "%s: el preprocessador de C ha fallat amb el senyal %d\n" + +-#: sunrpc/rpc_main.c:423 ++#: sunrpc/rpc_main.c:422 + #, c-format + msgid "%s: C preprocessor failed with exit code %d\n" + msgstr "%s: el preprocessador de C ha fallat amb el codi d'eixida %d\n" + +-#: sunrpc/rpc_main.c:463 ++#: sunrpc/rpc_main.c:462 + #, c-format + msgid "illegal nettype :`%s'\n" + msgstr "el tipus de xarxa no és permés: «%s»\n" + +-#: sunrpc/rpc_main.c:1105 ++#: sunrpc/rpc_main.c:1104 + msgid "rpcgen: too many defines\n" + msgstr "rpcgen: hi ha massa definicions\n" + +-#: sunrpc/rpc_main.c:1117 ++#: sunrpc/rpc_main.c:1116 + msgid "rpcgen: arglist coding error\n" + msgstr "rpcgen: error en codificar els arguments\n" + + #. TRANS: the file will not be removed; this is an + #. TRANS: informative message. +-#: sunrpc/rpc_main.c:1150 ++#: sunrpc/rpc_main.c:1149 + #, c-format + msgid "file `%s' already exists and may be overwritten\n" + msgstr "el fitxer «%s» ja existeix i podria ser sobreescrit\n" + +-#: sunrpc/rpc_main.c:1195 ++#: sunrpc/rpc_main.c:1194 + msgid "Cannot specify more than one input file!\n" + msgstr "No es pot especificar més d'un fitxer d'entrada!\n" + +-#: sunrpc/rpc_main.c:1365 ++#: sunrpc/rpc_main.c:1364 + msgid "This implementation doesn't support newstyle or MT-safe code!\n" + msgstr "Aquesta implementació no suporta l'estil nou ni el codi compatible amb MT!\n" + +-#: sunrpc/rpc_main.c:1374 ++#: sunrpc/rpc_main.c:1373 + msgid "Cannot use netid flag with inetd flag!\n" + msgstr "No es pot usar l'opció idxarxa (-n) amb l'opció inetd (-I)!\n" + +-#: sunrpc/rpc_main.c:1386 ++#: sunrpc/rpc_main.c:1385 + msgid "Cannot use netid flag without TIRPC!\n" + msgstr "No es pot usar l'opció idxarxa (-n) sense TIRPC!\n" + +-#: sunrpc/rpc_main.c:1393 ++#: sunrpc/rpc_main.c:1392 + msgid "Cannot use table flags with newstyle!\n" + msgstr "No es pot usar opcions de taula amb l'estil nou (-N)!\n" + +-#: sunrpc/rpc_main.c:1412 ++#: sunrpc/rpc_main.c:1411 + msgid "\"infile\" is required for template generation flags.\n" + msgstr "cal «fitxerentrada» pels senyaladors de generació de plantilles.\n" + +-#: sunrpc/rpc_main.c:1417 ++#: sunrpc/rpc_main.c:1416 + msgid "Cannot have more than one file generation flag!\n" + msgstr "No es pot tenir més d'un senyalador de generació de fitxers!\n" + +-#: sunrpc/rpc_main.c:1426 ++#: sunrpc/rpc_main.c:1425 + #, c-format + msgid "usage: %s infile\n" + msgstr "Forma d'ús: %s fitxerentrada\n" + +-#: sunrpc/rpc_main.c:1427 ++#: sunrpc/rpc_main.c:1426 + #, c-format + msgid "\t%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile\n" + msgstr "\t%s [-abkCLNTM][-Dnom[=valor]] [-i tamany] [-I [-K segons]] [-Y camí] fitxerentrada\n" + +-#: sunrpc/rpc_main.c:1429 ++#: sunrpc/rpc_main.c:1428 + #, 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 fitxereixida] [fitxerentrada]\n" + +-#: sunrpc/rpc_main.c:1431 ++#: sunrpc/rpc_main.c:1430 + #, c-format + msgid "\t%s [-s nettype]* [-o outfile] [infile]\n" + msgstr "\t%s [-s tipusdexarxa]* [-o fitxereixida] [fitxerentrada]\n" + +-#: sunrpc/rpc_main.c:1432 ++#: sunrpc/rpc_main.c:1431 + #, c-format + msgid "\t%s [-n netid]* [-o outfile] [infile]\n" + msgstr "\t%s [-n idxarxa]* [-o fitxereixida] [fitxerentrada]\n" +@@ -5126,7 +5130,7 @@ + msgid "while allocating hash table entry" + msgstr "en reservar una entrada en la taula de dispersió" + +-#: nscd/cache.c:150 nscd/connections.c:185 ++#: nscd/cache.c:150 nscd/connections.c:187 + #, c-format + msgid "cannot stat() file `%s': %s" + msgstr "ha fallat stat() sobre el fitxer «%s»: %s" +@@ -5139,27 +5143,32 @@ + msgid "Cannot run nscd in secure mode as unprivileged user" + msgstr "no es pot executar «nscd» en mode segur com a usuari sense privilegis" + +-#: nscd/connections.c:199 ++#: nscd/connections.c:175 ++#, c-format ++msgid "while allocating cache: %s" ++msgstr "en reservar la memòria cau: %s" ++ ++#: nscd/connections.c:200 + #, c-format + msgid "cannot open socket: %s" + msgstr "no s'ha pogut obrir el connector: %s" + +-#: nscd/connections.c:217 ++#: nscd/connections.c:218 + #, c-format + msgid "cannot enable socket to accept connections: %s" + msgstr "no s'ha pogut habilitar el connector per acceptar connexions: %s" + +-#: nscd/connections.c:259 ++#: nscd/connections.c:260 + #, c-format + msgid "handle_request: request received (Version = %d)" + msgstr "handle_request: s'ha rebut una petició (Versió = %d)" + +-#: nscd/connections.c:265 ++#: nscd/connections.c:266 + #, c-format + msgid "cannot handle old request version %d; current version is %d" + msgstr "no s'ha pogut atendre la petició amb versió antiga %d; la versió actual és %d" + +-#: nscd/connections.c:303 nscd/connections.c:325 ++#: nscd/connections.c:304 nscd/connections.c:326 + #, c-format + msgid "cannot write result: %s" + msgstr "no s'ha pogut escriure el resultat: %s" +@@ -5169,130 +5178,130 @@ + # ivb dimoni «nscd» per consultar la memòria cau o invalidar-la. Per + # ivb això faig servir «programa de control» (com «ndc» amb «named» o + # ivb «chronyc» amb «chronyd»). +-#: nscd/connections.c:404 nscd/connections.c:498 ++#: nscd/connections.c:405 nscd/connections.c:499 + #, c-format + msgid "error getting callers id: %s" + msgstr "error en obtenir l'identificador del programa de control: %s" + +-#: nscd/connections.c:470 ++#: nscd/connections.c:471 + #, c-format + msgid "while accepting connection: %s" + msgstr "en acceptar la connexió: %s" + +-#: nscd/connections.c:481 ++#: nscd/connections.c:482 + #, c-format + msgid "short read while reading request: %s" + msgstr "lectura incompleta en llegir la petició: %s" + +-#: nscd/connections.c:517 ++#: nscd/connections.c:518 + #, c-format + msgid "key length in request too long: %d" + msgstr "la longitud de la clau de la petició és massa gran: %d" + +-#: nscd/connections.c:531 ++#: nscd/connections.c:532 + #, c-format + msgid "short read while reading request key: %s" + msgstr "lectura incompleta en llegir la clau de la petició: %s" + +-#: nscd/connections.c:590 nscd/connections.c:591 nscd/connections.c:610 +-#: nscd/connections.c:623 nscd/connections.c:629 nscd/connections.c:636 ++#: nscd/connections.c:591 nscd/connections.c:592 nscd/connections.c:611 ++#: nscd/connections.c:624 nscd/connections.c:630 nscd/connections.c:637 + #, c-format + msgid "Failed to run nscd as user '%s'" + msgstr "No s'ha pogut executar «nscd» com a l'usuari «%s»" + +-#: nscd/connections.c:611 ++#: nscd/connections.c:612 + msgid "getgrouplist failed" + msgstr "ha fallat getgrouplist()" + +-#: nscd/connections.c:624 ++#: nscd/connections.c:625 + msgid "setgroups failed" + msgstr "ha fallat setgroups()" + +-#: nscd/grpcache.c:102 nscd/hstcache.c:110 nscd/pwdcache.c:108 ++#: nscd/grpcache.c:103 nscd/hstcache.c:111 nscd/pwdcache.c:109 + msgid "while allocating key copy" + msgstr "en reservar una còpia de la clau" + +-#: nscd/grpcache.c:152 nscd/hstcache.c:167 nscd/pwdcache.c:145 ++#: nscd/grpcache.c:153 nscd/hstcache.c:168 nscd/pwdcache.c:146 + msgid "while allocating cache entry" + msgstr "en reservar una entrada en la memòria cau" + +-#: nscd/grpcache.c:195 nscd/hstcache.c:281 nscd/pwdcache.c:191 ++#: nscd/grpcache.c:196 nscd/hstcache.c:282 nscd/pwdcache.c:192 + #, c-format + msgid "short write in %s: %s" + msgstr "escriptura incompleta en «%s»: %s" + +-#: nscd/grpcache.c:217 ++#: nscd/grpcache.c:218 + #, c-format + msgid "Haven't found \"%s\" in group cache!" + msgstr "No s'ha trobat «%s» en la memòria cau de grups!" + +-#: nscd/grpcache.c:292 ++#: nscd/grpcache.c:284 + #, c-format + msgid "Invalid numeric gid \"%s\"!" + msgstr "«%s» no és un gid numèric vàlid!" + +-#: nscd/grpcache.c:299 ++#: nscd/grpcache.c:291 + #, c-format + msgid "Haven't found \"%d\" in group cache!" + msgstr "No s'ha trobat «%d» en la memòria cau de grups!" + +-#: nscd/hstcache.c:303 nscd/hstcache.c:378 nscd/hstcache.c:456 +-#: nscd/hstcache.c:533 ++#: nscd/hstcache.c:304 nscd/hstcache.c:370 nscd/hstcache.c:435 ++#: nscd/hstcache.c:500 + #, c-format + msgid "Haven't found \"%s\" in hosts cache!" + msgstr "No s'ha trobat «%s» en la memòria cau d'estacions!" + +-#: nscd/nscd.c:80 ++#: nscd/nscd.c:85 + msgid "Read configuration data from NAME" + msgstr "Llig les dades de configuració de NOM" + +-#: nscd/nscd.c:82 ++#: nscd/nscd.c:87 + msgid "Do not fork and display messages on the current tty" + msgstr "No fa fork() i mostra els missatges en el terminal actual" + + # ivb (2001/10/30) + # ivb Es refereix al _nombre_ de fils a llançar. +-#: nscd/nscd.c:83 ++#: nscd/nscd.c:88 + msgid "NUMBER" + msgstr "NOMBRE" + +-#: nscd/nscd.c:83 ++#: nscd/nscd.c:88 + msgid "Start NUMBER threads" + msgstr "Llança NOMBRE fils d'exeució" + +-#: nscd/nscd.c:84 ++#: nscd/nscd.c:89 + msgid "Shut the server down" + msgstr "Termina el servidor" + +-#: nscd/nscd.c:85 ++#: nscd/nscd.c:90 + msgid "Print current configuration statistic" + msgstr "Mostra estadístiques de la configuració actual" + +-#: nscd/nscd.c:86 ++#: nscd/nscd.c:91 + msgid "TABLE" + msgstr "TAULA" + +-#: nscd/nscd.c:87 ++#: nscd/nscd.c:92 + msgid "Invalidate the specified cache" + msgstr "Invalida la memòria cau especificada" + +-#: nscd/nscd.c:88 ++#: nscd/nscd.c:93 + msgid "TABLE,yes" + msgstr "TAULA,yes" + +-#: nscd/nscd.c:88 ++#: nscd/nscd.c:93 + msgid "Use separate cache for each user" + msgstr "Usa una memòria cau diferent per cada usuari" + +-#: nscd/nscd.c:93 ++#: nscd/nscd.c:98 + msgid "Name Service Cache Daemon." + msgstr "Dimoni de memòria cau del servei de noms." + +-#: nscd/nscd.c:126 ++#: nscd/nscd.c:131 + msgid "already running" + msgstr "ja es troba en marxa" + +-#: nscd/nscd.c:192 nscd/nscd.c:212 nscd/nscd.c:218 ++#: nscd/nscd.c:243 nscd/nscd.c:263 nscd/nscd.c:269 + msgid "Only root is allowed to use this option!" + msgstr "Només root pot usar aquesta opció!" + +@@ -5382,22 +5391,22 @@ + "%15ld%% ràtio d'encerts de memòria cau\n" + "%15s comprovar /etc/%s per si hi ha hagut canvis?\n" + +-#: nscd/pwdcache.c:213 ++#: nscd/pwdcache.c:214 + #, c-format + msgid "Haven't found \"%s\" in password cache!" + msgstr "No s'ha trobat «%s» en la memòria cau d'usuaris!" + +-#: nscd/pwdcache.c:288 ++#: nscd/pwdcache.c:280 + #, c-format + msgid "Invalid numeric uid \"%s\"!" + msgstr "«%s» no és un uid numèric vàlid!" + +-#: nscd/pwdcache.c:295 ++#: nscd/pwdcache.c:287 + #, c-format + msgid "Haven't found \"%d\" in password cache!" + msgstr "No s'ha trobat «%d» en la memòria cau d'usuaris!" + +-#: elf/../sysdeps/generic/dl-sysdep.c:297 ++#: elf/../sysdeps/generic/dl-sysdep.c:357 + msgid "cannot create capability list" + msgstr "no s'ha pogut crear la llista de capacitats" + +@@ -5454,7 +5463,7 @@ + msgid ", OS ABI: %s %d.%d.%d" + msgstr ", ABI del SO: %s %d.%d.%d" + +-#: elf/cache.c:136 elf/ldconfig.c:1033 ++#: elf/cache.c:136 elf/ldconfig.c:1045 + #, c-format + msgid "Can't open cache file %s\n" + msgstr "No s'ha pogut obrir el fitxer «%s» de memòria cau\n" +@@ -5500,19 +5509,19 @@ + msgid "Renaming of %s to %s failed" + msgstr "No s'ha pogut reanomenar «%s» a «%s»" + +-#: elf/dl-close.c:113 ++#: elf/dl-close.c:128 + msgid "shared object not open" + msgstr "l'objecte compartit no és obert" + + # ivb (2002/10/29) + # ivb TLS = Thread Local Storage +-#: elf/dl-close.c:357 elf/dl-open.c:436 ++#: elf/dl-close.c:486 elf/dl-open.c:444 + msgid "TLS generation counter wrapped! Please send report with the 'glibcbug' script." + msgstr "El comptador de generació de TLS s'ha esgotat! Per favor, envieu un informe amb el guió «glibcbug»." + + # ivb (2001/11/05) + # ivb DST = Dynamic String Token (component cadena dinàmica) +-#: elf/dl-deps.c:111 elf/dl-open.c:177 ++#: elf/dl-deps.c:111 elf/dl-open.c:183 + msgid "DST not allowed in SUID/SGID programs" + msgstr "no es permeten components cadena dinàmica (DST) en programes SUID/SGID" + +@@ -5531,183 +5540,195 @@ + msgid "cannot allocate dependency list" + msgstr "no s'ha pogut reservar la llista de dependències" + +-#: elf/dl-deps.c:492 elf/dl-deps.c:547 ++#: elf/dl-deps.c:494 elf/dl-deps.c:549 + msgid "cannot allocate symbol search list" + msgstr "no s'ha pogut reservar la llista de recerca de símbols" + + # ivb (2002/10/21) + # ivb LD_TRACE_PRELINKING és una variable d'entorn, no és part del filtre. +-#: elf/dl-deps.c:532 ++#: elf/dl-deps.c:534 + msgid "Filters not supported with LD_TRACE_PRELINKING" + msgstr "Amb LD_TRACE_PRELINKING no es suporten els filtres" + +-#: elf/dl-error.c:73 ++#: elf/dl-error.c:75 + msgid "DYNAMIC LINKER BUG!!!" + msgstr "ERROR EN L'ENLLAÇADOR DINÀMIC!!!" + +-#: elf/dl-error.c:106 ++#: elf/dl-error.c:108 + msgid "error while loading shared libraries" + msgstr "error en carregar les biblioteques dinàmiques" + +-#: elf/dl-load.c:338 ++#: elf/dl-load.c:339 + msgid "cannot allocate name record" + msgstr "no s'ha pogut reservar el registre de nom" + +-#: elf/dl-load.c:440 elf/dl-load.c:520 elf/dl-load.c:614 elf/dl-load.c:709 ++#: elf/dl-load.c:441 elf/dl-load.c:520 elf/dl-load.c:612 elf/dl-load.c:707 + msgid "cannot create cache for search path" + msgstr "no s'ha pogut crear la memòria cau dels camins de recerca" + +-#: elf/dl-load.c:545 ++#: elf/dl-load.c:543 + msgid "cannot create RUNPATH/RPATH copy" + msgstr "no s'ha pogut crear una còpia de RUNPATH/RPATH" + +-#: elf/dl-load.c:600 ++#: elf/dl-load.c:598 + msgid "cannot create search path array" + msgstr "no s'ha pogut crear el vector de camins de recerca" + +-#: elf/dl-load.c:796 ++#: elf/dl-load.c:794 + msgid "cannot stat shared object" + msgstr "ha fallat stat() sobre l'objecte compartit" + + # ivb (2001/10/28) + # ivb Es refereix a /dev/zero . +-#: elf/dl-load.c:840 ++#: elf/dl-load.c:838 + msgid "cannot open zero fill device" + msgstr "no s'ha pogut obrir el dispositiu de zeros" + +-#: elf/dl-load.c:849 elf/dl-load.c:1855 ++#: elf/dl-load.c:847 elf/dl-load.c:1902 + msgid "cannot create shared object descriptor" + msgstr "no s'ha pogut crear el descriptor d'objecte compartit" + +-#: elf/dl-load.c:868 elf/dl-load.c:1351 elf/dl-load.c:1434 ++#: elf/dl-load.c:866 elf/dl-load.c:1398 elf/dl-load.c:1481 + msgid "cannot read file data" + msgstr "no s'han pogut llegir les dades del fitxer" + +-#: elf/dl-load.c:908 ++#: elf/dl-load.c:906 + msgid "ELF load command alignment not page-aligned" + msgstr "L'alineament de l'ordre ELF de càrrega no està alineada amb la pàgina" + +-#: elf/dl-load.c:915 ++#: elf/dl-load.c:913 + msgid "ELF load command address/offset not properly aligned" + msgstr "L'adreça/desplaçament de l'ordre ELF de càrrega no està correctament alineada" + +-#: elf/dl-load.c:996 ++#: elf/dl-load.c:988 ++msgid "cannot allocate TLS data structures for initial thread" ++msgstr "no s'han pogut reservar les estructures de dades TLS pel fil inicial" ++ ++#: elf/dl-load.c:1012 ++msgid "cannot handle TLS data" ++msgstr "no es pot tractar amb dades TLS" ++ ++#: elf/dl-load.c:1047 + msgid "failed to map segment from shared object" + msgstr "no s'ha pogut mapar un segment de l'objecte compartit" + +-#: elf/dl-load.c:1020 ++#: elf/dl-load.c:1071 + msgid "cannot dynamically load executable" + msgstr "no s'ha pogut carregar dinàmicament l'executable" + +-#: elf/dl-load.c:1081 ++#: elf/dl-load.c:1132 + msgid "cannot change memory protections" + msgstr "no s'han pogut canviar les proteccions de memòria" + +-#: elf/dl-load.c:1100 ++#: elf/dl-load.c:1151 + msgid "cannot map zero-fill pages" + msgstr "no s'han pogut mapar les pàgines plenes de zeros" + +-#: elf/dl-load.c:1118 ++#: elf/dl-load.c:1169 + msgid "cannot allocate memory for program header" + msgstr "no s'ha pogut reservar memòria per la capçalera del programa" + +-#: elf/dl-load.c:1149 ++#: elf/dl-load.c:1200 + msgid "object file has no dynamic section" + msgstr "el fitxer objecte no té secció dinàmica" + +-#: elf/dl-load.c:1193 ++#: elf/dl-load.c:1240 + msgid "shared object cannot be dlopen()ed" + msgstr "ha fallat dlopen() sobre l'objecte compartit" + +-#: elf/dl-load.c:1216 ++#: elf/dl-load.c:1263 + msgid "cannot create searchlist" + msgstr "no s'ha pogut crear la llista de recerca" + +-#: elf/dl-load.c:1351 ++#: elf/dl-load.c:1398 + msgid "file too short" + msgstr "el fitxer és massa curt" + +-#: elf/dl-load.c:1374 ++#: elf/dl-load.c:1421 + msgid "invalid ELF header" + msgstr "la capçalera ELF no és vàlida" + +-#: elf/dl-load.c:1383 ++#: elf/dl-load.c:1430 + msgid "ELF file data encoding not big-endian" + msgstr "La codificació de les dades del fitxer ELF no és big-endian" + +-#: elf/dl-load.c:1385 ++#: elf/dl-load.c:1432 + msgid "ELF file data encoding not little-endian" + msgstr "La codificació de les dades del fitxer ELF no és little-endian" + +-#: elf/dl-load.c:1389 ++#: elf/dl-load.c:1436 + msgid "ELF file version ident does not match current one" + msgstr "La identificació de la versió del fitxer ELF no concorda amb l'actual" + + # ivb (2001/11(06) + # ivb ABI = Application Binary Interface (interfície binària d'aplicació) +-#: elf/dl-load.c:1393 ++#: elf/dl-load.c:1440 + msgid "ELF file OS ABI invalid" + msgstr "L'ABI de sistema operatiu del fitxer ELF no és vàlida" + +-#: elf/dl-load.c:1395 ++#: elf/dl-load.c:1442 + msgid "ELF file ABI version invalid" + msgstr "La versió de l'ABI del fitxer ELF no és vàlida" + +-#: elf/dl-load.c:1398 ++#: elf/dl-load.c:1445 + msgid "internal error" + msgstr "error intern" + +-#: elf/dl-load.c:1405 ++#: elf/dl-load.c:1452 + msgid "ELF file version does not match current one" + msgstr "La versió del fitxer ELF no concorda amb l'actual" + + # ivb (2001/11/01) + # ivb La traducció completa de «phentsize» vindria a ser: tamany d'entrada + # ivb de taula de la capçalera de programa. +-#: elf/dl-load.c:1413 ++#: elf/dl-load.c:1460 + msgid "ELF file's phentsize not the expected size" + msgstr "El valor de «phentsize» del fitxer ELF no és l'esperat" + +-#: elf/dl-load.c:1419 ++#: elf/dl-load.c:1466 + msgid "only ET_DYN and ET_EXEC can be loaded" + msgstr "només es poden carregar els tipus ET_DYN i ET_EXEC" + +-#: elf/dl-load.c:1870 ++#: elf/dl-load.c:1917 + msgid "cannot open shared object file" + msgstr "no s'ha pogut obrir el fitxer objecte compartit" + +-#: elf/dl-lookup.c:248 elf/dl-lookup.c:413 ++#: elf/dl-lookup.c:265 elf/dl-lookup.c:430 + msgid "relocation error" + msgstr "error de reubicació" + +-#: elf/dl-open.c:105 ++#: elf/dl-open.c:111 + msgid "cannot extend global scope" + msgstr "no s'ha pogut estendre l'àmbit global" + +-#: elf/dl-open.c:208 ++#: elf/dl-open.c:214 + msgid "empty dynamic string token substitution" + msgstr "la substitució del component cadena dinàmica és buida" + +-#: elf/dl-open.c:345 elf/dl-open.c:356 ++#: elf/dl-open.c:351 elf/dl-open.c:362 + msgid "cannot create scope list" + msgstr "no s'ha pogut crear la llista d'àmbits" + +-#: elf/dl-open.c:416 ++#: elf/dl-open.c:424 + msgid "cannot create TLS data structures" + msgstr "no s'han pogut crear les estructures de dades TLS" + +-#: elf/dl-open.c:478 ++#: elf/dl-open.c:486 + msgid "invalid mode for dlopen()" + msgstr "el mode de dlopen() no és vàlid" + +-#: elf/dl-reloc.c:88 ++#: elf/dl-reloc.c:58 ++msgid "shared object cannot be dlopen()ed: static TLS memory too small" ++msgstr "ha fallat dlopen() sobre l'objecte compartit: la memòria TLS estàtica és massa menuda" ++ ++#: elf/dl-reloc.c:118 + msgid "cannot make segment writable for relocation" + msgstr "no s'ha pogut fer escrivible el segment per reubicar-lo" + + # ivb (2002/10/21) + # ivb PLT = Procedure Linkage Table, Taula d'Enllaçat de Procediments + # ivb PLTREL = tipus de reubicació usada per la PLT +-#: elf/dl-reloc.c:174 ++#: elf/dl-reloc.c:219 + #, c-format + msgid "%s: profiler found no PLTREL in object %s\n" + msgstr "%s: el perfilador no ha trobat el PLTREL de l'objecte «%s»\n" +@@ -5715,12 +5736,12 @@ + # ivb (2002/10/29) + # ivb Açò és un cacau, però pense que ací hauria de posar PLT i no PLTREL. + # ivb Total, qui ho va a llegir? +-#: elf/dl-reloc.c:186 ++#: elf/dl-reloc.c:231 + #, c-format + msgid "%s: profiler out of memory shadowing PLTREL of %s\n" + msgstr "%s: el perfilador ha exhaurit la memòria en calcular el PLTREL de «%s»\n" + +-#: elf/dl-reloc.c:201 ++#: elf/dl-reloc.c:246 + msgid "cannot restore segment prot after reloc" + msgstr "no s'ha pogut restaurar la protecció del segment després de reubicar-lo" + +@@ -5776,123 +5797,123 @@ + msgid "Configure Dynamic Linker Run Time Bindings." + msgstr "Configura els vincles en temps d'execució de l'enllaçador dinàmic." + +-#: elf/ldconfig.c:282 ++#: elf/ldconfig.c:294 + #, c-format + msgid "Path `%s' given more than once" + msgstr "S'ha especificat el camí «%s» més d'una volta" + +-#: elf/ldconfig.c:326 ++#: elf/ldconfig.c:338 + #, c-format + msgid "%s is not a known library type" + msgstr "«%s» no és un tipus conegut de biblioteca" + +-#: elf/ldconfig.c:344 ++#: elf/ldconfig.c:356 + #, c-format + msgid "Can't stat %s" + msgstr "Ha fallat stat() sobre «%s»" + +-#: elf/ldconfig.c:414 ++#: elf/ldconfig.c:426 + #, c-format + msgid "Can't stat %s\n" + msgstr "Ha fallat stat() sobre «%s»\n" + +-#: elf/ldconfig.c:424 ++#: elf/ldconfig.c:436 + #, c-format + msgid "%s is not a symbolic link\n" + msgstr "«%s» no és un enllaç simbòlic\n" + +-#: elf/ldconfig.c:443 ++#: elf/ldconfig.c:455 + #, c-format + msgid "Can't unlink %s" + msgstr "No s'ha pogut desenllaçar «%s»" + +-#: elf/ldconfig.c:449 ++#: elf/ldconfig.c:461 + #, c-format + msgid "Can't link %s to %s" + msgstr "No s'ha pogut crear un enllaç des de «%s» cap a «%s»" + + # ivb (2001/10/28) + # ivb Es refereix a un enllaç -> masculí. +-#: elf/ldconfig.c:455 ++#: elf/ldconfig.c:467 + msgid " (changed)\n" + msgstr " (canviat)\n" + + # ivb (2001/10/28) + # ivb Es refereix a fer o no l'enllaç, no importa el gènere. +-#: elf/ldconfig.c:457 ++#: elf/ldconfig.c:469 + msgid " (SKIPPED)\n" + msgstr " (SALTAT)\n" + +-#: elf/ldconfig.c:512 ++#: elf/ldconfig.c:524 + #, c-format + msgid "Can't find %s" + msgstr "No s'ha pogut trobar «%s»" + +-#: elf/ldconfig.c:528 ++#: elf/ldconfig.c:540 + #, c-format + msgid "Can't lstat %s" + msgstr "Ha fallat lstat() sobre «%s»" + +-#: elf/ldconfig.c:535 ++#: elf/ldconfig.c:547 + #, c-format + msgid "Ignored file %s since it is not a regular file." + msgstr "Es descarta el fitxer «%s» que no és un fitxer ordinari." + +-#: elf/ldconfig.c:543 ++#: elf/ldconfig.c:555 + #, c-format + msgid "No link created since soname could not be found for %s" + msgstr "No s'ha creat l'enllaç perquè no s'ha trobat el nom d'objecte compartit de «%s»" + +-#: elf/ldconfig.c:634 ++#: elf/ldconfig.c:646 + #, c-format + msgid "Can't open directory %s" + msgstr "No s'ha pogut obrir el directori «%s»" + +-#: elf/ldconfig.c:689 elf/ldconfig.c:736 ++#: elf/ldconfig.c:701 elf/ldconfig.c:748 + #, c-format + msgid "Cannot lstat %s" + msgstr "Ha fallat lstat() sobre «%s»" + +-#: elf/ldconfig.c:701 ++#: elf/ldconfig.c:713 + #, c-format + msgid "Cannot stat %s" + msgstr "Ha fallat stat() sobre «%s»" + +-#: elf/ldconfig.c:758 elf/readlib.c:93 ++#: elf/ldconfig.c:770 elf/readlib.c:93 + #, c-format + msgid "Input file %s not found.\n" + msgstr "No s'ha trobat el fitxer d'entrada «%s».\n" + +-#: elf/ldconfig.c:792 ++#: elf/ldconfig.c:804 + #, c-format + msgid "libc5 library %s in wrong directory" + msgstr "la bibliotexa «%s» per libc5 es troba en un directori incorrecte" + +-#: elf/ldconfig.c:795 ++#: elf/ldconfig.c:807 + #, c-format + msgid "libc6 library %s in wrong directory" + msgstr "la biblioteca «%s» per libc6 es troba en un directori incorrecte" + +-#: elf/ldconfig.c:798 ++#: elf/ldconfig.c:810 + #, c-format + msgid "libc4 library %s in wrong directory" + msgstr "la biblioteca «%s» per libc4 es troba en un directori incorrecte" + +-#: elf/ldconfig.c:825 ++#: elf/ldconfig.c:837 + #, c-format + msgid "libraries %s and %s in directory %s have same soname but different type." + msgstr "les biblioteques «%s» i «%s» del directori «%s» tenen el mateix nom d'objecte compartit però diferent tipus." + +-#: elf/ldconfig.c:928 ++#: elf/ldconfig.c:940 + #, c-format + msgid "Can't open configuration file %s" + msgstr "No s'ha pogut obrir el fitxer «%s» de configuració" + +-#: elf/ldconfig.c:1012 ++#: elf/ldconfig.c:1024 + msgid "Can't chdir to /" + msgstr "No s'ha pogut canviar al directori /" + +-#: elf/ldconfig.c:1054 ++#: elf/ldconfig.c:1066 + #, c-format + msgid "Can't open cache file directory %s\n" + msgstr "No s'ha pogut obrir el directori «%s» de fitxers de memòria cau\n" +@@ -6005,12 +6026,3 @@ + #: elf/sprof.c:936 elf/sprof.c:988 + msgid "cannot allocate symbol data" + msgstr "no s'han pogut reservar les dades de símbols" +- +-#~ msgid "\t\t\t\t\t\t\t %s: value for field `%s' must be in range %d...%d" +-#~ msgstr "\t\t\t\t\t\t\t %s: el valor del camp «%s» ha d'estar en el rang %d...%d" +- +-#~ msgid "Failed to look up user '%s' to run server as" +-#~ msgstr "Ha fallat la recerca de l'usuari «%s», com a qui executar el servidor" +- +-#~ msgid "no filename for profiling data given and shared object `%s' has no soname" +-#~ msgstr "no s'ha especificat un fitxer de dades de perfilat i «%s» no té nom d'objecte compartit" +Binary files glibc-2.3.2/po/cs.mo and glibc-2.3.2-200304020432/po/cs.mo differ +Binary files glibc-2.3.2/po/da.mo and glibc-2.3.2-200304020432/po/da.mo differ +diff -u -udbrN glibc-2.3.2/po/da.po glibc-2.3.2-200304020432/po/da.po +--- glibc-2.3.2/po/da.po Mon Nov 11 00:14:07 2002 ++++ glibc-2.3.2-200304020432/po/da.po Mon Mar 10 00:17:53 2003 +@@ -4,9 +4,9 @@ + # + msgid "" + msgstr "" +-"Project-Id-Version: libc 2.3.1\n" +-"POT-Creation-Date: 2002-10-02 17:22-0700\n" +-"PO-Revision-Date: 2002-11-09 20:18+01:00\n" ++"Project-Id-Version: libc 2.3.2\n" ++"POT-Creation-Date: 2003-02-22 15:34-0800\n" ++"PO-Revision-Date: 2003-03-08 20:18+01:00\n" + "Last-Translator: Keld Simonsen \n" + "Language-Team: Danish \n" + "MIME-Version: 1.0\n" +@@ -259,8 +259,8 @@ + + #: iconv/iconv_prog.c:241 + #, c-format +-msgid "conversions from `%s' and to `%s' are not supported" +-msgstr "konverteringer fra '%s' og til '%s' er ikke understøttet" ++msgid "conversion from `%s' and to `%s' are not supported" ++msgstr "konvertering fra '%s' og til '%s' er ikke understøttet" + + #: iconv/iconv_prog.c:246 + #, c-format +@@ -285,15 +285,15 @@ + msgid "error while closing output file" + msgstr "fejl ved lukning af udfil" + +-#: iconv/iconv_prog.c:407 iconv/iconvconfig.c:355 locale/programs/locale.c:268 ++#: iconv/iconv_prog.c:407 iconv/iconvconfig.c:357 locale/programs/locale.c:274 + #: locale/programs/localedef.c:372 catgets/gencat.c:233 + #: malloc/memusagestat.c:602 debug/pcprofiledump.c:199 + msgid "Report bugs using the `glibcbug' script to .\n" + msgstr "Rapportér fejl ved at bruge skriptet 'glibcbug' til .\n" + +-#: iconv/iconv_prog.c:421 iconv/iconvconfig.c:369 locale/programs/locale.c:281 +-#: locale/programs/localedef.c:386 catgets/gencat.c:246 posix/getconf.c:904 +-#: nss/getent.c:74 nscd/nscd.c:279 nscd/nscd_nischeck.c:90 elf/ldconfig.c:259 ++#: iconv/iconv_prog.c:421 iconv/iconvconfig.c:371 locale/programs/locale.c:287 ++#: locale/programs/localedef.c:386 catgets/gencat.c:246 posix/getconf.c:910 ++#: nss/getent.c:74 nscd/nscd.c:330 nscd/nscd_nischeck.c:90 elf/ldconfig.c:271 + #: elf/sprof.c:349 + #, c-format + msgid "" +@@ -306,9 +306,9 @@ + "Programmellet har ingen garanti, ikke en gang for SALGBARHED eller EGNETHED\n" + "TIL NOGEN SPECIEL OPGAVE.\n" + +-#: iconv/iconv_prog.c:426 iconv/iconvconfig.c:374 locale/programs/locale.c:286 +-#: locale/programs/localedef.c:391 catgets/gencat.c:251 posix/getconf.c:909 +-#: nss/getent.c:79 nscd/nscd.c:284 nscd/nscd_nischeck.c:95 elf/ldconfig.c:264 ++#: iconv/iconv_prog.c:426 iconv/iconvconfig.c:376 locale/programs/locale.c:292 ++#: locale/programs/localedef.c:391 catgets/gencat.c:251 posix/getconf.c:915 ++#: nss/getent.c:79 nscd/nscd.c:335 nscd/nscd_nischeck.c:95 elf/ldconfig.c:276 + #: elf/sprof.c:355 + #, c-format + msgid "Written by %s.\n" +@@ -360,15 +360,15 @@ + msgid "Prefix used for all file accesses" + msgstr "Præfiks brugt for alle filadgange" + +-#: iconv/iconvconfig.c:325 locale/programs/localedef.c:292 ++#: iconv/iconvconfig.c:327 locale/programs/localedef.c:292 + msgid "no output file produced because warning were issued" + msgstr "på grund af advarsler blev ingen udfil oprettet" + +-#: iconv/iconvconfig.c:403 ++#: iconv/iconvconfig.c:405 + msgid "while inserting in search tree" + msgstr "fejl ved indsætning i søgetræ" + +-#: iconv/iconvconfig.c:1202 ++#: iconv/iconvconfig.c:1204 + msgid "cannot generate output file" + msgstr "kan ikke generere udfil" + +@@ -1280,7 +1280,7 @@ + msgid "unterminated symbolic name" + msgstr "uafsluttet symbolsk navn" + +-#: locale/programs/linereader.c:537 catgets/gencat.c:1166 ++#: locale/programs/linereader.c:537 catgets/gencat.c:1195 + msgid "invalid escape sequence" + msgstr "ugyldig undtagelsessekvens" + +@@ -1310,39 +1310,39 @@ + msgid "trailing garbage at end of line" + msgstr "efterfølgende snavs på slutningen af linien" + +-#: locale/programs/locale.c:73 ++#: locale/programs/locale.c:75 + msgid "System information:" + msgstr "Systeminformation:" + +-#: locale/programs/locale.c:75 ++#: locale/programs/locale.c:77 + msgid "Write names of available locales" + msgstr "Skriv navnene til tilgængelige lokaler" + +-#: locale/programs/locale.c:77 ++#: locale/programs/locale.c:79 + msgid "Write names of available charmaps" + msgstr "Skriv navnene til tilgængelige tegntabel" + +-#: locale/programs/locale.c:78 ++#: locale/programs/locale.c:80 + msgid "Modify output format:" + msgstr "Ændre format for uddata:" + +-#: locale/programs/locale.c:79 ++#: locale/programs/locale.c:81 + msgid "Write names of selected categories" + msgstr "Skriv navnene til valgte kategorier" + +-#: locale/programs/locale.c:80 ++#: locale/programs/locale.c:82 + msgid "Write names of selected keywords" + msgstr "Skriv navnene til valgte nøgleord" + +-#: locale/programs/locale.c:81 ++#: locale/programs/locale.c:83 + msgid "Print more information" + msgstr "Skriv mere information" + +-#: locale/programs/locale.c:86 ++#: locale/programs/locale.c:88 + msgid "Get locale-specific information." + msgstr "Hent information specifik for lokalet." + +-#: locale/programs/locale.c:89 ++#: locale/programs/locale.c:91 + msgid "" + "NAME\n" + "[-a|-m]" +@@ -1350,7 +1350,7 @@ + "NAVN\n" + "[-a|-m]" + +-#: locale/programs/locale.c:488 ++#: locale/programs/locale.c:512 + msgid "while preparing output" + msgstr "da uddata blev forberedt" + +@@ -1481,16 +1481,16 @@ + msgid "cannot create temporary file" + msgstr "Kan ikke oprette midlertidig fil" + +-#: locale/programs/locarchive.c:118 locale/programs/locarchive.c:302 ++#: locale/programs/locarchive.c:118 locale/programs/locarchive.c:305 + msgid "cannot initialize archive file" + msgstr "kan ikke initiere arkivfil" + +-#: locale/programs/locarchive.c:125 locale/programs/locarchive.c:309 ++#: locale/programs/locarchive.c:125 locale/programs/locarchive.c:312 + msgid "cannot resize archive file" + msgstr "kan ikke skifte størrelse på arkivfil" + +-#: locale/programs/locarchive.c:134 locale/programs/locarchive.c:318 +-#: locale/programs/locarchive.c:508 ++#: locale/programs/locarchive.c:134 locale/programs/locarchive.c:321 ++#: locale/programs/locarchive.c:511 + msgid "cannot map archive header" + msgstr "kan ikke læse arkivhoved med mmap" + +@@ -1506,88 +1506,88 @@ + msgid "cannot map locale archive file" + msgstr "kan ikke åbne lokalearkivfil med mmap" + +-#: locale/programs/locarchive.c:326 ++#: locale/programs/locarchive.c:329 + msgid "cannot lock new archive" + msgstr "kan ikke låse nyt arkiv" + +-#: locale/programs/locarchive.c:377 ++#: locale/programs/locarchive.c:380 + msgid "cannot extend locale archive file" + msgstr "kan ikke udvide lokalearkivfil" + +-#: locale/programs/locarchive.c:386 ++#: locale/programs/locarchive.c:389 + msgid "cannot change mode of resized locale archive" + msgstr "kan ikke ændre adgangtilstand på størrelsesændret lokalearkiv" + +-#: locale/programs/locarchive.c:394 ++#: locale/programs/locarchive.c:397 + msgid "cannot rename new archive" + msgstr "kan ikke omdøbe nyt arkiv" + +-#: locale/programs/locarchive.c:447 ++#: locale/programs/locarchive.c:450 + #, c-format + msgid "cannot open locale archive \"%s\"" + msgstr "kan ikke åbne lokalearkiv \"%s\"" + +-#: locale/programs/locarchive.c:452 ++#: locale/programs/locarchive.c:455 + #, c-format + msgid "cannot stat locale archive \"%s\"" + msgstr "kan ikke udføre 'stat' på lokalearkiv '%s'" + +-#: locale/programs/locarchive.c:471 ++#: locale/programs/locarchive.c:474 + #, c-format + msgid "cannot lock locale archive \"%s\"" + msgstr "kan ikke låse lokalearkiv '%s'" + +-#: locale/programs/locarchive.c:494 ++#: locale/programs/locarchive.c:497 + msgid "cannot read archive header" + msgstr "kan ikke læse arkivhoved" + +-#: locale/programs/locarchive.c:554 ++#: locale/programs/locarchive.c:557 + #, c-format + msgid "locale '%s' already exists" + msgstr "lokale '%s' eksisterer allerede" + +-#: locale/programs/locarchive.c:784 locale/programs/locarchive.c:799 +-#: locale/programs/locarchive.c:811 locale/programs/locarchive.c:823 ++#: locale/programs/locarchive.c:788 locale/programs/locarchive.c:803 ++#: locale/programs/locarchive.c:815 locale/programs/locarchive.c:827 + #: locale/programs/locfile.c:343 + msgid "cannot add to locale archive" + msgstr "kan ikke tilføje til lokalearkiv" + +-#: locale/programs/locarchive.c:976 ++#: locale/programs/locarchive.c:982 + #, c-format + msgid "locale alias file `%s' not found" + msgstr "fil \"%s\" for lokalealias findes ikke" + +-#: locale/programs/locarchive.c:1118 ++#: locale/programs/locarchive.c:1126 + #, c-format + msgid "Adding %s\n" + msgstr "Tilføjer %s\n" + +-#: locale/programs/locarchive.c:1124 ++#: locale/programs/locarchive.c:1132 + #, c-format + msgid "stat of \"%s\" failed: %s: ignored" + msgstr "status på \"%s\" mislykkedes: %s: ignoreret" + +-#: locale/programs/locarchive.c:1130 ++#: locale/programs/locarchive.c:1138 + #, c-format + msgid "\"%s\" is no directory; ignored" + msgstr "\"%s\" er ikke et katalog, ignoreret" + +-#: locale/programs/locarchive.c:1137 ++#: locale/programs/locarchive.c:1145 + #, c-format + msgid "cannot open directory \"%s\": %s: ignored" + msgstr "kan ikke åbne katalog \"%s\": %s: ignoreret" + +-#: locale/programs/locarchive.c:1209 ++#: locale/programs/locarchive.c:1217 + #, c-format + msgid "incomplete set of locale files in \"%s\"" + msgstr "ufuldstændig opsætning af lokalefiler i \"%s\"" + +-#: locale/programs/locarchive.c:1273 ++#: locale/programs/locarchive.c:1281 + #, c-format + msgid "cannot read all files in \"%s\": ignored" + msgstr "kan ikke læse alle filer i \"%s\": ignoreret" + +-#: locale/programs/locarchive.c:1343 ++#: locale/programs/locarchive.c:1351 + #, c-format + msgid "locale \"%s\" not in archive" + msgstr "lokale \"%s\" findes ikke i arkivet" +@@ -1656,8 +1656,8 @@ + msgid "upper limit in range is not smaller then lower limit" + msgstr "øvre grænse i område er ikke mindre end nedre grænse" + +-#: locale/programs/xmalloc.c:70 malloc/obstack.c:500 malloc/obstack.c:503 +-#: posix/getconf.c:996 ++#: locale/programs/xmalloc.c:70 malloc/obstack.c:505 malloc/obstack.c:508 ++#: posix/getconf.c:1002 + msgid "memory exhausted" + msgstr "lageret opbrugt" + +@@ -1683,7 +1683,7 @@ + msgid "Another string for testing." + msgstr "En ny streng til afprøvning." + +-#: catgets/gencat.c:111 catgets/gencat.c:115 nscd/nscd.c:79 ++#: catgets/gencat.c:111 catgets/gencat.c:115 nscd/nscd.c:84 + msgid "NAME" + msgstr "NAVN" + +@@ -1727,7 +1727,7 @@ + msgid "duplicate set definition" + msgstr "duplikeret definition af sæt" + +-#: catgets/gencat.c:446 catgets/gencat.c:619 catgets/gencat.c:648 ++#: catgets/gencat.c:446 catgets/gencat.c:623 catgets/gencat.c:677 + msgid "this is the first definition" + msgstr "dette er den første definition" + +@@ -1745,44 +1745,44 @@ + msgid "unknown directive `%s': line ignored" + msgstr "ukendt nøgleord '%s': linie ignoreret" + +-#: catgets/gencat.c:617 ++#: catgets/gencat.c:621 + msgid "duplicated message number" + msgstr "duplikeret meddelelsesnummer" + +-#: catgets/gencat.c:645 ++#: catgets/gencat.c:674 + msgid "duplicated message identifier" + msgstr "duplikeret meddelelsesidentifikator" + +-#: catgets/gencat.c:702 ++#: catgets/gencat.c:731 + msgid "invalid character: message ignored" + msgstr "Ugyldigt tegn: besked ignoreret" + +-#: catgets/gencat.c:745 ++#: catgets/gencat.c:774 + msgid "invalid line" + msgstr "ugyldig linje" + +-#: catgets/gencat.c:799 ++#: catgets/gencat.c:828 + msgid "malformed line ignored" + msgstr "fejlagtig linie ignoreret" + +-#: catgets/gencat.c:963 catgets/gencat.c:1004 ++#: catgets/gencat.c:992 catgets/gencat.c:1033 + #, c-format + msgid "cannot open output file `%s'" + msgstr "kan ikke åbne udfil '%s'" + +-#: catgets/gencat.c:1188 ++#: catgets/gencat.c:1217 + msgid "unterminated message" + msgstr "uafsluttet meddelelse" + +-#: catgets/gencat.c:1212 ++#: catgets/gencat.c:1241 + msgid "while opening old catalog file" + msgstr "da den gamle katalogfil blev åbnet" + +-#: catgets/gencat.c:1303 ++#: catgets/gencat.c:1332 + msgid "conversion modules not available" + msgstr "konverteringsmoduler ikke tilgængelige" + +-#: catgets/gencat.c:1329 ++#: catgets/gencat.c:1358 + msgid "cannot determine escape character" + msgstr "kan ikke bestemme undvigetegn" + +@@ -1790,7 +1790,7 @@ + msgid "makecontext: does not know how to handle more than 8 arguments\n" + msgstr "makecontext: véd ikke hvordan mere end 8 argumenter skal behandles\n" + +-#: stdio-common/../sysdeps/gnu/errlist.c:12 posix/regcomp.c:178 ++#: stdio-common/../sysdeps/gnu/errlist.c:12 posix/regcomp.c:133 + #: nis/nis_error.c:29 nis/ypclnt.c:787 nis/ypclnt.c:861 + msgid "Success" + msgstr "Succes" +@@ -2979,23 +2979,23 @@ + msgid "%s%sUnknown signal %d\n" + msgstr "%s%sUkendt signal %d\n" + +-#: malloc/mcheck.c:296 ++#: malloc/mcheck.c:346 + msgid "memory is consistent, library is buggy\n" + msgstr "lageret er konsistent, biblioteket er fejlbehæftet\n" + +-#: malloc/mcheck.c:299 ++#: malloc/mcheck.c:349 + msgid "memory clobbered before allocated block\n" + msgstr "området foran tildelt lagerblok snavset til\n" + +-#: malloc/mcheck.c:302 ++#: malloc/mcheck.c:352 + msgid "memory clobbered past end of allocated block\n" + msgstr "området efter tildelt lagerblok snavset til\n" + +-#: malloc/mcheck.c:305 ++#: malloc/mcheck.c:355 + msgid "block freed twice\n" + msgstr "blok frigjort to gange\n" + +-#: malloc/mcheck.c:308 ++#: malloc/mcheck.c:358 + msgid "bogus mcheck_status, library is buggy\n" + msgstr "fejlagtig mcheck_status, biblioteket er fejlbehæftet\n" + +@@ -3031,6 +3031,10 @@ + msgid "DATAFILE [OUTFILE]" + msgstr "DATAFIL [UDFIL]" + ++#: string/strerror.c:43 posix/../sysdeps/posix/gai_strerror.c:57 ++msgid "Unknown error" ++msgstr "Ukendt fejl" ++ + #: string/strsignal.c:69 + #, c-format + msgid "Real-time signal %d" +@@ -3055,7 +3059,7 @@ + msgid "%s: Memory exhausted: %s\n" + msgstr "%s: Lageret opbrugt: %s\n" + +-#: timezone/zic.c:390 misc/error.c:120 ++#: timezone/zic.c:390 misc/error.c:127 misc/error.c:155 + msgid "Unknown system error" + msgstr "Ukendt systemfejl" + +@@ -3448,25 +3452,21 @@ + msgid "Interrupted by a signal" + msgstr "Afbrudt af et signal" + +-#: posix/../sysdeps/posix/gai_strerror.c:57 +-msgid "Unknown error" +-msgstr "Ukendt fejl" +- +-#: posix/getconf.c:883 ++#: posix/getconf.c:889 + #, c-format + msgid "Usage: %s [-v specification] variable_name [pathname]\n" + msgstr "Brug: %s [-v specifikation] variabelnavn [søgesti]\n" + +-#: posix/getconf.c:941 ++#: posix/getconf.c:947 + #, c-format + msgid "unknown specification \"%s\"" + msgstr "ukendt specifikation '%s'" + +-#: posix/getconf.c:968 posix/getconf.c:984 ++#: posix/getconf.c:974 posix/getconf.c:990 + msgid "undefined" + msgstr "udefineret" + +-#: posix/getconf.c:1006 ++#: posix/getconf.c:1012 + #, c-format + msgid "Unrecognized variable `%s'" + msgstr "Ukendt variabel '%s'" +@@ -3528,71 +3528,71 @@ + msgid "%s: option `-W %s' doesn't allow an argument\n" + msgstr "%s: flaget '-W %s' tager ikke argumenter\n" + +-#: posix/regcomp.c:181 ++#: posix/regcomp.c:136 + msgid "No match" + msgstr "Ingen træf" + +-#: posix/regcomp.c:184 ++#: posix/regcomp.c:139 + msgid "Invalid regular expression" + msgstr "Ugyldigt regulært udtryk" + +-#: posix/regcomp.c:187 ++#: posix/regcomp.c:142 + msgid "Invalid collation character" + msgstr "Ugyldigt sammenligningstegn" + +-#: posix/regcomp.c:190 ++#: posix/regcomp.c:145 + msgid "Invalid character class name" + msgstr "Ugyldigt tegnklassenavn" + +-#: posix/regcomp.c:193 ++#: posix/regcomp.c:148 + msgid "Trailing backslash" + msgstr "Efterfølgende backslash" + +-#: posix/regcomp.c:196 ++#: posix/regcomp.c:151 + msgid "Invalid back reference" + msgstr "Ugyldig tilbage-reference" + +-#: posix/regcomp.c:199 ++#: posix/regcomp.c:154 + msgid "Unmatched [ or [^" + msgstr "Ubalanceret [ eller [^" + +-#: posix/regcomp.c:202 ++#: posix/regcomp.c:157 + msgid "Unmatched ( or \\(" + msgstr "Ubalanceret ( eller \\(" + +-#: posix/regcomp.c:205 ++#: posix/regcomp.c:160 + msgid "Unmatched \\{" + msgstr "Ubalanceret \\{" + +-#: posix/regcomp.c:208 ++#: posix/regcomp.c:163 + msgid "Invalid content of \\{\\}" + msgstr "Ugyldig brug af \\{\\}" + +-#: posix/regcomp.c:211 ++#: posix/regcomp.c:166 + msgid "Invalid range end" + msgstr "Ugyldigt intervalslut" + +-#: posix/regcomp.c:214 ++#: posix/regcomp.c:169 + msgid "Memory exhausted" + msgstr "Lageret opbrugt" + +-#: posix/regcomp.c:217 ++#: posix/regcomp.c:172 + msgid "Invalid preceding regular expression" + msgstr "Ugyldigt foregående regulært udtryk" + +-#: posix/regcomp.c:220 ++#: posix/regcomp.c:175 + msgid "Premature end of regular expression" + msgstr "For tidlig afslutning på regulært udtryk" + +-#: posix/regcomp.c:223 ++#: posix/regcomp.c:178 + msgid "Regular expression too big" + msgstr "Regulært udtryk for stort" + +-#: posix/regcomp.c:226 ++#: posix/regcomp.c:181 + msgid "Unmatched ) or \\)" + msgstr "Ubalanceret ) eller \\)" + +-#: posix/regcomp.c:673 ++#: posix/regcomp.c:615 + msgid "No previous regular expression" + msgstr "Intet foregående regulært udtryk" + +@@ -3746,24 +3746,24 @@ + msgid "Service configuration to be used" + msgstr "Tjenestekonfiguration som skal bruges" + +-#: nss/getent.c:136 nss/getent.c:305 ++#: nss/getent.c:136 nss/getent.c:308 + #, c-format + msgid "Enumeration not supported on %s\n" + msgstr "Enumeration er ikke understøttet på %s\n" + +-#: nss/getent.c:729 ++#: nss/getent.c:732 + msgid "getent - get entries from administrative database." + msgstr "getent - hent indtastninger fra administrativ database." + +-#: nss/getent.c:730 ++#: nss/getent.c:733 + msgid "Supported databases:" + msgstr "Understøttede databaser:" + +-#: nss/getent.c:787 nscd/nscd.c:119 nscd/nscd_nischeck.c:64 ++#: nss/getent.c:790 nscd/nscd.c:124 nscd/nscd_nischeck.c:64 + msgid "wrong number of arguments" + msgstr "galt antal argumenter" + +-#: nss/getent.c:797 ++#: nss/getent.c:800 + #, c-format + msgid "Unknown database: %s\n" + msgstr "Ukendt database: %s\n" +@@ -3792,68 +3792,72 @@ + msgid "invalid pointer size" + msgstr "ugyldig størrelse for pegere" + +-#: inet/rcmd.c:174 inet/rcmd.c:177 ++#: inet/rcmd.c:163 inet/rcmd.c:166 ++msgid "rcmd: Cannot allocate memory\n" ++msgstr "rcmd: Kan ikke tildele lager\n" ++ ++#: inet/rcmd.c:185 inet/rcmd.c:188 + msgid "rcmd: socket: All ports in use\n" + msgstr "rcmd: sokkel: Alle porte i brug\n" + +-#: inet/rcmd.c:211 ++#: inet/rcmd.c:222 + #, c-format + msgid "connect to address %s: " + msgstr "koble til adresse %s: " + +-#: inet/rcmd.c:229 ++#: inet/rcmd.c:240 + #, c-format + msgid "Trying %s...\n" + msgstr "Prøver %s...\n" + +-#: inet/rcmd.c:278 ++#: inet/rcmd.c:289 + #, c-format + msgid "rcmd: write (setting up stderr): %m\n" + msgstr "rcmd: write: (opsætter standard error): %m\n" + +-#: inet/rcmd.c:299 ++#: inet/rcmd.c:310 + #, c-format + msgid "rcmd: poll (setting up stderr): %m\n" + msgstr "rcmd: poll (opsætter stderr): %m\n" + +-#: inet/rcmd.c:302 ++#: inet/rcmd.c:313 + msgid "poll: protocol failure in circuit setup\n" + msgstr "poll: protokolfejl i opsætning af forbindelse\n" + +-#: inet/rcmd.c:346 ++#: inet/rcmd.c:358 + msgid "socket: protocol failure in circuit setup\n" + msgstr "sokkel: protokolfejl i opsætning af forbindelse\n" + +-#: inet/rcmd.c:368 ++#: inet/rcmd.c:387 + #, c-format + msgid "rcmd: %s: short read" + msgstr "rcmd: %s: kort indlæsning" + +-#: inet/rcmd.c:524 ++#: inet/rcmd.c:549 + msgid "lstat failed" + msgstr "lstat fejlede" + +-#: inet/rcmd.c:526 ++#: inet/rcmd.c:551 + msgid "not regular file" + msgstr "ikke en almindelig fil" + +-#: inet/rcmd.c:531 ++#: inet/rcmd.c:556 + msgid "cannot open" + msgstr "kan ikke åbne" + +-#: inet/rcmd.c:533 ++#: inet/rcmd.c:558 + msgid "fstat failed" + msgstr "fstat fejlede" + +-#: inet/rcmd.c:535 ++#: inet/rcmd.c:560 + msgid "bad owner" + msgstr "forkert ejer" + +-#: inet/rcmd.c:537 ++#: inet/rcmd.c:562 + msgid "writeable by other than owner" + msgstr "skrivbar af andre end ejer" + +-#: inet/rcmd.c:539 ++#: inet/rcmd.c:564 + msgid "hard linked somewhere" + msgstr "hårdlænket et eller andet sted" + +@@ -4064,109 +4068,109 @@ + msgid "Cannot receive reply to broadcast" + msgstr "Kan ikke tage imod svar på rundsending" + +-#: sunrpc/rpc_main.c:289 ++#: sunrpc/rpc_main.c:288 + #, c-format + msgid "%s: output would overwrite %s\n" + msgstr "%s: udskrift ville overskrive %s\n" + +-#: sunrpc/rpc_main.c:296 ++#: sunrpc/rpc_main.c:295 + #, c-format + msgid "%s: unable to open %s: %m\n" + msgstr "%s: kan ikke åbne %s: %m\n" + +-#: sunrpc/rpc_main.c:308 ++#: sunrpc/rpc_main.c:307 + #, c-format + msgid "%s: while writing output %s: %m" + msgstr "%s: under skrivning af uddata %s: %m" + +-#: sunrpc/rpc_main.c:343 ++#: sunrpc/rpc_main.c:342 + #, c-format + msgid "cannot find C preprocessor: %s \n" + msgstr "kan ikke finde C-præprocessor: %s \n" + +-#: sunrpc/rpc_main.c:351 ++#: sunrpc/rpc_main.c:350 + msgid "cannot find any C preprocessor (cpp)\n" + msgstr "kan ikke finde nogen C-præprocessor (cpp)\n" + +-#: sunrpc/rpc_main.c:420 ++#: sunrpc/rpc_main.c:419 + #, c-format + msgid "%s: C preprocessor failed with signal %d\n" + msgstr "%s: C-præprocessoren fejlede med signal %d\n" + +-#: sunrpc/rpc_main.c:423 ++#: sunrpc/rpc_main.c:422 + #, c-format + msgid "%s: C preprocessor failed with exit code %d\n" + msgstr "%s: C-præprocessoren fejlede med slutkode %d\n" + +-#: sunrpc/rpc_main.c:463 ++#: sunrpc/rpc_main.c:462 + #, c-format + msgid "illegal nettype :`%s'\n" + msgstr "ulovlig nettype: '%s'\n" + +-#: sunrpc/rpc_main.c:1105 ++#: sunrpc/rpc_main.c:1104 + msgid "rpcgen: too many defines\n" + msgstr "rpcgen: for mange definitioner\n" + +-#: sunrpc/rpc_main.c:1117 ++#: sunrpc/rpc_main.c:1116 + msgid "rpcgen: arglist coding error\n" + msgstr "rpcgen: arglist kode-fejl\n" + + #. TRANS: the file will not be removed; this is an + #. TRANS: informative message. +-#: sunrpc/rpc_main.c:1150 ++#: sunrpc/rpc_main.c:1149 + #, c-format + msgid "file `%s' already exists and may be overwritten\n" + msgstr "filen '%s' eksisterer allerede og kan blive overskrevet\n" + +-#: sunrpc/rpc_main.c:1195 ++#: sunrpc/rpc_main.c:1194 + msgid "Cannot specify more than one input file!\n" + msgstr "Kan ikke specificere mere end én indfil!\n" + +-#: sunrpc/rpc_main.c:1365 ++#: sunrpc/rpc_main.c:1364 + msgid "This implementation doesn't support newstyle or MT-safe code!\n" + msgstr "Denne implementation understøtter ikke nystil eller MT-sikker kode!\n" + +-#: sunrpc/rpc_main.c:1374 ++#: sunrpc/rpc_main.c:1373 + msgid "Cannot use netid flag with inetd flag!\n" + msgstr "Kan ikke bruge netid-flag med inetd-flag!\n" + +-#: sunrpc/rpc_main.c:1386 ++#: sunrpc/rpc_main.c:1385 + msgid "Cannot use netid flag without TIRPC!\n" + msgstr "Kan ikke bruge netid-flag uden TIRPC!\n" + +-#: sunrpc/rpc_main.c:1393 ++#: sunrpc/rpc_main.c:1392 + msgid "Cannot use table flags with newstyle!\n" + msgstr "Kan ikke bruge tabelflag med ny stil!\n" + +-#: sunrpc/rpc_main.c:1412 ++#: sunrpc/rpc_main.c:1411 + msgid "\"infile\" is required for template generation flags.\n" + msgstr "'indfil' er nødvendig for flag til at generere skabelon.\n" + +-#: sunrpc/rpc_main.c:1417 ++#: sunrpc/rpc_main.c:1416 + msgid "Cannot have more than one file generation flag!\n" + msgstr "Kan ikke have mere end et fil-genereringsflag!\n" + +-#: sunrpc/rpc_main.c:1426 ++#: sunrpc/rpc_main.c:1425 + #, c-format + msgid "usage: %s infile\n" + msgstr "brug: %s indfil\n" + +-#: sunrpc/rpc_main.c:1427 ++#: sunrpc/rpc_main.c:1426 + #, c-format + msgid "\t%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile\n" + msgstr "\t%s [-abkCLNTM] [-Dnavn[=værdi]] [-i størrelse] [-I [-K sekunder]] [-Y søgesti] indfil\n" + +-#: sunrpc/rpc_main.c:1429 ++#: sunrpc/rpc_main.c:1428 + #, 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 udfil] [indfil]\n" + +-#: sunrpc/rpc_main.c:1431 ++#: sunrpc/rpc_main.c:1430 + #, c-format + msgid "\t%s [-s nettype]* [-o outfile] [infile]\n" + msgstr "\t%s [-s nettype]* [-o udfil] [indfil]\n" + +-#: sunrpc/rpc_main.c:1432 ++#: sunrpc/rpc_main.c:1431 + #, c-format + msgid "\t%s [-n netid]* [-o outfile] [infile]\n" + msgstr "\t%s [-n netid]* [-o udfil] [indfil]\n" +@@ -5024,7 +5028,7 @@ + msgid "while allocating hash table entry" + msgstr "under allokering af hashtabel-indtastninger" + +-#: nscd/cache.c:150 nscd/connections.c:185 ++#: nscd/cache.c:150 nscd/connections.c:187 + #, c-format + msgid "cannot stat() file `%s': %s" + msgstr "kan ikke udføre stat() på fil '%s': %s" +@@ -5037,153 +5041,158 @@ + msgid "Cannot run nscd in secure mode as unprivileged user" + msgstr "Kan ikke køre nscd i sikker tilstand som upriviligieret bruger" + +-#: nscd/connections.c:199 ++#: nscd/connections.c:175 ++#, c-format ++msgid "while allocating cache: %s" ++msgstr "under allokering af buffer: %s" ++ ++#: nscd/connections.c:200 + #, c-format + msgid "cannot open socket: %s" + msgstr "kan ikke åbne sokkel: %s" + +-#: nscd/connections.c:217 ++#: nscd/connections.c:218 + #, c-format + msgid "cannot enable socket to accept connections: %s" + msgstr "kan ikke få sokkel til at acceptere forbindelser: %s" + +-#: nscd/connections.c:259 ++#: nscd/connections.c:260 + #, c-format + msgid "handle_request: request received (Version = %d)" + msgstr "handle_request: forespørgsel modtaget (version = %d)" + +-#: nscd/connections.c:265 ++#: nscd/connections.c:266 + #, c-format + msgid "cannot handle old request version %d; current version is %d" + msgstr "kan ikke håndtere gammel forespørgsel af version %d. Nuværende version er %d" + +-#: nscd/connections.c:303 nscd/connections.c:325 ++#: nscd/connections.c:304 nscd/connections.c:326 + #, c-format + msgid "cannot write result: %s" + msgstr "kan ikke udskrive resultat: '%s'" + +-#: nscd/connections.c:404 nscd/connections.c:498 ++#: nscd/connections.c:405 nscd/connections.c:499 + #, c-format + msgid "error getting callers id: %s" + msgstr "fejl ved forespørgsel på opkaldets id: %s" + +-#: nscd/connections.c:470 ++#: nscd/connections.c:471 + #, c-format + msgid "while accepting connection: %s" + msgstr "under accept af forbindelse: %s" + +-#: nscd/connections.c:481 ++#: nscd/connections.c:482 + #, c-format + msgid "short read while reading request: %s" + msgstr "afkortet læsning ved læsning af forespørgsel: %s" + +-#: nscd/connections.c:517 ++#: nscd/connections.c:518 + #, c-format + msgid "key length in request too long: %d" + msgstr "nøglelængde i forespørgsel for lang: %d" + +-#: nscd/connections.c:531 ++#: nscd/connections.c:532 + #, c-format + msgid "short read while reading request key: %s" + msgstr "afkortet læsning ved læsning af forespørgsels-nøgle: %s" + +-#: nscd/connections.c:590 nscd/connections.c:591 nscd/connections.c:610 +-#: nscd/connections.c:623 nscd/connections.c:629 nscd/connections.c:636 ++#: nscd/connections.c:591 nscd/connections.c:592 nscd/connections.c:611 ++#: nscd/connections.c:624 nscd/connections.c:630 nscd/connections.c:637 + #, c-format + msgid "Failed to run nscd as user '%s'" + msgstr "Kunne ikke køre nscd som bruger \"%s\"" + +-#: nscd/connections.c:611 ++#: nscd/connections.c:612 + msgid "getgrouplist failed" + msgstr "getgrouplist mislykkedes" + +-#: nscd/connections.c:624 ++#: nscd/connections.c:625 + msgid "setgroups failed" + msgstr "setgroups mislykkedes" + +-#: nscd/grpcache.c:102 nscd/hstcache.c:110 nscd/pwdcache.c:108 ++#: nscd/grpcache.c:103 nscd/hstcache.c:111 nscd/pwdcache.c:109 + msgid "while allocating key copy" + msgstr "under allokering af nøglekopi" + +-#: nscd/grpcache.c:152 nscd/hstcache.c:167 nscd/pwdcache.c:145 ++#: nscd/grpcache.c:153 nscd/hstcache.c:168 nscd/pwdcache.c:146 + msgid "while allocating cache entry" + msgstr "under allokering af nærbuffer-indtastninger" + +-#: nscd/grpcache.c:195 nscd/hstcache.c:281 nscd/pwdcache.c:191 ++#: nscd/grpcache.c:196 nscd/hstcache.c:282 nscd/pwdcache.c:192 + #, c-format + msgid "short write in %s: %s" + msgstr "afkortet skrivning i %s: %s" + +-#: nscd/grpcache.c:217 ++#: nscd/grpcache.c:218 + #, c-format + msgid "Haven't found \"%s\" in group cache!" + msgstr "Har ikke fundet '%s' i gruppe-nærbuffer!" + +-#: nscd/grpcache.c:292 ++#: nscd/grpcache.c:284 + #, c-format + msgid "Invalid numeric gid \"%s\"!" + msgstr "Ugyldigt numerisk gruppe-id (gid) \"%s\"!" + +-#: nscd/grpcache.c:299 ++#: nscd/grpcache.c:291 + #, c-format + msgid "Haven't found \"%d\" in group cache!" + msgstr "Har ikke fundet '%d' i gruppe-nærbuffer!" + +-#: nscd/hstcache.c:303 nscd/hstcache.c:378 nscd/hstcache.c:456 +-#: nscd/hstcache.c:533 ++#: nscd/hstcache.c:304 nscd/hstcache.c:370 nscd/hstcache.c:435 ++#: nscd/hstcache.c:500 + #, c-format + msgid "Haven't found \"%s\" in hosts cache!" + msgstr "Har ikke fundet '%s' i værts-nærbuffer!" + +-#: nscd/nscd.c:80 ++#: nscd/nscd.c:85 + msgid "Read configuration data from NAME" + msgstr "Læs konfigurationsdata fra NAVN" + +-#: nscd/nscd.c:82 ++#: nscd/nscd.c:87 + msgid "Do not fork and display messages on the current tty" + msgstr "Udspalt ikke ny proces og vis meddelelser på nuværende tty" + +-#: nscd/nscd.c:83 ++#: nscd/nscd.c:88 + msgid "NUMBER" + msgstr "NUMMER" + +-#: nscd/nscd.c:83 ++#: nscd/nscd.c:88 + msgid "Start NUMBER threads" + msgstr "Start ANTAL tråde" + +-#: nscd/nscd.c:84 ++#: nscd/nscd.c:89 + msgid "Shut the server down" + msgstr "Afbryd tjeneren" + +-#: nscd/nscd.c:85 ++#: nscd/nscd.c:90 + msgid "Print current configuration statistic" + msgstr "Skriv nuværende konfigurationsstatistik ud" + +-#: nscd/nscd.c:86 ++#: nscd/nscd.c:91 + msgid "TABLE" + msgstr "TABEL" + +-#: nscd/nscd.c:87 ++#: nscd/nscd.c:92 + msgid "Invalidate the specified cache" + msgstr "Ugyldiggør den opgivne hurtigbuffer" + +-#: nscd/nscd.c:88 ++#: nscd/nscd.c:93 + msgid "TABLE,yes" + msgstr "TABEL,ja" + +-#: nscd/nscd.c:88 ++#: nscd/nscd.c:93 + msgid "Use separate cache for each user" + msgstr "Brug separat buffer for hver bruger" + +-#: nscd/nscd.c:93 ++#: nscd/nscd.c:98 + msgid "Name Service Cache Daemon." + msgstr "Dæmon for bufring af navnetjeneste" + +-#: nscd/nscd.c:126 ++#: nscd/nscd.c:131 + msgid "already running" + msgstr "kører allerede" + +-#: nscd/nscd.c:192 nscd/nscd.c:212 nscd/nscd.c:218 ++#: nscd/nscd.c:243 nscd/nscd.c:263 nscd/nscd.c:269 + msgid "Only root is allowed to use this option!" + msgstr "Kun 'root' har lov til at bruge dette flag!" + +@@ -5273,22 +5282,22 @@ + "%15ld%% træfrate for hurtigbuffer\n" + "%15s tjek /etc/%s for ændringer\n" + +-#: nscd/pwdcache.c:213 ++#: nscd/pwdcache.c:214 + #, c-format + msgid "Haven't found \"%s\" in password cache!" + msgstr "Har ikke fundet '%s' i adgangskode-nærbuffer!" + +-#: nscd/pwdcache.c:288 ++#: nscd/pwdcache.c:280 + #, c-format + msgid "Invalid numeric uid \"%s\"!" + msgstr "Ugyldig numerisk bruger-id (uid) \"%s\"!" + +-#: nscd/pwdcache.c:295 ++#: nscd/pwdcache.c:287 + #, c-format + msgid "Haven't found \"%d\" in password cache!" + msgstr "Har ikke fundet '%d' i adgangskode-nærbuffer!" + +-#: elf/../sysdeps/generic/dl-sysdep.c:297 ++#: elf/../sysdeps/generic/dl-sysdep.c:357 + msgid "cannot create capability list" + msgstr "kan ikke oprette egenskabsliste" + +@@ -5339,7 +5348,7 @@ + msgid ", OS ABI: %s %d.%d.%d" + msgstr ", OS ABI: %s %d.%d.%d" + +-#: elf/cache.c:136 elf/ldconfig.c:1033 ++#: elf/cache.c:136 elf/ldconfig.c:1045 + #, c-format + msgid "Can't open cache file %s\n" + msgstr "Kan ikke åbne hurtigbufferfil %s\n" +@@ -5385,17 +5394,17 @@ + msgid "Renaming of %s to %s failed" + msgstr "Omdøbning af %s til %s fejlede" + +-#: elf/dl-close.c:113 ++#: elf/dl-close.c:128 + msgid "shared object not open" + msgstr "delt objekt er ikke åbent" + +-#: elf/dl-close.c:357 elf/dl-open.c:436 ++#: elf/dl-close.c:486 elf/dl-open.c:444 + msgid "TLS generation counter wrapped! Please send report with the 'glibcbug' script." + msgstr "" + "Generationstæller for TLS tilbagestillet! Vær sød at indsende fejlrapport med\n" + "\"glibcbug\"-skriptet" + +-#: elf/dl-deps.c:111 elf/dl-open.c:177 ++#: elf/dl-deps.c:111 elf/dl-open.c:183 + msgid "DST not allowed in SUID/SGID programs" + msgstr "DST er ikke tilladt i SUIT/SGID-programmer" + +@@ -5414,181 +5423,193 @@ + msgid "cannot allocate dependency list" + msgstr "kan ikke allokere afhængighedsliste" + +-#: elf/dl-deps.c:492 elf/dl-deps.c:547 ++#: elf/dl-deps.c:494 elf/dl-deps.c:549 + msgid "cannot allocate symbol search list" + msgstr "kan ikke allokere symbolsøgningsliste" + +-#: elf/dl-deps.c:532 ++#: elf/dl-deps.c:534 + msgid "Filters not supported with LD_TRACE_PRELINKING" + msgstr "Filter understøttes ej med LD_TRACE_PRELINKING" + +-#: elf/dl-error.c:73 ++#: elf/dl-error.c:75 + msgid "DYNAMIC LINKER BUG!!!" + msgstr "FEJL I DYNAMISK LÆNKER!!!" + +-#: elf/dl-error.c:106 ++#: elf/dl-error.c:108 + msgid "error while loading shared libraries" + msgstr "fejl da delte biblioteker indlæstes" + +-#: elf/dl-load.c:338 ++#: elf/dl-load.c:339 + msgid "cannot allocate name record" + msgstr "Kan ikke allokere navnepost" + +-#: elf/dl-load.c:440 elf/dl-load.c:520 elf/dl-load.c:614 elf/dl-load.c:709 ++#: elf/dl-load.c:441 elf/dl-load.c:520 elf/dl-load.c:612 elf/dl-load.c:707 + msgid "cannot create cache for search path" + msgstr "Kan ikke oprette buffer for søgesti" + +-#: elf/dl-load.c:545 ++#: elf/dl-load.c:543 + msgid "cannot create RUNPATH/RPATH copy" + msgstr "kan ikke oprette RUNPATH/RPATH kopi" + +-#: elf/dl-load.c:600 ++#: elf/dl-load.c:598 + msgid "cannot create search path array" + msgstr "kan ikke oprette tabel over søgestier" + +-#: elf/dl-load.c:796 ++#: elf/dl-load.c:794 + msgid "cannot stat shared object" + msgstr "kan ikke tage status på delt objekt" + +-#: elf/dl-load.c:840 ++#: elf/dl-load.c:838 + msgid "cannot open zero fill device" + msgstr "kan ikke åbne nulstil-enhed" + +-#: elf/dl-load.c:849 elf/dl-load.c:1855 ++#: elf/dl-load.c:847 elf/dl-load.c:1902 + msgid "cannot create shared object descriptor" + msgstr "kan ikke oprette delt objektbeskriver" + +-#: elf/dl-load.c:868 elf/dl-load.c:1351 elf/dl-load.c:1434 ++#: elf/dl-load.c:866 elf/dl-load.c:1398 elf/dl-load.c:1481 + msgid "cannot read file data" + msgstr "kan ikke indlæse fildata" + +-#: elf/dl-load.c:908 ++#: elf/dl-load.c:906 + msgid "ELF load command alignment not page-aligned" + msgstr "ELF-indlæsningskommandos tilpasning er ikke tilpasset siden" + +-#: elf/dl-load.c:915 ++#: elf/dl-load.c:913 + msgid "ELF load command address/offset not properly aligned" + msgstr "ELF-indlæsningskommandos adresse/tillæg er ikke tilpasset ordentligt" + +-#: elf/dl-load.c:996 ++#: elf/dl-load.c:988 ++msgid "cannot allocate TLS data structures for initial thread" ++msgstr "kan ikke oprette TLS-datastrukturer for første tråd" ++ ++#: elf/dl-load.c:1012 ++msgid "cannot handle TLS data" ++msgstr "kan ikke behandle TLS-data" ++ ++#: elf/dl-load.c:1047 + msgid "failed to map segment from shared object" + msgstr "klarede ikke at afbilde fra delt objekt'" + +-#: elf/dl-load.c:1020 ++#: elf/dl-load.c:1071 + msgid "cannot dynamically load executable" + msgstr "kan ikke indlæse udførbare dynamisk" + +-#: elf/dl-load.c:1081 ++#: elf/dl-load.c:1132 + msgid "cannot change memory protections" + msgstr "kan ikke ændre lagerbeskyttelser" + +-#: elf/dl-load.c:1100 ++#: elf/dl-load.c:1151 + msgid "cannot map zero-fill pages" + msgstr "kan ikke mappe nulstil-sider" + +-#: elf/dl-load.c:1118 ++#: elf/dl-load.c:1169 + msgid "cannot allocate memory for program header" + msgstr "Kan ikke allokere lager til programhoved" + +-#: elf/dl-load.c:1149 ++#: elf/dl-load.c:1200 + msgid "object file has no dynamic section" + msgstr "objektfil har ingen dynamisk sektion" + +-#: elf/dl-load.c:1193 ++#: elf/dl-load.c:1240 + msgid "shared object cannot be dlopen()ed" + msgstr "delt objekt kan ikke åbnes med dlopen()" + +-#: elf/dl-load.c:1216 ++#: elf/dl-load.c:1263 + msgid "cannot create searchlist" + msgstr "kan ikke læse søgningsliste" + +-#: elf/dl-load.c:1351 ++#: elf/dl-load.c:1398 + msgid "file too short" + msgstr "For kort fil" + +-#: elf/dl-load.c:1374 ++#: elf/dl-load.c:1421 + msgid "invalid ELF header" + msgstr "ugyldigt ELF-hoved" + +-#: elf/dl-load.c:1383 ++#: elf/dl-load.c:1430 + msgid "ELF file data encoding not big-endian" + msgstr "Kodning for ELF-fildata er ikke \"big-endian\"" + +-#: elf/dl-load.c:1385 ++#: elf/dl-load.c:1432 + msgid "ELF file data encoding not little-endian" + msgstr "Kodning for ELF-fildata er ikke \"little-endian\"" + +-#: elf/dl-load.c:1389 ++#: elf/dl-load.c:1436 + msgid "ELF file version ident does not match current one" + msgstr "ELF-filens version-identitet passer ikke med den aktuelle" + +-#: elf/dl-load.c:1393 ++#: elf/dl-load.c:1440 + msgid "ELF file OS ABI invalid" + msgstr "ELF-filens OS ABI er ugyldig" + +-#: elf/dl-load.c:1395 ++#: elf/dl-load.c:1442 + msgid "ELF file ABI version invalid" + msgstr "ELF-filens ABI-version er ugyldig" + +-#: elf/dl-load.c:1398 ++#: elf/dl-load.c:1445 + msgid "internal error" + msgstr "Intern fejl" + +-#: elf/dl-load.c:1405 ++#: elf/dl-load.c:1452 + msgid "ELF file version does not match current one" + msgstr "ELF-filens version passer ikke med den aktuelle" + +-#: elf/dl-load.c:1413 ++#: elf/dl-load.c:1460 + msgid "ELF file's phentsize not the expected size" + msgstr "ELF-filens 'phentsize' er ikke den forventede størrelse" + +-#: elf/dl-load.c:1419 ++#: elf/dl-load.c:1466 + msgid "only ET_DYN and ET_EXEC can be loaded" + msgstr "kun ET_DYN og ET_EXEC kan indlæses" + +-#: elf/dl-load.c:1870 ++#: elf/dl-load.c:1917 + msgid "cannot open shared object file" + msgstr "kan ikke åbne delt objektfil" + +-#: elf/dl-lookup.c:248 elf/dl-lookup.c:413 ++#: elf/dl-lookup.c:265 elf/dl-lookup.c:430 + msgid "relocation error" + msgstr "fejl ved relokering" + +-#: elf/dl-open.c:105 ++#: elf/dl-open.c:111 + msgid "cannot extend global scope" + msgstr "Kan ikke udvide globalt defineringområde" + +-#: elf/dl-open.c:208 ++#: elf/dl-open.c:214 + msgid "empty dynamic string token substitution" + msgstr "tom dynamisk strengelement-erstatning" + +-#: elf/dl-open.c:345 elf/dl-open.c:356 ++#: elf/dl-open.c:351 elf/dl-open.c:362 + msgid "cannot create scope list" + msgstr "kan ikke oprette omfangsliste" + +-#: elf/dl-open.c:416 ++#: elf/dl-open.c:424 + msgid "cannot create TLS data structures" + msgstr "kan ikke oprette datastrukturer for TLS" + +-#: elf/dl-open.c:478 ++#: elf/dl-open.c:486 + msgid "invalid mode for dlopen()" + msgstr "ugyldig modus for dlopen()" + +-#: elf/dl-reloc.c:88 ++#: elf/dl-reloc.c:58 ++msgid "shared object cannot be dlopen()ed: static TLS memory too small" ++msgstr "delt objekt kan ikke åbnes med dlopen(): statisk TLS-hukommelse for lille" ++ ++#: elf/dl-reloc.c:118 + msgid "cannot make segment writable for relocation" + msgstr "Kan ikke gøre segment skrivbart for omflytning" + +-#: elf/dl-reloc.c:174 ++#: elf/dl-reloc.c:219 + #, c-format + msgid "%s: profiler found no PLTREL in object %s\n" + msgstr "%s: profilereren fandt ingen PLTREL i objekt %s\n" + +-#: elf/dl-reloc.c:186 ++#: elf/dl-reloc.c:231 + #, c-format + msgid "%s: profiler out of memory shadowing PLTREL of %s\n" + msgstr "%s: profilereren fik slut på hukommelse for kopiering af PLTREL i %s\n" + +-#: elf/dl-reloc.c:201 ++#: elf/dl-reloc.c:246 + msgid "cannot restore segment prot after reloc" + msgstr "kan ikke genskabe segmentbeskyttelse efter omflytning" + +@@ -5644,119 +5665,119 @@ + msgid "Configure Dynamic Linker Run Time Bindings." + msgstr "Konfigurerer værdier til Dynamisk Lænker" + +-#: elf/ldconfig.c:282 ++#: elf/ldconfig.c:294 + #, c-format + msgid "Path `%s' given more than once" + msgstr "Stien '%s' givet mere end én gang" + +-#: elf/ldconfig.c:326 ++#: elf/ldconfig.c:338 + #, c-format + msgid "%s is not a known library type" + msgstr "%s er ikke en kendt bibliotekstype" + +-#: elf/ldconfig.c:344 ++#: elf/ldconfig.c:356 + #, c-format + msgid "Can't stat %s" + msgstr "Kan ikke stat() %s" + +-#: elf/ldconfig.c:414 ++#: elf/ldconfig.c:426 + #, c-format + msgid "Can't stat %s\n" + msgstr "Kan ikke stat() %s\n" + +-#: elf/ldconfig.c:424 ++#: elf/ldconfig.c:436 + #, c-format + msgid "%s is not a symbolic link\n" + msgstr "%s er ikke en symbolsk lænke\n" + +-#: elf/ldconfig.c:443 ++#: elf/ldconfig.c:455 + #, c-format + msgid "Can't unlink %s" + msgstr "Kan ikke aflænke %s" + +-#: elf/ldconfig.c:449 ++#: elf/ldconfig.c:461 + #, c-format + msgid "Can't link %s to %s" + msgstr "Kan ikke lænke %s til %s" + +-#: elf/ldconfig.c:455 ++#: elf/ldconfig.c:467 + msgid " (changed)\n" + msgstr " (ændret)\n" + +-#: elf/ldconfig.c:457 ++#: elf/ldconfig.c:469 + msgid " (SKIPPED)\n" + msgstr " (UDELADT)\n" + +-#: elf/ldconfig.c:512 ++#: elf/ldconfig.c:524 + #, c-format + msgid "Can't find %s" + msgstr "Kan ikke finde %s" + +-#: elf/ldconfig.c:528 ++#: elf/ldconfig.c:540 + #, c-format + msgid "Can't lstat %s" + msgstr "Kan ikke lstat %s" + +-#: elf/ldconfig.c:535 ++#: elf/ldconfig.c:547 + #, c-format + msgid "Ignored file %s since it is not a regular file." + msgstr "Ignorerede filen %s da den ikke er en almindelig fil." + +-#: elf/ldconfig.c:543 ++#: elf/ldconfig.c:555 + #, c-format + msgid "No link created since soname could not be found for %s" + msgstr "Ingen lænke oprettet da .so-navn ikke kunne findes for %s" + +-#: elf/ldconfig.c:634 ++#: elf/ldconfig.c:646 + #, c-format + msgid "Can't open directory %s" + msgstr "Kan ikke åbne katalog %s" + +-#: elf/ldconfig.c:689 elf/ldconfig.c:736 ++#: elf/ldconfig.c:701 elf/ldconfig.c:748 + #, c-format + msgid "Cannot lstat %s" + msgstr "Kan ikke lstat %s" + +-#: elf/ldconfig.c:701 ++#: elf/ldconfig.c:713 + #, c-format + msgid "Cannot stat %s" + msgstr "Kan ikke stat() %s" + +-#: elf/ldconfig.c:758 elf/readlib.c:93 ++#: elf/ldconfig.c:770 elf/readlib.c:93 + #, c-format + msgid "Input file %s not found.\n" + msgstr "Indputfilen %s ikke fundet\n" + +-#: elf/ldconfig.c:792 ++#: elf/ldconfig.c:804 + #, c-format + msgid "libc5 library %s in wrong directory" + msgstr "libc5-bibliotek %s i forkert katalog" + +-#: elf/ldconfig.c:795 ++#: elf/ldconfig.c:807 + #, c-format + msgid "libc6 library %s in wrong directory" + msgstr "libc6-bibliotek %s i forkert katalog" + +-#: elf/ldconfig.c:798 ++#: elf/ldconfig.c:810 + #, c-format + msgid "libc4 library %s in wrong directory" + msgstr "libc4-bibliotek %s i forkert katalog" + +-#: elf/ldconfig.c:825 ++#: elf/ldconfig.c:837 + #, c-format + msgid "libraries %s and %s in directory %s have same soname but different type." + msgstr "bibliotekerne %s og %s i kataloget %s har samme .so-navn, men forskellig type" + +-#: elf/ldconfig.c:928 ++#: elf/ldconfig.c:940 + #, c-format + msgid "Can't open configuration file %s" + msgstr "Kan ikke åbne konfigurationsfil %s" + +-#: elf/ldconfig.c:1012 ++#: elf/ldconfig.c:1024 + msgid "Can't chdir to /" + msgstr "Kan ikke chdir til /" + +-#: elf/ldconfig.c:1054 ++#: elf/ldconfig.c:1066 + #, c-format + msgid "Can't open cache file directory %s\n" + msgstr "Kan ikke åbne hurtigbufferkatalog %s\n" +Binary files glibc-2.3.2/po/de.mo and glibc-2.3.2-200304020432/po/de.mo differ +Binary files glibc-2.3.2/po/el.mo and glibc-2.3.2-200304020432/po/el.mo differ +Binary files glibc-2.3.2/po/en_GB.mo and glibc-2.3.2-200304020432/po/en_GB.mo differ +Binary files glibc-2.3.2/po/es.mo and glibc-2.3.2-200304020432/po/es.mo differ +diff -u -udbrN glibc-2.3.2/po/es.po glibc-2.3.2-200304020432/po/es.po +--- glibc-2.3.2/po/es.po Mon Nov 4 07:56:19 2002 ++++ glibc-2.3.2-200304020432/po/es.po Mon Mar 3 19:12:33 2003 +@@ -1,13 +1,13 @@ + # Mensajes en español para GNU libc. +-# Copyright (C) 1996, 1997, 1998, 2001, 2002 Free Software Foundation, Inc. ++# Copyright (C) 1996, 1997, 1998, 2001, 2002, 2003 Free Software Foundation, Inc. + # Enrique Melero Gómez , 1996, 1997. +-# Santiago Vila Doncel , 1997, 1998, 2001, 2002. ++# Santiago Vila Doncel , 1997, 1998, 2001, 2002, 2003. + # + msgid "" + msgstr "" +-"Project-Id-Version: GNU libc 2.3.1\n" +-"POT-Creation-Date: 2002-10-02 17:22-0700\n" +-"PO-Revision-Date: 2002-11-02 16:52+0100\n" ++"Project-Id-Version: GNU libc 2.3.2\n" ++"POT-Creation-Date: 2003-02-22 15:34-0800\n" ++"PO-Revision-Date: 2003-03-03 17:20+0100\n" + "Last-Translator: Santiago Vila Doncel \n" + "Language-Team: Spanish \n" + "MIME-Version: 1.0\n" +@@ -301,8 +301,8 @@ + + #: iconv/iconv_prog.c:241 + #, c-format +-msgid "conversions from `%s' and to `%s' are not supported" +-msgstr "no se admiten conversiones de `%s' a `%s'" ++msgid "conversion from `%s' and to `%s' are not supported" ++msgstr "no se admite la conversión de `%s' a `%s'" + + #: iconv/iconv_prog.c:246 + #, c-format +@@ -327,15 +327,15 @@ + msgid "error while closing output file" + msgstr "error al cerrar el fichero de salida" + +-#: iconv/iconv_prog.c:407 iconv/iconvconfig.c:355 locale/programs/locale.c:268 ++#: iconv/iconv_prog.c:407 iconv/iconvconfig.c:357 locale/programs/locale.c:274 + #: locale/programs/localedef.c:372 catgets/gencat.c:233 + #: malloc/memusagestat.c:602 debug/pcprofiledump.c:199 + msgid "Report bugs using the `glibcbug' script to .\n" + msgstr "Comunicar bichos usando el programa `glibcbug' a .\n" + +-#: iconv/iconv_prog.c:421 iconv/iconvconfig.c:369 locale/programs/locale.c:281 +-#: locale/programs/localedef.c:386 catgets/gencat.c:246 posix/getconf.c:904 +-#: nss/getent.c:74 nscd/nscd.c:279 nscd/nscd_nischeck.c:90 elf/ldconfig.c:259 ++#: iconv/iconv_prog.c:421 iconv/iconvconfig.c:371 locale/programs/locale.c:287 ++#: locale/programs/localedef.c:386 catgets/gencat.c:246 posix/getconf.c:910 ++#: nss/getent.c:74 nscd/nscd.c:330 nscd/nscd_nischeck.c:90 elf/ldconfig.c:271 + #: elf/sprof.c:349 + #, c-format + msgid "" +@@ -348,9 +348,9 @@ + "No hay NINGUNA garantía; ni siquiera de COMERCIABILIDAD o IDONEIDAD PARA UN\n" + "FIN DETERMINADO.\n" + +-#: iconv/iconv_prog.c:426 iconv/iconvconfig.c:374 locale/programs/locale.c:286 +-#: locale/programs/localedef.c:391 catgets/gencat.c:251 posix/getconf.c:909 +-#: nss/getent.c:79 nscd/nscd.c:284 nscd/nscd_nischeck.c:95 elf/ldconfig.c:264 ++#: iconv/iconv_prog.c:426 iconv/iconvconfig.c:376 locale/programs/locale.c:292 ++#: locale/programs/localedef.c:391 catgets/gencat.c:251 posix/getconf.c:915 ++#: nss/getent.c:79 nscd/nscd.c:335 nscd/nscd_nischeck.c:95 elf/ldconfig.c:276 + #: elf/sprof.c:355 + #, c-format + msgid "Written by %s.\n" +@@ -409,15 +409,15 @@ + msgid "Prefix used for all file accesses" + msgstr "Prefijo utilizado para todos los accesos a ficheros" + +-#: iconv/iconvconfig.c:325 locale/programs/localedef.c:292 ++#: iconv/iconvconfig.c:327 locale/programs/localedef.c:292 + msgid "no output file produced because warning were issued" + msgstr "no se ha producido ningún fichero de salida debido a la existencia de avisos" + +-#: iconv/iconvconfig.c:403 ++#: iconv/iconvconfig.c:405 + msgid "while inserting in search tree" + msgstr "al insertar en el árbol de búsqueda" + +-#: iconv/iconvconfig.c:1202 ++#: iconv/iconvconfig.c:1204 + msgid "cannot generate output file" + msgstr "no se puede generar el fichero de salida" + +@@ -1368,7 +1368,7 @@ + msgid "unterminated symbolic name" + msgstr "nombre simbólico sin terminar" + +-#: locale/programs/linereader.c:537 catgets/gencat.c:1166 ++#: locale/programs/linereader.c:537 catgets/gencat.c:1195 + msgid "invalid escape sequence" + msgstr "secuencia de escape inválida" + +@@ -1398,39 +1398,39 @@ + msgid "trailing garbage at end of line" + msgstr "hay inconsistencias al final de la línea" + +-#: locale/programs/locale.c:73 ++#: locale/programs/locale.c:75 + msgid "System information:" + msgstr "Información del sistema:" + +-#: locale/programs/locale.c:75 ++#: locale/programs/locale.c:77 + msgid "Write names of available locales" + msgstr "Escribe los nombres de los locales disponibles" + +-#: locale/programs/locale.c:77 ++#: locale/programs/locale.c:79 + msgid "Write names of available charmaps" + msgstr "Escribe los nombres de las asignaciones de caracteres disponibles" + +-#: locale/programs/locale.c:78 ++#: locale/programs/locale.c:80 + msgid "Modify output format:" + msgstr "Modifica el formato de salida:" + +-#: locale/programs/locale.c:79 ++#: locale/programs/locale.c:81 + msgid "Write names of selected categories" + msgstr "Escribe los nombres de las categorías seleccionadas" + +-#: locale/programs/locale.c:80 ++#: locale/programs/locale.c:82 + msgid "Write names of selected keywords" + msgstr "Escribe los nombres de las palabras clave seleccionadas" + +-#: locale/programs/locale.c:81 ++#: locale/programs/locale.c:83 + msgid "Print more information" + msgstr "Muestra más información" + +-#: locale/programs/locale.c:86 ++#: locale/programs/locale.c:88 + msgid "Get locale-specific information." + msgstr "Obtiene la información específica del locale." + +-#: locale/programs/locale.c:89 ++#: locale/programs/locale.c:91 + msgid "" + "NAME\n" + "[-a|-m]" +@@ -1438,7 +1438,7 @@ + "NOMBRE\n" + "[-a|-m]" + +-#: locale/programs/locale.c:488 ++#: locale/programs/locale.c:512 + msgid "while preparing output" + msgstr "al preparar la salida" + +@@ -1571,16 +1571,16 @@ + msgid "cannot create temporary file" + msgstr "no se puede crear un fichero temporal" + +-#: locale/programs/locarchive.c:118 locale/programs/locarchive.c:302 ++#: locale/programs/locarchive.c:118 locale/programs/locarchive.c:305 + msgid "cannot initialize archive file" + msgstr "no se puede inicializar el archivo" + +-#: locale/programs/locarchive.c:125 locale/programs/locarchive.c:309 ++#: locale/programs/locarchive.c:125 locale/programs/locarchive.c:312 + msgid "cannot resize archive file" + msgstr "no se puede cambiar el tamaño del archivo" + +-#: locale/programs/locarchive.c:134 locale/programs/locarchive.c:318 +-#: locale/programs/locarchive.c:508 ++#: locale/programs/locarchive.c:134 locale/programs/locarchive.c:321 ++#: locale/programs/locarchive.c:511 + msgid "cannot map archive header" + msgstr "no se puede leer la cabecera del archivo" + +@@ -1596,88 +1596,88 @@ + msgid "cannot map locale archive file" + msgstr "no se puede leer el fichero de locales" + +-#: locale/programs/locarchive.c:326 ++#: locale/programs/locarchive.c:329 + msgid "cannot lock new archive" + msgstr "no se puede bloquear el archivo nuevo" + +-#: locale/programs/locarchive.c:377 ++#: locale/programs/locarchive.c:380 + msgid "cannot extend locale archive file" + msgstr "no se puede extender el archivo de locales" + +-#: locale/programs/locarchive.c:386 ++#: locale/programs/locarchive.c:389 + msgid "cannot change mode of resized locale archive" + msgstr "no se puede cambiar el modo de un archivo de locales redimensionado" + +-#: locale/programs/locarchive.c:394 ++#: locale/programs/locarchive.c:397 + msgid "cannot rename new archive" + msgstr "no se puede renombrar el nuevo archivo" + +-#: locale/programs/locarchive.c:447 ++#: locale/programs/locarchive.c:450 + #, c-format + msgid "cannot open locale archive \"%s\"" + msgstr "no se puede abrir el archivo de locales \"%s\"" + +-#: locale/programs/locarchive.c:452 ++#: locale/programs/locarchive.c:455 + #, c-format + msgid "cannot stat locale archive \"%s\"" + msgstr "no se puede efectuar `stat' sobre el archivo de locales \"%s\"" + +-#: locale/programs/locarchive.c:471 ++#: locale/programs/locarchive.c:474 + #, c-format + msgid "cannot lock locale archive \"%s\"" + msgstr "no se puede bloquear el archivo de locales \"%s\"" + +-#: locale/programs/locarchive.c:494 ++#: locale/programs/locarchive.c:497 + msgid "cannot read archive header" + msgstr "no se puede leer la cabecera del archivo" + +-#: locale/programs/locarchive.c:554 ++#: locale/programs/locarchive.c:557 + #, c-format + msgid "locale '%s' already exists" + msgstr "el local `%s' ya existe" + +-#: locale/programs/locarchive.c:784 locale/programs/locarchive.c:799 +-#: locale/programs/locarchive.c:811 locale/programs/locarchive.c:823 ++#: locale/programs/locarchive.c:788 locale/programs/locarchive.c:803 ++#: locale/programs/locarchive.c:815 locale/programs/locarchive.c:827 + #: locale/programs/locfile.c:343 + msgid "cannot add to locale archive" + msgstr "no se puede añadir al archivo de locales" + +-#: locale/programs/locarchive.c:976 ++#: locale/programs/locarchive.c:982 + #, c-format + msgid "locale alias file `%s' not found" + msgstr "no se encontró el fichero de alias de locales `%s'" + +-#: locale/programs/locarchive.c:1118 ++#: locale/programs/locarchive.c:1126 + #, c-format + msgid "Adding %s\n" + msgstr "Añadiendo %s\n" + +-#: locale/programs/locarchive.c:1124 ++#: locale/programs/locarchive.c:1132 + #, c-format + msgid "stat of \"%s\" failed: %s: ignored" + msgstr "falló la llamada a `stat' sobre \"%s\": %s: descartado" + +-#: locale/programs/locarchive.c:1130 ++#: locale/programs/locarchive.c:1138 + #, c-format + msgid "\"%s\" is no directory; ignored" + msgstr "\"%s\" no es un directorio; descarrtado" + +-#: locale/programs/locarchive.c:1137 ++#: locale/programs/locarchive.c:1145 + #, c-format + msgid "cannot open directory \"%s\": %s: ignored" + msgstr "no se puede abrir el directorio \"%s\": %s: descartado" + +-#: locale/programs/locarchive.c:1209 ++#: locale/programs/locarchive.c:1217 + #, c-format + msgid "incomplete set of locale files in \"%s\"" + msgstr "conjunto incompleto de ficheros de locales en \"%s\"" + +-#: locale/programs/locarchive.c:1273 ++#: locale/programs/locarchive.c:1281 + #, c-format + msgid "cannot read all files in \"%s\": ignored" + msgstr "no se pueden leer todos los ficheros de \"%s\": descartado" + +-#: locale/programs/locarchive.c:1343 ++#: locale/programs/locarchive.c:1351 + #, c-format + msgid "locale \"%s\" not in archive" + msgstr "el local \"%s\" no está en el archivo" +@@ -1749,8 +1749,8 @@ + msgid "upper limit in range is not smaller then lower limit" + msgstr "el límite superior del rango no es menor que el límite inferior" + +-#: locale/programs/xmalloc.c:70 malloc/obstack.c:500 malloc/obstack.c:503 +-#: posix/getconf.c:996 ++#: locale/programs/xmalloc.c:70 malloc/obstack.c:505 malloc/obstack.c:508 ++#: posix/getconf.c:1002 + msgid "memory exhausted" + msgstr "memoria agotada" + +@@ -1793,7 +1793,7 @@ + msgid "Another string for testing." + msgstr "Otra cadena para hacer pruebas." + +-#: catgets/gencat.c:111 catgets/gencat.c:115 nscd/nscd.c:79 ++#: catgets/gencat.c:111 catgets/gencat.c:115 nscd/nscd.c:84 + msgid "NAME" + msgstr "NOMBRE" + +@@ -1839,7 +1839,7 @@ + msgid "duplicate set definition" + msgstr "definición de conjunto duplicada" + +-#: catgets/gencat.c:446 catgets/gencat.c:619 catgets/gencat.c:648 ++#: catgets/gencat.c:446 catgets/gencat.c:623 catgets/gencat.c:677 + msgid "this is the first definition" + msgstr "esta es la primera vez que aparece la definición" + +@@ -1860,44 +1860,44 @@ + msgid "unknown directive `%s': line ignored" + msgstr "directiva desconocida `%s': línea pasada por alto" + +-#: catgets/gencat.c:617 ++#: catgets/gencat.c:621 + msgid "duplicated message number" + msgstr "número de mensaje duplicado" + +-#: catgets/gencat.c:645 ++#: catgets/gencat.c:674 + msgid "duplicated message identifier" + msgstr "identificador de mensaje duplicado" + +-#: catgets/gencat.c:702 ++#: catgets/gencat.c:731 + msgid "invalid character: message ignored" + msgstr "carácter inválido: mensaje descartado" + +-#: catgets/gencat.c:745 ++#: catgets/gencat.c:774 + msgid "invalid line" + msgstr "línea inválida" + +-#: catgets/gencat.c:799 ++#: catgets/gencat.c:828 + msgid "malformed line ignored" + msgstr "una línea incorrecta no se tendrá en cuenta" + +-#: catgets/gencat.c:963 catgets/gencat.c:1004 ++#: catgets/gencat.c:992 catgets/gencat.c:1033 + #, c-format + msgid "cannot open output file `%s'" + msgstr "no se puede abrir el fichero de salida `%s'" + +-#: catgets/gencat.c:1188 ++#: catgets/gencat.c:1217 + msgid "unterminated message" + msgstr "mensaje sin terminar" + +-#: catgets/gencat.c:1212 ++#: catgets/gencat.c:1241 + msgid "while opening old catalog file" + msgstr "al abrir el fichero de catálogo antiguo" + +-#: catgets/gencat.c:1303 ++#: catgets/gencat.c:1332 + msgid "conversion modules not available" + msgstr "no están disponibles los módulos de conversión" + +-#: catgets/gencat.c:1329 ++#: catgets/gencat.c:1358 + msgid "cannot determine escape character" + msgstr "no se puede determinar el carácter de escape" + +@@ -1909,7 +1909,7 @@ + # me gustaría que hubiera otra palabra mejor. SV + # Siempre me han gustado F&C ;-) + # A mí también :-) sv +-#: stdio-common/../sysdeps/gnu/errlist.c:12 posix/regcomp.c:178 ++#: stdio-common/../sysdeps/gnu/errlist.c:12 posix/regcomp.c:133 + #: nis/nis_error.c:29 nis/ypclnt.c:787 nis/ypclnt.c:861 + msgid "Success" + msgstr "Conseguido" +@@ -3316,24 +3316,24 @@ + msgid "%s%sUnknown signal %d\n" + msgstr "%s%sSeñal desconocida %d\n" + +-#: malloc/mcheck.c:296 ++#: malloc/mcheck.c:346 + msgid "memory is consistent, library is buggy\n" + msgstr "la memoria es consistente, la biblioteca tiene un bicho\n" + +-#: malloc/mcheck.c:299 ++#: malloc/mcheck.c:349 + msgid "memory clobbered before allocated block\n" + msgstr "memoria alterada antes del bloque de memoria asignado\n" + +-#: malloc/mcheck.c:302 ++#: malloc/mcheck.c:352 + msgid "memory clobbered past end of allocated block\n" + msgstr "memoria alterada pasado el final del bloque de memoria asignado\n" + +-#: malloc/mcheck.c:305 ++#: malloc/mcheck.c:355 + msgid "block freed twice\n" + msgstr "bloque liberado dos veces\n" + + # Revisar lo de bogus. creo que es eso. +-#: malloc/mcheck.c:308 ++#: malloc/mcheck.c:358 + msgid "bogus mcheck_status, library is buggy\n" + msgstr "valor de mcheck_status incorrecto, la biblioteca tiene un bicho\n" + +@@ -3372,6 +3372,10 @@ + msgid "DATAFILE [OUTFILE]" + msgstr "FICHERODEDATOS [FICHERODESALIDA]" + ++#: string/strerror.c:43 posix/../sysdeps/posix/gai_strerror.c:57 ++msgid "Unknown error" ++msgstr "Error desconocido" ++ + #: string/strsignal.c:69 + #, c-format + msgid "Real-time signal %d" +@@ -3396,7 +3400,7 @@ + msgid "%s: Memory exhausted: %s\n" + msgstr "%s: Memoria agotada: %s\n" + +-#: timezone/zic.c:390 misc/error.c:120 ++#: timezone/zic.c:390 misc/error.c:127 misc/error.c:155 + msgid "Unknown system error" + msgstr "Error del sistema desconocido" + +@@ -3855,25 +3859,21 @@ + msgid "Interrupted by a signal" + msgstr "Interrumpido por una señal" + +-#: posix/../sysdeps/posix/gai_strerror.c:57 +-msgid "Unknown error" +-msgstr "Error desconocido" +- +-#: posix/getconf.c:883 ++#: posix/getconf.c:889 + #, c-format + msgid "Usage: %s [-v specification] variable_name [pathname]\n" + msgstr "Modo de empleo: %s [-v especificación] nombre_de_variable [ruta]\n" + +-#: posix/getconf.c:941 ++#: posix/getconf.c:947 + #, c-format + msgid "unknown specification \"%s\"" + msgstr "especificación \"%s\" desconocida" + +-#: posix/getconf.c:968 posix/getconf.c:984 ++#: posix/getconf.c:974 posix/getconf.c:990 + msgid "undefined" + msgstr "sin definir" + +-#: posix/getconf.c:1006 ++#: posix/getconf.c:1012 + #, c-format + msgid "Unrecognized variable `%s'" + msgstr "Variable no reconocida `%s'" +@@ -3949,71 +3949,71 @@ + msgid "%s: option `-W %s' doesn't allow an argument\n" + msgstr "%s: la opción `-W %s' no admite ningún argumento\n" + +-#: posix/regcomp.c:181 ++#: posix/regcomp.c:136 + msgid "No match" + msgstr "No hay ninguna coincidencia" + +-#: posix/regcomp.c:184 ++#: posix/regcomp.c:139 + msgid "Invalid regular expression" + msgstr "La expresión regular es errónea" + +-#: posix/regcomp.c:187 ++#: posix/regcomp.c:142 + msgid "Invalid collation character" + msgstr "Carácter de unión inválido" + +-#: posix/regcomp.c:190 ++#: posix/regcomp.c:145 + msgid "Invalid character class name" + msgstr "Nombre de clase de carácter inválido" + +-#: posix/regcomp.c:193 ++#: posix/regcomp.c:148 + msgid "Trailing backslash" + msgstr "Barra invertida extra al final `\\'" + +-#: posix/regcomp.c:196 ++#: posix/regcomp.c:151 + msgid "Invalid back reference" + msgstr "Referencia hacia atrás inválida" + +-#: posix/regcomp.c:199 ++#: posix/regcomp.c:154 + msgid "Unmatched [ or [^" + msgstr "[ ó ^[ desemparejados" + +-#: posix/regcomp.c:202 ++#: posix/regcomp.c:157 + msgid "Unmatched ( or \\(" + msgstr "( ó \\( desemparejados" + +-#: posix/regcomp.c:205 ++#: posix/regcomp.c:160 + msgid "Unmatched \\{" + msgstr "\\{ desemparejado" + +-#: posix/regcomp.c:208 ++#: posix/regcomp.c:163 + msgid "Invalid content of \\{\\}" + msgstr "Contenido de \\{\\} inválido" + +-#: posix/regcomp.c:211 ++#: posix/regcomp.c:166 + msgid "Invalid range end" + msgstr "Final de rango inválido" + +-#: posix/regcomp.c:214 ++#: posix/regcomp.c:169 + msgid "Memory exhausted" + msgstr "Memoria agotada" + +-#: posix/regcomp.c:217 ++#: posix/regcomp.c:172 + msgid "Invalid preceding regular expression" + msgstr "La expresión regular precedente es inválida" + +-#: posix/regcomp.c:220 ++#: posix/regcomp.c:175 + msgid "Premature end of regular expression" + msgstr "Fin no esperado de la expresión regular" + +-#: posix/regcomp.c:223 ++#: posix/regcomp.c:178 + msgid "Regular expression too big" + msgstr "La expresión regular es demasiado grande" + +-#: posix/regcomp.c:226 ++#: posix/regcomp.c:181 + msgid "Unmatched ) or \\)" + msgstr ") ó \\) desemparejados" + +-#: posix/regcomp.c:673 ++#: posix/regcomp.c:615 + msgid "No previous regular expression" + msgstr "No existe ninguna expresión regular anterior" + +@@ -4174,24 +4174,24 @@ + msgid "Service configuration to be used" + msgstr "Configuración del servicio" + +-#: nss/getent.c:136 nss/getent.c:305 ++#: nss/getent.c:136 nss/getent.c:308 + #, c-format + msgid "Enumeration not supported on %s\n" + msgstr "La enumeración no está soportada sobre %s\n" + +-#: nss/getent.c:729 ++#: nss/getent.c:732 + msgid "getent - get entries from administrative database." + msgstr "getent - obtiene entradas de la base de datos administrativa." + +-#: nss/getent.c:730 ++#: nss/getent.c:733 + msgid "Supported databases:" + msgstr "Bases de datos admitidas:" + +-#: nss/getent.c:787 nscd/nscd.c:119 nscd/nscd_nischeck.c:64 ++#: nss/getent.c:790 nscd/nscd.c:124 nscd/nscd_nischeck.c:64 + msgid "wrong number of arguments" + msgstr "número incorrecto de argumentos" + +-#: nss/getent.c:797 ++#: nss/getent.c:800 + #, c-format + msgid "Unknown database: %s\n" + msgstr "Base de datos desconocida: %s\n" +@@ -4221,77 +4221,81 @@ + msgid "invalid pointer size" + msgstr "tamaño de puntero inválido" + +-#: inet/rcmd.c:174 inet/rcmd.c:177 ++#: inet/rcmd.c:163 inet/rcmd.c:166 ++msgid "rcmd: Cannot allocate memory\n" ++msgstr "rcmd: No se puede asignar memoria\n" ++ ++#: inet/rcmd.c:185 inet/rcmd.c:188 + msgid "rcmd: socket: All ports in use\n" + msgstr "rcmd: socket: Se están usando todos los puertos\n" + +-#: inet/rcmd.c:211 ++#: inet/rcmd.c:222 + #, c-format + msgid "connect to address %s: " + msgstr "conexión a la dirección %s: " + +-#: inet/rcmd.c:229 ++#: inet/rcmd.c:240 + #, c-format + msgid "Trying %s...\n" + msgstr "Intentando %s...\n" + +-#: inet/rcmd.c:278 ++#: inet/rcmd.c:289 + #, c-format + msgid "rcmd: write (setting up stderr): %m\n" + msgstr "rcmd: write (activando la salida de error estándar): %m\n" + +-#: inet/rcmd.c:299 ++#: inet/rcmd.c:310 + #, c-format + msgid "rcmd: poll (setting up stderr): %m\n" + msgstr "rcmd: poll (activando la salida de error estándar): %m\n" + + # ¿en la configuración del servicio?, ¿del circuito?, ¿o dejarlo así? + # Es de locos, estuve viendo las/los fuentes, preferí dejarlo así. em +-#: inet/rcmd.c:302 ++#: inet/rcmd.c:313 + msgid "poll: protocol failure in circuit setup\n" + msgstr "poll: fallo de protocolo al configurar el circuito\n" + + # ??? lo mismo que arriba +-#: inet/rcmd.c:346 ++#: inet/rcmd.c:358 + msgid "socket: protocol failure in circuit setup\n" + msgstr "socket: fallo de protocolo al configurar el circuito\n" + +-#: inet/rcmd.c:368 ++#: inet/rcmd.c:387 + #, c-format + msgid "rcmd: %s: short read" + msgstr "rcmd: %s: lectura insuficiente" + + # ## Lo mismo con lstat. sv + # Antes decía: No se pudo obtener información (lstat) del fichero .rhosts +-#: inet/rcmd.c:524 ++#: inet/rcmd.c:549 + msgid "lstat failed" + msgstr "lstat ha fallado" + + # Antes decía: .rhosts no es un fichero regular +-#: inet/rcmd.c:526 ++#: inet/rcmd.c:551 + msgid "not regular file" + msgstr "no es un fichero regular" + +-#: inet/rcmd.c:531 ++#: inet/rcmd.c:556 + msgid "cannot open" + msgstr "no se puede abrir" + + # ## Sugerencia: Añadir (fstat) después de información. sv + # Antes decía: No se pudo obtener información (fstat) del fichero .rhosts +-#: inet/rcmd.c:533 ++#: inet/rcmd.c:558 + msgid "fstat failed" + msgstr "fstat ha fallado" + + # Antes decía: El propietario del fichero .rhosts no es válido +-#: inet/rcmd.c:535 ++#: inet/rcmd.c:560 + msgid "bad owner" + msgstr "propietario incorrecto" + +-#: inet/rcmd.c:537 ++#: inet/rcmd.c:562 + msgid "writeable by other than owner" + msgstr "puede ser modificado por otros además del propietario" + +-#: inet/rcmd.c:539 ++#: inet/rcmd.c:564 + msgid "hard linked somewhere" + msgstr "hay un enlace duro en alguna parte" + +@@ -4539,115 +4543,115 @@ + msgid "Cannot receive reply to broadcast" + msgstr "No se puede recibir la respuesta al `broadcast'" + +-#: sunrpc/rpc_main.c:289 ++#: sunrpc/rpc_main.c:288 + #, c-format + msgid "%s: output would overwrite %s\n" + msgstr "%s: la salida sobreescribiría %s\n" + +-#: sunrpc/rpc_main.c:296 ++#: sunrpc/rpc_main.c:295 + #, c-format + msgid "%s: unable to open %s: %m\n" + msgstr "%s: no se pudo abrir %s: %m\n" + +-#: sunrpc/rpc_main.c:308 ++#: sunrpc/rpc_main.c:307 + #, c-format + msgid "%s: while writing output %s: %m" + msgstr "%s: al escribir el resultado %s: %m:" + + # FIXME: El espacio final. +-#: sunrpc/rpc_main.c:343 ++#: sunrpc/rpc_main.c:342 + #, c-format + msgid "cannot find C preprocessor: %s \n" + msgstr "no se puede encontrar el preprocesador de C: %s \n" + +-#: sunrpc/rpc_main.c:351 ++#: sunrpc/rpc_main.c:350 + msgid "cannot find any C preprocessor (cpp)\n" + msgstr "no se puede encontrar ningún preprocesador de C (cpp)\n" + +-#: sunrpc/rpc_main.c:420 ++#: sunrpc/rpc_main.c:419 + #, c-format + msgid "%s: C preprocessor failed with signal %d\n" + msgstr "%s: El preprocesador de C falló con la señal %d\n" + +-#: sunrpc/rpc_main.c:423 ++#: sunrpc/rpc_main.c:422 + #, c-format + msgid "%s: C preprocessor failed with exit code %d\n" + msgstr "%s: El preprocesador de C falló con un código de retorno %d\n" + +-#: sunrpc/rpc_main.c:463 ++#: sunrpc/rpc_main.c:462 + #, c-format + msgid "illegal nettype :`%s'\n" + msgstr "tipodered ilegal :`%s'\n" + +-#: sunrpc/rpc_main.c:1105 ++#: sunrpc/rpc_main.c:1104 + msgid "rpcgen: too many defines\n" + msgstr "rpcgen: demasiados defines\n" + +-#: sunrpc/rpc_main.c:1117 ++#: sunrpc/rpc_main.c:1116 + msgid "rpcgen: arglist coding error\n" + msgstr "rpcgen: error de codificación de la lista de argumentos\n" + + #. TRANS: the file will not be removed; this is an + #. TRANS: informative message. +-#: sunrpc/rpc_main.c:1150 ++#: sunrpc/rpc_main.c:1149 + #, c-format + msgid "file `%s' already exists and may be overwritten\n" + msgstr "el fichero `%s' ya existe y podría ser sobreescrito\n" + +-#: sunrpc/rpc_main.c:1195 ++#: sunrpc/rpc_main.c:1194 + msgid "Cannot specify more than one input file!\n" + msgstr "No se puede especificar más de un fichero de entrada\n" + + # Se admiten sugerencias para MT-safe. sv +-#: sunrpc/rpc_main.c:1365 ++#: sunrpc/rpc_main.c:1364 + msgid "This implementation doesn't support newstyle or MT-safe code!\n" + msgstr "¡Esta implementación no admite código de nuevo estilo o `MT-safe'!\n" + +-#: sunrpc/rpc_main.c:1374 ++#: sunrpc/rpc_main.c:1373 + msgid "Cannot use netid flag with inetd flag!\n" + msgstr "No se puede usar la opción netid con la opción inetd\n" + +-#: sunrpc/rpc_main.c:1386 ++#: sunrpc/rpc_main.c:1385 + msgid "Cannot use netid flag without TIRPC!\n" + msgstr "No se puede usar la opción netid sin TIRPC\n" + +-#: sunrpc/rpc_main.c:1393 ++#: sunrpc/rpc_main.c:1392 + msgid "Cannot use table flags with newstyle!\n" + msgstr "No se pueden usar las opciones de la tabla con el nuevo estilo\n" + +-#: sunrpc/rpc_main.c:1412 ++#: sunrpc/rpc_main.c:1411 + msgid "\"infile\" is required for template generation flags.\n" + msgstr "" + "se necesita un \"fichero_de_entrada\" para las opciones de generación\n" + "de plantillas\n" + +-#: sunrpc/rpc_main.c:1417 ++#: sunrpc/rpc_main.c:1416 + msgid "Cannot have more than one file generation flag!\n" + msgstr "No se puede tener más de una opción de generación de fichero\n" + +-#: sunrpc/rpc_main.c:1426 ++#: sunrpc/rpc_main.c:1425 + #, c-format + msgid "usage: %s infile\n" + msgstr "modo de empleo: %s fichero_de_entrada\n" + + # Este mensaje tal vez habría que cortarlo por algún lado. sv +-#: sunrpc/rpc_main.c:1427 ++#: sunrpc/rpc_main.c:1426 + #, c-format + msgid "\t%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile\n" + msgstr "\t%s [-abkCLNTM][-Dnombre[=valor]] [-i tamaño] [-I [-K segundos]] [-Y camino] fichero_de_entrada\n" + + # Y este también. sv +-#: sunrpc/rpc_main.c:1429 ++#: sunrpc/rpc_main.c:1428 + #, 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 fichero_de_salida] [fichero_de_entrada]\n" + +-#: sunrpc/rpc_main.c:1431 ++#: sunrpc/rpc_main.c:1430 + #, c-format + msgid "\t%s [-s nettype]* [-o outfile] [infile]\n" + msgstr "\t%s [-s tipored]* [-o fichero_de_salida] [fichero_de_entrada]\n" + +-#: sunrpc/rpc_main.c:1432 ++#: sunrpc/rpc_main.c:1431 + #, c-format + msgid "\t%s [-n netid]* [-o outfile] [infile]\n" + msgstr "\t%s [-n netid]* [-o fichero_de_salida] [fichero_de_entrada]\n" +@@ -5549,7 +5553,7 @@ + msgid "while allocating hash table entry" + msgstr "al asignar espacio para la entrada en la tabla `hash'" + +-#: nscd/cache.c:150 nscd/connections.c:185 ++#: nscd/cache.c:150 nscd/connections.c:187 + #, c-format + msgid "cannot stat() file `%s': %s" + msgstr "no se puede ejecutar stat() sobre el fichero `%s': %s" +@@ -5562,155 +5566,160 @@ + msgid "Cannot run nscd in secure mode as unprivileged user" + msgstr "No se puede ejecutar nscd en modo seguro como usuario no privilegiado" + +-#: nscd/connections.c:199 ++#: nscd/connections.c:175 ++#, c-format ++msgid "while allocating cache: %s" ++msgstr "al asignar espacio para el caché: %s" ++ ++#: nscd/connections.c:200 + #, c-format + msgid "cannot open socket: %s" + msgstr "no se puede abrir el `socket': %s" + +-#: nscd/connections.c:217 ++#: nscd/connections.c:218 + #, c-format + msgid "cannot enable socket to accept connections: %s" + msgstr "no se puede activar el `socket' para aceptar conexiones: %s" + +-#: nscd/connections.c:259 ++#: nscd/connections.c:260 + #, c-format + msgid "handle_request: request received (Version = %d)" + msgstr "handle_request: petición recibida (Versión = %d)" + +-#: nscd/connections.c:265 ++#: nscd/connections.c:266 + #, c-format + msgid "cannot handle old request version %d; current version is %d" + msgstr "" + "no se pueden manejar peticiones de la versión %d, la versión\n" + "actual es %d" + +-#: nscd/connections.c:303 nscd/connections.c:325 ++#: nscd/connections.c:304 nscd/connections.c:326 + #, c-format + msgid "cannot write result: %s" + msgstr "no se puede escribir el resultado: %s" + +-#: nscd/connections.c:404 nscd/connections.c:498 ++#: nscd/connections.c:405 nscd/connections.c:499 + #, c-format + msgid "error getting callers id: %s" + msgstr "error al obtener el id de los llamantes: %s" + +-#: nscd/connections.c:470 ++#: nscd/connections.c:471 + #, c-format + msgid "while accepting connection: %s" + msgstr "al aceptar la conexión: %s" + +-#: nscd/connections.c:481 ++#: nscd/connections.c:482 + #, c-format + msgid "short read while reading request: %s" + msgstr "lectura insuficiente mientras se leía la petición: %s" + +-#: nscd/connections.c:517 ++#: nscd/connections.c:518 + #, c-format + msgid "key length in request too long: %d" + msgstr "la longitud de la clave en la petición es demasiado larga: %d" + +-#: nscd/connections.c:531 ++#: nscd/connections.c:532 + #, c-format + msgid "short read while reading request key: %s" + msgstr "se acabaron los datos mientras se leía la clave de petición: %s" + +-#: nscd/connections.c:590 nscd/connections.c:591 nscd/connections.c:610 +-#: nscd/connections.c:623 nscd/connections.c:629 nscd/connections.c:636 ++#: nscd/connections.c:591 nscd/connections.c:592 nscd/connections.c:611 ++#: nscd/connections.c:624 nscd/connections.c:630 nscd/connections.c:637 + #, c-format + msgid "Failed to run nscd as user '%s'" + msgstr "Fallo al ejecutar nscd como usuario `%s'" + +-#: nscd/connections.c:611 ++#: nscd/connections.c:612 + msgid "getgrouplist failed" + msgstr "falló `getgrouplist'" + +-#: nscd/connections.c:624 ++#: nscd/connections.c:625 + msgid "setgroups failed" + msgstr "falló `setgroups'" + +-#: nscd/grpcache.c:102 nscd/hstcache.c:110 nscd/pwdcache.c:108 ++#: nscd/grpcache.c:103 nscd/hstcache.c:111 nscd/pwdcache.c:109 + msgid "while allocating key copy" + msgstr "al asignar espacio para la copia de la clave" + +-#: nscd/grpcache.c:152 nscd/hstcache.c:167 nscd/pwdcache.c:145 ++#: nscd/grpcache.c:153 nscd/hstcache.c:168 nscd/pwdcache.c:146 + msgid "while allocating cache entry" + msgstr "al asignar espacio para la entrada en el caché" + +-#: nscd/grpcache.c:195 nscd/hstcache.c:281 nscd/pwdcache.c:191 ++#: nscd/grpcache.c:196 nscd/hstcache.c:282 nscd/pwdcache.c:192 + #, c-format + msgid "short write in %s: %s" + msgstr "escritura insuficiente en %s: %s" + +-#: nscd/grpcache.c:217 ++#: nscd/grpcache.c:218 + #, c-format + msgid "Haven't found \"%s\" in group cache!" + msgstr "No se ha encontrado \"%s\" en el caché de grupos" + +-#: nscd/grpcache.c:292 ++#: nscd/grpcache.c:284 + #, c-format + msgid "Invalid numeric gid \"%s\"!" + msgstr "¡gid numérico inválido \"%s\"!" + +-#: nscd/grpcache.c:299 ++#: nscd/grpcache.c:291 + #, c-format + msgid "Haven't found \"%d\" in group cache!" + msgstr "No se ha encontrado \"%d\" en el caché de grupo" + +-#: nscd/hstcache.c:303 nscd/hstcache.c:378 nscd/hstcache.c:456 +-#: nscd/hstcache.c:533 ++#: nscd/hstcache.c:304 nscd/hstcache.c:370 nscd/hstcache.c:435 ++#: nscd/hstcache.c:500 + #, c-format + msgid "Haven't found \"%s\" in hosts cache!" + msgstr "No se ha encontrado \"%s\" en el caché de `hosts'" + +-#: nscd/nscd.c:80 ++#: nscd/nscd.c:85 + msgid "Read configuration data from NAME" + msgstr "Lee datos de configuración de NOMBRE" + +-#: nscd/nscd.c:82 ++#: nscd/nscd.c:87 + msgid "Do not fork and display messages on the current tty" + msgstr "No se divide y muestra los mensajes en la terminal actual" + +-#: nscd/nscd.c:83 ++#: nscd/nscd.c:88 + msgid "NUMBER" + msgstr "NÚMERO" + +-#: nscd/nscd.c:83 ++#: nscd/nscd.c:88 + msgid "Start NUMBER threads" + msgstr "Comienza NÚMERO hilos" + +-#: nscd/nscd.c:84 ++#: nscd/nscd.c:89 + msgid "Shut the server down" + msgstr "Apagar el servidor" + +-#: nscd/nscd.c:85 ++#: nscd/nscd.c:90 + msgid "Print current configuration statistic" + msgstr "Muestra una estadística sobre la configuración actual" + +-#: nscd/nscd.c:86 ++#: nscd/nscd.c:91 + msgid "TABLE" + msgstr "TABLA" + +-#: nscd/nscd.c:87 ++#: nscd/nscd.c:92 + msgid "Invalidate the specified cache" + msgstr "Invalida la caché especificada" + +-#: nscd/nscd.c:88 ++#: nscd/nscd.c:93 + msgid "TABLE,yes" + msgstr "TABLA,sí" + +-#: nscd/nscd.c:88 ++#: nscd/nscd.c:93 + msgid "Use separate cache for each user" + msgstr "Utiliza una caché separada para cada usuario" + +-#: nscd/nscd.c:93 ++#: nscd/nscd.c:98 + msgid "Name Service Cache Daemon." + msgstr "Daemon de Caché del Servicio de Nombres." + +-#: nscd/nscd.c:126 ++#: nscd/nscd.c:131 + msgid "already running" + msgstr "ya está funcionando" + +-#: nscd/nscd.c:192 nscd/nscd.c:212 nscd/nscd.c:218 ++#: nscd/nscd.c:243 nscd/nscd.c:263 nscd/nscd.c:269 + msgid "Only root is allowed to use this option!" + msgstr "Solamente root puede usar esta opción" + +@@ -5800,22 +5809,22 @@ + "%15ld%% tasa de aciertos de caché\n" + "%15s compruebe /etc/%s para cambios\n" + +-#: nscd/pwdcache.c:213 ++#: nscd/pwdcache.c:214 + #, c-format + msgid "Haven't found \"%s\" in password cache!" + msgstr "No se ha encontrado \"%s\" en el caché de contraseñas" + +-#: nscd/pwdcache.c:288 ++#: nscd/pwdcache.c:280 + #, c-format + msgid "Invalid numeric uid \"%s\"!" + msgstr "¡uid numérico inválido \"%s\"!" + +-#: nscd/pwdcache.c:295 ++#: nscd/pwdcache.c:287 + #, c-format + msgid "Haven't found \"%d\" in password cache!" + msgstr "No se ha encontrado \"%d\" en el caché de contraseñas" + +-#: elf/../sysdeps/generic/dl-sysdep.c:297 ++#: elf/../sysdeps/generic/dl-sysdep.c:357 + msgid "cannot create capability list" + msgstr "no se puede crear la lista de capacidades" + +@@ -5867,7 +5876,7 @@ + msgid ", OS ABI: %s %d.%d.%d" + msgstr ", ABI del SO: %s %d.%d.%d" + +-#: elf/cache.c:136 elf/ldconfig.c:1033 ++#: elf/cache.c:136 elf/ldconfig.c:1045 + #, c-format + msgid "Can't open cache file %s\n" + msgstr "No se puede abrir el fichero de caché %s\n" +@@ -5914,17 +5923,17 @@ + msgid "Renaming of %s to %s failed" + msgstr "Falló el renombramiento de %s a %s" + +-#: elf/dl-close.c:113 ++#: elf/dl-close.c:128 + msgid "shared object not open" + msgstr "el objeto compartido no está abierto" + +-#: elf/dl-close.c:357 elf/dl-open.c:436 ++#: elf/dl-close.c:486 elf/dl-open.c:444 + msgid "TLS generation counter wrapped! Please send report with the 'glibcbug' script." + msgstr "" + "¡El contador de generaciones TLS ha vuelto a cero! Por favor envíe un informe\n" + "con el script 'glibcbug'" + +-#: elf/dl-deps.c:111 elf/dl-open.c:177 ++#: elf/dl-deps.c:111 elf/dl-open.c:183 + msgid "DST not allowed in SUID/SGID programs" + msgstr "No se permite DST en programas SUID/SGID" + +@@ -5946,185 +5955,199 @@ + msgid "cannot allocate dependency list" + msgstr "no se pudo asignar espacio para la lista de dependencias" + +-#: elf/dl-deps.c:492 elf/dl-deps.c:547 ++#: elf/dl-deps.c:494 elf/dl-deps.c:549 + msgid "cannot allocate symbol search list" + msgstr "no se puede asignar espacio para la lista de búsqueda de los símbolos" + +-#: elf/dl-deps.c:532 ++#: elf/dl-deps.c:534 + msgid "Filters not supported with LD_TRACE_PRELINKING" + msgstr "No se admiten filtros con LD_TRACE_PRELINKING" + + # Véase "A bug's life". +-#: elf/dl-error.c:73 ++#: elf/dl-error.c:75 + msgid "DYNAMIC LINKER BUG!!!" + msgstr "¡¡¡HAY UN BICHO EN EL ENLAZADOR DINÁMICO!!!" + +-#: elf/dl-error.c:106 ++#: elf/dl-error.c:108 + msgid "error while loading shared libraries" + msgstr "error al cargar las bibliotecas compartidas" + +-#: elf/dl-load.c:338 ++#: elf/dl-load.c:339 + msgid "cannot allocate name record" + msgstr "no se puede asignar el registro del nombre" + + # He intentado mejorarlo un poco ... + # +-#: elf/dl-load.c:440 elf/dl-load.c:520 elf/dl-load.c:614 elf/dl-load.c:709 ++#: elf/dl-load.c:441 elf/dl-load.c:520 elf/dl-load.c:612 elf/dl-load.c:707 + msgid "cannot create cache for search path" + msgstr "no se puede crear un caché para la ruta de búsqueda" + +-#: elf/dl-load.c:545 ++#: elf/dl-load.c:543 + msgid "cannot create RUNPATH/RPATH copy" + msgstr "no se puede crear una copia RUNPATH/RPATH" + +-#: elf/dl-load.c:600 ++#: elf/dl-load.c:598 + msgid "cannot create search path array" + msgstr "no se puede crear la matriz de la ruta de búsqueda" + +-#: elf/dl-load.c:796 ++#: elf/dl-load.c:794 + msgid "cannot stat shared object" + msgstr "no se puede efectuar `stat' sobre el objeto compartido" + +-#: elf/dl-load.c:840 ++#: elf/dl-load.c:838 + msgid "cannot open zero fill device" + msgstr "no se puede abrir el dispositivo de `zero fill'" + +-#: elf/dl-load.c:849 elf/dl-load.c:1855 ++#: elf/dl-load.c:847 elf/dl-load.c:1902 + msgid "cannot create shared object descriptor" + msgstr "no se puede crear el descriptor del objeto compartido" + +-#: elf/dl-load.c:868 elf/dl-load.c:1351 elf/dl-load.c:1434 ++#: elf/dl-load.c:866 elf/dl-load.c:1398 elf/dl-load.c:1481 + msgid "cannot read file data" + msgstr "no se pueden leer los datos del fichero" + +-#: elf/dl-load.c:908 ++#: elf/dl-load.c:906 + msgid "ELF load command alignment not page-aligned" + msgstr "El alineamiento de la orden de carga ELF no está alineada a la página" + +-#: elf/dl-load.c:915 ++#: elf/dl-load.c:913 + msgid "ELF load command address/offset not properly aligned" + msgstr "La dirección/desplazamiento de la orden de carga ELF no está bien alineada" + +-#: elf/dl-load.c:996 ++#: elf/dl-load.c:988 ++msgid "cannot allocate TLS data structures for initial thread" ++msgstr "no se pueden crear las estructuras de datos TLS para el hilo inicial" ++ ++#: elf/dl-load.c:1012 ++msgid "cannot handle TLS data" ++msgstr "no se pueden manejar los datos de TLS" ++ ++#: elf/dl-load.c:1047 + msgid "failed to map segment from shared object" + msgstr "fallo al asignar un segmento del objeto compartido" + +-#: elf/dl-load.c:1020 ++#: elf/dl-load.c:1071 + msgid "cannot dynamically load executable" + msgstr "no se puede cargar el ejecutable dinámicamente" + +-#: elf/dl-load.c:1081 ++#: elf/dl-load.c:1132 + msgid "cannot change memory protections" + msgstr "no se pueden cambiar las protecciones de memoria" + +-#: elf/dl-load.c:1100 ++#: elf/dl-load.c:1151 + msgid "cannot map zero-fill pages" + msgstr "no se pueden asignar páginas de tipo `zero-fill'" + +-#: elf/dl-load.c:1118 ++#: elf/dl-load.c:1169 + msgid "cannot allocate memory for program header" + msgstr "no se puede asignar memoria para la cabecera del programa" + +-#: elf/dl-load.c:1149 ++#: elf/dl-load.c:1200 + msgid "object file has no dynamic section" + msgstr "el fichero objeto no tiene sección dinámica" + +-#: elf/dl-load.c:1193 ++#: elf/dl-load.c:1240 + msgid "shared object cannot be dlopen()ed" + msgstr "no se puede efectuar dlopen() sobre el objeto compartido" + +-#: elf/dl-load.c:1216 ++#: elf/dl-load.c:1263 + msgid "cannot create searchlist" + msgstr "no se puede crear la lista de búsqueda" + +-#: elf/dl-load.c:1351 ++#: elf/dl-load.c:1398 + msgid "file too short" + msgstr "fichero demasiado corto" + +-#: elf/dl-load.c:1374 ++#: elf/dl-load.c:1421 + msgid "invalid ELF header" + msgstr "cabecera ELF inválida" + +-#: elf/dl-load.c:1383 ++#: elf/dl-load.c:1430 + msgid "ELF file data encoding not big-endian" + msgstr "La codificación de los datos del fichero ELF no es `big-endian'" + +-#: elf/dl-load.c:1385 ++#: elf/dl-load.c:1432 + msgid "ELF file data encoding not little-endian" + msgstr "La codificación de los datos del fichero ELF no es `little-endian'" + +-#: elf/dl-load.c:1389 ++#: elf/dl-load.c:1436 + msgid "ELF file version ident does not match current one" + msgstr "La identificación de versión del fichero ELF no encaja con la actual" + +-#: elf/dl-load.c:1393 ++#: elf/dl-load.c:1440 + msgid "ELF file OS ABI invalid" + msgstr "ABI del OS del fichero ELF inválida" + +-#: elf/dl-load.c:1395 ++#: elf/dl-load.c:1442 + msgid "ELF file ABI version invalid" + msgstr "Versión de ABI del fichero ELF inválida" + +-#: elf/dl-load.c:1398 ++#: elf/dl-load.c:1445 + msgid "internal error" + msgstr "error interno" + +-#: elf/dl-load.c:1405 ++#: elf/dl-load.c:1452 + msgid "ELF file version does not match current one" + msgstr "La versión del fichero ELF no coincide con la actual" + +-#: elf/dl-load.c:1413 ++#: elf/dl-load.c:1460 + msgid "ELF file's phentsize not the expected size" + msgstr "El `phentsize' del fichero ELF no es el tamaño esperado" + +-#: elf/dl-load.c:1419 ++#: elf/dl-load.c:1466 + msgid "only ET_DYN and ET_EXEC can be loaded" + msgstr "solamente pueden cargarse ET_DYN y ET_EXEC" + +-#: elf/dl-load.c:1870 ++#: elf/dl-load.c:1917 + msgid "cannot open shared object file" + msgstr "no se puede abrir el fichero del objeto compartido" + +-#: elf/dl-lookup.c:248 elf/dl-lookup.c:413 ++#: elf/dl-lookup.c:265 elf/dl-lookup.c:430 + msgid "relocation error" + msgstr "error de relocalización" + +-#: elf/dl-open.c:105 ++#: elf/dl-open.c:111 + msgid "cannot extend global scope" + msgstr "no se puede extender el ámbito global" + +-#: elf/dl-open.c:208 ++#: elf/dl-open.c:214 + msgid "empty dynamic string token substitution" + msgstr "sustitución dinámica de un elemento por una cadena vacía" + +-#: elf/dl-open.c:345 elf/dl-open.c:356 ++#: elf/dl-open.c:351 elf/dl-open.c:362 + msgid "cannot create scope list" + msgstr "no se puede crear la lista de ámbito" + +-#: elf/dl-open.c:416 ++#: elf/dl-open.c:424 + msgid "cannot create TLS data structures" + msgstr "no se pueden crear las estructuras de datos TLS" + +-#: elf/dl-open.c:478 ++#: elf/dl-open.c:486 + msgid "invalid mode for dlopen()" + msgstr "modo inválido para dlopen()" + +-#: elf/dl-reloc.c:88 ++#: elf/dl-reloc.c:58 ++msgid "shared object cannot be dlopen()ed: static TLS memory too small" ++msgstr "" ++"no se puede efectuar dlopen() sobre el objeto compartido: memoria estática TLS\n" ++"demasiado pequeña" ++ ++#: elf/dl-reloc.c:118 + msgid "cannot make segment writable for relocation" + msgstr "no se puede hacer el segmento escribible para su relocalización" + +-#: elf/dl-reloc.c:174 ++#: elf/dl-reloc.c:219 + #, c-format + msgid "%s: profiler found no PLTREL in object %s\n" + msgstr "%s el `profiler' no encontró ningún PLTREL en el objeto %s\n" + +-#: elf/dl-reloc.c:186 ++#: elf/dl-reloc.c:231 + #, c-format + msgid "%s: profiler out of memory shadowing PLTREL of %s\n" + msgstr "%s: el `profiler' se quedó sin memoria al ocultar el PLTREL de %s\n" + + # Se admiten sugerencias. sv +-#: elf/dl-reloc.c:201 ++#: elf/dl-reloc.c:246 + msgid "cannot restore segment prot after reloc" + msgstr "no se puede restaurar el `prot' del segmento después de la relocalización" + +@@ -6183,119 +6206,119 @@ + msgid "Configure Dynamic Linker Run Time Bindings." + msgstr "Configura las asociaciones de tiempo de ejecución del enlazador dinámico" + +-#: elf/ldconfig.c:282 ++#: elf/ldconfig.c:294 + #, c-format + msgid "Path `%s' given more than once" + msgstr "Se ha dado la ruta `%s' más de una vez" + +-#: elf/ldconfig.c:326 ++#: elf/ldconfig.c:338 + #, c-format + msgid "%s is not a known library type" + msgstr "%s no es un tipo de biblioteca conocido" + +-#: elf/ldconfig.c:344 ++#: elf/ldconfig.c:356 + #, c-format + msgid "Can't stat %s" + msgstr "No se puede efectuar `stat' sobre %s" + +-#: elf/ldconfig.c:414 ++#: elf/ldconfig.c:426 + #, c-format + msgid "Can't stat %s\n" + msgstr "No se puede efectuar `stat' sobre %s\n" + +-#: elf/ldconfig.c:424 ++#: elf/ldconfig.c:436 + #, c-format + msgid "%s is not a symbolic link\n" + msgstr "%s no es un enlace simbólico\n" + +-#: elf/ldconfig.c:443 ++#: elf/ldconfig.c:455 + #, c-format + msgid "Can't unlink %s" + msgstr "No se puede efectuar `unlink' sobre %s" + +-#: elf/ldconfig.c:449 ++#: elf/ldconfig.c:461 + #, c-format + msgid "Can't link %s to %s" + msgstr "No se puede crear un enlace de %s a %s" + +-#: elf/ldconfig.c:455 ++#: elf/ldconfig.c:467 + msgid " (changed)\n" + msgstr " (cambiado)\n" + +-#: elf/ldconfig.c:457 ++#: elf/ldconfig.c:469 + msgid " (SKIPPED)\n" + msgstr " (SALTADO)\n" + +-#: elf/ldconfig.c:512 ++#: elf/ldconfig.c:524 + #, c-format + msgid "Can't find %s" + msgstr "No se encuentra %s" + +-#: elf/ldconfig.c:528 ++#: elf/ldconfig.c:540 + #, c-format + msgid "Can't lstat %s" + msgstr "No se puede efectuar `lstat' sobre %s" + +-#: elf/ldconfig.c:535 ++#: elf/ldconfig.c:547 + #, c-format + msgid "Ignored file %s since it is not a regular file." + msgstr "Descartado el fichero %s dado que no es un fichero regular." + +-#: elf/ldconfig.c:543 ++#: elf/ldconfig.c:555 + #, c-format + msgid "No link created since soname could not be found for %s" + msgstr "No se creó el enlace ya que no se encontró el soname para %s" + +-#: elf/ldconfig.c:634 ++#: elf/ldconfig.c:646 + #, c-format + msgid "Can't open directory %s" + msgstr "No se puede abrir el directorio %s" + +-#: elf/ldconfig.c:689 elf/ldconfig.c:736 ++#: elf/ldconfig.c:701 elf/ldconfig.c:748 + #, c-format + msgid "Cannot lstat %s" + msgstr "No se puede efectuar `lstat' sobre %s" + +-#: elf/ldconfig.c:701 ++#: elf/ldconfig.c:713 + #, c-format + msgid "Cannot stat %s" + msgstr "No se puede efectuar `stat' sobre %s" + +-#: elf/ldconfig.c:758 elf/readlib.c:93 ++#: elf/ldconfig.c:770 elf/readlib.c:93 + #, c-format + msgid "Input file %s not found.\n" + msgstr "No se encontró el fichero de entrada %s.\n" + +-#: elf/ldconfig.c:792 ++#: elf/ldconfig.c:804 + #, c-format + msgid "libc5 library %s in wrong directory" + msgstr "biblioteca libc5 %s en un directorio equivocado" + +-#: elf/ldconfig.c:795 ++#: elf/ldconfig.c:807 + #, c-format + msgid "libc6 library %s in wrong directory" + msgstr "biblioteca libc6 %s en un directorio equivocado" + +-#: elf/ldconfig.c:798 ++#: elf/ldconfig.c:810 + #, c-format + msgid "libc4 library %s in wrong directory" + msgstr "biblioteca libc4 %s en un directorio equivocado" + +-#: elf/ldconfig.c:825 ++#: elf/ldconfig.c:837 + #, c-format + msgid "libraries %s and %s in directory %s have same soname but different type." + msgstr "las bibliotecas %s y %s en el directorio %s tienen el mismo soname pero distinto tipo." + +-#: elf/ldconfig.c:928 ++#: elf/ldconfig.c:940 + #, c-format + msgid "Can't open configuration file %s" + msgstr "No se puede abrir el fichero de configuración `%s'" + +-#: elf/ldconfig.c:1012 ++#: elf/ldconfig.c:1024 + msgid "Can't chdir to /" + msgstr "No se puede cambiar al directorio /" + +-#: elf/ldconfig.c:1054 ++#: elf/ldconfig.c:1066 + #, c-format + msgid "Can't open cache file directory %s\n" + msgstr "No se puede leer el directorio de ficheros de caché %s\n" +Binary files glibc-2.3.2/po/fi.mo and glibc-2.3.2-200304020432/po/fi.mo differ +diff -u -udbrN glibc-2.3.2/po/fi.po glibc-2.3.2-200304020432/po/fi.po +--- glibc-2.3.2/po/fi.po Mon Dec 2 19:11:53 2002 ++++ glibc-2.3.2-200304020432/po/fi.po Sun Mar 9 18:47:01 2003 +@@ -1,11 +1,16 @@ + # Finnish messages for GNU libc. +-# Copyright © 2002 Free Software Foundation, Inc. +-# Lauri Nurmi , 2002. ++# Copyright © 2003 Free Software Foundation, Inc. ++# Lauri Nurmi , 2002, 2003. + # Thanks to: + # * Timo Laine for suggestions + # + # "locale" on suomennettu uudella sanalla "maa-asetusto". + # ++# Pitäisikö signaalien nimien olla aktiivissa vai passiivissa? ++# esim. Terminated = Päättynyt vai Päätetty? ++# Aborted = Keskeytynyt vai Keskeytetty? ++# ++# + # (parempia) suomennosehdotuksia kaivataan sanoille: + # exchange -- vaihto? (mitä ihmettä?) + # ellipsis -- sanankatkaisu? ATK-sanakirja sanoo näin. +@@ -13,9 +18,9 @@ + # + msgid "" + msgstr "" +-"Project-Id-Version: libc 2.3.1\n" +-"POT-Creation-Date: 2002-10-02 17:22-0700\n" +-"PO-Revision-Date: 2002-12-02 05:20+0300\n" ++"Project-Id-Version: libc 2.3.2\n" ++"POT-Creation-Date: 2003-02-22 15:34-0800\n" ++"PO-Revision-Date: 2003-03-08 21:53+0200\n" + "Last-Translator: Lauri Nurmi \n" + "Language-Team: Finnish \n" + "MIME-Version: 1.0\n" +@@ -79,7 +84,7 @@ + + #: sysdeps/generic/siglist.h:41 stdio-common/../sysdeps/unix/siglist.c:41 + msgid "Terminated" +-msgstr "Päättynyt" ++msgstr "Päätetty" + + #: sysdeps/generic/siglist.h:42 stdio-common/../sysdeps/unix/siglist.c:42 + msgid "Urgent I/O condition" +@@ -87,11 +92,11 @@ + + #: sysdeps/generic/siglist.h:43 stdio-common/../sysdeps/unix/siglist.c:43 + msgid "Stopped (signal)" +-msgstr "Pysähtynyt (signaali)" ++msgstr "Pysäytetty (signaali)" + + #: sysdeps/generic/siglist.h:44 stdio-common/../sysdeps/unix/siglist.c:44 + msgid "Stopped" +-msgstr "Pysähtynyt" ++msgstr "Pysäytetty" + + #: sysdeps/generic/siglist.h:45 stdio-common/../sysdeps/unix/siglist.c:45 + msgid "Continued" +@@ -103,11 +108,11 @@ + + #: sysdeps/generic/siglist.h:47 stdio-common/../sysdeps/unix/siglist.c:47 + msgid "Stopped (tty input)" +-msgstr "Pysähtynyt (päätteen syöte)" ++msgstr "Pysäytetty (päätteen syöte)" + + #: sysdeps/generic/siglist.h:48 stdio-common/../sysdeps/unix/siglist.c:48 + msgid "Stopped (tty output)" +-msgstr "Pysähtynyt (päätteen tuloste)" ++msgstr "Pysäytetty (päätteen tuloste)" + + #: sysdeps/generic/siglist.h:49 stdio-common/../sysdeps/unix/siglist.c:49 + msgid "I/O possible" +@@ -268,7 +273,7 @@ + + #: iconv/iconv_prog.c:241 + #, c-format +-msgid "conversions from `%s' and to `%s' are not supported" ++msgid "conversion from `%s' and to `%s' are not supported" + msgstr "muunnos \"%s\" <-> \"%s\" ei ole tuettu" + + #: iconv/iconv_prog.c:246 +@@ -294,7 +299,7 @@ + msgid "error while closing output file" + msgstr "virhe suljettaessa tulostiedostoa" + +-#: iconv/iconv_prog.c:407 iconv/iconvconfig.c:355 locale/programs/locale.c:268 ++#: iconv/iconv_prog.c:407 iconv/iconvconfig.c:357 locale/programs/locale.c:274 + #: locale/programs/localedef.c:372 catgets/gencat.c:233 + #: malloc/memusagestat.c:602 debug/pcprofiledump.c:199 + msgid "Report bugs using the `glibcbug' script to .\n" +@@ -302,9 +307,9 @@ + "Ilmoita ohjelmistovirheistä \"glibcbug\"-skriptillä (englanniksi) osoitteeseen .\n" + "Suomennoksen virheistä voit ilmoittaa listalle .\n" + +-#: iconv/iconv_prog.c:421 iconv/iconvconfig.c:369 locale/programs/locale.c:281 +-#: locale/programs/localedef.c:386 catgets/gencat.c:246 posix/getconf.c:904 +-#: nss/getent.c:74 nscd/nscd.c:279 nscd/nscd_nischeck.c:90 elf/ldconfig.c:259 ++#: iconv/iconv_prog.c:421 iconv/iconvconfig.c:371 locale/programs/locale.c:287 ++#: locale/programs/localedef.c:386 catgets/gencat.c:246 posix/getconf.c:910 ++#: nss/getent.c:74 nscd/nscd.c:330 nscd/nscd_nischeck.c:90 elf/ldconfig.c:271 + #: elf/sprof.c:349 + #, c-format + msgid "" +@@ -316,9 +321,9 @@ + "Tämä on vapaa ohjelmisto; katso kopiointiehdot lähdekoodista. Takuuta EI\n" + "ole, ei edes KAUPALLISESTI HYVÄKSYTTÄVÄSTÄ LAADUSTA tai SOPIVUUDESTA TIETTYYN TARKOITUKSEEN.\n" + +-#: iconv/iconv_prog.c:426 iconv/iconvconfig.c:374 locale/programs/locale.c:286 +-#: locale/programs/localedef.c:391 catgets/gencat.c:251 posix/getconf.c:909 +-#: nss/getent.c:79 nscd/nscd.c:284 nscd/nscd_nischeck.c:95 elf/ldconfig.c:264 ++#: iconv/iconv_prog.c:426 iconv/iconvconfig.c:376 locale/programs/locale.c:292 ++#: locale/programs/localedef.c:391 catgets/gencat.c:251 posix/getconf.c:915 ++#: nss/getent.c:79 nscd/nscd.c:335 nscd/nscd_nischeck.c:95 elf/ldconfig.c:276 + #: elf/sprof.c:355 + #, c-format + msgid "Written by %s.\n" +@@ -370,15 +375,15 @@ + msgid "Prefix used for all file accesses" + msgstr "Jokaisen tiedoston käsittelyssä käytettävä etuliite" + +-#: iconv/iconvconfig.c:325 locale/programs/localedef.c:292 ++#: iconv/iconvconfig.c:327 locale/programs/localedef.c:292 + msgid "no output file produced because warning were issued" + msgstr "tulostiedostoa ei tuotettu varoituksen takia" + +-#: iconv/iconvconfig.c:403 ++#: iconv/iconvconfig.c:405 + msgid "while inserting in search tree" + msgstr "lisättäessä hakupuuhun" + +-#: iconv/iconvconfig.c:1202 ++#: iconv/iconvconfig.c:1204 + msgid "cannot generate output file" + msgstr "tulostiedostoa ei voi luoda" + +@@ -1288,7 +1293,7 @@ + msgid "unterminated symbolic name" + msgstr "päättämätön symbolinen nimi" + +-#: locale/programs/linereader.c:537 catgets/gencat.c:1166 ++#: locale/programs/linereader.c:537 catgets/gencat.c:1195 + msgid "invalid escape sequence" + msgstr "virheellinen ohjaussarja" + +@@ -1318,39 +1323,39 @@ + msgid "trailing garbage at end of line" + msgstr "roskaa rivin lopussa" + +-#: locale/programs/locale.c:73 ++#: locale/programs/locale.c:75 + msgid "System information:" + msgstr "Tietoa järjestelmästä:" + +-#: locale/programs/locale.c:75 ++#: locale/programs/locale.c:77 + msgid "Write names of available locales" + msgstr "Näytä käytettävissä olevien maa-asetustojen nimet" + +-#: locale/programs/locale.c:77 ++#: locale/programs/locale.c:79 + msgid "Write names of available charmaps" + msgstr "Näytä käytettävissä olevien merkistökarttojen nimet" + +-#: locale/programs/locale.c:78 ++#: locale/programs/locale.c:80 + msgid "Modify output format:" + msgstr "Muuta tulostemuotoa:" + +-#: locale/programs/locale.c:79 ++#: locale/programs/locale.c:81 + msgid "Write names of selected categories" + msgstr "Näytä valittujen kategorioiden nimet" + +-#: locale/programs/locale.c:80 ++#: locale/programs/locale.c:82 + msgid "Write names of selected keywords" + msgstr "Näytä valittujen avainsanojen nimet" + +-#: locale/programs/locale.c:81 ++#: locale/programs/locale.c:83 + msgid "Print more information" + msgstr "Näytä lisää tietoa" + +-#: locale/programs/locale.c:86 ++#: locale/programs/locale.c:88 + msgid "Get locale-specific information." + msgstr "Hae maa-asetustokohtaiset tiedot." + +-#: locale/programs/locale.c:89 ++#: locale/programs/locale.c:91 + msgid "" + "NAME\n" + "[-a|-m]" +@@ -1358,7 +1363,7 @@ + "NIMI\n" + "[-a|-m]" + +-#: locale/programs/locale.c:488 ++#: locale/programs/locale.c:512 + msgid "while preparing output" + msgstr "valmisteltaessa tulostetta" + +@@ -1489,16 +1494,16 @@ + msgid "cannot create temporary file" + msgstr "tilapäistä tiedostoa ei voi luoda" + +-#: locale/programs/locarchive.c:118 locale/programs/locarchive.c:302 ++#: locale/programs/locarchive.c:118 locale/programs/locarchive.c:305 + msgid "cannot initialize archive file" + msgstr "arkistotiedostoa ei voi alustaa" + +-#: locale/programs/locarchive.c:125 locale/programs/locarchive.c:309 ++#: locale/programs/locarchive.c:125 locale/programs/locarchive.c:312 + msgid "cannot resize archive file" + msgstr "arkistotiedoston kokoa ei voi muuttaa" + +-#: locale/programs/locarchive.c:134 locale/programs/locarchive.c:318 +-#: locale/programs/locarchive.c:508 ++#: locale/programs/locarchive.c:134 locale/programs/locarchive.c:321 ++#: locale/programs/locarchive.c:511 + msgid "cannot map archive header" + msgstr "arkiston otsaketta ei voi kartoittaa" + +@@ -1514,88 +1519,88 @@ + msgid "cannot map locale archive file" + msgstr "maa-asetustoarkistoa \"%s\" ei voi kartoittaa" + +-#: locale/programs/locarchive.c:326 ++#: locale/programs/locarchive.c:329 + msgid "cannot lock new archive" + msgstr "uutta arkistoa ei voi lukita" + +-#: locale/programs/locarchive.c:377 ++#: locale/programs/locarchive.c:380 + msgid "cannot extend locale archive file" + msgstr "maa-asetustoarkistoa ei voi laajentaa" + +-#: locale/programs/locarchive.c:386 ++#: locale/programs/locarchive.c:389 + msgid "cannot change mode of resized locale archive" + msgstr "maa-asetustoarkiston tilaa ei voi muuttaa" + +-#: locale/programs/locarchive.c:394 ++#: locale/programs/locarchive.c:397 + msgid "cannot rename new archive" + msgstr "uutta arkistoa ei voi nimetä uudelleen" + +-#: locale/programs/locarchive.c:447 ++#: locale/programs/locarchive.c:450 + #, c-format + msgid "cannot open locale archive \"%s\"" + msgstr "maa-asetustoarkistoa \"%s\" ei voi avata" + +-#: locale/programs/locarchive.c:452 ++#: locale/programs/locarchive.c:455 + #, c-format + msgid "cannot stat locale archive \"%s\"" + msgstr "maa-asetustoarkiston \"%s\" tilaa ei voi lukea" + +-#: locale/programs/locarchive.c:471 ++#: locale/programs/locarchive.c:474 + #, c-format + msgid "cannot lock locale archive \"%s\"" + msgstr "maa-asetustoarkistoa \"%s\" ei voi lukita" + +-#: locale/programs/locarchive.c:494 ++#: locale/programs/locarchive.c:497 + msgid "cannot read archive header" + msgstr "arkiston otsaketta ei voi lukea" + +-#: locale/programs/locarchive.c:554 ++#: locale/programs/locarchive.c:557 + #, c-format + msgid "locale '%s' already exists" + msgstr "maa-asetusto \"%s\" on jo olemassa" + +-#: locale/programs/locarchive.c:784 locale/programs/locarchive.c:799 +-#: locale/programs/locarchive.c:811 locale/programs/locarchive.c:823 ++#: locale/programs/locarchive.c:788 locale/programs/locarchive.c:803 ++#: locale/programs/locarchive.c:815 locale/programs/locarchive.c:827 + #: locale/programs/locfile.c:343 + msgid "cannot add to locale archive" + msgstr "ei voi lisätä maa-asetustoarkistoon" + +-#: locale/programs/locarchive.c:976 ++#: locale/programs/locarchive.c:982 + #, c-format + msgid "locale alias file `%s' not found" + msgstr "maa-asetustojen aliastiedostoa \"%s\" ei löydy" + +-#: locale/programs/locarchive.c:1118 ++#: locale/programs/locarchive.c:1126 + #, c-format + msgid "Adding %s\n" + msgstr "Listätään %s\n" + +-#: locale/programs/locarchive.c:1124 ++#: locale/programs/locarchive.c:1132 + #, c-format + msgid "stat of \"%s\" failed: %s: ignored" + msgstr "tiedoston \"%s\" tilan lukeminen epäonnistui: %s: ei huomioida" + +-#: locale/programs/locarchive.c:1130 ++#: locale/programs/locarchive.c:1138 + #, c-format + msgid "\"%s\" is no directory; ignored" + msgstr "\"%s\" ei ole hakemisto: ei huomioida" + +-#: locale/programs/locarchive.c:1137 ++#: locale/programs/locarchive.c:1145 + #, c-format + msgid "cannot open directory \"%s\": %s: ignored" + msgstr "hakemistoa \"%s\" ei voi avata: %s: ei huomioida" + +-#: locale/programs/locarchive.c:1209 ++#: locale/programs/locarchive.c:1217 + #, c-format + msgid "incomplete set of locale files in \"%s\"" + msgstr "epätäydellinen valikoima maa-asetustotiedostoja hakemistossa \"%s\"" + +-#: locale/programs/locarchive.c:1273 ++#: locale/programs/locarchive.c:1281 + #, c-format + msgid "cannot read all files in \"%s\": ignored" + msgstr "kaikkia tiedostoja hakemistossa \"%s\" ei voi lukea: ei huomioida" + +-#: locale/programs/locarchive.c:1343 ++#: locale/programs/locarchive.c:1351 + #, c-format + msgid "locale \"%s\" not in archive" + msgstr "maa-asetusto \"%s\" ei ole arkistossa" +@@ -1664,8 +1669,8 @@ + msgid "upper limit in range is not smaller then lower limit" + msgstr "välin yläraja ei ole pienempi kuin alaraja" + +-#: locale/programs/xmalloc.c:70 malloc/obstack.c:500 malloc/obstack.c:503 +-#: posix/getconf.c:996 ++#: locale/programs/xmalloc.c:70 malloc/obstack.c:505 malloc/obstack.c:508 ++#: posix/getconf.c:1002 + msgid "memory exhausted" + msgstr "muisti lopussa" + +@@ -1692,7 +1697,7 @@ + msgid "Another string for testing." + msgstr "Toinen merkkijono testausta varten" + +-#: catgets/gencat.c:111 catgets/gencat.c:115 nscd/nscd.c:79 ++#: catgets/gencat.c:111 catgets/gencat.c:115 nscd/nscd.c:84 + msgid "NAME" + msgstr "NIMI" + +@@ -1736,7 +1741,7 @@ + msgid "duplicate set definition" + msgstr "kaksinkertainen joukon määrittely" + +-#: catgets/gencat.c:446 catgets/gencat.c:619 catgets/gencat.c:648 ++#: catgets/gencat.c:446 catgets/gencat.c:623 catgets/gencat.c:677 + msgid "this is the first definition" + msgstr "tämä on ensimmäinen määrittely" + +@@ -1754,44 +1759,44 @@ + msgid "unknown directive `%s': line ignored" + msgstr "tuntematon direktiivi \"%s\": riviä ei huomioida" + +-#: catgets/gencat.c:617 ++#: catgets/gencat.c:621 + msgid "duplicated message number" + msgstr "kaksinkertainen viestinumero" + +-#: catgets/gencat.c:645 ++#: catgets/gencat.c:674 + msgid "duplicated message identifier" + msgstr "kaksinkertainen viestitunniste" + +-#: catgets/gencat.c:702 ++#: catgets/gencat.c:731 + msgid "invalid character: message ignored" + msgstr "virheellinen merkki: viestiä ei huomioida" + +-#: catgets/gencat.c:745 ++#: catgets/gencat.c:774 + msgid "invalid line" + msgstr "virheellinen rivi" + +-#: catgets/gencat.c:799 ++#: catgets/gencat.c:828 + msgid "malformed line ignored" + msgstr "väärän muotoinen rivi jätetty huomioimatta" + +-#: catgets/gencat.c:963 catgets/gencat.c:1004 ++#: catgets/gencat.c:992 catgets/gencat.c:1033 + #, c-format + msgid "cannot open output file `%s'" + msgstr "tulostiedostoa \"%s\" ei voi avata" + +-#: catgets/gencat.c:1188 ++#: catgets/gencat.c:1217 + msgid "unterminated message" + msgstr "päättämätön viesti" + +-#: catgets/gencat.c:1212 ++#: catgets/gencat.c:1241 + msgid "while opening old catalog file" + msgstr "avattaessa vanhaa katalogitiedostoa" + +-#: catgets/gencat.c:1303 ++#: catgets/gencat.c:1332 + msgid "conversion modules not available" + msgstr "muunnosmoduulit eivät ole käytettävissä" + +-#: catgets/gencat.c:1329 ++#: catgets/gencat.c:1358 + msgid "cannot determine escape character" + msgstr "ohjausmerkkiä ei voi määrittää" + +@@ -1799,7 +1804,7 @@ + msgid "makecontext: does not know how to handle more than 8 arguments\n" + msgstr "makecontext: ei osaa käsitellä yli kahdeksaa argumenttia\n" + +-#: stdio-common/../sysdeps/gnu/errlist.c:12 posix/regcomp.c:178 ++#: stdio-common/../sysdeps/gnu/errlist.c:12 posix/regcomp.c:133 + #: nis/nis_error.c:29 nis/ypclnt.c:787 nis/ypclnt.c:861 + msgid "Success" + msgstr "Onnistui" +@@ -2988,23 +2993,23 @@ + msgid "%s%sUnknown signal %d\n" + msgstr "%s%sTuntematon signaali %d\n" + +-#: malloc/mcheck.c:296 ++#: malloc/mcheck.c:346 + msgid "memory is consistent, library is buggy\n" + msgstr "muisti on yhtenäinen, kirjastossa on ohjelmistovirheitä\n" + +-#: malloc/mcheck.c:299 ++#: malloc/mcheck.c:349 + msgid "memory clobbered before allocated block\n" + msgstr "muisti kärsinyt ennen varattuja lohkoja\n" + +-#: malloc/mcheck.c:302 ++#: malloc/mcheck.c:352 + msgid "memory clobbered past end of allocated block\n" + msgstr "muisti kärsinyt varattujen lohkojen jälkeen\n" + +-#: malloc/mcheck.c:305 ++#: malloc/mcheck.c:355 + msgid "block freed twice\n" + msgstr "lohko vapautettu kahdesti\n" + +-#: malloc/mcheck.c:308 ++#: malloc/mcheck.c:358 + msgid "bogus mcheck_status, library is buggy\n" + msgstr "väärä mcheck_status, kirjastossa on ohjelmavirhe\n" + +@@ -3040,6 +3045,10 @@ + msgid "DATAFILE [OUTFILE]" + msgstr "DATATIEDOSTO [TULOSTIEDOSTO]" + ++#: string/strerror.c:43 posix/../sysdeps/posix/gai_strerror.c:57 ++msgid "Unknown error" ++msgstr "Tuntematon virhe" ++ + #: string/strsignal.c:69 + #, c-format + msgid "Real-time signal %d" +@@ -3064,7 +3073,7 @@ + msgid "%s: Memory exhausted: %s\n" + msgstr "%s: Muisti lopussa: %s\n" + +-#: timezone/zic.c:390 misc/error.c:120 ++#: timezone/zic.c:390 misc/error.c:127 misc/error.c:155 + msgid "Unknown system error" + msgstr "Tuntematon järjestelmävirhe" + +@@ -3457,25 +3466,21 @@ + msgid "Interrupted by a signal" + msgstr "Signaalin keskeyttämä" + +-#: posix/../sysdeps/posix/gai_strerror.c:57 +-msgid "Unknown error" +-msgstr "Tuntematon virhe" +- +-#: posix/getconf.c:883 ++#: posix/getconf.c:889 + #, c-format + msgid "Usage: %s [-v specification] variable_name [pathname]\n" + msgstr "Käyttö: %s [-v määrittely] muuttujanimi [polku]\n" + +-#: posix/getconf.c:941 ++#: posix/getconf.c:947 + #, c-format + msgid "unknown specification \"%s\"" + msgstr "tuntematon määrittely \"%s\"" + +-#: posix/getconf.c:968 posix/getconf.c:984 ++#: posix/getconf.c:974 posix/getconf.c:990 + msgid "undefined" + msgstr "määrittelemätön" + +-#: posix/getconf.c:1006 ++#: posix/getconf.c:1012 + #, c-format + msgid "Unrecognized variable `%s'" + msgstr "Tunnistamaton muuttuja \"%s\"" +@@ -3537,71 +3542,71 @@ + msgid "%s: option `-W %s' doesn't allow an argument\n" + msgstr "%s: valitsin \"-W %s\" ei salli argumenttia\n" + +-#: posix/regcomp.c:181 ++#: posix/regcomp.c:136 + msgid "No match" + msgstr "Ei vastaavuutta" + +-#: posix/regcomp.c:184 ++#: posix/regcomp.c:139 + msgid "Invalid regular expression" + msgstr "Virheellinen säännöllinen ilmaus" + +-#: posix/regcomp.c:187 ++#: posix/regcomp.c:142 + msgid "Invalid collation character" + msgstr "Virheellinen vertailumerkki" + +-#: posix/regcomp.c:190 ++#: posix/regcomp.c:145 + msgid "Invalid character class name" + msgstr "Virheellinen merkkiluokan nimi" + +-#: posix/regcomp.c:193 ++#: posix/regcomp.c:148 + msgid "Trailing backslash" + msgstr "Kenoviiva lopussa" + +-#: posix/regcomp.c:196 ++#: posix/regcomp.c:151 + msgid "Invalid back reference" + msgstr "Virheellinen takaisinviittaus" + +-#: posix/regcomp.c:199 ++#: posix/regcomp.c:154 + msgid "Unmatched [ or [^" + msgstr "Pariton [ tai [^" + +-#: posix/regcomp.c:202 ++#: posix/regcomp.c:157 + msgid "Unmatched ( or \\(" + msgstr "Pariton ( tai \\(" + +-#: posix/regcomp.c:205 ++#: posix/regcomp.c:160 + msgid "Unmatched \\{" + msgstr "Pariton \\{" + +-#: posix/regcomp.c:208 ++#: posix/regcomp.c:163 + msgid "Invalid content of \\{\\}" + msgstr "Virheellinen \\{\\}:n sisältö" + +-#: posix/regcomp.c:211 ++#: posix/regcomp.c:166 + msgid "Invalid range end" + msgstr "Virheellinen välin loppu" + +-#: posix/regcomp.c:214 ++#: posix/regcomp.c:169 + msgid "Memory exhausted" + msgstr "Muisti lopussa" + +-#: posix/regcomp.c:217 ++#: posix/regcomp.c:172 + msgid "Invalid preceding regular expression" + msgstr "Virheellinen edeltävä säännöllinen ilmaus" + +-#: posix/regcomp.c:220 ++#: posix/regcomp.c:175 + msgid "Premature end of regular expression" + msgstr "Ennenaikainen säännöllisen ilmauksen loppu" + +-#: posix/regcomp.c:223 ++#: posix/regcomp.c:178 + msgid "Regular expression too big" + msgstr "Liian suuri säännöllinen ilmaus" + +-#: posix/regcomp.c:226 ++#: posix/regcomp.c:181 + msgid "Unmatched ) or \\)" + msgstr "Pariton ) tai \\)" + +-#: posix/regcomp.c:673 ++#: posix/regcomp.c:615 + msgid "No previous regular expression" + msgstr "Ei edeltävää säännöllistä lauseketta" + +@@ -3622,7 +3627,7 @@ + + #: argp/argp-help.c:1189 + msgid "Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options." +-msgstr "Pakolliset tai valinnaiset argumentit pitkille optioille ovat pakollisia tai valinnaisia kaikille vastaaville lyhyille optioille." ++msgstr "Pakolliset tai valinnaiset argumentit pitkille valitsimille ovat pakollisia tai valinnaisia kaikille vastaaville lyhyille valitsimille." + + #: argp/argp-help.c:1572 + msgid "Usage:" +@@ -3755,24 +3760,24 @@ + msgid "Service configuration to be used" + msgstr "Käytettävät palveluasetukset" + +-#: nss/getent.c:136 nss/getent.c:305 ++#: nss/getent.c:136 nss/getent.c:308 + #, c-format + msgid "Enumeration not supported on %s\n" + msgstr "%s ei tue luettelemista\n" + +-#: nss/getent.c:729 ++#: nss/getent.c:732 + msgid "getent - get entries from administrative database." + msgstr "getent - hae merkintöjä hallinnollisesta tietokannasta." + +-#: nss/getent.c:730 ++#: nss/getent.c:733 + msgid "Supported databases:" + msgstr "Tuetut tietokannat:" + +-#: nss/getent.c:787 nscd/nscd.c:119 nscd/nscd_nischeck.c:64 ++#: nss/getent.c:790 nscd/nscd.c:124 nscd/nscd_nischeck.c:64 + msgid "wrong number of arguments" + msgstr "väärä määrä argumentteja" + +-#: nss/getent.c:797 ++#: nss/getent.c:800 + #, c-format + msgid "Unknown database: %s\n" + msgstr "Tuntematon tietokanta: %s\n" +@@ -3801,68 +3806,72 @@ + msgid "invalid pointer size" + msgstr "virheellinen osoittimen koko" + +-#: inet/rcmd.c:174 inet/rcmd.c:177 ++#: inet/rcmd.c:163 inet/rcmd.c:166 ++msgid "rcmd: Cannot allocate memory\n" ++msgstr "rcmd: Muistin varaaminen ei onnistu\n" ++ ++#: inet/rcmd.c:185 inet/rcmd.c:188 + msgid "rcmd: socket: All ports in use\n" + msgstr "rcmd: socket: Kaikki portit käytössä\n" + +-#: inet/rcmd.c:211 ++#: inet/rcmd.c:222 + #, c-format + msgid "connect to address %s: " + msgstr "yhdistä osoitteeseen %s: " + +-#: inet/rcmd.c:229 ++#: inet/rcmd.c:240 + #, c-format + msgid "Trying %s...\n" + msgstr "Yritetään %s...\n" + +-#: inet/rcmd.c:278 ++#: inet/rcmd.c:289 + #, c-format + msgid "rcmd: write (setting up stderr): %m\n" + msgstr "rcmd: write (alustetaan vakiovirhetuloste): %m\n" + +-#: inet/rcmd.c:299 ++#: inet/rcmd.c:310 + #, c-format + msgid "rcmd: poll (setting up stderr): %m\n" + msgstr "rcmd: poll (alustetaan vakiovirhetuloste): %m\n" + +-#: inet/rcmd.c:302 ++#: inet/rcmd.c:313 + msgid "poll: protocol failure in circuit setup\n" + msgstr "poll: protokollavirhe piiriasetuksissa\n" + +-#: inet/rcmd.c:346 ++#: inet/rcmd.c:358 + msgid "socket: protocol failure in circuit setup\n" + msgstr "socket: protokollavirhe piiriasetuksissa\n" + +-#: inet/rcmd.c:368 ++#: inet/rcmd.c:387 + #, c-format + msgid "rcmd: %s: short read" + msgstr "rcmd: %s: vajaa luku" + +-#: inet/rcmd.c:524 ++#: inet/rcmd.c:549 + msgid "lstat failed" + msgstr "tiedoston tilan luku epäonnistui" + +-#: inet/rcmd.c:526 ++#: inet/rcmd.c:551 + msgid "not regular file" + msgstr "ei ole tavallinen tiedosto" + +-#: inet/rcmd.c:531 ++#: inet/rcmd.c:556 + msgid "cannot open" + msgstr "ei voi avata" + +-#: inet/rcmd.c:533 ++#: inet/rcmd.c:558 + msgid "fstat failed" + msgstr "tiedoston tilan luku epäonnistui" + +-#: inet/rcmd.c:535 ++#: inet/rcmd.c:560 + msgid "bad owner" + msgstr "virheellinen omistaja" + +-#: inet/rcmd.c:537 ++#: inet/rcmd.c:562 + msgid "writeable by other than owner" + msgstr "kirjoitusoikeus muulla kuin omistajalla" + +-#: inet/rcmd.c:539 ++#: inet/rcmd.c:564 + msgid "hard linked somewhere" + msgstr "kovalinkitetty johonkin" + +@@ -4035,7 +4044,7 @@ + + #: sunrpc/pm_getmaps.c:74 + msgid "pmap_getmaps rpc problem" +-msgstr "pmap_getmaps rpc-ongelma" ++msgstr "pmap_getmaps-rpc-ongelma" + + #: sunrpc/pmap_clnt.c:72 + msgid "__get_myaddress: ioctl (get interface configuration)" +@@ -4073,109 +4082,109 @@ + msgid "Cannot receive reply to broadcast" + msgstr "Vastausta yleislähetykseen ei pystytä vastaanottamaan" + +-#: sunrpc/rpc_main.c:289 ++#: sunrpc/rpc_main.c:288 + #, c-format + msgid "%s: output would overwrite %s\n" + msgstr "%s: tuloste ylikirjoittaisi tiedoston %s\n" + +-#: sunrpc/rpc_main.c:296 ++#: sunrpc/rpc_main.c:295 + #, c-format + msgid "%s: unable to open %s: %m\n" + msgstr "%s: tiedostoa %s ei voi avata: %m\n" + +-#: sunrpc/rpc_main.c:308 ++#: sunrpc/rpc_main.c:307 + #, c-format + msgid "%s: while writing output %s: %m" + msgstr "%s: kirjoitettaessa tulostetta %s: %m" + +-#: sunrpc/rpc_main.c:343 ++#: sunrpc/rpc_main.c:342 + #, c-format + msgid "cannot find C preprocessor: %s \n" + msgstr "C-esikääntäjää ei löydy: %s \n" + +-#: sunrpc/rpc_main.c:351 ++#: sunrpc/rpc_main.c:350 + msgid "cannot find any C preprocessor (cpp)\n" + msgstr "mitään C-esikääntäjää (cpp) ei löydy\n" + +-#: sunrpc/rpc_main.c:420 ++#: sunrpc/rpc_main.c:419 + #, c-format + msgid "%s: C preprocessor failed with signal %d\n" + msgstr "%s: C-esikääntäjä epäonnistui signaalilla %d\n" + +-#: sunrpc/rpc_main.c:423 ++#: sunrpc/rpc_main.c:422 + #, c-format + msgid "%s: C preprocessor failed with exit code %d\n" + msgstr "%s: C-esikääntäjä epäonnistui paluuarvolla %d\n" + +-#: sunrpc/rpc_main.c:463 ++#: sunrpc/rpc_main.c:462 + #, c-format + msgid "illegal nettype :`%s'\n" + msgstr "virheellinen verkkotyyppi :\"%s\"\n" + +-#: sunrpc/rpc_main.c:1105 ++#: sunrpc/rpc_main.c:1104 + msgid "rpcgen: too many defines\n" + msgstr "rpcgen: liian monta määrittelyä\n" + +-#: sunrpc/rpc_main.c:1117 ++#: sunrpc/rpc_main.c:1116 + msgid "rpcgen: arglist coding error\n" + msgstr "rpcgen: argumenttillistan koodausvirhe\n" + + #. TRANS: the file will not be removed; this is an + #. TRANS: informative message. +-#: sunrpc/rpc_main.c:1150 ++#: sunrpc/rpc_main.c:1149 + #, c-format + msgid "file `%s' already exists and may be overwritten\n" + msgstr "tiedosto \"%s\" on olemassa ja saatetaan ylikirjoittaa\n" + +-#: sunrpc/rpc_main.c:1195 ++#: sunrpc/rpc_main.c:1194 + msgid "Cannot specify more than one input file!\n" + msgstr "Voidaan antaa vain yksi syötetiedosto!\n" + +-#: sunrpc/rpc_main.c:1365 ++#: sunrpc/rpc_main.c:1364 + msgid "This implementation doesn't support newstyle or MT-safe code!\n" + msgstr "Tämä toteutus ei tue uudentyyppistä MT-turvallista koodia!\n" + +-#: sunrpc/rpc_main.c:1374 ++#: sunrpc/rpc_main.c:1373 + msgid "Cannot use netid flag with inetd flag!\n" + msgstr "Netid-lippua ei voi käyttää inetd-lipun kanssa!\n" + +-#: sunrpc/rpc_main.c:1386 ++#: sunrpc/rpc_main.c:1385 + msgid "Cannot use netid flag without TIRPC!\n" + msgstr "Lippua netid ei voi käyttää ilman TIRPC:tä!\n" + +-#: sunrpc/rpc_main.c:1393 ++#: sunrpc/rpc_main.c:1392 + msgid "Cannot use table flags with newstyle!\n" + msgstr "Table-lippuja ei voi käyttää \"newstyle\":n kanssa!\n" + +-#: sunrpc/rpc_main.c:1412 ++#: sunrpc/rpc_main.c:1411 + msgid "\"infile\" is required for template generation flags.\n" + msgstr "\"syötetiedosto\" vaaditaan mallin luontilippuja varten.\n" + +-#: sunrpc/rpc_main.c:1417 ++#: sunrpc/rpc_main.c:1416 + msgid "Cannot have more than one file generation flag!\n" + msgstr "Tiedostonluontilippuja voi olla vain yksi!\n" + +-#: sunrpc/rpc_main.c:1426 ++#: sunrpc/rpc_main.c:1425 + #, c-format + msgid "usage: %s infile\n" + msgstr "käyttö: %s syötetiedosto\n" + +-#: sunrpc/rpc_main.c:1427 ++#: sunrpc/rpc_main.c:1426 + #, c-format + msgid "\t%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile\n" + msgstr "\t%s [-abkCLNTM][-Dnimi[=arvo]] [-i koko] [-I [-K sekuntit]] [-Y polku] syötetiedosto\n" + +-#: sunrpc/rpc_main.c:1429 ++#: sunrpc/rpc_main.c:1428 + #, 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 tulostiedosto] [syötetiedosto]\n" + +-#: sunrpc/rpc_main.c:1431 ++#: sunrpc/rpc_main.c:1430 + #, c-format + msgid "\t%s [-s nettype]* [-o outfile] [infile]\n" + msgstr "\t%s [-s verkkotyyppi]* [-o tulostiedosto] [syötetiedosto]\n" + +-#: sunrpc/rpc_main.c:1432 ++#: sunrpc/rpc_main.c:1431 + #, c-format + msgid "\t%s [-n netid]* [-o outfile] [infile]\n" + msgstr "\t%s [-n verkkoid]* [-o tulostiedosto] [syötetiedosto]\n" +@@ -5032,7 +5041,7 @@ + msgid "while allocating hash table entry" + msgstr "varattaessa tilaa tiivistetaulukkomerkinnälle" + +-#: nscd/cache.c:150 nscd/connections.c:185 ++#: nscd/cache.c:150 nscd/connections.c:187 + #, c-format + msgid "cannot stat() file `%s': %s" + msgstr "tiedoston \"%s\" tilaa ei voi lukea: %s" +@@ -5045,153 +5054,158 @@ + msgid "Cannot run nscd in secure mode as unprivileged user" + msgstr "Ohjelmaa nscd ei voi ajaa turvallisessa tilassa normaalin käyttäjän oikeuksilla" + +-#: nscd/connections.c:199 ++#: nscd/connections.c:175 ++#, c-format ++msgid "while allocating cache: %s" ++msgstr "varattaessa välimuistia: %s" ++ ++#: nscd/connections.c:200 + #, c-format + msgid "cannot open socket: %s" + msgstr "pistoketta ei voi avata: %s" + +-#: nscd/connections.c:217 ++#: nscd/connections.c:218 + #, c-format + msgid "cannot enable socket to accept connections: %s" + msgstr "pistoketta ei voi asettaa vastaanottamaan yhteyksiä: %s" + +-#: nscd/connections.c:259 ++#: nscd/connections.c:260 + #, c-format + msgid "handle_request: request received (Version = %d)" + msgstr "handle_request: pyyntö vastaanotettu (Versio = %d)" + +-#: nscd/connections.c:265 ++#: nscd/connections.c:266 + #, c-format + msgid "cannot handle old request version %d; current version is %d" + msgstr "vanhaa pyyntöversiota %d ei voi käsitellä; nykyinen versio on %d" + +-#: nscd/connections.c:303 nscd/connections.c:325 ++#: nscd/connections.c:304 nscd/connections.c:326 + #, c-format + msgid "cannot write result: %s" + msgstr "tulosta ei voi kirjoittaa: %s" + +-#: nscd/connections.c:404 nscd/connections.c:498 ++#: nscd/connections.c:405 nscd/connections.c:499 + #, c-format + msgid "error getting callers id: %s" + msgstr "virhe kutsujan tunnisteen hakemisessa: %s" + +-#: nscd/connections.c:470 ++#: nscd/connections.c:471 + #, c-format + msgid "while accepting connection: %s" + msgstr "hyväksyttäessä yhteyksiä: %s" + +-#: nscd/connections.c:481 ++#: nscd/connections.c:482 + #, c-format + msgid "short read while reading request: %s" + msgstr "vajaa luku luettaessa pyyntöä: %s" + +-#: nscd/connections.c:517 ++#: nscd/connections.c:518 + #, c-format + msgid "key length in request too long: %d" + msgstr "avaimen pituus pyynnössä liian pitkä: %d" + +-#: nscd/connections.c:531 ++#: nscd/connections.c:532 + #, c-format + msgid "short read while reading request key: %s" + msgstr "vajaa luku luettaessa pyyntöavainta: %s" + +-#: nscd/connections.c:590 nscd/connections.c:591 nscd/connections.c:610 +-#: nscd/connections.c:623 nscd/connections.c:629 nscd/connections.c:636 ++#: nscd/connections.c:591 nscd/connections.c:592 nscd/connections.c:611 ++#: nscd/connections.c:624 nscd/connections.c:630 nscd/connections.c:637 + #, c-format + msgid "Failed to run nscd as user '%s'" + msgstr "Ohjelman nscd ajaminen käyttäjän \"%s\" oikeuksilla epäonnistui" + +-#: nscd/connections.c:611 ++#: nscd/connections.c:612 + msgid "getgrouplist failed" + msgstr "getgrouplist epäonnistui" + +-#: nscd/connections.c:624 ++#: nscd/connections.c:625 + msgid "setgroups failed" + msgstr "setgroups epäonnistui" + +-#: nscd/grpcache.c:102 nscd/hstcache.c:110 nscd/pwdcache.c:108 ++#: nscd/grpcache.c:103 nscd/hstcache.c:111 nscd/pwdcache.c:109 + msgid "while allocating key copy" + msgstr "varattaessa tilaa avainkopiolle" + +-#: nscd/grpcache.c:152 nscd/hstcache.c:167 nscd/pwdcache.c:145 ++#: nscd/grpcache.c:153 nscd/hstcache.c:168 nscd/pwdcache.c:146 + msgid "while allocating cache entry" + msgstr "varattaessa tilaa välimuistimerkinnälle" + +-#: nscd/grpcache.c:195 nscd/hstcache.c:281 nscd/pwdcache.c:191 ++#: nscd/grpcache.c:196 nscd/hstcache.c:282 nscd/pwdcache.c:192 + #, c-format + msgid "short write in %s: %s" + msgstr "vajaa kirjoitus tiedostossa %s: %s" + +-#: nscd/grpcache.c:217 ++#: nscd/grpcache.c:218 + #, c-format + msgid "Haven't found \"%s\" in group cache!" + msgstr "\"%s\" ei löytynyt ryhmävälimuistista!" + +-#: nscd/grpcache.c:292 ++#: nscd/grpcache.c:284 + #, c-format + msgid "Invalid numeric gid \"%s\"!" + msgstr "Virheellinen numeerinen gid \"%s\"!" + +-#: nscd/grpcache.c:299 ++#: nscd/grpcache.c:291 + #, c-format + msgid "Haven't found \"%d\" in group cache!" + msgstr "\"%d\" ei löytynyt ryhmävälimuistista!" + +-#: nscd/hstcache.c:303 nscd/hstcache.c:378 nscd/hstcache.c:456 +-#: nscd/hstcache.c:533 ++#: nscd/hstcache.c:304 nscd/hstcache.c:370 nscd/hstcache.c:435 ++#: nscd/hstcache.c:500 + #, c-format + msgid "Haven't found \"%s\" in hosts cache!" + msgstr "\"%s\" ei löytynyt isäntävälimuistista!" + +-#: nscd/nscd.c:80 ++#: nscd/nscd.c:85 + msgid "Read configuration data from NAME" + msgstr "Lue asetukset tiedostosta NIMI" + +-#: nscd/nscd.c:82 ++#: nscd/nscd.c:87 + msgid "Do not fork and display messages on the current tty" + msgstr "Älä haaraudu ja näytä viestit nykyisessä tty:ssä" + +-#: nscd/nscd.c:83 ++#: nscd/nscd.c:88 + msgid "NUMBER" + msgstr "MÄÄRÄ" + +-#: nscd/nscd.c:83 ++#: nscd/nscd.c:88 + msgid "Start NUMBER threads" + msgstr "Käynnistä MÄÄRÄ säiettä" + +-#: nscd/nscd.c:84 ++#: nscd/nscd.c:89 + msgid "Shut the server down" + msgstr "Sammuta palvelin" + +-#: nscd/nscd.c:85 ++#: nscd/nscd.c:90 + msgid "Print current configuration statistic" + msgstr "Näytä nykyiset asetustilastot" + +-#: nscd/nscd.c:86 ++#: nscd/nscd.c:91 + msgid "TABLE" + msgstr "TAULUKKO" + +-#: nscd/nscd.c:87 ++#: nscd/nscd.c:92 + msgid "Invalidate the specified cache" + msgstr "Poista käytöstä määritelty välimuisti" + +-#: nscd/nscd.c:88 ++#: nscd/nscd.c:93 + msgid "TABLE,yes" + msgstr "TAULUKKO,kyllä" + +-#: nscd/nscd.c:88 ++#: nscd/nscd.c:93 + msgid "Use separate cache for each user" + msgstr "Käytä erillistä välimuistia jokaiselle käyttäjälle" + +-#: nscd/nscd.c:93 ++#: nscd/nscd.c:98 + msgid "Name Service Cache Daemon." + msgstr "Nimipalvelun välimuistidemoni." + +-#: nscd/nscd.c:126 ++#: nscd/nscd.c:131 + msgid "already running" + msgstr "on jo käynnissä" + +-#: nscd/nscd.c:192 nscd/nscd.c:212 nscd/nscd.c:218 ++#: nscd/nscd.c:243 nscd/nscd.c:263 nscd/nscd.c:269 + msgid "Only root is allowed to use this option!" + msgstr "Vain root voi käyttää tätä valitsinta!" + +@@ -5281,22 +5295,22 @@ + "%15ld%% välimuistiosuma-aste\n" + "%15s tarkista muutokset tiedostosta /etc/%s\n" + +-#: nscd/pwdcache.c:213 ++#: nscd/pwdcache.c:214 + #, c-format + msgid "Haven't found \"%s\" in password cache!" + msgstr "\"%s\" ei löytynyt salasanavälimuistista!" + +-#: nscd/pwdcache.c:288 ++#: nscd/pwdcache.c:280 + #, c-format + msgid "Invalid numeric uid \"%s\"!" + msgstr "Virheellinen numeerinen uid \"%s\"!" + +-#: nscd/pwdcache.c:295 ++#: nscd/pwdcache.c:287 + #, c-format + msgid "Haven't found \"%d\" in password cache!" + msgstr "\"%d\" ei löytynyt salasanavälimuistista!" + +-#: elf/../sysdeps/generic/dl-sysdep.c:297 ++#: elf/../sysdeps/generic/dl-sysdep.c:357 + msgid "cannot create capability list" + msgstr "kykylistaa ei voi luoda" + +@@ -5347,7 +5361,7 @@ + msgid ", OS ABI: %s %d.%d.%d" + msgstr ", OS ABI: %s %d.%d.%d" + +-#: elf/cache.c:136 elf/ldconfig.c:1033 ++#: elf/cache.c:136 elf/ldconfig.c:1045 + #, c-format + msgid "Can't open cache file %s\n" + msgstr "Välimuistitiedostoa %s ei voi avata\n" +@@ -5393,15 +5407,15 @@ + msgid "Renaming of %s to %s failed" + msgstr "Uudelleennimeäminen %s -> %s epäonnistui" + +-#: elf/dl-close.c:113 ++#: elf/dl-close.c:128 + msgid "shared object not open" + msgstr "jaettu objekti ei ole avoin" + +-#: elf/dl-close.c:357 elf/dl-open.c:436 ++#: elf/dl-close.c:486 elf/dl-open.c:444 + msgid "TLS generation counter wrapped! Please send report with the 'glibcbug' script." + msgstr "TLS-luontilaskurin ylivuoto! Lähetä raportti \"glibcbug\"-skriptillä." + +-#: elf/dl-deps.c:111 elf/dl-open.c:177 ++#: elf/dl-deps.c:111 elf/dl-open.c:183 + msgid "DST not allowed in SUID/SGID programs" + msgstr "DST ei ole sallittu SUID/SGID-ohjelmissa" + +@@ -5418,181 +5432,193 @@ + msgid "cannot allocate dependency list" + msgstr "riippuvuuslistalle ei voi varata muistia" + +-#: elf/dl-deps.c:492 elf/dl-deps.c:547 ++#: elf/dl-deps.c:494 elf/dl-deps.c:549 + msgid "cannot allocate symbol search list" + msgstr "symbolihakulistalle ei voi varata muistia" + +-#: elf/dl-deps.c:532 ++#: elf/dl-deps.c:534 + msgid "Filters not supported with LD_TRACE_PRELINKING" + msgstr "Suodattimet eivät ole tuettuja LD_TRACE_RPELINKING:in kanssa" + +-#: elf/dl-error.c:73 ++#: elf/dl-error.c:75 + msgid "DYNAMIC LINKER BUG!!!" + msgstr "DYNAAMISEN LINKITTÄJÄN OHJELMISTOVIRHE!!!" + +-#: elf/dl-error.c:106 ++#: elf/dl-error.c:108 + msgid "error while loading shared libraries" + msgstr "virhe ladattaessa jaettuja kirjastoja" + +-#: elf/dl-load.c:338 ++#: elf/dl-load.c:339 + msgid "cannot allocate name record" + msgstr "nimitietueelle ei voi varata muistia" + +-#: elf/dl-load.c:440 elf/dl-load.c:520 elf/dl-load.c:614 elf/dl-load.c:709 ++#: elf/dl-load.c:441 elf/dl-load.c:520 elf/dl-load.c:612 elf/dl-load.c:707 + msgid "cannot create cache for search path" + msgstr "hakupolulle ei voi luoda välimuistia" + +-#: elf/dl-load.c:545 ++#: elf/dl-load.c:543 + msgid "cannot create RUNPATH/RPATH copy" + msgstr "RUNPATH/RPATH-kopiota ei voi luoda" + +-#: elf/dl-load.c:600 ++#: elf/dl-load.c:598 + msgid "cannot create search path array" + msgstr "hakupolkutaulukkoa ei voi luoda" + +-#: elf/dl-load.c:796 ++#: elf/dl-load.c:794 + msgid "cannot stat shared object" + msgstr "jaetun objektin tilaa ei voi lukea" + +-#: elf/dl-load.c:840 ++#: elf/dl-load.c:838 + msgid "cannot open zero fill device" + msgstr "nollatäyttölaitetta ei voi avata" + +-#: elf/dl-load.c:849 elf/dl-load.c:1855 ++#: elf/dl-load.c:847 elf/dl-load.c:1902 + msgid "cannot create shared object descriptor" + msgstr "jaettua objektikahvaa ei voi luoda" + +-#: elf/dl-load.c:868 elf/dl-load.c:1351 elf/dl-load.c:1434 ++#: elf/dl-load.c:866 elf/dl-load.c:1398 elf/dl-load.c:1481 + msgid "cannot read file data" + msgstr "tiedoston dataa ei voi lukea" + +-#: elf/dl-load.c:908 ++#: elf/dl-load.c:906 + msgid "ELF load command alignment not page-aligned" + msgstr "ELF-latauskomennon tasaus ei ole sivutasattu" + +-#: elf/dl-load.c:915 ++#: elf/dl-load.c:913 + msgid "ELF load command address/offset not properly aligned" + msgstr "ELF-latauskomennon osoite/siirtymä ei ole tasattu oikein" + +-#: elf/dl-load.c:996 ++#: elf/dl-load.c:988 ++msgid "cannot allocate TLS data structures for initial thread" ++msgstr "alkusäikeelle ei voi varata TLS-tietorakenteita" ++ ++#: elf/dl-load.c:1012 ++msgid "cannot handle TLS data" ++msgstr "TLS-dataa ei voi käsitellä" ++ ++#: elf/dl-load.c:1047 + msgid "failed to map segment from shared object" + msgstr "segmentin kartoitus jaetusta objektista epäonnistui" + +-#: elf/dl-load.c:1020 ++#: elf/dl-load.c:1071 + msgid "cannot dynamically load executable" + msgstr "käynnistettävää tiedostoa ei voi ladata dynaamisesti" + +-#: elf/dl-load.c:1081 ++#: elf/dl-load.c:1132 + msgid "cannot change memory protections" + msgstr "muistin suojausta ei voi muuttaa" + +-#: elf/dl-load.c:1100 ++#: elf/dl-load.c:1151 + msgid "cannot map zero-fill pages" + msgstr "nollatäytteisiä sivuja ei voi kartoittaa" + +-#: elf/dl-load.c:1118 ++#: elf/dl-load.c:1169 + msgid "cannot allocate memory for program header" + msgstr "ohjelman otsakkeelle ei voi varata muistia" + +-#: elf/dl-load.c:1149 ++#: elf/dl-load.c:1200 + msgid "object file has no dynamic section" + msgstr "objektitiedostossa ei ole dynaamista osaa" + +-#: elf/dl-load.c:1193 ++#: elf/dl-load.c:1240 + msgid "shared object cannot be dlopen()ed" + msgstr "jaettua objektia ei voi avata funktiolla dlopen()" + +-#: elf/dl-load.c:1216 ++#: elf/dl-load.c:1263 + msgid "cannot create searchlist" + msgstr "hakulistaa ei voi luoda" + +-#: elf/dl-load.c:1351 ++#: elf/dl-load.c:1398 + msgid "file too short" + msgstr "tiedosto on liian lyhyt" + +-#: elf/dl-load.c:1374 ++#: elf/dl-load.c:1421 + msgid "invalid ELF header" + msgstr "virheellinen ELF-otsikko" + +-#: elf/dl-load.c:1383 ++#: elf/dl-load.c:1430 + msgid "ELF file data encoding not big-endian" + msgstr "ELF-tiedoston tavujärjestys ei ole \"big-endian\"" + +-#: elf/dl-load.c:1385 ++#: elf/dl-load.c:1432 + msgid "ELF file data encoding not little-endian" + msgstr "ELF-tiedoston tavujärjestys ei ole \"little-endian\"" + +-#: elf/dl-load.c:1389 ++#: elf/dl-load.c:1436 + msgid "ELF file version ident does not match current one" + msgstr "ELF-tiedoston versiotunnus ei vastaa nykyistä" + +-#: elf/dl-load.c:1393 ++#: elf/dl-load.c:1440 + msgid "ELF file OS ABI invalid" + msgstr "ELF-tiedoston OS ABI on virheellinen" + +-#: elf/dl-load.c:1395 ++#: elf/dl-load.c:1442 + msgid "ELF file ABI version invalid" + msgstr "ELF-tiedoston ABI-versio virheellinen" + +-#: elf/dl-load.c:1398 ++#: elf/dl-load.c:1445 + msgid "internal error" + msgstr "sisäinen virhe" + +-#: elf/dl-load.c:1405 ++#: elf/dl-load.c:1452 + msgid "ELF file version does not match current one" + msgstr "ELF-tiedoston versio ei vastaa nykyistä" + +-#: elf/dl-load.c:1413 ++#: elf/dl-load.c:1460 + msgid "ELF file's phentsize not the expected size" + msgstr "ELF-tiedoston phent-koko ei ole odotetun kokoinen" + +-#: elf/dl-load.c:1419 ++#: elf/dl-load.c:1466 + msgid "only ET_DYN and ET_EXEC can be loaded" + msgstr "vain ET_DYN ja ET_EXEC voidaan ladata" + +-#: elf/dl-load.c:1870 ++#: elf/dl-load.c:1917 + msgid "cannot open shared object file" + msgstr "jaettua objektitiedostoa ei voi avata" + +-#: elf/dl-lookup.c:248 elf/dl-lookup.c:413 ++#: elf/dl-lookup.c:265 elf/dl-lookup.c:430 + msgid "relocation error" + msgstr "uudelleensijoitusvirhe" + +-#: elf/dl-open.c:105 ++#: elf/dl-open.c:111 + msgid "cannot extend global scope" + msgstr "globaalia aluetta ei voi laajentaa" + +-#: elf/dl-open.c:208 ++#: elf/dl-open.c:214 + msgid "empty dynamic string token substitution" + msgstr "tyhjän dynaamisen merkkijonon osan korvaus" + +-#: elf/dl-open.c:345 elf/dl-open.c:356 ++#: elf/dl-open.c:351 elf/dl-open.c:362 + msgid "cannot create scope list" + msgstr "aluelistaa ei voi luoda" + +-#: elf/dl-open.c:416 ++#: elf/dl-open.c:424 + msgid "cannot create TLS data structures" + msgstr "TLS-tietorakenteita ei voi luoda" + +-#: elf/dl-open.c:478 ++#: elf/dl-open.c:486 + msgid "invalid mode for dlopen()" + msgstr "virheellinen tila funktiolle dlopen()" + +-#: elf/dl-reloc.c:88 ++#: elf/dl-reloc.c:58 ++msgid "shared object cannot be dlopen()ed: static TLS memory too small" ++msgstr "jaettua objektia ei voi avata funktiolla dlopen(): staattinen TLS-muisti on liian pieni" ++ ++#: elf/dl-reloc.c:118 + msgid "cannot make segment writable for relocation" + msgstr "segmenttiä ei voi muuttaa kirjoitettavaksi uudelleensijoitusta varten" + +-#: elf/dl-reloc.c:174 ++#: elf/dl-reloc.c:219 + #, c-format + msgid "%s: profiler found no PLTREL in object %s\n" + msgstr "%s: profiloija ei löytänyt PLTREL-kenttää objektista %s\n" + +-#: elf/dl-reloc.c:186 ++#: elf/dl-reloc.c:231 + #, c-format + msgid "%s: profiler out of memory shadowing PLTREL of %s\n" + msgstr "%s: profiloijan muisti loppui varjostettaessa objektin %s PLTREL-kenttää\n" + +-#: elf/dl-reloc.c:201 ++#: elf/dl-reloc.c:246 + msgid "cannot restore segment prot after reloc" + msgstr "segmentin suojausta ei voi palauttaa uudelleensijoituksen jälkeen" + +@@ -5648,119 +5674,119 @@ + msgid "Configure Dynamic Linker Run Time Bindings." + msgstr "Säädä dynaamisen linkittäjän ajonaikaiset sidonnat." + +-#: elf/ldconfig.c:282 ++#: elf/ldconfig.c:294 + #, c-format + msgid "Path `%s' given more than once" + msgstr "Polku \"%s\" on annettu useammin kuin kerran" + +-#: elf/ldconfig.c:326 ++#: elf/ldconfig.c:338 + #, c-format + msgid "%s is not a known library type" + msgstr "%s ei ole tunnettu kirjastotyyppi" + +-#: elf/ldconfig.c:344 ++#: elf/ldconfig.c:356 + #, c-format + msgid "Can't stat %s" + msgstr "Tiedoston %s tilaa ei voi lukea" + +-#: elf/ldconfig.c:414 ++#: elf/ldconfig.c:426 + #, c-format + msgid "Can't stat %s\n" + msgstr "Tiedoston %s tilaa ei voi lukea\n" + +-#: elf/ldconfig.c:424 ++#: elf/ldconfig.c:436 + #, c-format + msgid "%s is not a symbolic link\n" + msgstr "%s ei ole symbolinen linkki\n" + +-#: elf/ldconfig.c:443 ++#: elf/ldconfig.c:455 + #, c-format + msgid "Can't unlink %s" + msgstr "Tiedoston %s linkitystä ei voi poistaa" + +-#: elf/ldconfig.c:449 ++#: elf/ldconfig.c:461 + #, c-format + msgid "Can't link %s to %s" + msgstr "Linkitys %s -> %s ei onnistu" + +-#: elf/ldconfig.c:455 ++#: elf/ldconfig.c:467 + msgid " (changed)\n" + msgstr " (muutettu)\n" + +-#: elf/ldconfig.c:457 ++#: elf/ldconfig.c:469 + msgid " (SKIPPED)\n" + msgstr " (OHITETTU)\n" + +-#: elf/ldconfig.c:512 ++#: elf/ldconfig.c:524 + #, c-format + msgid "Can't find %s" + msgstr "%s ei löydy" + +-#: elf/ldconfig.c:528 ++#: elf/ldconfig.c:540 + #, c-format + msgid "Can't lstat %s" + msgstr "Tiedoston %s tilaa ei voi lukea" + +-#: elf/ldconfig.c:535 ++#: elf/ldconfig.c:547 + #, c-format + msgid "Ignored file %s since it is not a regular file." + msgstr "Tiedostoa %s ei huomioitu, koska se ei ole tavallinen tiedosto." + +-#: elf/ldconfig.c:543 ++#: elf/ldconfig.c:555 + #, c-format + msgid "No link created since soname could not be found for %s" + msgstr "Linkkiä ei luotu, koska tiedostolle %s ei löytynyt so-nimeä" + +-#: elf/ldconfig.c:634 ++#: elf/ldconfig.c:646 + #, c-format + msgid "Can't open directory %s" + msgstr "Hakemistoa %s ei voi avata" + +-#: elf/ldconfig.c:689 elf/ldconfig.c:736 ++#: elf/ldconfig.c:701 elf/ldconfig.c:748 + #, c-format + msgid "Cannot lstat %s" + msgstr "Tiedoston %s tilaa ei voi lukea" + +-#: elf/ldconfig.c:701 ++#: elf/ldconfig.c:713 + #, c-format + msgid "Cannot stat %s" + msgstr "Tiedoston %s tilaa ei voi lukea" + +-#: elf/ldconfig.c:758 elf/readlib.c:93 ++#: elf/ldconfig.c:770 elf/readlib.c:93 + #, c-format + msgid "Input file %s not found.\n" + msgstr "Syötetiedostoa %s ei löydy.\n" + +-#: elf/ldconfig.c:792 ++#: elf/ldconfig.c:804 + #, c-format + msgid "libc5 library %s in wrong directory" + msgstr "libc5-kirjasto %s on väärässä hakemistossa" + +-#: elf/ldconfig.c:795 ++#: elf/ldconfig.c:807 + #, c-format + msgid "libc6 library %s in wrong directory" + msgstr "libc6-kirjasto %s on väärässä hakemistossa" + +-#: elf/ldconfig.c:798 ++#: elf/ldconfig.c:810 + #, c-format + msgid "libc4 library %s in wrong directory" + msgstr "libc4-kirjasto %s on väärässä hakemistossa" + +-#: elf/ldconfig.c:825 ++#: elf/ldconfig.c:837 + #, c-format + msgid "libraries %s and %s in directory %s have same soname but different type." + msgstr "kirjastoilla %s ja %s hakemistossa %s on sama so-nimi, mutta eri tyypit." + +-#: elf/ldconfig.c:928 ++#: elf/ldconfig.c:940 + #, c-format + msgid "Can't open configuration file %s" + msgstr "Asetustiedostoa %s ei voi avata" + +-#: elf/ldconfig.c:1012 ++#: elf/ldconfig.c:1024 + msgid "Can't chdir to /" + msgstr "Juurihakemistoon / siirtyminen ei onnistu" + +-#: elf/ldconfig.c:1054 ++#: elf/ldconfig.c:1066 + #, c-format + msgid "Can't open cache file directory %s\n" + msgstr "Välimuistihakemistoa %s ei voi avata\n" +Binary files glibc-2.3.2/po/fr.mo and glibc-2.3.2-200304020432/po/fr.mo differ +diff -u -udbrN glibc-2.3.2/po/fr.po glibc-2.3.2-200304020432/po/fr.po +--- glibc-2.3.2/po/fr.po Sun Oct 13 04:01:44 2002 ++++ glibc-2.3.2-200304020432/po/fr.po Mon Mar 3 19:12:33 2003 +@@ -4,9 +4,9 @@ + # + msgid "" + msgstr "" +-"Project-Id-Version: GNU libc 2.3.1\n" +-"POT-Creation-Date: 2002-10-02 17:22-0700\n" +-"PO-Revision-Date: 2002-10-12 12:00-0500\n" ++"Project-Id-Version: GNU libc 2.3.2\n" ++"POT-Creation-Date: 2003-02-22 15:34-0800\n" ++"PO-Revision-Date: 2003-03-03 08:00-0500\n" + "Last-Translator: Michel Robitaille \n" + "Language-Team: French \n" + "MIME-Version: 1.0\n" +@@ -259,8 +259,8 @@ + + #: iconv/iconv_prog.c:241 + #, c-format +-msgid "conversions from `%s' and to `%s' are not supported" +-msgstr "conversions de « %s » vers « %s » ne sont pas supportées" ++msgid "conversion from `%s' and to `%s' are not supported" ++msgstr "conversions de « %s » et de , vers « %s » ne sont pas supportées" + + #: iconv/iconv_prog.c:246 + #, c-format +@@ -285,15 +285,15 @@ + msgid "error while closing output file" + msgstr "Erreur lors de la fermeture du fichier de sortie" + +-#: iconv/iconv_prog.c:407 iconv/iconvconfig.c:355 locale/programs/locale.c:268 ++#: iconv/iconv_prog.c:407 iconv/iconvconfig.c:357 locale/programs/locale.c:274 + #: locale/programs/localedef.c:372 catgets/gencat.c:233 + #: malloc/memusagestat.c:602 debug/pcprofiledump.c:199 + msgid "Report bugs using the `glibcbug' script to .\n" + msgstr "Rapporter toutes anomalies via le script « glibcbug » à .\n" + +-#: iconv/iconv_prog.c:421 iconv/iconvconfig.c:369 locale/programs/locale.c:281 +-#: locale/programs/localedef.c:386 catgets/gencat.c:246 posix/getconf.c:904 +-#: nss/getent.c:74 nscd/nscd.c:279 nscd/nscd_nischeck.c:90 elf/ldconfig.c:259 ++#: iconv/iconv_prog.c:421 iconv/iconvconfig.c:371 locale/programs/locale.c:287 ++#: locale/programs/localedef.c:386 catgets/gencat.c:246 posix/getconf.c:910 ++#: nss/getent.c:74 nscd/nscd.c:330 nscd/nscd_nischeck.c:90 elf/ldconfig.c:271 + #: elf/sprof.c:349 + #, c-format + msgid "" +@@ -306,9 +306,9 @@ + "reproduction. AUCUNE garantie n'est donnée; tant pour des raisons\n" + "COMMERCIALES que pour RÉPONDRE À UN BESOIN PARTICULIER.\n" + +-#: iconv/iconv_prog.c:426 iconv/iconvconfig.c:374 locale/programs/locale.c:286 +-#: locale/programs/localedef.c:391 catgets/gencat.c:251 posix/getconf.c:909 +-#: nss/getent.c:79 nscd/nscd.c:284 nscd/nscd_nischeck.c:95 elf/ldconfig.c:264 ++#: iconv/iconv_prog.c:426 iconv/iconvconfig.c:376 locale/programs/locale.c:292 ++#: locale/programs/localedef.c:391 catgets/gencat.c:251 posix/getconf.c:915 ++#: nss/getent.c:79 nscd/nscd.c:335 nscd/nscd_nischeck.c:95 elf/ldconfig.c:276 + #: elf/sprof.c:355 + #, c-format + msgid "Written by %s.\n" +@@ -360,15 +360,15 @@ + msgid "Prefix used for all file accesses" + msgstr "Préfixe utilisé pour tous les accès fichiers" + +-#: iconv/iconvconfig.c:325 locale/programs/localedef.c:292 ++#: iconv/iconvconfig.c:327 locale/programs/localedef.c:292 + msgid "no output file produced because warning were issued" + msgstr "Aucun fichier de sortie généré en raison d'un avertissement déjà émis" + +-#: iconv/iconvconfig.c:403 ++#: iconv/iconvconfig.c:405 + msgid "while inserting in search tree" + msgstr "lors d'une insertion dans un arbre de recherche" + +-#: iconv/iconvconfig.c:1202 ++#: iconv/iconvconfig.c:1204 + msgid "cannot generate output file" + msgstr "Ne peut générer le fichier de sortie" + +@@ -1288,7 +1288,7 @@ + msgid "unterminated symbolic name" + msgstr "Nom symbolique incomplet" + +-#: locale/programs/linereader.c:537 catgets/gencat.c:1166 ++#: locale/programs/linereader.c:537 catgets/gencat.c:1195 + msgid "invalid escape sequence" + msgstr "Séquence d'échappement invalide" + +@@ -1318,39 +1318,39 @@ + msgid "trailing garbage at end of line" + msgstr "rebut en suffixe à la fin de la ligne" + +-#: locale/programs/locale.c:73 ++#: locale/programs/locale.c:75 + msgid "System information:" + msgstr "Information système:" + +-#: locale/programs/locale.c:75 ++#: locale/programs/locale.c:77 + msgid "Write names of available locales" + msgstr "Écriture des noms disponibles des localisations" + +-#: locale/programs/locale.c:77 ++#: locale/programs/locale.c:79 + msgid "Write names of available charmaps" + msgstr "Écriture des noms disponibles des tables de caractères" + +-#: locale/programs/locale.c:78 ++#: locale/programs/locale.c:80 + msgid "Modify output format:" + msgstr "Format de sortie de modification:" + +-#: locale/programs/locale.c:79 ++#: locale/programs/locale.c:81 + msgid "Write names of selected categories" + msgstr "Écriture des noms sélectionnés des catégories" + +-#: locale/programs/locale.c:80 ++#: locale/programs/locale.c:82 + msgid "Write names of selected keywords" + msgstr "Écriture des noms sélectionnés des mots clés" + +-#: locale/programs/locale.c:81 ++#: locale/programs/locale.c:83 + msgid "Print more information" + msgstr "Afficher plus informations" + +-#: locale/programs/locale.c:86 ++#: locale/programs/locale.c:88 + msgid "Get locale-specific information." + msgstr "Trouver l'information locale spécifique" + +-#: locale/programs/locale.c:89 ++#: locale/programs/locale.c:91 + msgid "" + "NAME\n" + "[-a|-m]" +@@ -1358,7 +1358,7 @@ + "NOM\n" + "[-a|-m]" + +-#: locale/programs/locale.c:488 ++#: locale/programs/locale.c:512 + msgid "while preparing output" + msgstr "lors de la préparation de la sortie" + +@@ -1489,16 +1489,16 @@ + msgid "cannot create temporary file" + msgstr "ne peut créer un fichier temporaire" + +-#: locale/programs/locarchive.c:118 locale/programs/locarchive.c:302 ++#: locale/programs/locarchive.c:118 locale/programs/locarchive.c:305 + msgid "cannot initialize archive file" + msgstr "ne peut initialiser le fichier d'archive" + +-#: locale/programs/locarchive.c:125 locale/programs/locarchive.c:309 ++#: locale/programs/locarchive.c:125 locale/programs/locarchive.c:312 + msgid "cannot resize archive file" + msgstr "ne peut modifier la taille du fichier d'archive" + +-#: locale/programs/locarchive.c:134 locale/programs/locarchive.c:318 +-#: locale/programs/locarchive.c:508 ++#: locale/programs/locarchive.c:134 locale/programs/locarchive.c:321 ++#: locale/programs/locarchive.c:511 + msgid "cannot map archive header" + msgstr "ne peut mapper l'en-tête de l'archive" + +@@ -1514,88 +1514,88 @@ + msgid "cannot map locale archive file" + msgstr "ne peut mapper l'archive de localisation" + +-#: locale/programs/locarchive.c:326 ++#: locale/programs/locarchive.c:329 + msgid "cannot lock new archive" + msgstr "ne peut verrouiller la nouvelle archive" + +-#: locale/programs/locarchive.c:377 ++#: locale/programs/locarchive.c:380 + msgid "cannot extend locale archive file" + msgstr "ne peut augmenter la taille du fichier de l'archive de localisation" + +-#: locale/programs/locarchive.c:386 ++#: locale/programs/locarchive.c:389 + msgid "cannot change mode of resized locale archive" + msgstr "ne peut modifier les protections de l'archive des localisations dont la taille a changé" + +-#: locale/programs/locarchive.c:394 ++#: locale/programs/locarchive.c:397 + msgid "cannot rename new archive" + msgstr "ne peut changer le nom de la nouvelle archive" + +-#: locale/programs/locarchive.c:447 ++#: locale/programs/locarchive.c:450 + #, c-format + msgid "cannot open locale archive \"%s\"" + msgstr "ne peut ouvrir l'archive des localisations « %s »" + +-#: locale/programs/locarchive.c:452 ++#: locale/programs/locarchive.c:455 + #, c-format + msgid "cannot stat locale archive \"%s\"" + msgstr "ne peut évaluer par `stat' l'archive des localisations « %s »" + +-#: locale/programs/locarchive.c:471 ++#: locale/programs/locarchive.c:474 + #, c-format + msgid "cannot lock locale archive \"%s\"" + msgstr "ne peut verrouiller l'archive des localisations « %s »" + +-#: locale/programs/locarchive.c:494 ++#: locale/programs/locarchive.c:497 + msgid "cannot read archive header" + msgstr "ne peut lire l'en-tête de l'archive" + +-#: locale/programs/locarchive.c:554 ++#: locale/programs/locarchive.c:557 + #, c-format + msgid "locale '%s' already exists" + msgstr "localisation « %s » existe déjà" + +-#: locale/programs/locarchive.c:784 locale/programs/locarchive.c:799 +-#: locale/programs/locarchive.c:811 locale/programs/locarchive.c:823 ++#: locale/programs/locarchive.c:788 locale/programs/locarchive.c:803 ++#: locale/programs/locarchive.c:815 locale/programs/locarchive.c:827 + #: locale/programs/locfile.c:343 + msgid "cannot add to locale archive" + msgstr "ne peut l'ajouter à l'archive des localisations" + +-#: locale/programs/locarchive.c:976 ++#: locale/programs/locarchive.c:982 + #, c-format + msgid "locale alias file `%s' not found" + msgstr "alias du fichier des localisations « %s » non trouvé" + +-#: locale/programs/locarchive.c:1118 ++#: locale/programs/locarchive.c:1126 + #, c-format + msgid "Adding %s\n" + msgstr "Ajout de %s\n" + +-#: locale/programs/locarchive.c:1124 ++#: locale/programs/locarchive.c:1132 + #, c-format + msgid "stat of \"%s\" failed: %s: ignored" + msgstr "échec d'évaluation par stat() de « %s »: %s: ignoré" + +-#: locale/programs/locarchive.c:1130 ++#: locale/programs/locarchive.c:1138 + #, c-format + msgid "\"%s\" is no directory; ignored" + msgstr "« %s » n'est pas un répertoire; ignoré" + +-#: locale/programs/locarchive.c:1137 ++#: locale/programs/locarchive.c:1145 + #, c-format + msgid "cannot open directory \"%s\": %s: ignored" + msgstr "ne peut ouvrir le répertoire « %s »: %s: ignoré" + +-#: locale/programs/locarchive.c:1209 ++#: locale/programs/locarchive.c:1217 + #, c-format + msgid "incomplete set of locale files in \"%s\"" + msgstr "jeu incomplet de fichiers dea localisations dans « %s »" + +-#: locale/programs/locarchive.c:1273 ++#: locale/programs/locarchive.c:1281 + #, c-format + msgid "cannot read all files in \"%s\": ignored" + msgstr "ne peut lire tous les fichiers dans « %s »: ignoré" + +-#: locale/programs/locarchive.c:1343 ++#: locale/programs/locarchive.c:1351 + #, c-format + msgid "locale \"%s\" not in archive" + msgstr "localisation « %s » n'est pas dans l'archive" +@@ -1666,8 +1666,8 @@ + "La limite supérieure de l'intervalle n'est pas plus petite\n" + "que la limite inférieure." + +-#: locale/programs/xmalloc.c:70 malloc/obstack.c:500 malloc/obstack.c:503 +-#: posix/getconf.c:996 ++#: locale/programs/xmalloc.c:70 malloc/obstack.c:505 malloc/obstack.c:508 ++#: posix/getconf.c:1002 + msgid "memory exhausted" + msgstr "Mémoire épuisée" + +@@ -1693,7 +1693,7 @@ + msgid "Another string for testing." + msgstr "Une autre chaîne pour fins de test." + +-#: catgets/gencat.c:111 catgets/gencat.c:115 nscd/nscd.c:79 ++#: catgets/gencat.c:111 catgets/gencat.c:115 nscd/nscd.c:84 + msgid "NAME" + msgstr "NOM" + +@@ -1737,7 +1737,7 @@ + msgid "duplicate set definition" + msgstr "Double définitions de jeux" + +-#: catgets/gencat.c:446 catgets/gencat.c:619 catgets/gencat.c:648 ++#: catgets/gencat.c:446 catgets/gencat.c:623 catgets/gencat.c:677 + msgid "this is the first definition" + msgstr "Ceci est la première définition." + +@@ -1755,44 +1755,44 @@ + msgid "unknown directive `%s': line ignored" + msgstr "Directive inconnue « %s »: ligne ignorée" + +-#: catgets/gencat.c:617 ++#: catgets/gencat.c:621 + msgid "duplicated message number" + msgstr "Double messages du numéro" + +-#: catgets/gencat.c:645 ++#: catgets/gencat.c:674 + msgid "duplicated message identifier" + msgstr "Double identificateurs de message" + +-#: catgets/gencat.c:702 ++#: catgets/gencat.c:731 + msgid "invalid character: message ignored" + msgstr "Caractères invalide: message ignoré" + +-#: catgets/gencat.c:745 ++#: catgets/gencat.c:774 + msgid "invalid line" + msgstr "Ligne invalide" + +-#: catgets/gencat.c:799 ++#: catgets/gencat.c:828 + msgid "malformed line ignored" + msgstr "Ligne incorrecte ignorée" + +-#: catgets/gencat.c:963 catgets/gencat.c:1004 ++#: catgets/gencat.c:992 catgets/gencat.c:1033 + #, c-format + msgid "cannot open output file `%s'" + msgstr "Ne peut ouvrir le fichier de sortie « %s »" + +-#: catgets/gencat.c:1188 ++#: catgets/gencat.c:1217 + msgid "unterminated message" + msgstr "Message incomplet" + +-#: catgets/gencat.c:1212 ++#: catgets/gencat.c:1241 + msgid "while opening old catalog file" + msgstr "lors de l'ouverture du vieux fichier du catalogue" + +-#: catgets/gencat.c:1303 ++#: catgets/gencat.c:1332 + msgid "conversion modules not available" + msgstr "Module de conversion 'est pas disponible" + +-#: catgets/gencat.c:1329 ++#: catgets/gencat.c:1358 + msgid "cannot determine escape character" + msgstr "Ne peut déterminer une séquence de caractère" + +@@ -1800,7 +1800,7 @@ + msgid "makecontext: does not know how to handle more than 8 arguments\n" + msgstr "makecontext: ne sait pas comment traiter plus de 8 arguments\n" + +-#: stdio-common/../sysdeps/gnu/errlist.c:12 posix/regcomp.c:178 ++#: stdio-common/../sysdeps/gnu/errlist.c:12 posix/regcomp.c:133 + #: nis/nis_error.c:29 nis/ypclnt.c:787 nis/ypclnt.c:861 + msgid "Success" + msgstr "Succès" +@@ -2989,23 +2989,23 @@ + msgid "%s%sUnknown signal %d\n" + msgstr "%s%ssignal inconnu %d.\n" + +-#: malloc/mcheck.c:296 ++#: malloc/mcheck.c:346 + msgid "memory is consistent, library is buggy\n" + msgstr "La mémoire est consistente, la librairie est fautive.\n" + +-#: malloc/mcheck.c:299 ++#: malloc/mcheck.c:349 + msgid "memory clobbered before allocated block\n" + msgstr "Mémoire écrasée avant le bloc alloué\n" + +-#: malloc/mcheck.c:302 ++#: malloc/mcheck.c:352 + msgid "memory clobbered past end of allocated block\n" + msgstr "Mémoire écrasée après la fin du bloc alloué\n" + +-#: malloc/mcheck.c:305 ++#: malloc/mcheck.c:355 + msgid "block freed twice\n" + msgstr "Bloc libéré deux fois\n" + +-#: malloc/mcheck.c:308 ++#: malloc/mcheck.c:358 + msgid "bogus mcheck_status, library is buggy\n" + msgstr "Statut de « mcheck_status » erroné, la librarie est erronée.\n" + +@@ -3041,6 +3041,10 @@ + msgid "DATAFILE [OUTFILE]" + msgstr "DATAFILE [FICHIER_DE_SORTIE]" + ++#: string/strerror.c:43 posix/../sysdeps/posix/gai_strerror.c:57 ++msgid "Unknown error" ++msgstr "Erreur inconnue" ++ + #: string/strsignal.c:69 + #, c-format + msgid "Real-time signal %d" +@@ -3065,7 +3069,7 @@ + msgid "%s: Memory exhausted: %s\n" + msgstr "%s: mémoire épuisée: %s\n" + +-#: timezone/zic.c:390 misc/error.c:120 ++#: timezone/zic.c:390 misc/error.c:127 misc/error.c:155 + msgid "Unknown system error" + msgstr "Erreur système inconnue" + +@@ -3465,25 +3469,21 @@ + msgid "Interrupted by a signal" + msgstr "Interrompu par un signal" + +-#: posix/../sysdeps/posix/gai_strerror.c:57 +-msgid "Unknown error" +-msgstr "Erreur inconnue" +- +-#: posix/getconf.c:883 ++#: posix/getconf.c:889 + #, c-format + msgid "Usage: %s [-v specification] variable_name [pathname]\n" + msgstr "Usage: %s [-v spécification] nom_de_variable [chemin_d_accès]\n" + +-#: posix/getconf.c:941 ++#: posix/getconf.c:947 + #, c-format + msgid "unknown specification \"%s\"" + msgstr "spécification inconnu « %s »" + +-#: posix/getconf.c:968 posix/getconf.c:984 ++#: posix/getconf.c:974 posix/getconf.c:990 + msgid "undefined" + msgstr "indéfini" + +-#: posix/getconf.c:1006 ++#: posix/getconf.c:1012 + #, c-format + msgid "Unrecognized variable `%s'" + msgstr "Variable non reconnue « %s »" +@@ -3545,71 +3545,71 @@ + msgid "%s: option `-W %s' doesn't allow an argument\n" + msgstr "%s: l'option « -W %s » ne permet pas d'argument\n" + +-#: posix/regcomp.c:181 ++#: posix/regcomp.c:136 + msgid "No match" + msgstr "Pas de concordance" + +-#: posix/regcomp.c:184 ++#: posix/regcomp.c:139 + msgid "Invalid regular expression" + msgstr "Expression régulière invalide" + +-#: posix/regcomp.c:187 ++#: posix/regcomp.c:142 + msgid "Invalid collation character" + msgstr "Caractère de fusionnement invalide" + +-#: posix/regcomp.c:190 ++#: posix/regcomp.c:145 + msgid "Invalid character class name" + msgstr "Nom de classe de caractères invalide" + +-#: posix/regcomp.c:193 ++#: posix/regcomp.c:148 + msgid "Trailing backslash" + msgstr "Barre oblique inverse en suffixe" + +-#: posix/regcomp.c:196 ++#: posix/regcomp.c:151 + msgid "Invalid back reference" + msgstr "Référence arrière invalide" + +-#: posix/regcomp.c:199 ++#: posix/regcomp.c:154 + msgid "Unmatched [ or [^" + msgstr "Échec du pairage de [ ou de [^" + +-#: posix/regcomp.c:202 ++#: posix/regcomp.c:157 + msgid "Unmatched ( or \\(" + msgstr "Échec du pairage de ( ou de \\(" + +-#: posix/regcomp.c:205 ++#: posix/regcomp.c:160 + msgid "Unmatched \\{" + msgstr "Échec du pairage de \\{" + +-#: posix/regcomp.c:208 ++#: posix/regcomp.c:163 + msgid "Invalid content of \\{\\}" + msgstr "Contenu invalide de \\{\\}" + +-#: posix/regcomp.c:211 ++#: posix/regcomp.c:166 + msgid "Invalid range end" + msgstr "Fin d'intervalle invalide" + +-#: posix/regcomp.c:214 ++#: posix/regcomp.c:169 + msgid "Memory exhausted" + msgstr "Mémoire épuisée" + +-#: posix/regcomp.c:217 ++#: posix/regcomp.c:172 + msgid "Invalid preceding regular expression" + msgstr "Expression régulière précédente invalide" + +-#: posix/regcomp.c:220 ++#: posix/regcomp.c:175 + msgid "Premature end of regular expression" + msgstr "Fin prématurée de l'expression régulière" + +-#: posix/regcomp.c:223 ++#: posix/regcomp.c:178 + msgid "Regular expression too big" + msgstr "Expression régulière trop grosse" + +-#: posix/regcomp.c:226 ++#: posix/regcomp.c:181 + msgid "Unmatched ) or \\)" + msgstr "Échec du pairage de ) ou de \\)" + +-#: posix/regcomp.c:673 ++#: posix/regcomp.c:615 + msgid "No previous regular expression" + msgstr "Aucune expression régulière précédente" + +@@ -3765,24 +3765,24 @@ + msgid "Service configuration to be used" + msgstr "Configuration de service à être utilisée" + +-#: nss/getent.c:136 nss/getent.c:305 ++#: nss/getent.c:136 nss/getent.c:308 + #, c-format + msgid "Enumeration not supported on %s\n" + msgstr "Énumération non supportée sur %s\n" + +-#: nss/getent.c:729 ++#: nss/getent.c:732 + msgid "getent - get entries from administrative database." + msgstr "getent() - obtenir les entrées de la base de données administratives" + +-#: nss/getent.c:730 ++#: nss/getent.c:733 + msgid "Supported databases:" + msgstr "Base de données supportées:" + +-#: nss/getent.c:787 nscd/nscd.c:119 nscd/nscd_nischeck.c:64 ++#: nss/getent.c:790 nscd/nscd.c:124 nscd/nscd_nischeck.c:64 + msgid "wrong number of arguments" + msgstr "Mauvais nombre d'arguments" + +-#: nss/getent.c:797 ++#: nss/getent.c:800 + #, c-format + msgid "Unknown database: %s\n" + msgstr "Base de données inconnue: « %s »\n" +@@ -3811,68 +3811,72 @@ + msgid "invalid pointer size" + msgstr "Taille de pointeur invalide" + +-#: inet/rcmd.c:174 inet/rcmd.c:177 ++#: inet/rcmd.c:163 inet/rcmd.c:166 ++msgid "rcmd: Cannot allocate memory\n" ++msgstr "rcmd: ne peut allouer de la mémoire\n" ++ ++#: inet/rcmd.c:185 inet/rcmd.c:188 + msgid "rcmd: socket: All ports in use\n" + msgstr "rcmd: socket: tous les ports sont occupés\n" + +-#: inet/rcmd.c:211 ++#: inet/rcmd.c:222 + #, c-format + msgid "connect to address %s: " + msgstr "Connexion établie à l'adresse %s: " + +-#: inet/rcmd.c:229 ++#: inet/rcmd.c:240 + #, c-format + msgid "Trying %s...\n" + msgstr "On tente %s...\n" + +-#: inet/rcmd.c:278 ++#: inet/rcmd.c:289 + #, c-format + msgid "rcmd: write (setting up stderr): %m\n" + msgstr "rcmd: écriture (configuration de stderr): %m\n" + +-#: inet/rcmd.c:299 ++#: inet/rcmd.c:310 + #, c-format + msgid "rcmd: poll (setting up stderr): %m\n" + msgstr "rcmd: poll (configuration de stderr): %m\n" + +-#: inet/rcmd.c:302 ++#: inet/rcmd.c:313 + msgid "poll: protocol failure in circuit setup\n" + msgstr "poll: échec du protocole dans la configuration du circuit\n" + +-#: inet/rcmd.c:346 ++#: inet/rcmd.c:358 + msgid "socket: protocol failure in circuit setup\n" + msgstr "socket: échec de protocole dans la configuration du circuit.\n" + +-#: inet/rcmd.c:368 ++#: inet/rcmd.c:387 + #, c-format + msgid "rcmd: %s: short read" + msgstr "rcmd: %s: lecture écourtée" + +-#: inet/rcmd.c:524 ++#: inet/rcmd.c:549 + msgid "lstat failed" + msgstr "Échec d'évaluation lstat()" + +-#: inet/rcmd.c:526 ++#: inet/rcmd.c:551 + msgid "not regular file" + msgstr "N'est pas un fichier régulier" + +-#: inet/rcmd.c:531 ++#: inet/rcmd.c:556 + msgid "cannot open" + msgstr "Ne peut ouvrir" + +-#: inet/rcmd.c:533 ++#: inet/rcmd.c:558 + msgid "fstat failed" + msgstr "Échec d'évaluation fstat()" + +-#: inet/rcmd.c:535 ++#: inet/rcmd.c:560 + msgid "bad owner" + msgstr "Mauvais propriétaire" + +-#: inet/rcmd.c:537 ++#: inet/rcmd.c:562 + msgid "writeable by other than owner" + msgstr "accessible en écriture par d'autres que le propriétaire" + +-#: inet/rcmd.c:539 ++#: inet/rcmd.c:564 + msgid "hard linked somewhere" + msgstr "lien direct rencontré" + +@@ -4083,109 +4087,109 @@ + msgid "Cannot receive reply to broadcast" + msgstr "Ne peut recevoir l'accusé réception à la requête faite par diffusion" + +-#: sunrpc/rpc_main.c:289 ++#: sunrpc/rpc_main.c:288 + #, c-format + msgid "%s: output would overwrite %s\n" + msgstr "%s: la sortie écraserait %s\n" + +-#: sunrpc/rpc_main.c:296 ++#: sunrpc/rpc_main.c:295 + #, c-format + msgid "%s: unable to open %s: %m\n" + msgstr "%s: incapable d'ouvrir %s: %m\n" + +-#: sunrpc/rpc_main.c:308 ++#: sunrpc/rpc_main.c:307 + #, c-format + msgid "%s: while writing output %s: %m" + msgstr "%s: lors de l'écriture sur la sortie %s: %m" + +-#: sunrpc/rpc_main.c:343 ++#: sunrpc/rpc_main.c:342 + #, c-format + msgid "cannot find C preprocessor: %s \n" + msgstr "Ne peut trouver le préprocesseur C: %s\n" + +-#: sunrpc/rpc_main.c:351 ++#: sunrpc/rpc_main.c:350 + msgid "cannot find any C preprocessor (cpp)\n" + msgstr "Ne peut trouver un préprocesseur C (cpp)\n" + +-#: sunrpc/rpc_main.c:420 ++#: sunrpc/rpc_main.c:419 + #, c-format + msgid "%s: C preprocessor failed with signal %d\n" + msgstr "%s: échec du préprocesseur C -- code de terminaison: %d\n" + +-#: sunrpc/rpc_main.c:423 ++#: sunrpc/rpc_main.c:422 + #, c-format + msgid "%s: C preprocessor failed with exit code %d\n" + msgstr "%s: échec du préprocesseur C -- code de terminaison: %d\n" + +-#: sunrpc/rpc_main.c:463 ++#: sunrpc/rpc_main.c:462 + #, c-format + msgid "illegal nettype :`%s'\n" + msgstr "« nettype » illégal :« %s »\n" + +-#: sunrpc/rpc_main.c:1105 ++#: sunrpc/rpc_main.c:1104 + msgid "rpcgen: too many defines\n" + msgstr "rpcgen: trop de définitions\n" + +-#: sunrpc/rpc_main.c:1117 ++#: sunrpc/rpc_main.c:1116 + msgid "rpcgen: arglist coding error\n" + msgstr "rpcgen: erreur dans la liste d'arguments de codage\n" + + #. TRANS: the file will not be removed; this is an + #. TRANS: informative message. +-#: sunrpc/rpc_main.c:1150 ++#: sunrpc/rpc_main.c:1149 + #, c-format + msgid "file `%s' already exists and may be overwritten\n" + msgstr "Le fichier « %s » existe déjà et peut avoir été écrasé.\n" + +-#: sunrpc/rpc_main.c:1195 ++#: sunrpc/rpc_main.c:1194 + msgid "Cannot specify more than one input file!\n" + msgstr "Ne peut spécifier plus d'un fichier d'entrée!\n" + +-#: sunrpc/rpc_main.c:1365 ++#: sunrpc/rpc_main.c:1364 + msgid "This implementation doesn't support newstyle or MT-safe code!\n" + msgstr "Cette implantation ne supporte pas le nouveau style ou le code MT-safe!\n" + +-#: sunrpc/rpc_main.c:1374 ++#: sunrpc/rpc_main.c:1373 + msgid "Cannot use netid flag with inetd flag!\n" + msgstr "Ne utiliser le sémaphore « netid » avec le sémaphore « inetd »!\n" + +-#: sunrpc/rpc_main.c:1386 ++#: sunrpc/rpc_main.c:1385 + msgid "Cannot use netid flag without TIRPC!\n" + msgstr "Ne peut utiliser le sémaphore « netid » sans « TIRPC »!\n" + +-#: sunrpc/rpc_main.c:1393 ++#: sunrpc/rpc_main.c:1392 + msgid "Cannot use table flags with newstyle!\n" + msgstr "Ne peut utiliser la table des sémaphores avec « newstyle »!\n" + +-#: sunrpc/rpc_main.c:1412 ++#: sunrpc/rpc_main.c:1411 + msgid "\"infile\" is required for template generation flags.\n" + msgstr "\"fichier_d_entrée\" est requis pour la génération du gabarit des indicateurs.\n" + +-#: sunrpc/rpc_main.c:1417 ++#: sunrpc/rpc_main.c:1416 + msgid "Cannot have more than one file generation flag!\n" + msgstr "Ne peut avoir plus d'un fichier de génération de sémaphores!\n" + +-#: sunrpc/rpc_main.c:1426 ++#: sunrpc/rpc_main.c:1425 + #, c-format + msgid "usage: %s infile\n" + msgstr "usage: %s fichier_d_entrée\n" + +-#: sunrpc/rpc_main.c:1427 ++#: sunrpc/rpc_main.c:1426 + #, c-format + msgid "\t%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile\n" + msgstr "\t%s [-abkCLNTM][-Dname[=valeur]] [-i taille] [-I [-K secondes]] [-Y chemin] fichier\n" + +-#: sunrpc/rpc_main.c:1429 ++#: sunrpc/rpc_main.c:1428 + #, 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 fichier_de_sortie] [fichier_d_entrée]\n" + +-#: sunrpc/rpc_main.c:1431 ++#: sunrpc/rpc_main.c:1430 + #, c-format + msgid "\t%s [-s nettype]* [-o outfile] [infile]\n" + msgstr "\t%s [-s type_réseau]* [-o fichier_de_sortie] [fichier_d_entrée]\n" + +-#: sunrpc/rpc_main.c:1432 ++#: sunrpc/rpc_main.c:1431 + #, c-format + msgid "\t%s [-n netid]* [-o outfile] [infile]\n" + msgstr "\t%s [-n id_réseau]* [-o fichier_de_sortie] [fichier_d_entrée]\n" +@@ -5042,7 +5046,7 @@ + msgid "while allocating hash table entry" + msgstr "lors de l'allocation d'entrées dans la table de hachage" + +-#: nscd/cache.c:150 nscd/connections.c:185 ++#: nscd/cache.c:150 nscd/connections.c:187 + #, c-format + msgid "cannot stat() file `%s': %s" + msgstr "Ne peut évaluer par stat() le fichier « %s »: %s" +@@ -5055,153 +5059,158 @@ + msgid "Cannot run nscd in secure mode as unprivileged user" + msgstr "Ne peut exécuter nscd en mode sécuritaire en tant qu'usager sans privilège" + +-#: nscd/connections.c:199 ++#: nscd/connections.c:175 ++#, c-format ++msgid "while allocating cache: %s" ++msgstr "lors de l'allocation de la cache: %s" ++ ++#: nscd/connections.c:200 + #, c-format + msgid "cannot open socket: %s" + msgstr "Ne peut ouvrir le socket: « %s »" + +-#: nscd/connections.c:217 ++#: nscd/connections.c:218 + #, c-format + msgid "cannot enable socket to accept connections: %s" + msgstr "Ne peut activer le socket pour accepter des connexions: %s" + +-#: nscd/connections.c:259 ++#: nscd/connections.c:260 + #, c-format + msgid "handle_request: request received (Version = %d)" + msgstr "handle_request: requête reçue (Version = %d)" + +-#: nscd/connections.c:265 ++#: nscd/connections.c:266 + #, c-format + msgid "cannot handle old request version %d; current version is %d" + msgstr "Ne peut traiter une requête d'une vieille version %d; la version courante est %d" + +-#: nscd/connections.c:303 nscd/connections.c:325 ++#: nscd/connections.c:304 nscd/connections.c:326 + #, c-format + msgid "cannot write result: %s" + msgstr "Ne peut écrire les résultats: « %s »" + +-#: nscd/connections.c:404 nscd/connections.c:498 ++#: nscd/connections.c:405 nscd/connections.c:499 + #, c-format + msgid "error getting callers id: %s" + msgstr "erreur lors de la recherche de l'identificateur de l'appelant: %s" + +-#: nscd/connections.c:470 ++#: nscd/connections.c:471 + #, c-format + msgid "while accepting connection: %s" + msgstr "lors de l'acceptation de connexion: %s" + +-#: nscd/connections.c:481 ++#: nscd/connections.c:482 + #, c-format + msgid "short read while reading request: %s" + msgstr "Lecture écourtée lors de la lecture de la requête: « %s »" + +-#: nscd/connections.c:517 ++#: nscd/connections.c:518 + #, c-format + msgid "key length in request too long: %d" + msgstr "La longueur de la clé de la requête est trop longue: %d" + +-#: nscd/connections.c:531 ++#: nscd/connections.c:532 + #, c-format + msgid "short read while reading request key: %s" + msgstr "Lecture écourtée lors de la lecture de la clé de requête: %s" + +-#: nscd/connections.c:590 nscd/connections.c:591 nscd/connections.c:610 +-#: nscd/connections.c:623 nscd/connections.c:629 nscd/connections.c:636 ++#: nscd/connections.c:591 nscd/connections.c:592 nscd/connections.c:611 ++#: nscd/connections.c:624 nscd/connections.c:630 nscd/connections.c:637 + #, c-format + msgid "Failed to run nscd as user '%s'" + msgstr "Échec d'exécution de nscd en tant qu'usager « %s »" + +-#: nscd/connections.c:611 ++#: nscd/connections.c:612 + msgid "getgrouplist failed" + msgstr "échec de getgrouplist" + +-#: nscd/connections.c:624 ++#: nscd/connections.c:625 + msgid "setgroups failed" + msgstr "échec de setgroups" + +-#: nscd/grpcache.c:102 nscd/hstcache.c:110 nscd/pwdcache.c:108 ++#: nscd/grpcache.c:103 nscd/hstcache.c:111 nscd/pwdcache.c:109 + msgid "while allocating key copy" + msgstr "lors de l'allocation d'une copie de clé" + +-#: nscd/grpcache.c:152 nscd/hstcache.c:167 nscd/pwdcache.c:145 ++#: nscd/grpcache.c:153 nscd/hstcache.c:168 nscd/pwdcache.c:146 + msgid "while allocating cache entry" + msgstr "lors de l'allocation d'entrée dans la cache" + +-#: nscd/grpcache.c:195 nscd/hstcache.c:281 nscd/pwdcache.c:191 ++#: nscd/grpcache.c:196 nscd/hstcache.c:282 nscd/pwdcache.c:192 + #, c-format + msgid "short write in %s: %s" + msgstr "Écriture écourtée dans %s: %s" + +-#: nscd/grpcache.c:217 ++#: nscd/grpcache.c:218 + #, c-format + msgid "Haven't found \"%s\" in group cache!" + msgstr "N'a pas trouvé « %s » dans la cache du groupe!" + +-#: nscd/grpcache.c:292 ++#: nscd/grpcache.c:284 + #, c-format + msgid "Invalid numeric gid \"%s\"!" + msgstr "gid numérique invalide « %s »!" + +-#: nscd/grpcache.c:299 ++#: nscd/grpcache.c:291 + #, c-format + msgid "Haven't found \"%d\" in group cache!" + msgstr "N'a pas trouvé « %d » dans la cache du groupe!" + +-#: nscd/hstcache.c:303 nscd/hstcache.c:378 nscd/hstcache.c:456 +-#: nscd/hstcache.c:533 ++#: nscd/hstcache.c:304 nscd/hstcache.c:370 nscd/hstcache.c:435 ++#: nscd/hstcache.c:500 + #, c-format + msgid "Haven't found \"%s\" in hosts cache!" + msgstr "N'a pas trouvé « %s » dans la cache de la liste des hôtes!" + +-#: nscd/nscd.c:80 ++#: nscd/nscd.c:85 + msgid "Read configuration data from NAME" + msgstr "Lire les données de configuration du NOM" + +-#: nscd/nscd.c:82 ++#: nscd/nscd.c:87 + msgid "Do not fork and display messages on the current tty" + msgstr "Ne pas cloner le processus par fork() et ne pas afficher de message sur le tty courant" + +-#: nscd/nscd.c:83 ++#: nscd/nscd.c:88 + msgid "NUMBER" + msgstr "NUMÉRO" + +-#: nscd/nscd.c:83 ++#: nscd/nscd.c:88 + msgid "Start NUMBER threads" + msgstr "Démarrage du NOMBRE de « threads »" + +-#: nscd/nscd.c:84 ++#: nscd/nscd.c:89 + msgid "Shut the server down" + msgstr "Arrêter le serveur" + +-#: nscd/nscd.c:85 ++#: nscd/nscd.c:90 + msgid "Print current configuration statistic" + msgstr "Afficher les statistiques de la configuration courante" + +-#: nscd/nscd.c:86 ++#: nscd/nscd.c:91 + msgid "TABLE" + msgstr "TABLE" + +-#: nscd/nscd.c:87 ++#: nscd/nscd.c:92 + msgid "Invalidate the specified cache" + msgstr "Invalide la cache spécifiée" + +-#: nscd/nscd.c:88 ++#: nscd/nscd.c:93 + msgid "TABLE,yes" + msgstr "TABLE,oui" + +-#: nscd/nscd.c:88 ++#: nscd/nscd.c:93 + msgid "Use separate cache for each user" + msgstr "Utiliser une cache séparée pour chaque usager" + +-#: nscd/nscd.c:93 ++#: nscd/nscd.c:98 + msgid "Name Service Cache Daemon." + msgstr "« Daemon » de la cache du service de noms" + +-#: nscd/nscd.c:126 ++#: nscd/nscd.c:131 + msgid "already running" + msgstr "déjà en exécution" + +-#: nscd/nscd.c:192 nscd/nscd.c:212 nscd/nscd.c:218 ++#: nscd/nscd.c:243 nscd/nscd.c:263 nscd/nscd.c:269 + msgid "Only root is allowed to use this option!" + msgstr "Seul ROOT est autorisé à utiliser cette option!" + +@@ -5291,22 +5300,22 @@ + "%15ld%% taux de repérage\n" + "%15s vérifier /etc/%s pour les changements\n" + +-#: nscd/pwdcache.c:213 ++#: nscd/pwdcache.c:214 + #, c-format + msgid "Haven't found \"%s\" in password cache!" + msgstr "N'a pas trouvé « %s » dans la cache des mots de passe!" + +-#: nscd/pwdcache.c:288 ++#: nscd/pwdcache.c:280 + #, c-format + msgid "Invalid numeric uid \"%s\"!" + msgstr "uid numérique invalide « %s »!" + +-#: nscd/pwdcache.c:295 ++#: nscd/pwdcache.c:287 + #, c-format + msgid "Haven't found \"%d\" in password cache!" + msgstr "N'a pas trouvé « %d » dans la cache des mots de passe!" + +-#: elf/../sysdeps/generic/dl-sysdep.c:297 ++#: elf/../sysdeps/generic/dl-sysdep.c:357 + msgid "cannot create capability list" + msgstr "Ne peut créer une liste des possibilités" + +@@ -5357,7 +5366,7 @@ + msgid ", OS ABI: %s %d.%d.%d" + msgstr ", ABI Système d'exploitation: %s %d.%d.%d" + +-#: elf/cache.c:136 elf/ldconfig.c:1033 ++#: elf/cache.c:136 elf/ldconfig.c:1045 + #, c-format + msgid "Can't open cache file %s\n" + msgstr "Ne peut ouvrir le fichier de la cache %s\n" +@@ -5403,15 +5412,15 @@ + msgid "Renaming of %s to %s failed" + msgstr "ÉCHEC du changement de nom de %s vers %s" + +-#: elf/dl-close.c:113 ++#: elf/dl-close.c:128 + msgid "shared object not open" + msgstr "Objet partagé non ouvert" + +-#: elf/dl-close.c:357 elf/dl-open.c:436 ++#: elf/dl-close.c:486 elf/dl-open.c:444 + msgid "TLS generation counter wrapped! Please send report with the 'glibcbug' script." + msgstr "Compteut de génération TLS a bouclé! SVP expédier un rapport avec le script 'glibcbug'" + +-#: elf/dl-deps.c:111 elf/dl-open.c:177 ++#: elf/dl-deps.c:111 elf/dl-open.c:183 + msgid "DST not allowed in SUID/SGID programs" + msgstr "DST non permis dans un programme SUID/SGID" + +@@ -5428,181 +5437,193 @@ + msgid "cannot allocate dependency list" + msgstr "Ne peut allouer une liste de dépendances" + +-#: elf/dl-deps.c:492 elf/dl-deps.c:547 ++#: elf/dl-deps.c:494 elf/dl-deps.c:549 + msgid "cannot allocate symbol search list" + msgstr "Ne peut allouer la liste des symboles recherchées" + +-#: elf/dl-deps.c:532 ++#: elf/dl-deps.c:534 + msgid "Filters not supported with LD_TRACE_PRELINKING" + msgstr "Filtres non supportés avec LD_TRACE_PRELINKING" + +-#: elf/dl-error.c:73 ++#: elf/dl-error.c:75 + msgid "DYNAMIC LINKER BUG!!!" + msgstr "PROBLÈME DANS LE CHARGEUR DE LIENS DYNAMIQUES" + +-#: elf/dl-error.c:106 ++#: elf/dl-error.c:108 + msgid "error while loading shared libraries" + msgstr "erreur lors du chargement des librairies partagées" + +-#: elf/dl-load.c:338 ++#: elf/dl-load.c:339 + msgid "cannot allocate name record" + msgstr "Ne peut allouer une nom d'enregistrement" + +-#: elf/dl-load.c:440 elf/dl-load.c:520 elf/dl-load.c:614 elf/dl-load.c:709 ++#: elf/dl-load.c:441 elf/dl-load.c:520 elf/dl-load.c:612 elf/dl-load.c:707 + msgid "cannot create cache for search path" + msgstr "Ne peut créer une cache pour le chemin de recherche" + +-#: elf/dl-load.c:545 ++#: elf/dl-load.c:543 + msgid "cannot create RUNPATH/RPATH copy" + msgstr "Ne peut créer une copie RUNPATH/RPATH" + +-#: elf/dl-load.c:600 ++#: elf/dl-load.c:598 + msgid "cannot create search path array" + msgstr "Ne peut créer un tableau des chemins de recherche" + +-#: elf/dl-load.c:796 ++#: elf/dl-load.c:794 + msgid "cannot stat shared object" + msgstr "Échec évaluer par stat() l'objet partagé" + +-#: elf/dl-load.c:840 ++#: elf/dl-load.c:838 + msgid "cannot open zero fill device" + msgstr "Ne peut ouvrir le fichier de périphérique rempli de zéros" + +-#: elf/dl-load.c:849 elf/dl-load.c:1855 ++#: elf/dl-load.c:847 elf/dl-load.c:1902 + msgid "cannot create shared object descriptor" + msgstr "Ne peut créer un objet descripteur partagé" + +-#: elf/dl-load.c:868 elf/dl-load.c:1351 elf/dl-load.c:1434 ++#: elf/dl-load.c:866 elf/dl-load.c:1398 elf/dl-load.c:1481 + msgid "cannot read file data" + msgstr "Ne peut lire le fichier de données" + +-#: elf/dl-load.c:908 ++#: elf/dl-load.c:906 + msgid "ELF load command alignment not page-aligned" + msgstr "Commande de chargement sur une page ELF qui n'est pas alignée" + +-#: elf/dl-load.c:915 ++#: elf/dl-load.c:913 + msgid "ELF load command address/offset not properly aligned" + msgstr "Commande de chargement sur une adresse ELF incorrectement alignée" + +-#: elf/dl-load.c:996 ++#: elf/dl-load.c:988 ++msgid "cannot allocate TLS data structures for initial thread" ++msgstr "ne peut allouer une structure de données TLS pour un thread initial" ++ ++#: elf/dl-load.c:1012 ++msgid "cannot handle TLS data" ++msgstr "ne peut traiter les données TLS" ++ ++#: elf/dl-load.c:1047 + msgid "failed to map segment from shared object" + msgstr "Échec d'adressage (mapping) du segement de l'objet partagé" + +-#: elf/dl-load.c:1020 ++#: elf/dl-load.c:1071 + msgid "cannot dynamically load executable" + msgstr "Ne peut dynamiquement charger un exécutable" + +-#: elf/dl-load.c:1081 ++#: elf/dl-load.c:1132 + msgid "cannot change memory protections" + msgstr "Ne peut modifier les protections de mémoire" + +-#: elf/dl-load.c:1100 ++#: elf/dl-load.c:1151 + msgid "cannot map zero-fill pages" + msgstr "Ne peut adresser des pages rempliez de zéros" + +-#: elf/dl-load.c:1118 ++#: elf/dl-load.c:1169 + msgid "cannot allocate memory for program header" + msgstr "Ne peut allouer de la mémoire pour une en-tête de programme" + +-#: elf/dl-load.c:1149 ++#: elf/dl-load.c:1200 + msgid "object file has no dynamic section" + msgstr "Le fichier objet n'a pas de section dynamique" + +-#: elf/dl-load.c:1193 ++#: elf/dl-load.c:1240 + msgid "shared object cannot be dlopen()ed" + msgstr "L'objet partagé ne peut pas être ouvert via dlopen()" + +-#: elf/dl-load.c:1216 ++#: elf/dl-load.c:1263 + msgid "cannot create searchlist" + msgstr "Ne peut créer une liste de recherche" + +-#: elf/dl-load.c:1351 ++#: elf/dl-load.c:1398 + msgid "file too short" + msgstr "Fichier trop court" + +-#: elf/dl-load.c:1374 ++#: elf/dl-load.c:1421 + msgid "invalid ELF header" + msgstr "En-tête ELF invalide" + +-#: elf/dl-load.c:1383 ++#: elf/dl-load.c:1430 + msgid "ELF file data encoding not big-endian" + msgstr "Données d'encodage du fichier ELF n'est pas big-endian" + +-#: elf/dl-load.c:1385 ++#: elf/dl-load.c:1432 + msgid "ELF file data encoding not little-endian" + msgstr "Données d'encodage du fichier ELF n'est pas little-endian" + +-#: elf/dl-load.c:1389 ++#: elf/dl-load.c:1436 + msgid "ELF file version ident does not match current one" + msgstr "Identificateur de version du fichier ELF ne concorde pas avec la version courante" + +-#: elf/dl-load.c:1393 ++#: elf/dl-load.c:1440 + msgid "ELF file OS ABI invalid" + msgstr "Système d'exploitation du fichier ELF ABI invalide" + +-#: elf/dl-load.c:1395 ++#: elf/dl-load.c:1442 + msgid "ELF file ABI version invalid" + msgstr "Version du fichier ELF ABI invalide" + +-#: elf/dl-load.c:1398 ++#: elf/dl-load.c:1445 + msgid "internal error" + msgstr "Erreur interne" + +-#: elf/dl-load.c:1405 ++#: elf/dl-load.c:1452 + msgid "ELF file version does not match current one" + msgstr "Version du fichier ELF ne concorde pas avec la version courante" + +-#: elf/dl-load.c:1413 ++#: elf/dl-load.c:1460 + msgid "ELF file's phentsize not the expected size" + msgstr "« Phentize » du fichier ELF ne concorde pas avec la taille prévue" + +-#: elf/dl-load.c:1419 ++#: elf/dl-load.c:1466 + msgid "only ET_DYN and ET_EXEC can be loaded" + msgstr "Seuls ET_DYN et ET_EXEC peuvent être chargés" + +-#: elf/dl-load.c:1870 ++#: elf/dl-load.c:1917 + msgid "cannot open shared object file" + msgstr "Ne peut ouvrir le fichier d'objet partagé" + +-#: elf/dl-lookup.c:248 elf/dl-lookup.c:413 ++#: elf/dl-lookup.c:265 elf/dl-lookup.c:430 + msgid "relocation error" + msgstr "erreur de relocalisation" + +-#: elf/dl-open.c:105 ++#: elf/dl-open.c:111 + msgid "cannot extend global scope" + msgstr "Ne peut augmenter l'étendue de la plage" + +-#: elf/dl-open.c:208 ++#: elf/dl-open.c:214 + msgid "empty dynamic string token substitution" + msgstr "La chaîne dynamique d'un jeton de substition est vide." + +-#: elf/dl-open.c:345 elf/dl-open.c:356 ++#: elf/dl-open.c:351 elf/dl-open.c:362 + msgid "cannot create scope list" + msgstr "ne peut créer une liste d'étendue" + +-#: elf/dl-open.c:416 ++#: elf/dl-open.c:424 + msgid "cannot create TLS data structures" + msgstr "ne peut créer les structures de données TLS" + +-#: elf/dl-open.c:478 ++#: elf/dl-open.c:486 + msgid "invalid mode for dlopen()" + msgstr "mode invalide pour dlopen()" + +-#: elf/dl-reloc.c:88 ++#: elf/dl-reloc.c:58 ++msgid "shared object cannot be dlopen()ed: static TLS memory too small" ++msgstr "l'objet partagé ne peut pas être ouvert via dlopen(): mémoire statiques TLS trop petite" ++ ++#: elf/dl-reloc.c:118 + msgid "cannot make segment writable for relocation" + msgstr "Ne peut rendre le segment inscritible lors d'une relocalisation" + +-#: elf/dl-reloc.c:174 ++#: elf/dl-reloc.c:219 + #, c-format + msgid "%s: profiler found no PLTREL in object %s\n" + msgstr "%s: profileur n'a repéré aucun PLTREL dans l'objet %s\n" + +-#: elf/dl-reloc.c:186 ++#: elf/dl-reloc.c:231 + #, c-format + msgid "%s: profiler out of memory shadowing PLTREL of %s\n" + msgstr "%s: profileur mémoire épuisée par l'ombrage PLTREL de %s\n" + +-#: elf/dl-reloc.c:201 ++#: elf/dl-reloc.c:246 + msgid "cannot restore segment prot after reloc" + msgstr "ne peut restaurer le segment prot après reloc" + +@@ -5658,119 +5679,119 @@ + msgid "Configure Dynamic Linker Run Time Bindings." + msgstr "Configuration dynamique des éditions de liens lors de l'exécution" + +-#: elf/ldconfig.c:282 ++#: elf/ldconfig.c:294 + #, c-format + msgid "Path `%s' given more than once" + msgstr "Chemin « %s » donné plus d'une fois" + +-#: elf/ldconfig.c:326 ++#: elf/ldconfig.c:338 + #, c-format + msgid "%s is not a known library type" + msgstr "%s n'est pas un type de librairie connue" + +-#: elf/ldconfig.c:344 ++#: elf/ldconfig.c:356 + #, c-format + msgid "Can't stat %s" + msgstr "Ne peut évaluer par stat %s" + +-#: elf/ldconfig.c:414 ++#: elf/ldconfig.c:426 + #, c-format + msgid "Can't stat %s\n" + msgstr "Ne peut évaluer par stat %s\n" + +-#: elf/ldconfig.c:424 ++#: elf/ldconfig.c:436 + #, c-format + msgid "%s is not a symbolic link\n" + msgstr "%s n,est pas un lien symbolique\n" + +-#: elf/ldconfig.c:443 ++#: elf/ldconfig.c:455 + #, c-format + msgid "Can't unlink %s" + msgstr "Ne peut enlever le lien (unlink) %s" + +-#: elf/ldconfig.c:449 ++#: elf/ldconfig.c:461 + #, c-format + msgid "Can't link %s to %s" + msgstr "Ne peut établir un lien entre %s et %s" + +-#: elf/ldconfig.c:455 ++#: elf/ldconfig.c:467 + msgid " (changed)\n" + msgstr " (a été modifié)\n" + +-#: elf/ldconfig.c:457 ++#: elf/ldconfig.c:469 + msgid " (SKIPPED)\n" + msgstr " (ESCAMOTÉ)\n" + +-#: elf/ldconfig.c:512 ++#: elf/ldconfig.c:524 + #, c-format + msgid "Can't find %s" + msgstr "Ne peut repérer %s" + +-#: elf/ldconfig.c:528 ++#: elf/ldconfig.c:540 + #, c-format + msgid "Can't lstat %s" + msgstr "Ne peut évaluer par lstat %s" + +-#: elf/ldconfig.c:535 ++#: elf/ldconfig.c:547 + #, c-format + msgid "Ignored file %s since it is not a regular file." + msgstr "Ignorer le fichier %s étant donné que ce n'est pas un fichier régulier" + +-#: elf/ldconfig.c:543 ++#: elf/ldconfig.c:555 + #, c-format + msgid "No link created since soname could not be found for %s" + msgstr "Aucun lien créé étant donné qu'il n'a pas été repéré pour %s" + +-#: elf/ldconfig.c:634 ++#: elf/ldconfig.c:646 + #, c-format + msgid "Can't open directory %s" + msgstr "Ne peut ouvrir le répertoire %s" + +-#: elf/ldconfig.c:689 elf/ldconfig.c:736 ++#: elf/ldconfig.c:701 elf/ldconfig.c:748 + #, c-format + msgid "Cannot lstat %s" + msgstr "Ne peut évaluer par lstat %s" + +-#: elf/ldconfig.c:701 ++#: elf/ldconfig.c:713 + #, c-format + msgid "Cannot stat %s" + msgstr "Ne peut évaluer par stat %s" + +-#: elf/ldconfig.c:758 elf/readlib.c:93 ++#: elf/ldconfig.c:770 elf/readlib.c:93 + #, c-format + msgid "Input file %s not found.\n" + msgstr "Fichier d'entrée %s non repéré\n" + +-#: elf/ldconfig.c:792 ++#: elf/ldconfig.c:804 + #, c-format + msgid "libc5 library %s in wrong directory" + msgstr "librairie libc5 %s est dans le mauvais répertoire" + +-#: elf/ldconfig.c:795 ++#: elf/ldconfig.c:807 + #, c-format + msgid "libc6 library %s in wrong directory" + msgstr "librairie libc6 %s est dans el mauvais répertoire" + +-#: elf/ldconfig.c:798 ++#: elf/ldconfig.c:810 + #, c-format + msgid "libc4 library %s in wrong directory" + msgstr "librairie libc4 %s est dans le mauvais répertoire" + +-#: elf/ldconfig.c:825 ++#: elf/ldconfig.c:837 + #, c-format + msgid "libraries %s and %s in directory %s have same soname but different type." + msgstr "Les librairies %s et %s du répertoire %s ont le même nom mais sont de types différents" + +-#: elf/ldconfig.c:928 ++#: elf/ldconfig.c:940 + #, c-format + msgid "Can't open configuration file %s" + msgstr "Ne peut ouvrir le fichier de configuration %s" + +-#: elf/ldconfig.c:1012 ++#: elf/ldconfig.c:1024 + msgid "Can't chdir to /" + msgstr "Ne peut se positionner (chdir) dans /" + +-#: elf/ldconfig.c:1054 ++#: elf/ldconfig.c:1066 + #, c-format + msgid "Can't open cache file directory %s\n" + msgstr "Ne peut ouvrir le fichier de la cache des répertoires %s\n" +Binary files glibc-2.3.2/po/gl.mo and glibc-2.3.2-200304020432/po/gl.mo differ +diff -u -udbrN glibc-2.3.2/po/gl.po glibc-2.3.2-200304020432/po/gl.po +--- glibc-2.3.2/po/gl.po Sat Oct 5 20:15:44 2002 ++++ glibc-2.3.2-200304020432/po/gl.po Mon Mar 3 20:35:16 2003 +@@ -4,9 +4,9 @@ + # + msgid "" + msgstr "" +-"Project-Id-Version: libc 2.3\n" +-"POT-Creation-Date: 2002-10-02 17:22-0700\n" +-"PO-Revision-Date: 2002-10-05 15:13+0200\n" ++"Project-Id-Version: libc 2.3.2\n" ++"POT-Creation-Date: 2003-02-22 15:34-0800\n" ++"PO-Revision-Date: 2003-03-03 20:13+0100\n" + "Last-Translator: Jacobo Tarrio \n" + "Language-Team: Galician \n" + "MIME-Version: 1.0\n" +@@ -259,8 +259,8 @@ + + #: iconv/iconv_prog.c:241 + #, c-format +-msgid "conversions from `%s' and to `%s' are not supported" +-msgstr "as conversións de `%s' a `%s' non están soportadas" ++msgid "conversion from `%s' and to `%s' are not supported" ++msgstr "as conversións de `%s' e a `%s' non están soportadas" + + #: iconv/iconv_prog.c:246 + #, c-format +@@ -285,15 +285,15 @@ + msgid "error while closing output file" + msgstr "erro ao pecha-lo ficheiro de saída" + +-#: iconv/iconv_prog.c:407 iconv/iconvconfig.c:355 locale/programs/locale.c:268 ++#: iconv/iconv_prog.c:407 iconv/iconvconfig.c:357 locale/programs/locale.c:274 + #: locale/programs/localedef.c:372 catgets/gencat.c:233 + #: malloc/memusagestat.c:602 debug/pcprofiledump.c:199 + msgid "Report bugs using the `glibcbug' script to .\n" + msgstr "Informe dos erros usando o script `glibcbug' a .\n" + +-#: iconv/iconv_prog.c:421 iconv/iconvconfig.c:369 locale/programs/locale.c:281 +-#: locale/programs/localedef.c:386 catgets/gencat.c:246 posix/getconf.c:904 +-#: nss/getent.c:74 nscd/nscd.c:279 nscd/nscd_nischeck.c:90 elf/ldconfig.c:259 ++#: iconv/iconv_prog.c:421 iconv/iconvconfig.c:371 locale/programs/locale.c:287 ++#: locale/programs/localedef.c:386 catgets/gencat.c:246 posix/getconf.c:910 ++#: nss/getent.c:74 nscd/nscd.c:330 nscd/nscd_nischeck.c:90 elf/ldconfig.c:271 + #: elf/sprof.c:349 + #, c-format + msgid "" +@@ -305,9 +305,9 @@ + "Isto é software libre; vexa o código fonte polas condicións de copia. NON hai\n" + "garantía; nin sequera de COMERCIABILIDADE ou APTITUDE PARA UN FIN DETERMINADO.\n" + +-#: iconv/iconv_prog.c:426 iconv/iconvconfig.c:374 locale/programs/locale.c:286 +-#: locale/programs/localedef.c:391 catgets/gencat.c:251 posix/getconf.c:909 +-#: nss/getent.c:79 nscd/nscd.c:284 nscd/nscd_nischeck.c:95 elf/ldconfig.c:264 ++#: iconv/iconv_prog.c:426 iconv/iconvconfig.c:376 locale/programs/locale.c:292 ++#: locale/programs/localedef.c:391 catgets/gencat.c:251 posix/getconf.c:915 ++#: nss/getent.c:79 nscd/nscd.c:335 nscd/nscd_nischeck.c:95 elf/ldconfig.c:276 + #: elf/sprof.c:355 + #, c-format + msgid "Written by %s.\n" +@@ -359,15 +359,15 @@ + msgid "Prefix used for all file accesses" + msgstr "Prefixo a empregar para tódolos accesos a ficheiro" + +-#: iconv/iconvconfig.c:325 locale/programs/localedef.c:292 ++#: iconv/iconvconfig.c:327 locale/programs/localedef.c:292 + msgid "no output file produced because warning were issued" + msgstr "non se producíu un ficheiro de saída porque se deron avisos" + +-#: iconv/iconvconfig.c:403 ++#: iconv/iconvconfig.c:405 + msgid "while inserting in search tree" + msgstr "ao inserir na árbore de busca" + +-#: iconv/iconvconfig.c:1202 ++#: iconv/iconvconfig.c:1204 + msgid "cannot generate output file" + msgstr "non se pode xera-lo ficheiro de saída" + +@@ -1277,7 +1277,7 @@ + msgid "unterminated symbolic name" + msgstr "nome simbólico non rematado" + +-#: locale/programs/linereader.c:537 catgets/gencat.c:1166 ++#: locale/programs/linereader.c:537 catgets/gencat.c:1195 + msgid "invalid escape sequence" + msgstr "secuencia de escape non válida" + +@@ -1307,39 +1307,39 @@ + msgid "trailing garbage at end of line" + msgstr "lixo na fin da liña" + +-#: locale/programs/locale.c:73 ++#: locale/programs/locale.c:75 + msgid "System information:" + msgstr "Información do sistema:" + +-#: locale/programs/locale.c:75 ++#: locale/programs/locale.c:77 + msgid "Write names of available locales" + msgstr "Escribi-los nomes dos `locales' dispoñibles" + +-#: locale/programs/locale.c:77 ++#: locale/programs/locale.c:79 + msgid "Write names of available charmaps" + msgstr "Escribi-los nomes dos mapas de caracteres dispoñibles" + +-#: locale/programs/locale.c:78 ++#: locale/programs/locale.c:80 + msgid "Modify output format:" + msgstr "Modifica-lo formato de saída:" + +-#: locale/programs/locale.c:79 ++#: locale/programs/locale.c:81 + msgid "Write names of selected categories" + msgstr "Escribi-los nomes das categorías seleccionadas" + +-#: locale/programs/locale.c:80 ++#: locale/programs/locale.c:82 + msgid "Write names of selected keywords" + msgstr "Escribi-los nomes das claves seleccionadas" + +-#: locale/programs/locale.c:81 ++#: locale/programs/locale.c:83 + msgid "Print more information" + msgstr "Amosar máis información" + +-#: locale/programs/locale.c:86 ++#: locale/programs/locale.c:88 + msgid "Get locale-specific information." + msgstr "Obter información específica do `locale'." + +-#: locale/programs/locale.c:89 ++#: locale/programs/locale.c:91 + msgid "" + "NAME\n" + "[-a|-m]" +@@ -1347,7 +1347,7 @@ + "NOME\n" + "[-a|-m]" + +-#: locale/programs/locale.c:488 ++#: locale/programs/locale.c:512 + msgid "while preparing output" + msgstr "ao prepara-la saída" + +@@ -1478,16 +1478,16 @@ + msgid "cannot create temporary file" + msgstr "non se pode crea-lo ficheiro temporal" + +-#: locale/programs/locarchive.c:118 locale/programs/locarchive.c:302 ++#: locale/programs/locarchive.c:118 locale/programs/locarchive.c:305 + msgid "cannot initialize archive file" + msgstr "non se pode inicializa-lo ficheiro de arquivo" + +-#: locale/programs/locarchive.c:125 locale/programs/locarchive.c:309 ++#: locale/programs/locarchive.c:125 locale/programs/locarchive.c:312 + msgid "cannot resize archive file" + msgstr "non se pode cambia-lo tamaño do ficheiro de arquivo" + +-#: locale/programs/locarchive.c:134 locale/programs/locarchive.c:318 +-#: locale/programs/locarchive.c:508 ++#: locale/programs/locarchive.c:134 locale/programs/locarchive.c:321 ++#: locale/programs/locarchive.c:511 + msgid "cannot map archive header" + msgstr "non se pode mapea-la cabeceira do arquivo" + +@@ -1503,88 +1503,88 @@ + msgid "cannot map locale archive file" + msgstr "non se pode mapea-lo ficheiro de arquivo de locales" + +-#: locale/programs/locarchive.c:326 ++#: locale/programs/locarchive.c:329 + msgid "cannot lock new archive" + msgstr "non se pode bloquea-lo novo arquivo" + +-#: locale/programs/locarchive.c:377 ++#: locale/programs/locarchive.c:380 + msgid "cannot extend locale archive file" + msgstr "non se pode extende-lo ficheiro de arquivo de locales" + +-#: locale/programs/locarchive.c:386 ++#: locale/programs/locarchive.c:389 + msgid "cannot change mode of resized locale archive" + msgstr "non se pode cambia-lo modo do arquivo de locales co novo tamaño" + +-#: locale/programs/locarchive.c:394 ++#: locale/programs/locarchive.c:397 + msgid "cannot rename new archive" + msgstr "non se pode renomea-lo novo arquivo" + +-#: locale/programs/locarchive.c:447 ++#: locale/programs/locarchive.c:450 + #, c-format + msgid "cannot open locale archive \"%s\"" + msgstr "non se pode abri-lo arquivo de locales \"%s\"" + +-#: locale/programs/locarchive.c:452 ++#: locale/programs/locarchive.c:455 + #, c-format + msgid "cannot stat locale archive \"%s\"" + msgstr "non se pode facer stat do arquivo de locales \"%s\"" + +-#: locale/programs/locarchive.c:471 ++#: locale/programs/locarchive.c:474 + #, c-format + msgid "cannot lock locale archive \"%s\"" + msgstr "non se pode bloquea-lo arquivo de locales \"%s\"" + +-#: locale/programs/locarchive.c:494 ++#: locale/programs/locarchive.c:497 + msgid "cannot read archive header" + msgstr "non se pode le-la cabeceira do arquivo" + +-#: locale/programs/locarchive.c:554 ++#: locale/programs/locarchive.c:557 + #, c-format + msgid "locale '%s' already exists" + msgstr "o locale '%s' xa existe" + +-#: locale/programs/locarchive.c:784 locale/programs/locarchive.c:799 +-#: locale/programs/locarchive.c:811 locale/programs/locarchive.c:823 ++#: locale/programs/locarchive.c:788 locale/programs/locarchive.c:803 ++#: locale/programs/locarchive.c:815 locale/programs/locarchive.c:827 + #: locale/programs/locfile.c:343 + msgid "cannot add to locale archive" + msgstr "non se pode engadir no arquivo de locales" + +-#: locale/programs/locarchive.c:976 ++#: locale/programs/locarchive.c:982 + #, c-format + msgid "locale alias file `%s' not found" + msgstr "non se atopou o ficheiro de alias de locales `%s'" + +-#: locale/programs/locarchive.c:1118 ++#: locale/programs/locarchive.c:1126 + #, c-format + msgid "Adding %s\n" + msgstr "Engadindo %s\n" + +-#: locale/programs/locarchive.c:1124 ++#: locale/programs/locarchive.c:1132 + #, c-format + msgid "stat of \"%s\" failed: %s: ignored" + msgstr "a chamada a stat de \"%s\" fallou: %s: ignórase" + +-#: locale/programs/locarchive.c:1130 ++#: locale/programs/locarchive.c:1138 + #, c-format + msgid "\"%s\" is no directory; ignored" + msgstr "\"%s\" non é un directorio; ignórase" + +-#: locale/programs/locarchive.c:1137 ++#: locale/programs/locarchive.c:1145 + #, c-format + msgid "cannot open directory \"%s\": %s: ignored" + msgstr "non se pode abr-lo directorio \"%s\": %s: ignorado" + +-#: locale/programs/locarchive.c:1209 ++#: locale/programs/locarchive.c:1217 + #, c-format + msgid "incomplete set of locale files in \"%s\"" + msgstr "conxunto de ficheiros de locale incompleto en \"%s\"" + +-#: locale/programs/locarchive.c:1273 ++#: locale/programs/locarchive.c:1281 + #, c-format + msgid "cannot read all files in \"%s\": ignored" + msgstr "non se poden ler tódolos ficheiros de \"%s\": ignorado" + +-#: locale/programs/locarchive.c:1343 ++#: locale/programs/locarchive.c:1351 + #, c-format + msgid "locale \"%s\" not in archive" + msgstr "o locale \"%s\" non está no arquivo" +@@ -1653,8 +1653,8 @@ + msgid "upper limit in range is not smaller then lower limit" + msgstr "o límite superior do rango non é menor có límite inferior" + +-#: locale/programs/xmalloc.c:70 malloc/obstack.c:500 malloc/obstack.c:503 +-#: posix/getconf.c:996 ++#: locale/programs/xmalloc.c:70 malloc/obstack.c:505 malloc/obstack.c:508 ++#: posix/getconf.c:1002 + msgid "memory exhausted" + msgstr "memoria esgotada" + +@@ -1680,7 +1680,7 @@ + msgid "Another string for testing." + msgstr "Outra cadea para facer probas." + +-#: catgets/gencat.c:111 catgets/gencat.c:115 nscd/nscd.c:79 ++#: catgets/gencat.c:111 catgets/gencat.c:115 nscd/nscd.c:84 + msgid "NAME" + msgstr "NOME" + +@@ -1725,7 +1725,7 @@ + msgid "duplicate set definition" + msgstr "definición de conxunto duplicada" + +-#: catgets/gencat.c:446 catgets/gencat.c:619 catgets/gencat.c:648 ++#: catgets/gencat.c:446 catgets/gencat.c:623 catgets/gencat.c:677 + msgid "this is the first definition" + msgstr "esta é a primeira definición" + +@@ -1743,44 +1743,44 @@ + msgid "unknown directive `%s': line ignored" + msgstr "directiva `%s' descoñecida: liña ignorada" + +-#: catgets/gencat.c:617 ++#: catgets/gencat.c:621 + msgid "duplicated message number" + msgstr "número de mensaxe duplicado" + +-#: catgets/gencat.c:645 ++#: catgets/gencat.c:674 + msgid "duplicated message identifier" + msgstr "identificador de mensaxes duplicado" + +-#: catgets/gencat.c:702 ++#: catgets/gencat.c:731 + msgid "invalid character: message ignored" + msgstr "carácter non válido: mensaxe ignorada" + +-#: catgets/gencat.c:745 ++#: catgets/gencat.c:774 + msgid "invalid line" + msgstr "liña non válida" + +-#: catgets/gencat.c:799 ++#: catgets/gencat.c:828 + msgid "malformed line ignored" + msgstr "ignórase unha liña mal formada" + +-#: catgets/gencat.c:963 catgets/gencat.c:1004 ++#: catgets/gencat.c:992 catgets/gencat.c:1033 + #, c-format + msgid "cannot open output file `%s'" + msgstr "non se pode abri-lo ficheiro de saída `%s'" + +-#: catgets/gencat.c:1188 ++#: catgets/gencat.c:1217 + msgid "unterminated message" + msgstr "mensaxe non rematada" + +-#: catgets/gencat.c:1212 ++#: catgets/gencat.c:1241 + msgid "while opening old catalog file" + msgstr "ao abrir un antigo ficheiro de catálogo" + +-#: catgets/gencat.c:1303 ++#: catgets/gencat.c:1332 + msgid "conversion modules not available" + msgstr "os módulos de conversión non están dispoñibles" + +-#: catgets/gencat.c:1329 ++#: catgets/gencat.c:1358 + msgid "cannot determine escape character" + msgstr "non se pode determina-lo carácter de escape" + +@@ -1788,7 +1788,7 @@ + msgid "makecontext: does not know how to handle more than 8 arguments\n" + msgstr "makecontext: non se sabe como manexar máis de 8 argumentos\n" + +-#: stdio-common/../sysdeps/gnu/errlist.c:12 posix/regcomp.c:178 ++#: stdio-common/../sysdeps/gnu/errlist.c:12 posix/regcomp.c:133 + #: nis/nis_error.c:29 nis/ypclnt.c:787 nis/ypclnt.c:861 + msgid "Success" + msgstr "Éxito" +@@ -2977,23 +2977,23 @@ + msgid "%s%sUnknown signal %d\n" + msgstr "%s%sSinal descoñecido %d\n" + +-#: malloc/mcheck.c:296 ++#: malloc/mcheck.c:346 + msgid "memory is consistent, library is buggy\n" + msgstr "a memoria é consistente, a biblioteca ten erros\n" + +-#: malloc/mcheck.c:299 ++#: malloc/mcheck.c:349 + msgid "memory clobbered before allocated block\n" + msgstr "memoria alterada antes do bloque reservado\n" + +-#: malloc/mcheck.c:302 ++#: malloc/mcheck.c:352 + msgid "memory clobbered past end of allocated block\n" + msgstr "memoria alterada despois do bloque reservado\n" + +-#: malloc/mcheck.c:305 ++#: malloc/mcheck.c:355 + msgid "block freed twice\n" + msgstr "bloque liberado dúas veces\n" + +-#: malloc/mcheck.c:308 ++#: malloc/mcheck.c:358 + msgid "bogus mcheck_status, library is buggy\n" + msgstr "mcheck_status falso, a biblioteca ten erros\n" + +@@ -3029,6 +3029,10 @@ + msgid "DATAFILE [OUTFILE]" + msgstr "FICHEIRO_DATOS [FICHEIRO_SAÍDA]" + ++#: string/strerror.c:43 posix/../sysdeps/posix/gai_strerror.c:57 ++msgid "Unknown error" ++msgstr "Erro descoñecido" ++ + #: string/strsignal.c:69 + #, c-format + msgid "Real-time signal %d" +@@ -3053,7 +3057,7 @@ + msgid "%s: Memory exhausted: %s\n" + msgstr "%s: Memoria esgotada: %s\n" + +-#: timezone/zic.c:390 misc/error.c:120 ++#: timezone/zic.c:390 misc/error.c:127 misc/error.c:155 + msgid "Unknown system error" + msgstr "Erro de sistema descoñecido" + +@@ -3446,25 +3450,21 @@ + msgid "Interrupted by a signal" + msgstr "Interrompido por un sinal" + +-#: posix/../sysdeps/posix/gai_strerror.c:57 +-msgid "Unknown error" +-msgstr "Erro descoñecido" +- +-#: posix/getconf.c:883 ++#: posix/getconf.c:889 + #, c-format + msgid "Usage: %s [-v specification] variable_name [pathname]\n" + msgstr "Uso: %s [-v especificación] nome_variable [nome]\n" + +-#: posix/getconf.c:941 ++#: posix/getconf.c:947 + #, c-format + msgid "unknown specification \"%s\"" + msgstr "especificación `%s' descoñecida" + +-#: posix/getconf.c:968 posix/getconf.c:984 ++#: posix/getconf.c:974 posix/getconf.c:990 + msgid "undefined" + msgstr "non definido" + +-#: posix/getconf.c:1006 ++#: posix/getconf.c:1012 + #, c-format + msgid "Unrecognized variable `%s'" + msgstr "Variable `%s' non recoñecida" +@@ -3526,71 +3526,71 @@ + msgid "%s: option `-W %s' doesn't allow an argument\n" + msgstr "%s: a opción `-W %s' non acepta parámetros\n" + +-#: posix/regcomp.c:181 ++#: posix/regcomp.c:136 + msgid "No match" + msgstr "Nada coincide" + +-#: posix/regcomp.c:184 ++#: posix/regcomp.c:139 + msgid "Invalid regular expression" + msgstr "Expresión regular incorrecta" + +-#: posix/regcomp.c:187 ++#: posix/regcomp.c:142 + msgid "Invalid collation character" + msgstr "Carácter de ordenación incorrecto" + +-#: posix/regcomp.c:190 ++#: posix/regcomp.c:145 + msgid "Invalid character class name" + msgstr "Nome da clase de caracteres incorrecto" + +-#: posix/regcomp.c:193 ++#: posix/regcomp.c:148 + msgid "Trailing backslash" + msgstr "Barra invertida extra ó final" + +-#: posix/regcomp.c:196 ++#: posix/regcomp.c:151 + msgid "Invalid back reference" + msgstr "Referencia cara a atrás incorrecta" + +-#: posix/regcomp.c:199 ++#: posix/regcomp.c:154 + msgid "Unmatched [ or [^" + msgstr "[ ou [^ sen parella" + +-#: posix/regcomp.c:202 ++#: posix/regcomp.c:157 + msgid "Unmatched ( or \\(" + msgstr "( ou \\( sen parella" + +-#: posix/regcomp.c:205 ++#: posix/regcomp.c:160 + msgid "Unmatched \\{" + msgstr "\\{ sen parella" + +-#: posix/regcomp.c:208 ++#: posix/regcomp.c:163 + msgid "Invalid content of \\{\\}" + msgstr "Contido de \\{\\} incorrecto" + +-#: posix/regcomp.c:211 ++#: posix/regcomp.c:166 + msgid "Invalid range end" + msgstr "Final do rango incorrecto" + +-#: posix/regcomp.c:214 ++#: posix/regcomp.c:169 + msgid "Memory exhausted" + msgstr "Memoria esgotada" + +-#: posix/regcomp.c:217 ++#: posix/regcomp.c:172 + msgid "Invalid preceding regular expression" + msgstr "Expresión regular precedente incorrecta" + +-#: posix/regcomp.c:220 ++#: posix/regcomp.c:175 + msgid "Premature end of regular expression" + msgstr "Final prematura da expresión regular" + +-#: posix/regcomp.c:223 ++#: posix/regcomp.c:178 + msgid "Regular expression too big" + msgstr "Expresión regular demasiado grande" + +-#: posix/regcomp.c:226 ++#: posix/regcomp.c:181 + msgid "Unmatched ) or \\)" + msgstr ") ou \\) sen parella" + +-#: posix/regcomp.c:673 ++#: posix/regcomp.c:615 + msgid "No previous regular expression" + msgstr "Non hai unha expresión regular precedente" + +@@ -3744,24 +3744,24 @@ + msgid "Service configuration to be used" + msgstr "Configuración do servicio a empregar" + +-#: nss/getent.c:136 nss/getent.c:305 ++#: nss/getent.c:136 nss/getent.c:308 + #, c-format + msgid "Enumeration not supported on %s\n" + msgstr "A enumeración non está soportada en %s\n" + +-#: nss/getent.c:729 ++#: nss/getent.c:732 + msgid "getent - get entries from administrative database." + msgstr "getent - obte-las entradas da base de datos administrativa." + +-#: nss/getent.c:730 ++#: nss/getent.c:733 + msgid "Supported databases:" + msgstr "Bases de datos soportadas:" + +-#: nss/getent.c:787 nscd/nscd.c:119 nscd/nscd_nischeck.c:64 ++#: nss/getent.c:790 nscd/nscd.c:124 nscd/nscd_nischeck.c:64 + msgid "wrong number of arguments" + msgstr "número de parámetros incorrecto" + +-#: nss/getent.c:797 ++#: nss/getent.c:800 + #, c-format + msgid "Unknown database: %s\n" + msgstr "Base de datos descoñecida: %s\n" +@@ -3790,68 +3790,72 @@ + msgid "invalid pointer size" + msgstr "tamaño de punteiro non válido" + +-#: inet/rcmd.c:174 inet/rcmd.c:177 ++#: inet/rcmd.c:163 inet/rcmd.c:166 ++msgid "rcmd: Cannot allocate memory\n" ++msgstr "rcmd: Non se pode reservar memoria\n" ++ ++#: inet/rcmd.c:185 inet/rcmd.c:188 + msgid "rcmd: socket: All ports in use\n" + msgstr "rcmp: socket: Tódolos portos están sendo utilizados\n" + +-#: inet/rcmd.c:211 ++#: inet/rcmd.c:222 + #, c-format + msgid "connect to address %s: " + msgstr "conectarse ao enderezo %s: " + +-#: inet/rcmd.c:229 ++#: inet/rcmd.c:240 + #, c-format + msgid "Trying %s...\n" + msgstr "Probando %s...\n" + +-#: inet/rcmd.c:278 ++#: inet/rcmd.c:289 + #, c-format + msgid "rcmd: write (setting up stderr): %m\n" + msgstr "rcmd: write (configurando stderr): %m\n" + +-#: inet/rcmd.c:299 ++#: inet/rcmd.c:310 + #, c-format + msgid "rcmd: poll (setting up stderr): %m\n" + msgstr "rcmd: poll (configurando stderr): %m\n" + +-#: inet/rcmd.c:302 ++#: inet/rcmd.c:313 + msgid "poll: protocol failure in circuit setup\n" + msgstr "poll: fallo de protocolo no establecemento do circuito\n" + +-#: inet/rcmd.c:346 ++#: inet/rcmd.c:358 + msgid "socket: protocol failure in circuit setup\n" + msgstr "socket: fallo do protocolo no establecemento do circuito\n" + +-#: inet/rcmd.c:368 ++#: inet/rcmd.c:387 + #, c-format + msgid "rcmd: %s: short read" + msgstr "rcmd: %s: lectura curta" + +-#: inet/rcmd.c:524 ++#: inet/rcmd.c:549 + msgid "lstat failed" + msgstr "fallou a chamada a lstat" + +-#: inet/rcmd.c:526 ++#: inet/rcmd.c:551 + msgid "not regular file" + msgstr "non é un ficheiro normal" + +-#: inet/rcmd.c:531 ++#: inet/rcmd.c:556 + msgid "cannot open" + msgstr "non se pode abrir" + +-#: inet/rcmd.c:533 ++#: inet/rcmd.c:558 + msgid "fstat failed" + msgstr "fallou a chamada a fstat" + +-#: inet/rcmd.c:535 ++#: inet/rcmd.c:560 + msgid "bad owner" + msgstr "propietario incorrecto" + +-#: inet/rcmd.c:537 ++#: inet/rcmd.c:562 + msgid "writeable by other than owner" + msgstr "escribible por alguén distinto do propietario" + +-#: inet/rcmd.c:539 ++#: inet/rcmd.c:564 + msgid "hard linked somewhere" + msgstr "ten un enlace duro nalgún sitio" + +@@ -4062,109 +4066,109 @@ + msgid "Cannot receive reply to broadcast" + msgstr "Non se pode recibi-la resposta á multidifusión" + +-#: sunrpc/rpc_main.c:289 ++#: sunrpc/rpc_main.c:288 + #, c-format + msgid "%s: output would overwrite %s\n" + msgstr "%s: a saída sobreescribiría %s\n" + +-#: sunrpc/rpc_main.c:296 ++#: sunrpc/rpc_main.c:295 + #, c-format + msgid "%s: unable to open %s: %m\n" + msgstr "%s: non se pode abrir %s: %m\n" + +-#: sunrpc/rpc_main.c:308 ++#: sunrpc/rpc_main.c:307 + #, c-format + msgid "%s: while writing output %s: %m" + msgstr "%s: ao escribir á saída %s: %m" + +-#: sunrpc/rpc_main.c:343 ++#: sunrpc/rpc_main.c:342 + #, c-format + msgid "cannot find C preprocessor: %s \n" + msgstr "non podo atopa-lo preprocesador de C: %s \n" + +-#: sunrpc/rpc_main.c:351 ++#: sunrpc/rpc_main.c:350 + msgid "cannot find any C preprocessor (cpp)\n" + msgstr "non podo atopar un preprocesador de C (cpp)\n" + +-#: sunrpc/rpc_main.c:420 ++#: sunrpc/rpc_main.c:419 + #, c-format + msgid "%s: C preprocessor failed with signal %d\n" + msgstr "%s: O preprocesador de C fallou co sinal %d\n" + +-#: sunrpc/rpc_main.c:423 ++#: sunrpc/rpc_main.c:422 + #, c-format + msgid "%s: C preprocessor failed with exit code %d\n" + msgstr "%s: O preprocesador de C fallou co código de saída %d\n" + +-#: sunrpc/rpc_main.c:463 ++#: sunrpc/rpc_main.c:462 + #, c-format + msgid "illegal nettype :`%s'\n" + msgstr "tipo de rede ilegal :`%s'\n" + +-#: sunrpc/rpc_main.c:1105 ++#: sunrpc/rpc_main.c:1104 + msgid "rpcgen: too many defines\n" + msgstr "rpcgen: demasiadas definicións\n" + +-#: sunrpc/rpc_main.c:1117 ++#: sunrpc/rpc_main.c:1116 + msgid "rpcgen: arglist coding error\n" + msgstr "rpcgen: erro de codificación da lista de parámetros\n" + + #. TRANS: the file will not be removed; this is an + #. TRANS: informative message. +-#: sunrpc/rpc_main.c:1150 ++#: sunrpc/rpc_main.c:1149 + #, c-format + msgid "file `%s' already exists and may be overwritten\n" + msgstr "o ficheiro `%s' xa existe e pode ser sobreescrito\n" + +-#: sunrpc/rpc_main.c:1195 ++#: sunrpc/rpc_main.c:1194 + msgid "Cannot specify more than one input file!\n" + msgstr "¡Non se pode indicar máis dun ficheiro de entrada!\n" + +-#: sunrpc/rpc_main.c:1365 ++#: sunrpc/rpc_main.c:1364 + msgid "This implementation doesn't support newstyle or MT-safe code!\n" + msgstr "¡Esta implementación non soporta código de novo estilo ou seguro para MT!\n" + +-#: sunrpc/rpc_main.c:1374 ++#: sunrpc/rpc_main.c:1373 + msgid "Cannot use netid flag with inetd flag!\n" + msgstr "¡Non se pode utiliza-la opción netid coa opción inetd!\n" + +-#: sunrpc/rpc_main.c:1386 ++#: sunrpc/rpc_main.c:1385 + msgid "Cannot use netid flag without TIRPC!\n" + msgstr "¡Non se pode utiliza-la opción netid sen TIRPC!\n" + +-#: sunrpc/rpc_main.c:1393 ++#: sunrpc/rpc_main.c:1392 + msgid "Cannot use table flags with newstyle!\n" + msgstr "¡Non se poden utiliza-las opcións de táboa con newstyle!\n" + +-#: sunrpc/rpc_main.c:1412 ++#: sunrpc/rpc_main.c:1411 + msgid "\"infile\" is required for template generation flags.\n" + msgstr "Precísase dun ficheiro de \"entrada\" para as opcións de xeración de patróns.\n" + +-#: sunrpc/rpc_main.c:1417 ++#: sunrpc/rpc_main.c:1416 + msgid "Cannot have more than one file generation flag!\n" + msgstr "Non se pode ter máis dunha opción de xeración de ficheiros\n" + +-#: sunrpc/rpc_main.c:1426 ++#: sunrpc/rpc_main.c:1425 + #, c-format + msgid "usage: %s infile\n" + msgstr "uso: %s ficheiro-de-entrada\n" + +-#: sunrpc/rpc_main.c:1427 ++#: sunrpc/rpc_main.c:1426 + #, c-format + msgid "\t%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile\n" + msgstr "\t%s [-abkCLNTM][-Dnome[=valor]] [-i tamaño] [-I [-K segundos]] [-Y rota] entrada\n" + +-#: sunrpc/rpc_main.c:1429 ++#: sunrpc/rpc_main.c:1428 + #, 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 saída] [entrada]\n" + +-#: sunrpc/rpc_main.c:1431 ++#: sunrpc/rpc_main.c:1430 + #, c-format + msgid "\t%s [-s nettype]* [-o outfile] [infile]\n" + msgstr "\t%s [-s tiporede]* [-o saída] [entrada]\n" + +-#: sunrpc/rpc_main.c:1432 ++#: sunrpc/rpc_main.c:1431 + #, c-format + msgid "\t%s [-n netid]* [-o outfile] [infile]\n" + msgstr "\t%s [-n idrede]* [-o saída] [entrada]\n" +@@ -5021,7 +5025,7 @@ + msgid "while allocating hash table entry" + msgstr "ao reservar espacio para a entrada da táboa hash" + +-#: nscd/cache.c:150 nscd/connections.c:185 ++#: nscd/cache.c:150 nscd/connections.c:187 + #, c-format + msgid "cannot stat() file `%s': %s" + msgstr "non se pode facer stat() sobre o ficheiro `%s': %s" +@@ -5034,153 +5038,158 @@ + msgid "Cannot run nscd in secure mode as unprivileged user" + msgstr "Non se pode executar nscd en modo seguro coma usuario non privilexiado" + +-#: nscd/connections.c:199 ++#: nscd/connections.c:175 ++#, c-format ++msgid "while allocating cache: %s" ++msgstr "ao reservar espacio para a caché: %s" ++ ++#: nscd/connections.c:200 + #, c-format + msgid "cannot open socket: %s" + msgstr "non se pode abrir un socket: %s" + +-#: nscd/connections.c:217 ++#: nscd/connections.c:218 + #, c-format + msgid "cannot enable socket to accept connections: %s" + msgstr "non se pode facer que o socket acepte conexións: %s" + +-#: nscd/connections.c:259 ++#: nscd/connections.c:260 + #, c-format + msgid "handle_request: request received (Version = %d)" + msgstr "handle_request: petición recibida (Version = %d)" + +-#: nscd/connections.c:265 ++#: nscd/connections.c:266 + #, c-format + msgid "cannot handle old request version %d; current version is %d" + msgstr "non se pode manexa-la antiga petición versión %d; a versión actual é %d" + +-#: nscd/connections.c:303 nscd/connections.c:325 ++#: nscd/connections.c:304 nscd/connections.c:326 + #, c-format + msgid "cannot write result: %s" + msgstr "non se pode escribi-lo resultado: %s" + +-#: nscd/connections.c:404 nscd/connections.c:498 ++#: nscd/connections.c:405 nscd/connections.c:499 + #, c-format + msgid "error getting callers id: %s" + msgstr "erro ao obte-lo identificador do chamante: %s" + +-#: nscd/connections.c:470 ++#: nscd/connections.c:471 + #, c-format + msgid "while accepting connection: %s" + msgstr "ao aceptar unha conexión: %s" + +-#: nscd/connections.c:481 ++#: nscd/connections.c:482 + #, c-format + msgid "short read while reading request: %s" + msgstr "lectura demasiado curta ao le-la petición: %s" + +-#: nscd/connections.c:517 ++#: nscd/connections.c:518 + #, c-format + msgid "key length in request too long: %d" + msgstr "lonxitude da clave da petición demasiado grande: %d" + +-#: nscd/connections.c:531 ++#: nscd/connections.c:532 + #, c-format + msgid "short read while reading request key: %s" + msgstr "lectura demasiado curta ao le-la clave de petición: %s" + +-#: nscd/connections.c:590 nscd/connections.c:591 nscd/connections.c:610 +-#: nscd/connections.c:623 nscd/connections.c:629 nscd/connections.c:636 ++#: nscd/connections.c:591 nscd/connections.c:592 nscd/connections.c:611 ++#: nscd/connections.c:624 nscd/connections.c:630 nscd/connections.c:637 + #, c-format + msgid "Failed to run nscd as user '%s'" + msgstr "Non se puido executar nscd coma o usuario '%s'" + +-#: nscd/connections.c:611 ++#: nscd/connections.c:612 + msgid "getgrouplist failed" + msgstr "fallou a chamada a getgrouplist" + +-#: nscd/connections.c:624 ++#: nscd/connections.c:625 + msgid "setgroups failed" + msgstr "fallou a chamada a setgroups" + +-#: nscd/grpcache.c:102 nscd/hstcache.c:110 nscd/pwdcache.c:108 ++#: nscd/grpcache.c:103 nscd/hstcache.c:111 nscd/pwdcache.c:109 + msgid "while allocating key copy" + msgstr "ao reservar espacio para a copia da clave" + +-#: nscd/grpcache.c:152 nscd/hstcache.c:167 nscd/pwdcache.c:145 ++#: nscd/grpcache.c:153 nscd/hstcache.c:168 nscd/pwdcache.c:146 + msgid "while allocating cache entry" + msgstr "ao reservar espacio para a entrada de caché" + +-#: nscd/grpcache.c:195 nscd/hstcache.c:281 nscd/pwdcache.c:191 ++#: nscd/grpcache.c:196 nscd/hstcache.c:282 nscd/pwdcache.c:192 + #, c-format + msgid "short write in %s: %s" + msgstr "escritura demasiado curta en %s: %s" + +-#: nscd/grpcache.c:217 ++#: nscd/grpcache.c:218 + #, c-format + msgid "Haven't found \"%s\" in group cache!" + msgstr "¡Non atopei \"%s\" na caché de grupos!" + +-#: nscd/grpcache.c:292 ++#: nscd/grpcache.c:284 + #, c-format + msgid "Invalid numeric gid \"%s\"!" + msgstr "¡Identificación numérica de grupo \"%s\" non válida!" + +-#: nscd/grpcache.c:299 ++#: nscd/grpcache.c:291 + #, c-format + msgid "Haven't found \"%d\" in group cache!" + msgstr "¡Non atopei \"%d\" na caché de grupos!" + +-#: nscd/hstcache.c:303 nscd/hstcache.c:378 nscd/hstcache.c:456 +-#: nscd/hstcache.c:533 ++#: nscd/hstcache.c:304 nscd/hstcache.c:370 nscd/hstcache.c:435 ++#: nscd/hstcache.c:500 + #, c-format + msgid "Haven't found \"%s\" in hosts cache!" + msgstr "¡Non atopei \"%s\" na caché de servidores!" + +-#: nscd/nscd.c:80 ++#: nscd/nscd.c:85 + msgid "Read configuration data from NAME" + msgstr "Le-los datos de configuración de NOME" + +-#: nscd/nscd.c:82 ++#: nscd/nscd.c:87 + msgid "Do not fork and display messages on the current tty" + msgstr "Non bifurcar e visualiza-las mensaxes no terminal actual" + +-#: nscd/nscd.c:83 ++#: nscd/nscd.c:88 + msgid "NUMBER" + msgstr "NÚMERO" + +-#: nscd/nscd.c:83 ++#: nscd/nscd.c:88 + msgid "Start NUMBER threads" + msgstr "Comezar NÚMERO fíos" + +-#: nscd/nscd.c:84 ++#: nscd/nscd.c:89 + msgid "Shut the server down" + msgstr "Apaga-lo servidor" + +-#: nscd/nscd.c:85 ++#: nscd/nscd.c:90 + msgid "Print current configuration statistic" + msgstr "Visualiza-la estatística da configuración actual" + +-#: nscd/nscd.c:86 ++#: nscd/nscd.c:91 + msgid "TABLE" + msgstr "TÁBOA" + +-#: nscd/nscd.c:87 ++#: nscd/nscd.c:92 + msgid "Invalidate the specified cache" + msgstr "Invalida-la caché especificada" + +-#: nscd/nscd.c:88 ++#: nscd/nscd.c:93 + msgid "TABLE,yes" + msgstr "TÁBOA,si" + +-#: nscd/nscd.c:88 ++#: nscd/nscd.c:93 + msgid "Use separate cache for each user" + msgstr "Usar unha caché separada para cada usuario" + +-#: nscd/nscd.c:93 ++#: nscd/nscd.c:98 + msgid "Name Service Cache Daemon." + msgstr "Demo de Cache de Servicio de Nomes." + +-#: nscd/nscd.c:126 ++#: nscd/nscd.c:131 + msgid "already running" + msgstr "xa en execución" + +-#: nscd/nscd.c:192 nscd/nscd.c:212 nscd/nscd.c:218 ++#: nscd/nscd.c:243 nscd/nscd.c:263 nscd/nscd.c:269 + msgid "Only root is allowed to use this option!" + msgstr "¡Só root pode usar esa opción!" + +@@ -5270,22 +5279,22 @@ + "%15ld%% tasa de acertos de caché\n" + "%15s comprobe /etc/%s para ve-los cambios\n" + +-#: nscd/pwdcache.c:213 ++#: nscd/pwdcache.c:214 + #, c-format + msgid "Haven't found \"%s\" in password cache!" + msgstr "¡Non atopei \"%s\" na caché de contrasinais!" + +-#: nscd/pwdcache.c:288 ++#: nscd/pwdcache.c:280 + #, c-format + msgid "Invalid numeric uid \"%s\"!" + msgstr "¡Identificación numérica de usuario \"%s\" non válida!" + +-#: nscd/pwdcache.c:295 ++#: nscd/pwdcache.c:287 + #, c-format + msgid "Haven't found \"%d\" in password cache!" + msgstr "¡Non atopei \"%d\" na caché de contrasinais!" + +-#: elf/../sysdeps/generic/dl-sysdep.c:297 ++#: elf/../sysdeps/generic/dl-sysdep.c:357 + msgid "cannot create capability list" + msgstr "non se pode crea-la lista de capacidades" + +@@ -5336,7 +5345,7 @@ + msgid ", OS ABI: %s %d.%d.%d" + msgstr ", OS ABI: %s %d.%d.%d" + +-#: elf/cache.c:136 elf/ldconfig.c:1033 ++#: elf/cache.c:136 elf/ldconfig.c:1045 + #, c-format + msgid "Can't open cache file %s\n" + msgstr "Non se puido abri-lo ficheiro de caché %s\n" +@@ -5382,15 +5391,15 @@ + msgid "Renaming of %s to %s failed" + msgstr "Fallou o renomeado de %s a %s" + +-#: elf/dl-close.c:113 ++#: elf/dl-close.c:128 + msgid "shared object not open" + msgstr "o obxecto compartido non está aberto" + +-#: elf/dl-close.c:357 elf/dl-open.c:436 ++#: elf/dl-close.c:486 elf/dl-open.c:444 + msgid "TLS generation counter wrapped! Please send report with the 'glibcbug' script." + msgstr "O xerador de TLS deu unha volta completa. Informe co script 'glibcbug'." + +-#: elf/dl-deps.c:111 elf/dl-open.c:177 ++#: elf/dl-deps.c:111 elf/dl-open.c:183 + msgid "DST not allowed in SUID/SGID programs" + msgstr "Non se admite DST en programas SUID/SGID" + +@@ -5407,181 +5416,193 @@ + msgid "cannot allocate dependency list" + msgstr "non se pode localiza-la lista de dependencias" + +-#: elf/dl-deps.c:492 elf/dl-deps.c:547 ++#: elf/dl-deps.c:494 elf/dl-deps.c:549 + msgid "cannot allocate symbol search list" + msgstr "non se pode localiza-la lista de busca de símbolos" + +-#: elf/dl-deps.c:532 ++#: elf/dl-deps.c:534 + msgid "Filters not supported with LD_TRACE_PRELINKING" + msgstr "Non se soportan os filtros con LD_TRACE_PRELINKING" + +-#: elf/dl-error.c:73 ++#: elf/dl-error.c:75 + msgid "DYNAMIC LINKER BUG!!!" + msgstr "¡¡¡ERRO NO LIGADOR DINÁMICO!!!" + +-#: elf/dl-error.c:106 ++#: elf/dl-error.c:108 + msgid "error while loading shared libraries" + msgstr "erro ao carga-las bibliotecas compartidas" + +-#: elf/dl-load.c:338 ++#: elf/dl-load.c:339 + msgid "cannot allocate name record" + msgstr "non se pode localiza-lo rexistro de nome" + +-#: elf/dl-load.c:440 elf/dl-load.c:520 elf/dl-load.c:614 elf/dl-load.c:709 ++#: elf/dl-load.c:441 elf/dl-load.c:520 elf/dl-load.c:612 elf/dl-load.c:707 + msgid "cannot create cache for search path" + msgstr "non se pode crea-la caché para a ruta de busca" + +-#: elf/dl-load.c:545 ++#: elf/dl-load.c:543 + msgid "cannot create RUNPATH/RPATH copy" + msgstr "non se pode crear unha copia de RUNPATH/RPATH" + +-#: elf/dl-load.c:600 ++#: elf/dl-load.c:598 + msgid "cannot create search path array" + msgstr "non se pode crea-lo vector de rutas de busca" + +-#: elf/dl-load.c:796 ++#: elf/dl-load.c:794 + msgid "cannot stat shared object" + msgstr "non se puido facer stat sobre o obxecto compartido" + +-#: elf/dl-load.c:840 ++#: elf/dl-load.c:838 + msgid "cannot open zero fill device" + msgstr "non se pode abrir un dispositivo de recheo de ceros" + +-#: elf/dl-load.c:849 elf/dl-load.c:1855 ++#: elf/dl-load.c:847 elf/dl-load.c:1902 + msgid "cannot create shared object descriptor" + msgstr "non se pode crear un descriptor de obxecto compartido" + +-#: elf/dl-load.c:868 elf/dl-load.c:1351 elf/dl-load.c:1434 ++#: elf/dl-load.c:866 elf/dl-load.c:1398 elf/dl-load.c:1481 + msgid "cannot read file data" + msgstr "non se pode le-los datos do ficheiro" + +-#: elf/dl-load.c:908 ++#: elf/dl-load.c:906 + msgid "ELF load command alignment not page-aligned" + msgstr "O comando de carga ELF non está aliñado coa páxina" + +-#: elf/dl-load.c:915 ++#: elf/dl-load.c:913 + msgid "ELF load command address/offset not properly aligned" + msgstr "O enderezo/desprazamento do comando de carga ELF non está ben aliñado" + +-#: elf/dl-load.c:996 ++#: elf/dl-load.c:988 ++msgid "cannot allocate TLS data structures for initial thread" ++msgstr "non se poden crea-las estructuras de datos TLS para o fío inicial" ++ ++#: elf/dl-load.c:1012 ++msgid "cannot handle TLS data" ++msgstr "non se poden manexa-los datos TLS" ++ ++#: elf/dl-load.c:1047 + msgid "failed to map segment from shared object" + msgstr "non se puido mapear un segmento dun obxecto compartido" + +-#: elf/dl-load.c:1020 ++#: elf/dl-load.c:1071 + msgid "cannot dynamically load executable" + msgstr "non se pode cargar dinamicamente o executable" + +-#: elf/dl-load.c:1081 ++#: elf/dl-load.c:1132 + msgid "cannot change memory protections" + msgstr "non se poden cambia-las proteccións de memoria" + +-#: elf/dl-load.c:1100 ++#: elf/dl-load.c:1151 + msgid "cannot map zero-fill pages" + msgstr "non se poden mapear páxinas de recheo de ceros" + +-#: elf/dl-load.c:1118 ++#: elf/dl-load.c:1169 + msgid "cannot allocate memory for program header" + msgstr "Non se pode reservar memoria para a cabeceira do programa" + +-#: elf/dl-load.c:1149 ++#: elf/dl-load.c:1200 + msgid "object file has no dynamic section" + msgstr "o ficheiro obxecto non ten unha sección dinámica" + +-#: elf/dl-load.c:1193 ++#: elf/dl-load.c:1240 + msgid "shared object cannot be dlopen()ed" + msgstr "non se pode facer dlopen() sobre o obxecto compartido" + +-#: elf/dl-load.c:1216 ++#: elf/dl-load.c:1263 + msgid "cannot create searchlist" + msgstr "non se pode crea-la lista de busca" + +-#: elf/dl-load.c:1351 ++#: elf/dl-load.c:1398 + msgid "file too short" + msgstr "ficheiro pequeno de máis" + +-#: elf/dl-load.c:1374 ++#: elf/dl-load.c:1421 + msgid "invalid ELF header" + msgstr "cabeceira ELF non válida" + +-#: elf/dl-load.c:1383 ++#: elf/dl-load.c:1430 + msgid "ELF file data encoding not big-endian" + msgstr "A codificación dos datos do ficheiro ELF non é \"big-endian\"" + +-#: elf/dl-load.c:1385 ++#: elf/dl-load.c:1432 + msgid "ELF file data encoding not little-endian" + msgstr "A codificación dos datos do ficheiro ELF non é \"little-endian\"" + +-#: elf/dl-load.c:1389 ++#: elf/dl-load.c:1436 + msgid "ELF file version ident does not match current one" + msgstr "O identificador da versión do ficheiro ELF non coincide co actual" + +-#: elf/dl-load.c:1393 ++#: elf/dl-load.c:1440 + msgid "ELF file OS ABI invalid" + msgstr "ABI do SO do ficheiro ELF non válida" + +-#: elf/dl-load.c:1395 ++#: elf/dl-load.c:1442 + msgid "ELF file ABI version invalid" + msgstr "Versión do ABI do ficheiro ELF non válida" + +-#: elf/dl-load.c:1398 ++#: elf/dl-load.c:1445 + msgid "internal error" + msgstr "erro interno" + +-#: elf/dl-load.c:1405 ++#: elf/dl-load.c:1452 + msgid "ELF file version does not match current one" + msgstr "A versión do ficheiro ELF non coincide coa actual" + +-#: elf/dl-load.c:1413 ++#: elf/dl-load.c:1460 + msgid "ELF file's phentsize not the expected size" + msgstr "O phentsize do ficheiro ELF non é o tamaño esperado" + +-#: elf/dl-load.c:1419 ++#: elf/dl-load.c:1466 + msgid "only ET_DYN and ET_EXEC can be loaded" + msgstr "só se pode cargar ET_DYN e ET_EXEC" + +-#: elf/dl-load.c:1870 ++#: elf/dl-load.c:1917 + msgid "cannot open shared object file" + msgstr "non se pode abrir un ficheiro de obxecto compartido" + +-#: elf/dl-lookup.c:248 elf/dl-lookup.c:413 ++#: elf/dl-lookup.c:265 elf/dl-lookup.c:430 + msgid "relocation error" + msgstr "erro de cambio de reserva" + +-#: elf/dl-open.c:105 ++#: elf/dl-open.c:111 + msgid "cannot extend global scope" + msgstr "non se pode extende-lo alcance global" + +-#: elf/dl-open.c:208 ++#: elf/dl-open.c:214 + msgid "empty dynamic string token substitution" + msgstr "substitución de elementos da cadea dinámica baleira" + +-#: elf/dl-open.c:345 elf/dl-open.c:356 ++#: elf/dl-open.c:351 elf/dl-open.c:362 + msgid "cannot create scope list" + msgstr "non se pode crea-la lista de alcance" + +-#: elf/dl-open.c:416 ++#: elf/dl-open.c:424 + msgid "cannot create TLS data structures" + msgstr "non se poden crea-las estructuras de datos TLS" + +-#: elf/dl-open.c:478 ++#: elf/dl-open.c:486 + msgid "invalid mode for dlopen()" + msgstr "modo incorrecto para dlopen()" + +-#: elf/dl-reloc.c:88 ++#: elf/dl-reloc.c:58 ++msgid "shared object cannot be dlopen()ed: static TLS memory too small" ++msgstr "non se pode facer dlopen() sobre o obxecto compartido: a memoria TLS estática é pequena de máis" ++ ++#: elf/dl-reloc.c:118 + msgid "cannot make segment writable for relocation" + msgstr "non se pode face-lo segmento gravable para o movemento" + +-#: elf/dl-reloc.c:174 ++#: elf/dl-reloc.c:219 + #, c-format + msgid "%s: profiler found no PLTREL in object %s\n" + msgstr "%s: o perfilador non atopou PLTREL no obxecto %s\n" + +-#: elf/dl-reloc.c:186 ++#: elf/dl-reloc.c:231 + #, c-format + msgid "%s: profiler out of memory shadowing PLTREL of %s\n" + msgstr "%s: o perfilador esgotou a memoria sombreando o PLTREL de %s\n" + +-#: elf/dl-reloc.c:201 ++#: elf/dl-reloc.c:246 + msgid "cannot restore segment prot after reloc" + msgstr "non se pode restaura-la protección do segmento despois de movelo" + +@@ -5637,119 +5658,119 @@ + msgid "Configure Dynamic Linker Run Time Bindings." + msgstr "Configura-las Asignacións de Tempo de Execución do Ligador Dinámico" + +-#: elf/ldconfig.c:282 ++#: elf/ldconfig.c:294 + #, c-format + msgid "Path `%s' given more than once" + msgstr "Proporcionouse a ruta `%s' máis dunha vez" + +-#: elf/ldconfig.c:326 ++#: elf/ldconfig.c:338 + #, c-format + msgid "%s is not a known library type" + msgstr "%s non é un tipo de biblioteca coñecido" + +-#: elf/ldconfig.c:344 ++#: elf/ldconfig.c:356 + #, c-format + msgid "Can't stat %s" + msgstr "Non se puido executar `stat' sobre %s" + +-#: elf/ldconfig.c:414 ++#: elf/ldconfig.c:426 + #, c-format + msgid "Can't stat %s\n" + msgstr "Non se puido executar `stat' sobre %s\n" + +-#: elf/ldconfig.c:424 ++#: elf/ldconfig.c:436 + #, c-format + msgid "%s is not a symbolic link\n" + msgstr "%s non é unha ligazón simbólica\n" + +-#: elf/ldconfig.c:443 ++#: elf/ldconfig.c:455 + #, c-format + msgid "Can't unlink %s" + msgstr "Non se puido borrar %s" + +-#: elf/ldconfig.c:449 ++#: elf/ldconfig.c:461 + #, c-format + msgid "Can't link %s to %s" + msgstr "Non se puido ligar %s a %s" + +-#: elf/ldconfig.c:455 ++#: elf/ldconfig.c:467 + msgid " (changed)\n" + msgstr " (cambiou)\n" + +-#: elf/ldconfig.c:457 ++#: elf/ldconfig.c:469 + msgid " (SKIPPED)\n" + msgstr " (OMITIDO)\n" + +-#: elf/ldconfig.c:512 ++#: elf/ldconfig.c:524 + #, c-format + msgid "Can't find %s" + msgstr "Non se pode atopar %s" + +-#: elf/ldconfig.c:528 ++#: elf/ldconfig.c:540 + #, c-format + msgid "Can't lstat %s" + msgstr "Non se pode facer lstat sobre %s" + +-#: elf/ldconfig.c:535 ++#: elf/ldconfig.c:547 + #, c-format + msgid "Ignored file %s since it is not a regular file." + msgstr "Ignorouse o ficheiro %s porque non é un ficheiro normal" + +-#: elf/ldconfig.c:543 ++#: elf/ldconfig.c:555 + #, c-format + msgid "No link created since soname could not be found for %s" + msgstr "Non se creou unha ligazón porque non se atopou o soname para %s" + +-#: elf/ldconfig.c:634 ++#: elf/ldconfig.c:646 + #, c-format + msgid "Can't open directory %s" + msgstr "Non se puido abri-lo directorio %s" + +-#: elf/ldconfig.c:689 elf/ldconfig.c:736 ++#: elf/ldconfig.c:701 elf/ldconfig.c:748 + #, c-format + msgid "Cannot lstat %s" + msgstr "Non se pode facer lstat sobre %s" + +-#: elf/ldconfig.c:701 ++#: elf/ldconfig.c:713 + #, c-format + msgid "Cannot stat %s" + msgstr "Non se pode executar `stat' sobre %s" + +-#: elf/ldconfig.c:758 elf/readlib.c:93 ++#: elf/ldconfig.c:770 elf/readlib.c:93 + #, c-format + msgid "Input file %s not found.\n" + msgstr "Non se atopou o ficheiro de entrada %s.\n" + +-#: elf/ldconfig.c:792 ++#: elf/ldconfig.c:804 + #, c-format + msgid "libc5 library %s in wrong directory" + msgstr "biblioteca libc5 %s nun directorio incorrecto" + +-#: elf/ldconfig.c:795 ++#: elf/ldconfig.c:807 + #, c-format + msgid "libc6 library %s in wrong directory" + msgstr "biblioteca libc6 %s nun directorio incorrecto" + +-#: elf/ldconfig.c:798 ++#: elf/ldconfig.c:810 + #, c-format + msgid "libc4 library %s in wrong directory" + msgstr "biblioteca libc4 %s nun directorio incorrecto" + +-#: elf/ldconfig.c:825 ++#: elf/ldconfig.c:837 + #, c-format + msgid "libraries %s and %s in directory %s have same soname but different type." + msgstr "as bibliotecas %s e %s do directorio %s teñen o mesmo soname pero diferente tipo." + +-#: elf/ldconfig.c:928 ++#: elf/ldconfig.c:940 + #, c-format + msgid "Can't open configuration file %s" + msgstr "Non se puido abri-lo ficheiro de configuración %s" + +-#: elf/ldconfig.c:1012 ++#: elf/ldconfig.c:1024 + msgid "Can't chdir to /" + msgstr "Non se pode cambiar ao directorio /" + +-#: elf/ldconfig.c:1054 ++#: elf/ldconfig.c:1066 + #, c-format + msgid "Can't open cache file directory %s\n" + msgstr "Non se puido abri-lo directorio de ficheiros caché %s\n" +Binary files glibc-2.3.2/po/hr.mo and glibc-2.3.2-200304020432/po/hr.mo differ +Binary files glibc-2.3.2/po/hu.mo and glibc-2.3.2-200304020432/po/hu.mo differ +Binary files glibc-2.3.2/po/it.mo and glibc-2.3.2-200304020432/po/it.mo differ +Binary files glibc-2.3.2/po/ja.mo and glibc-2.3.2-200304020432/po/ja.mo differ +Binary files glibc-2.3.2/po/ko.mo and glibc-2.3.2-200304020432/po/ko.mo differ +Binary files glibc-2.3.2/po/nl.mo and glibc-2.3.2-200304020432/po/nl.mo differ +Binary files glibc-2.3.2/po/no.mo and glibc-2.3.2-200304020432/po/no.mo differ +Binary files glibc-2.3.2/po/pl.mo and glibc-2.3.2-200304020432/po/pl.mo differ +Binary files glibc-2.3.2/po/pt_BR.mo and glibc-2.3.2-200304020432/po/pt_BR.mo differ +Binary files glibc-2.3.2/po/sk.mo and glibc-2.3.2-200304020432/po/sk.mo differ +diff -u -udbrN glibc-2.3.2/po/sk.po glibc-2.3.2-200304020432/po/sk.po +--- glibc-2.3.2/po/sk.po Mon Oct 14 10:29:01 2002 ++++ glibc-2.3.2-200304020432/po/sk.po Mon Mar 3 19:12:34 2003 +@@ -1,13 +1,13 @@ + # Slovak translation of the GNU-libc-messages. +-# Copyright (C) 1998-2001, 2002 Free Software Foundation, Inc. +-# Marcel Telka , 2002. ++# Copyright (C) 1998-2001, 2002, 2003 Free Software Foundation, Inc. ++# Marcel Telka , 2002, 2003. + # Stanislav Meduna , 1998-2001. + # + msgid "" + msgstr "" +-"Project-Id-Version: libc 2.3.1\n" +-"POT-Creation-Date: 2002-10-02 17:22-0700\n" +-"PO-Revision-Date: 2002-10-14 09:46+0200\n" ++"Project-Id-Version: libc 2.3.2\n" ++"POT-Creation-Date: 2003-02-22 15:34-0800\n" ++"PO-Revision-Date: 2003-03-03 08:31+0200\n" + "Last-Translator: Marcel Telka \n" + "Language-Team: Slovak \n" + "MIME-Version: 1.0\n" +@@ -260,7 +260,7 @@ + + #: iconv/iconv_prog.c:241 + #, c-format +-msgid "conversions from `%s' and to `%s' are not supported" ++msgid "conversion from `%s' and to `%s' are not supported" + msgstr "konverzie z `%s' a do `%s' nie sú podporované" + + #: iconv/iconv_prog.c:246 +@@ -286,15 +286,15 @@ + msgid "error while closing output file" + msgstr "chyba poÄas zatvárania výstupného súboru" + +-#: iconv/iconv_prog.c:407 iconv/iconvconfig.c:355 locale/programs/locale.c:268 ++#: iconv/iconv_prog.c:407 iconv/iconvconfig.c:357 locale/programs/locale.c:274 + #: locale/programs/localedef.c:372 catgets/gencat.c:233 + #: malloc/memusagestat.c:602 debug/pcprofiledump.c:199 + msgid "Report bugs using the `glibcbug' script to .\n" + msgstr "Chyby hláste na adrese - použite skript `glibcbug'.\n" + +-#: iconv/iconv_prog.c:421 iconv/iconvconfig.c:369 locale/programs/locale.c:281 +-#: locale/programs/localedef.c:386 catgets/gencat.c:246 posix/getconf.c:904 +-#: nss/getent.c:74 nscd/nscd.c:279 nscd/nscd_nischeck.c:90 elf/ldconfig.c:259 ++#: iconv/iconv_prog.c:421 iconv/iconvconfig.c:371 locale/programs/locale.c:287 ++#: locale/programs/localedef.c:386 catgets/gencat.c:246 posix/getconf.c:910 ++#: nss/getent.c:74 nscd/nscd.c:330 nscd/nscd_nischeck.c:90 elf/ldconfig.c:271 + #: elf/sprof.c:349 + #, c-format + msgid "" +@@ -302,14 +302,14 @@ + "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 "" +-"Autorské práva (C) %s Free Software Foundation, Inc.\n" ++"Autorské práva © %s Free Software Foundation, Inc.\n" + "Toto je voľne šíriteľný softvér; pre podmienky kopírovania pozri zdrojový kód.\n" + "Neposkytuje sa ŽIADNA záruka; ani Äo sa týka OBCHODOVATEĽNOSTI alebo VHODNOSTI\n" + "NA KONKRÉTNY ÚČEL.\n" + +-#: iconv/iconv_prog.c:426 iconv/iconvconfig.c:374 locale/programs/locale.c:286 +-#: locale/programs/localedef.c:391 catgets/gencat.c:251 posix/getconf.c:909 +-#: nss/getent.c:79 nscd/nscd.c:284 nscd/nscd_nischeck.c:95 elf/ldconfig.c:264 ++#: iconv/iconv_prog.c:426 iconv/iconvconfig.c:376 locale/programs/locale.c:292 ++#: locale/programs/localedef.c:391 catgets/gencat.c:251 posix/getconf.c:915 ++#: nss/getent.c:79 nscd/nscd.c:335 nscd/nscd_nischeck.c:95 elf/ldconfig.c:276 + #: elf/sprof.c:355 + #, c-format + msgid "Written by %s.\n" +@@ -360,15 +360,15 @@ + msgid "Prefix used for all file accesses" + msgstr "Predpona použitá pre vÅ¡etky prístupy k súborom" + +-#: iconv/iconvconfig.c:325 locale/programs/localedef.c:292 ++#: iconv/iconvconfig.c:327 locale/programs/localedef.c:292 + msgid "no output file produced because warning were issued" + msgstr "výstupný súbor nebol vytvorený kvôli výskytu varovaní" + +-#: iconv/iconvconfig.c:403 ++#: iconv/iconvconfig.c:405 + msgid "while inserting in search tree" + msgstr "poÄas vkladania do vyhľadávacieho stromu" + +-#: iconv/iconvconfig.c:1202 ++#: iconv/iconvconfig.c:1204 + msgid "cannot generate output file" + msgstr "nie je možné vygenerovaÅ¥ výstupný súbor" + +@@ -1278,7 +1278,7 @@ + msgid "unterminated symbolic name" + msgstr "neukonÄené symbolické meno" + +-#: locale/programs/linereader.c:537 catgets/gencat.c:1166 ++#: locale/programs/linereader.c:537 catgets/gencat.c:1195 + msgid "invalid escape sequence" + msgstr "neprípustná escape-sekvencia" + +@@ -1308,39 +1308,39 @@ + msgid "trailing garbage at end of line" + msgstr "smetie na konci riadku" + +-#: locale/programs/locale.c:73 ++#: locale/programs/locale.c:75 + msgid "System information:" + msgstr "Systémové informácie:" + +-#: locale/programs/locale.c:75 ++#: locale/programs/locale.c:77 + msgid "Write names of available locales" + msgstr "VypísaÅ¥ názvy dostupných národných prostredí" + +-#: locale/programs/locale.c:77 ++#: locale/programs/locale.c:79 + msgid "Write names of available charmaps" + msgstr "VypísaÅ¥ názvy dostupných znakových sád" + +-#: locale/programs/locale.c:78 ++#: locale/programs/locale.c:80 + msgid "Modify output format:" + msgstr "ModifikovaÅ¥ výstupný formát:" + +-#: locale/programs/locale.c:79 ++#: locale/programs/locale.c:81 + msgid "Write names of selected categories" + msgstr "VypísaÅ¥ názvy vybraných kategórií" + +-#: locale/programs/locale.c:80 ++#: locale/programs/locale.c:82 + msgid "Write names of selected keywords" + msgstr "VypísaÅ¥ názvy vybraných kľúÄových slov" + +-#: locale/programs/locale.c:81 ++#: locale/programs/locale.c:83 + msgid "Print more information" + msgstr "VypisovaÅ¥ viac informácií" + +-#: locale/programs/locale.c:86 ++#: locale/programs/locale.c:88 + msgid "Get locale-specific information." + msgstr "ZískaÅ¥ informáciu Å¡pecifickú pre národné prostredie." + +-#: locale/programs/locale.c:89 ++#: locale/programs/locale.c:91 + msgid "" + "NAME\n" + "[-a|-m]" +@@ -1348,7 +1348,7 @@ + "NÃZOV\n" + "[-a|-m]" + +-#: locale/programs/locale.c:488 ++#: locale/programs/locale.c:512 + msgid "while preparing output" + msgstr "poÄas prípravy výstupu" + +@@ -1479,16 +1479,16 @@ + msgid "cannot create temporary file" + msgstr "nie je možné vytvoriÅ¥ doÄasný súbor" + +-#: locale/programs/locarchive.c:118 locale/programs/locarchive.c:302 ++#: locale/programs/locarchive.c:118 locale/programs/locarchive.c:305 + msgid "cannot initialize archive file" + msgstr "nie je možné inicializovaÅ¥ archívny súbor" + +-#: locale/programs/locarchive.c:125 locale/programs/locarchive.c:309 ++#: locale/programs/locarchive.c:125 locale/programs/locarchive.c:312 + msgid "cannot resize archive file" + msgstr "nie je možné zmeniÅ¥ veľkosÅ¥ archívneho súboru" + +-#: locale/programs/locarchive.c:134 locale/programs/locarchive.c:318 +-#: locale/programs/locarchive.c:508 ++#: locale/programs/locarchive.c:134 locale/programs/locarchive.c:321 ++#: locale/programs/locarchive.c:511 + msgid "cannot map archive header" + msgstr "nie je možné namapovaÅ¥ hlaviÄku archívu" + +@@ -1504,88 +1504,88 @@ + msgid "cannot map locale archive file" + msgstr "nie je možné namapovaÅ¥ súbor archívu národného prostredia" + +-#: locale/programs/locarchive.c:326 ++#: locale/programs/locarchive.c:329 + msgid "cannot lock new archive" + msgstr "nie je možné uzamknúť nový archív" + +-#: locale/programs/locarchive.c:377 ++#: locale/programs/locarchive.c:380 + msgid "cannot extend locale archive file" + msgstr "nie je možné rozšíriÅ¥ súbor archívu národného prostredia" + +-#: locale/programs/locarchive.c:386 ++#: locale/programs/locarchive.c:389 + msgid "cannot change mode of resized locale archive" + msgstr "nie je možné zmeniÅ¥ mód archívu národného prostredia s upravenou veľkosÅ¥ou" + +-#: locale/programs/locarchive.c:394 ++#: locale/programs/locarchive.c:397 + msgid "cannot rename new archive" + msgstr "nie je možné premenovaÅ¥ nový archív" + +-#: locale/programs/locarchive.c:447 ++#: locale/programs/locarchive.c:450 + #, c-format + msgid "cannot open locale archive \"%s\"" + msgstr "nie je možné otvoriÅ¥ archív národného prostredia \"%s\"" + +-#: locale/programs/locarchive.c:452 ++#: locale/programs/locarchive.c:455 + #, c-format + msgid "cannot stat locale archive \"%s\"" + msgstr "nie je možné zistiÅ¥ stav archívu národného prostredia \"%s\"" + +-#: locale/programs/locarchive.c:471 ++#: locale/programs/locarchive.c:474 + #, c-format + msgid "cannot lock locale archive \"%s\"" + msgstr "nie je možné uzamknúť archív národného prostredia \"%s\"" + +-#: locale/programs/locarchive.c:494 ++#: locale/programs/locarchive.c:497 + msgid "cannot read archive header" + msgstr "nie je možné preÄítaÅ¥ hlaviÄku archívu" + +-#: locale/programs/locarchive.c:554 ++#: locale/programs/locarchive.c:557 + #, c-format + msgid "locale '%s' already exists" + msgstr "národné prostredie `%s' už existuje" + +-#: locale/programs/locarchive.c:784 locale/programs/locarchive.c:799 +-#: locale/programs/locarchive.c:811 locale/programs/locarchive.c:823 ++#: locale/programs/locarchive.c:788 locale/programs/locarchive.c:803 ++#: locale/programs/locarchive.c:815 locale/programs/locarchive.c:827 + #: locale/programs/locfile.c:343 + msgid "cannot add to locale archive" + msgstr "nie je možné pridaÅ¥ do archívu národného prostredia" + +-#: locale/programs/locarchive.c:976 ++#: locale/programs/locarchive.c:982 + #, c-format + msgid "locale alias file `%s' not found" + msgstr "súbor aliasu národného prostredia `%s' nebol nájdený" + +-#: locale/programs/locarchive.c:1118 ++#: locale/programs/locarchive.c:1126 + #, c-format + msgid "Adding %s\n" + msgstr "Pridávam %s\n" + +-#: locale/programs/locarchive.c:1124 ++#: locale/programs/locarchive.c:1132 + #, c-format + msgid "stat of \"%s\" failed: %s: ignored" + msgstr "zistenie stavu \"%s\" zlyhalo: %s: ignorované" + +-#: locale/programs/locarchive.c:1130 ++#: locale/programs/locarchive.c:1138 + #, c-format + msgid "\"%s\" is no directory; ignored" + msgstr "\"%s\" nie je adresár; ignorované" + +-#: locale/programs/locarchive.c:1137 ++#: locale/programs/locarchive.c:1145 + #, c-format + msgid "cannot open directory \"%s\": %s: ignored" + msgstr "nie je možné otvoriÅ¥ adresár \"%s\": %s: ignorované" + +-#: locale/programs/locarchive.c:1209 ++#: locale/programs/locarchive.c:1217 + #, c-format + msgid "incomplete set of locale files in \"%s\"" + msgstr "nekompletná skupina súborov národných prostredí v \"%s\"" + +-#: locale/programs/locarchive.c:1273 ++#: locale/programs/locarchive.c:1281 + #, c-format + msgid "cannot read all files in \"%s\": ignored" + msgstr "nie je možné naÄítaÅ¥ vÅ¡etky súbory v \"%s\": ignorované" + +-#: locale/programs/locarchive.c:1343 ++#: locale/programs/locarchive.c:1351 + #, c-format + msgid "locale \"%s\" not in archive" + msgstr "národné prostredie \"%s\" nie je v archíve" +@@ -1654,8 +1654,8 @@ + msgid "upper limit in range is not smaller then lower limit" + msgstr "horný limit rozsahu je menší ako dolný" + +-#: locale/programs/xmalloc.c:70 malloc/obstack.c:500 malloc/obstack.c:503 +-#: posix/getconf.c:996 ++#: locale/programs/xmalloc.c:70 malloc/obstack.c:505 malloc/obstack.c:508 ++#: posix/getconf.c:1002 + msgid "memory exhausted" + msgstr "nedostatok pamäti" + +@@ -1681,7 +1681,7 @@ + msgid "Another string for testing." + msgstr "Iný reÅ¥azec pre testovanie." + +-#: catgets/gencat.c:111 catgets/gencat.c:115 nscd/nscd.c:79 ++#: catgets/gencat.c:111 catgets/gencat.c:115 nscd/nscd.c:84 + msgid "NAME" + msgstr "NÃZOV" + +@@ -1725,7 +1725,7 @@ + msgid "duplicate set definition" + msgstr "duplicitná definícia sady" + +-#: catgets/gencat.c:446 catgets/gencat.c:619 catgets/gencat.c:648 ++#: catgets/gencat.c:446 catgets/gencat.c:623 catgets/gencat.c:677 + msgid "this is the first definition" + msgstr "toto je prvá definícia" + +@@ -1743,44 +1743,44 @@ + msgid "unknown directive `%s': line ignored" + msgstr "neznáma direktíva `%s' - riadok ignorovaný" + +-#: catgets/gencat.c:617 ++#: catgets/gencat.c:621 + msgid "duplicated message number" + msgstr "duplicitné Äíslo správy" + +-#: catgets/gencat.c:645 ++#: catgets/gencat.c:674 + msgid "duplicated message identifier" + msgstr "duplicitný identifikátor správy" + +-#: catgets/gencat.c:702 ++#: catgets/gencat.c:731 + msgid "invalid character: message ignored" + msgstr "neprípustný znak: správa ignorovaná" + +-#: catgets/gencat.c:745 ++#: catgets/gencat.c:774 + msgid "invalid line" + msgstr "neprípustný riadok" + +-#: catgets/gencat.c:799 ++#: catgets/gencat.c:828 + msgid "malformed line ignored" + msgstr "nesprávny riadok ignorovaný" + +-#: catgets/gencat.c:963 catgets/gencat.c:1004 ++#: catgets/gencat.c:992 catgets/gencat.c:1033 + #, c-format + msgid "cannot open output file `%s'" + msgstr "nie je možné otvoriÅ¥ výstupný súbor `%s'" + +-#: catgets/gencat.c:1188 ++#: catgets/gencat.c:1217 + msgid "unterminated message" + msgstr "neukonÄená správa" + +-#: catgets/gencat.c:1212 ++#: catgets/gencat.c:1241 + msgid "while opening old catalog file" + msgstr "poÄas otvárania starého katalógu" + +-#: catgets/gencat.c:1303 ++#: catgets/gencat.c:1332 + msgid "conversion modules not available" + msgstr "moduly konverzie nie sú dostupné" + +-#: catgets/gencat.c:1329 ++#: catgets/gencat.c:1358 + msgid "cannot determine escape character" + msgstr "nie je možné urÄiÅ¥ znak escape" + +@@ -1788,7 +1788,7 @@ + msgid "makecontext: does not know how to handle more than 8 arguments\n" + msgstr "makecontext: nevie ako má spracovaÅ¥ viac ako 8 argumentov\n" + +-#: stdio-common/../sysdeps/gnu/errlist.c:12 posix/regcomp.c:178 ++#: stdio-common/../sysdeps/gnu/errlist.c:12 posix/regcomp.c:133 + #: nis/nis_error.c:29 nis/ypclnt.c:787 nis/ypclnt.c:861 + msgid "Success" + msgstr "Úspech" +@@ -2977,23 +2977,23 @@ + msgid "%s%sUnknown signal %d\n" + msgstr "%s%sNeznámy signál %d\n" + +-#: malloc/mcheck.c:296 ++#: malloc/mcheck.c:346 + msgid "memory is consistent, library is buggy\n" + msgstr "pamäť je konzistentná, knižnica je chybná\n" + +-#: malloc/mcheck.c:299 ++#: malloc/mcheck.c:349 + msgid "memory clobbered before allocated block\n" + msgstr "pamäť pred prideleným blokom prepísaná\n" + +-#: malloc/mcheck.c:302 ++#: malloc/mcheck.c:352 + msgid "memory clobbered past end of allocated block\n" + msgstr "pamäť za koncom prideleného bloku prepísaná\n" + +-#: malloc/mcheck.c:305 ++#: malloc/mcheck.c:355 + msgid "block freed twice\n" + msgstr "blok uvoľnený dvakrát\n" + +-#: malloc/mcheck.c:308 ++#: malloc/mcheck.c:358 + msgid "bogus mcheck_status, library is buggy\n" + msgstr "pochybný mcheck_status, knižnica má chyby\n" + +@@ -3029,6 +3029,10 @@ + msgid "DATAFILE [OUTFILE]" + msgstr "DÃTOVÃ_SÚBOR [VÃSTUPNÃ_SÚBOR]" + ++#: string/strerror.c:43 posix/../sysdeps/posix/gai_strerror.c:57 ++msgid "Unknown error" ++msgstr "Neznáma chyba" ++ + #: string/strsignal.c:69 + #, c-format + msgid "Real-time signal %d" +@@ -3053,7 +3057,7 @@ + msgid "%s: Memory exhausted: %s\n" + msgstr "%s: Nedostatok pamäti: %s\n" + +-#: timezone/zic.c:390 misc/error.c:120 ++#: timezone/zic.c:390 misc/error.c:127 misc/error.c:155 + msgid "Unknown system error" + msgstr "Neznáma chyba systému" + +@@ -3446,25 +3450,21 @@ + msgid "Interrupted by a signal" + msgstr "PreruÅ¡ené signálom" + +-#: posix/../sysdeps/posix/gai_strerror.c:57 +-msgid "Unknown error" +-msgstr "Neznáma chyba" +- +-#: posix/getconf.c:883 ++#: posix/getconf.c:889 + #, c-format + msgid "Usage: %s [-v specification] variable_name [pathname]\n" + msgstr "Použitie: %s [-v Å¡pecifikácia] meno_premennej [cesta]\n" + +-#: posix/getconf.c:941 ++#: posix/getconf.c:947 + #, c-format + msgid "unknown specification \"%s\"" + msgstr "neznáma Å¡pecifikácia \"%s\"" + +-#: posix/getconf.c:968 posix/getconf.c:984 ++#: posix/getconf.c:974 posix/getconf.c:990 + msgid "undefined" + msgstr "nedefinované" + +-#: posix/getconf.c:1006 ++#: posix/getconf.c:1012 + #, c-format + msgid "Unrecognized variable `%s'" + msgstr "Nerozpoznaná premenná `%s'" +@@ -3526,71 +3526,71 @@ + msgid "%s: option `-W %s' doesn't allow an argument\n" + msgstr "%s: voľba `-W %s' nedovoľuje pouÅ¥iÅ¥ argument\n" + +-#: posix/regcomp.c:181 ++#: posix/regcomp.c:136 + msgid "No match" + msgstr "Žiadna zhoda" + +-#: posix/regcomp.c:184 ++#: posix/regcomp.c:139 + msgid "Invalid regular expression" + msgstr "Neprípustný regulérny výraz" + +-#: posix/regcomp.c:187 ++#: posix/regcomp.c:142 + msgid "Invalid collation character" + msgstr "Neprípustný znak triedenia" + +-#: posix/regcomp.c:190 ++#: posix/regcomp.c:145 + msgid "Invalid character class name" + msgstr "Neprípustný názov triedy znakov" + +-#: posix/regcomp.c:193 ++#: posix/regcomp.c:148 + msgid "Trailing backslash" + msgstr "Koncové spätné lomítko" + +-#: posix/regcomp.c:196 ++#: posix/regcomp.c:151 + msgid "Invalid back reference" + msgstr "Neprípustný spätný odkaz" + +-#: posix/regcomp.c:199 ++#: posix/regcomp.c:154 + msgid "Unmatched [ or [^" + msgstr "Nepárová [ or [^" + +-#: posix/regcomp.c:202 ++#: posix/regcomp.c:157 + msgid "Unmatched ( or \\(" + msgstr "Nepárová ( or \\(" + +-#: posix/regcomp.c:205 ++#: posix/regcomp.c:160 + msgid "Unmatched \\{" + msgstr "Nepárová \\{" + +-#: posix/regcomp.c:208 ++#: posix/regcomp.c:163 + msgid "Invalid content of \\{\\}" + msgstr "Neprípustný obsah \\{\\}" + +-#: posix/regcomp.c:211 ++#: posix/regcomp.c:166 + msgid "Invalid range end" + msgstr "Neprípustný koniec rozsahu" + +-#: posix/regcomp.c:214 ++#: posix/regcomp.c:169 + msgid "Memory exhausted" + msgstr "Pamäť vyÄerpaná" + +-#: posix/regcomp.c:217 ++#: posix/regcomp.c:172 + msgid "Invalid preceding regular expression" + msgstr "Neprípustný predchádzajúci regulérny výraz" + +-#: posix/regcomp.c:220 ++#: posix/regcomp.c:175 + msgid "Premature end of regular expression" + msgstr "PredÄasný koniec regulérneho výrazu" + +-#: posix/regcomp.c:223 ++#: posix/regcomp.c:178 + msgid "Regular expression too big" + msgstr "Regulérny výraz príliÅ¡ veľký" + +-#: posix/regcomp.c:226 ++#: posix/regcomp.c:181 + msgid "Unmatched ) or \\)" + msgstr "Nepárová ) or \\)" + +-#: posix/regcomp.c:673 ++#: posix/regcomp.c:615 + msgid "No previous regular expression" + msgstr "Žiadny predchádzajúci regulérny výraz" + +@@ -3744,24 +3744,24 @@ + msgid "Service configuration to be used" + msgstr "Konfigurácia služby, ktorá má byÅ¥ použitá" + +-#: nss/getent.c:136 nss/getent.c:305 ++#: nss/getent.c:136 nss/getent.c:308 + #, c-format + msgid "Enumeration not supported on %s\n" + msgstr "Enumerácia %s nie je podporované\n" + +-#: nss/getent.c:729 ++#: nss/getent.c:732 + msgid "getent - get entries from administrative database." + msgstr "getent - získaÅ¥ záznamy z administratívnej databázy." + +-#: nss/getent.c:730 ++#: nss/getent.c:733 + msgid "Supported databases:" + msgstr "Podporované databázy:" + +-#: nss/getent.c:787 nscd/nscd.c:119 nscd/nscd_nischeck.c:64 ++#: nss/getent.c:790 nscd/nscd.c:124 nscd/nscd_nischeck.c:64 + msgid "wrong number of arguments" + msgstr "chybný poÄet argumentov" + +-#: nss/getent.c:797 ++#: nss/getent.c:800 + #, c-format + msgid "Unknown database: %s\n" + msgstr "Neznáma databáza %s\n" +@@ -3790,68 +3790,72 @@ + msgid "invalid pointer size" + msgstr "neprípustná veľkostÅ¥ ukazovateľa" + +-#: inet/rcmd.c:174 inet/rcmd.c:177 ++#: inet/rcmd.c:163 inet/rcmd.c:166 ++msgid "rcmd: Cannot allocate memory\n" ++msgstr "rcmd: Nie je možné prideliÅ¥ pamäť\n" ++ ++#: inet/rcmd.c:185 inet/rcmd.c:188 + msgid "rcmd: socket: All ports in use\n" + msgstr "rcmd: socket: VÅ¡etky porty sú použité\n" + +-#: inet/rcmd.c:211 ++#: inet/rcmd.c:222 + #, c-format + msgid "connect to address %s: " + msgstr "spojiÅ¥ sa s adresou %s: " + +-#: inet/rcmd.c:229 ++#: inet/rcmd.c:240 + #, c-format + msgid "Trying %s...\n" + msgstr "Skúšam %s...\n" + +-#: inet/rcmd.c:278 ++#: inet/rcmd.c:289 + #, c-format + msgid "rcmd: write (setting up stderr): %m\n" + msgstr "rcmd: write (nastavenie stderr): %m\n" + +-#: inet/rcmd.c:299 ++#: inet/rcmd.c:310 + #, c-format + msgid "rcmd: poll (setting up stderr): %m\n" + msgstr "rcmd: poll (nastavenie stderr): %m\n" + +-#: inet/rcmd.c:302 ++#: inet/rcmd.c:313 + msgid "poll: protocol failure in circuit setup\n" + msgstr "poll: chyba protokolu poÄas prípravy okruhu\n" + +-#: inet/rcmd.c:346 ++#: inet/rcmd.c:358 + msgid "socket: protocol failure in circuit setup\n" + msgstr "socket: chyba protokolu pri príprave okruhu\n" + +-#: inet/rcmd.c:368 ++#: inet/rcmd.c:387 + #, c-format + msgid "rcmd: %s: short read" + msgstr "rcmd: %s: krátke Äítanie" + +-#: inet/rcmd.c:524 ++#: inet/rcmd.c:549 + msgid "lstat failed" + msgstr "lstat zlyhal" + +-#: inet/rcmd.c:526 ++#: inet/rcmd.c:551 + msgid "not regular file" + msgstr "nie je regulérny súbor" + +-#: inet/rcmd.c:531 ++#: inet/rcmd.c:556 + msgid "cannot open" + msgstr "nie je možné otvoriÅ¥" + +-#: inet/rcmd.c:533 ++#: inet/rcmd.c:558 + msgid "fstat failed" + msgstr "fstat sa nepodaril" + +-#: inet/rcmd.c:535 ++#: inet/rcmd.c:560 + msgid "bad owner" + msgstr "chybný vlastník" + +-#: inet/rcmd.c:537 ++#: inet/rcmd.c:562 + msgid "writeable by other than owner" + msgstr "zapisovateľný nielen pre vlastníka" + +-#: inet/rcmd.c:539 ++#: inet/rcmd.c:564 + msgid "hard linked somewhere" + msgstr "niekde existuje pevný odkaz" + +@@ -4062,109 +4066,109 @@ + msgid "Cannot receive reply to broadcast" + msgstr "Nie je možné prijaÅ¥ odpoveÄ na broadcast" + +-#: sunrpc/rpc_main.c:289 ++#: sunrpc/rpc_main.c:288 + #, c-format + msgid "%s: output would overwrite %s\n" + msgstr "%s: výstup by prepísal %s\n" + +-#: sunrpc/rpc_main.c:296 ++#: sunrpc/rpc_main.c:295 + #, c-format + msgid "%s: unable to open %s: %m\n" + msgstr "%s: nie je možné otvoriÅ¥ %s: %m\n" + +-#: sunrpc/rpc_main.c:308 ++#: sunrpc/rpc_main.c:307 + #, c-format + msgid "%s: while writing output %s: %m" + msgstr "%s: poÄas zápisu výstupu %s: %m" + +-#: sunrpc/rpc_main.c:343 ++#: sunrpc/rpc_main.c:342 + #, c-format + msgid "cannot find C preprocessor: %s \n" + msgstr "nie je možné nájsÅ¥ preprocesor: %s \n" + +-#: sunrpc/rpc_main.c:351 ++#: sunrpc/rpc_main.c:350 + msgid "cannot find any C preprocessor (cpp)\n" + msgstr "nie je možné nájsÅ¥ žiadny C preprocesor (cpp)\n" + +-#: sunrpc/rpc_main.c:420 ++#: sunrpc/rpc_main.c:419 + #, c-format + msgid "%s: C preprocessor failed with signal %d\n" + msgstr "%s: C preprocesor zlyhal so signálom %d\n" + +-#: sunrpc/rpc_main.c:423 ++#: sunrpc/rpc_main.c:422 + #, c-format + msgid "%s: C preprocessor failed with exit code %d\n" + msgstr "%s: C preprocesor zlyhal s výstupným kódom %d\n" + +-#: sunrpc/rpc_main.c:463 ++#: sunrpc/rpc_main.c:462 + #, c-format + msgid "illegal nettype :`%s'\n" + msgstr "chybný nettype :`%s'\n" + +-#: sunrpc/rpc_main.c:1105 ++#: sunrpc/rpc_main.c:1104 + msgid "rpcgen: too many defines\n" + msgstr "rpcgen: priveľa defines\n" + +-#: sunrpc/rpc_main.c:1117 ++#: sunrpc/rpc_main.c:1116 + msgid "rpcgen: arglist coding error\n" + msgstr "rpcgen: chyba kódovania zoznamu argumentov\n" + + #. TRANS: the file will not be removed; this is an + #. TRANS: informative message. +-#: sunrpc/rpc_main.c:1150 ++#: sunrpc/rpc_main.c:1149 + #, c-format + msgid "file `%s' already exists and may be overwritten\n" + msgstr "súbor `%s' už existuje a môže byÅ¥ prepísaný\n" + +-#: sunrpc/rpc_main.c:1195 ++#: sunrpc/rpc_main.c:1194 + msgid "Cannot specify more than one input file!\n" + msgstr "Nie je možné zadaÅ¥ viac ako jeden vstupný súbor!\n" + +-#: sunrpc/rpc_main.c:1365 ++#: sunrpc/rpc_main.c:1364 + msgid "This implementation doesn't support newstyle or MT-safe code!\n" + msgstr "Táto implementácia nepodporuje nový Å¡týl alebo MT-bezpeÄný kód!\n" + +-#: sunrpc/rpc_main.c:1374 ++#: sunrpc/rpc_main.c:1373 + msgid "Cannot use netid flag with inetd flag!\n" + msgstr "Príznaky netid a inetd nie je možné použiÅ¥ súÄasne!\n" + +-#: sunrpc/rpc_main.c:1386 ++#: sunrpc/rpc_main.c:1385 + msgid "Cannot use netid flag without TIRPC!\n" + msgstr "Nie je možné použiÅ¥ príznak netid bez TIRPC!\n" + +-#: sunrpc/rpc_main.c:1393 ++#: sunrpc/rpc_main.c:1392 + msgid "Cannot use table flags with newstyle!\n" + msgstr "Pri použití nového Å¡týlu nie je možné použiÅ¥ príznaky tabuľky!\n" + +-#: sunrpc/rpc_main.c:1412 ++#: sunrpc/rpc_main.c:1411 + msgid "\"infile\" is required for template generation flags.\n" + msgstr "\"vst_súbor\" je vyžadovaný pri použití príznakov tvorby vzoru.\n" + +-#: sunrpc/rpc_main.c:1417 ++#: sunrpc/rpc_main.c:1416 + msgid "Cannot have more than one file generation flag!\n" + msgstr "Nie je možné použiÅ¥ viac ako jeden príznak tvorby súboru!\n" + +-#: sunrpc/rpc_main.c:1426 ++#: sunrpc/rpc_main.c:1425 + #, c-format + msgid "usage: %s infile\n" + msgstr "použitie: %s vstupný_súbor\n" + +-#: sunrpc/rpc_main.c:1427 ++#: sunrpc/rpc_main.c:1426 + #, c-format + msgid "\t%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile\n" + msgstr "\t%s [-abkCLNTM][-Dnázov[=hodnota]] [-i veľkosÅ¥] [-I [-K sekundy]] [-Y cesta] vst_súbor\n" + +-#: sunrpc/rpc_main.c:1429 ++#: sunrpc/rpc_main.c:1428 + #, 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 výst_súbor] [vst_súbor]\n" + +-#: sunrpc/rpc_main.c:1431 ++#: sunrpc/rpc_main.c:1430 + #, c-format + msgid "\t%s [-s nettype]* [-o outfile] [infile]\n" + msgstr "\t%s [-s nettype]* [-o výst_súbor] [vst_súbor]\n" + +-#: sunrpc/rpc_main.c:1432 ++#: sunrpc/rpc_main.c:1431 + #, c-format + msgid "\t%s [-n netid]* [-o outfile] [infile]\n" + msgstr "\t%s [-n netid]* [-o výst_súbor] [vst_súbor]\n" +@@ -5027,7 +5031,7 @@ + msgid "while allocating hash table entry" + msgstr "poÄas pridelenia záznamu hash-tabuľky" + +-#: nscd/cache.c:150 nscd/connections.c:185 ++#: nscd/cache.c:150 nscd/connections.c:187 + #, c-format + msgid "cannot stat() file `%s': %s" + msgstr "nie je možné vykonaÅ¥ stat() súboru `%s': %s" +@@ -5040,153 +5044,158 @@ + msgid "Cannot run nscd in secure mode as unprivileged user" + msgstr "Nie je možné spustiÅ¥ nscd v bezpeÄnom režime ako neprivilegovaný používateľ" + +-#: nscd/connections.c:199 ++#: nscd/connections.c:175 ++#, c-format ++msgid "while allocating cache: %s" ++msgstr "poÄas pridelenia cache: %s" ++ ++#: nscd/connections.c:200 + #, c-format + msgid "cannot open socket: %s" + msgstr "nie je možné otvoriÅ¥ socket `%s'" + +-#: nscd/connections.c:217 ++#: nscd/connections.c:218 + #, c-format + msgid "cannot enable socket to accept connections: %s" + msgstr "nie je možné povoliÅ¥ socketu prijímaÅ¥ spojenia: %s" + +-#: nscd/connections.c:259 ++#: nscd/connections.c:260 + #, c-format + msgid "handle_request: request received (Version = %d)" + msgstr "handle_request: žiadosÅ¥ prijatá (verzia = %d)" + +-#: nscd/connections.c:265 ++#: nscd/connections.c:266 + #, c-format + msgid "cannot handle old request version %d; current version is %d" + msgstr "nie je možné spracovaÅ¥ starú verziu žiadosti %d; aktuálna verzia je %d" + +-#: nscd/connections.c:303 nscd/connections.c:325 ++#: nscd/connections.c:304 nscd/connections.c:326 + #, c-format + msgid "cannot write result: %s" + msgstr "nie je možné zapísaÅ¥ výsledok: %s" + +-#: nscd/connections.c:404 nscd/connections.c:498 ++#: nscd/connections.c:405 nscd/connections.c:499 + #, c-format + msgid "error getting callers id: %s" + msgstr "chyba pri získaní id volajúceho: %s" + +-#: nscd/connections.c:470 ++#: nscd/connections.c:471 + #, c-format + msgid "while accepting connection: %s" + msgstr "poÄas prijatia spojenia: %s" + +-#: nscd/connections.c:481 ++#: nscd/connections.c:482 + #, c-format + msgid "short read while reading request: %s" + msgstr "neúplné Äítanie žiadosti: `%s'" + +-#: nscd/connections.c:517 ++#: nscd/connections.c:518 + #, c-format + msgid "key length in request too long: %d" + msgstr "dĺžka kľúÄa v žiadosti príliÅ¡ dlhá: %d" + +-#: nscd/connections.c:531 ++#: nscd/connections.c:532 + #, c-format + msgid "short read while reading request key: %s" + msgstr "neúplné Äítanie kľúÄa žiadosti: %s" + +-#: nscd/connections.c:590 nscd/connections.c:591 nscd/connections.c:610 +-#: nscd/connections.c:623 nscd/connections.c:629 nscd/connections.c:636 ++#: nscd/connections.c:591 nscd/connections.c:592 nscd/connections.c:611 ++#: nscd/connections.c:624 nscd/connections.c:630 nscd/connections.c:637 + #, c-format + msgid "Failed to run nscd as user '%s'" + msgstr "Zlyhalo spustenie nscd ako používateľ '%s'" + +-#: nscd/connections.c:611 ++#: nscd/connections.c:612 + msgid "getgrouplist failed" + msgstr "getgrouplist zlyhalo" + +-#: nscd/connections.c:624 ++#: nscd/connections.c:625 + msgid "setgroups failed" + msgstr "setgroups zlyhalo" + +-#: nscd/grpcache.c:102 nscd/hstcache.c:110 nscd/pwdcache.c:108 ++#: nscd/grpcache.c:103 nscd/hstcache.c:111 nscd/pwdcache.c:109 + msgid "while allocating key copy" + msgstr "poÄas pridelenia kópie kľúÄa" + +-#: nscd/grpcache.c:152 nscd/hstcache.c:167 nscd/pwdcache.c:145 ++#: nscd/grpcache.c:153 nscd/hstcache.c:168 nscd/pwdcache.c:146 + msgid "while allocating cache entry" + msgstr "poÄas pridelenia záznamu cache" + +-#: nscd/grpcache.c:195 nscd/hstcache.c:281 nscd/pwdcache.c:191 ++#: nscd/grpcache.c:196 nscd/hstcache.c:282 nscd/pwdcache.c:192 + #, c-format + msgid "short write in %s: %s" + msgstr "neúplný zápis v %s: %s" + +-#: nscd/grpcache.c:217 ++#: nscd/grpcache.c:218 + #, c-format + msgid "Haven't found \"%s\" in group cache!" + msgstr "Nenájdené \"%s\" v cache skupín!" + +-#: nscd/grpcache.c:292 ++#: nscd/grpcache.c:284 + #, c-format + msgid "Invalid numeric gid \"%s\"!" + msgstr "Neplatné Äíselné gid \"%s\"!" + +-#: nscd/grpcache.c:299 ++#: nscd/grpcache.c:291 + #, c-format + msgid "Haven't found \"%d\" in group cache!" + msgstr "Nenájdené \"%d\" v cache skupín!" + +-#: nscd/hstcache.c:303 nscd/hstcache.c:378 nscd/hstcache.c:456 +-#: nscd/hstcache.c:533 ++#: nscd/hstcache.c:304 nscd/hstcache.c:370 nscd/hstcache.c:435 ++#: nscd/hstcache.c:500 + #, c-format + msgid "Haven't found \"%s\" in hosts cache!" + msgstr "Nenájdené \"%s\" v cache poÄítaÄov!" + +-#: nscd/nscd.c:80 ++#: nscd/nscd.c:85 + msgid "Read configuration data from NAME" + msgstr "NaÄítaÅ¥ údaje o konfigurácii z NÃZOV" + +-#: nscd/nscd.c:82 ++#: nscd/nscd.c:87 + msgid "Do not fork and display messages on the current tty" + msgstr "NespúšťaÅ¥ samostatný proces a zobrazovaÅ¥ správy na aktuálnom termináli" + +-#: nscd/nscd.c:83 ++#: nscd/nscd.c:88 + msgid "NUMBER" + msgstr "POÄŒET" + +-#: nscd/nscd.c:83 ++#: nscd/nscd.c:88 + msgid "Start NUMBER threads" + msgstr "SpustiÅ¥ POÄŒET vlákien" + +-#: nscd/nscd.c:84 ++#: nscd/nscd.c:89 + msgid "Shut the server down" + msgstr "ZastaviÅ¥ server" + +-#: nscd/nscd.c:85 ++#: nscd/nscd.c:90 + msgid "Print current configuration statistic" + msgstr "VypísaÅ¥ Å¡tatistiku aktuálnej konfigurácie" + +-#: nscd/nscd.c:86 ++#: nscd/nscd.c:91 + msgid "TABLE" + msgstr "TABUĽKA" + +-#: nscd/nscd.c:87 ++#: nscd/nscd.c:92 + msgid "Invalidate the specified cache" + msgstr "ZneplatniÅ¥ zadanú cache" + +-#: nscd/nscd.c:88 ++#: nscd/nscd.c:93 + msgid "TABLE,yes" + msgstr "TABUĽKA,áno" + +-#: nscd/nscd.c:88 ++#: nscd/nscd.c:93 + msgid "Use separate cache for each user" + msgstr "PoužiÅ¥ samostatnú cache pre každého používateľa" + +-#: nscd/nscd.c:93 ++#: nscd/nscd.c:98 + msgid "Name Service Cache Daemon." + msgstr "Démon cache služby názvov." + +-#: nscd/nscd.c:126 ++#: nscd/nscd.c:131 + msgid "already running" + msgstr "už beží" + +-#: nscd/nscd.c:192 nscd/nscd.c:212 nscd/nscd.c:218 ++#: nscd/nscd.c:243 nscd/nscd.c:263 nscd/nscd.c:269 + msgid "Only root is allowed to use this option!" + msgstr "Táto voľba je dostupná iba superužívateľovi!" + +@@ -5276,22 +5285,22 @@ + "%15ld%% úspeÅ¡nosÅ¥ cache\n" + "%15s skontrolujte /etc/%s na zmeny\n" + +-#: nscd/pwdcache.c:213 ++#: nscd/pwdcache.c:214 + #, c-format + msgid "Haven't found \"%s\" in password cache!" + msgstr "Nenájdené \"%s\" v cache hesiel!" + +-#: nscd/pwdcache.c:288 ++#: nscd/pwdcache.c:280 + #, c-format + msgid "Invalid numeric uid \"%s\"!" + msgstr "Neplatné Äíselné uid \"%s\"!" + +-#: nscd/pwdcache.c:295 ++#: nscd/pwdcache.c:287 + #, c-format + msgid "Haven't found \"%d\" in password cache!" + msgstr "Nenájdené \"%d\" v cache hesiel!" + +-#: elf/../sysdeps/generic/dl-sysdep.c:297 ++#: elf/../sysdeps/generic/dl-sysdep.c:357 + msgid "cannot create capability list" + msgstr "nie je možné vytvoriÅ¥ zoznam zluÄiteľnosti" + +@@ -5342,7 +5351,7 @@ + msgid ", OS ABI: %s %d.%d.%d" + msgstr ", OS ABI: %s %d.%d.%d" + +-#: elf/cache.c:136 elf/ldconfig.c:1033 ++#: elf/cache.c:136 elf/ldconfig.c:1045 + #, c-format + msgid "Can't open cache file %s\n" + msgstr "Nie je možné otvoriÅ¥ cache súbor %s\n" +@@ -5388,15 +5397,15 @@ + msgid "Renaming of %s to %s failed" + msgstr "Premenovanie %s na %s zlyhalo" + +-#: elf/dl-close.c:113 ++#: elf/dl-close.c:128 + msgid "shared object not open" + msgstr "zdieľaný objekt nie je otvorený" + +-#: elf/dl-close.c:357 elf/dl-open.c:436 ++#: elf/dl-close.c:486 elf/dl-open.c:444 + msgid "TLS generation counter wrapped! Please send report with the 'glibcbug' script." + msgstr "PoÄítadlo generovania TLS pretieklo! Prosím poÅ¡lite správu pomocou skriptu 'glibcbug'." + +-#: elf/dl-deps.c:111 elf/dl-open.c:177 ++#: elf/dl-deps.c:111 elf/dl-open.c:183 + msgid "DST not allowed in SUID/SGID programs" + msgstr "DST nie je pre SUID/SGID programy povolené" + +@@ -5413,181 +5422,193 @@ + msgid "cannot allocate dependency list" + msgstr "nie je možné prideliÅ¥ pamäť pre zoznam závislostí" + +-#: elf/dl-deps.c:492 elf/dl-deps.c:547 ++#: elf/dl-deps.c:494 elf/dl-deps.c:549 + msgid "cannot allocate symbol search list" + msgstr "nie je možné prideliÅ¥ pamäť pre vyhľadávací zoznam symbolov" + +-#: elf/dl-deps.c:532 ++#: elf/dl-deps.c:534 + msgid "Filters not supported with LD_TRACE_PRELINKING" + msgstr "Filtre nie sú podporované s LD_TRACE_PRELINKING" + +-#: elf/dl-error.c:73 ++#: elf/dl-error.c:75 + msgid "DYNAMIC LINKER BUG!!!" + msgstr "CHYBA V DYNAMICKOM LINKERI!!!" + +-#: elf/dl-error.c:106 ++#: elf/dl-error.c:108 + msgid "error while loading shared libraries" + msgstr "chyba poÄas naÄítavania zdieľaných knižníc" + +-#: elf/dl-load.c:338 ++#: elf/dl-load.c:339 + msgid "cannot allocate name record" + msgstr "nie je možné prideliÅ¥ pamäť pre záznam názvu" + +-#: elf/dl-load.c:440 elf/dl-load.c:520 elf/dl-load.c:614 elf/dl-load.c:709 ++#: elf/dl-load.c:441 elf/dl-load.c:520 elf/dl-load.c:612 elf/dl-load.c:707 + msgid "cannot create cache for search path" + msgstr "Nie je možné vytvoriÅ¥ cache pre hľadanie v ceste" + +-#: elf/dl-load.c:545 ++#: elf/dl-load.c:543 + msgid "cannot create RUNPATH/RPATH copy" + msgstr "nie je možné vytvoriÅ¥ kópiu RUNPATH/RPATH" + +-#: elf/dl-load.c:600 ++#: elf/dl-load.c:598 + msgid "cannot create search path array" + msgstr "nie je možné vytvoriÅ¥ pole ciest" + +-#: elf/dl-load.c:796 ++#: elf/dl-load.c:794 + msgid "cannot stat shared object" + msgstr "nepodarilo sa zistiÅ¥ stav zdieľaného objektu" + +-#: elf/dl-load.c:840 ++#: elf/dl-load.c:838 + msgid "cannot open zero fill device" + msgstr "nie je možné otvoriÅ¥ zariadenie pre naplnenie nulami" + +-#: elf/dl-load.c:849 elf/dl-load.c:1855 ++#: elf/dl-load.c:847 elf/dl-load.c:1902 + msgid "cannot create shared object descriptor" + msgstr "nie je možné vytvoriÅ¥ deskriptor zdieľaného objektu" + +-#: elf/dl-load.c:868 elf/dl-load.c:1351 elf/dl-load.c:1434 ++#: elf/dl-load.c:866 elf/dl-load.c:1398 elf/dl-load.c:1481 + msgid "cannot read file data" + msgstr "nie je možné naÄítaÅ¥ údaje súboru" + +-#: elf/dl-load.c:908 ++#: elf/dl-load.c:906 + msgid "ELF load command alignment not page-aligned" + msgstr "ELF zarovnanie príkazu nie je zarovnané na stránku" + +-#: elf/dl-load.c:915 ++#: elf/dl-load.c:913 + msgid "ELF load command address/offset not properly aligned" + msgstr "ELF zavádzacia adresa/posunutie nie je správne zarovnaná" + +-#: elf/dl-load.c:996 ++#: elf/dl-load.c:988 ++msgid "cannot allocate TLS data structures for initial thread" ++msgstr "nie je možné prideliÅ¥ dátové Å¡truktúry TLS pre poÄiatoÄné vlákno" ++ ++#: elf/dl-load.c:1012 ++msgid "cannot handle TLS data" ++msgstr "nie je možné spracovaÅ¥ TLS dáta" ++ ++#: elf/dl-load.c:1047 + msgid "failed to map segment from shared object" + msgstr "nepodarilo sa namapovaÅ¥ segment zo zdieľaného objektu" + +-#: elf/dl-load.c:1020 ++#: elf/dl-load.c:1071 + msgid "cannot dynamically load executable" + msgstr "nie je možné dynamicky naÄítaÅ¥ spustiteľný súbor" + +-#: elf/dl-load.c:1081 ++#: elf/dl-load.c:1132 + msgid "cannot change memory protections" + msgstr "nie je možné zmeniÅ¥ ochranu pamäti" + +-#: elf/dl-load.c:1100 ++#: elf/dl-load.c:1151 + msgid "cannot map zero-fill pages" + msgstr "nie je možné namapovaÅ¥ stránky vyplnené nulami" + +-#: elf/dl-load.c:1118 ++#: elf/dl-load.c:1169 + msgid "cannot allocate memory for program header" + msgstr "nie je možné prideliÅ¥ pamäť pre hlaviÄku programu" + +-#: elf/dl-load.c:1149 ++#: elf/dl-load.c:1200 + msgid "object file has no dynamic section" + msgstr "objektový súbor neobsahuje žiadnu dynamickú sekciu" + +-#: elf/dl-load.c:1193 ++#: elf/dl-load.c:1240 + msgid "shared object cannot be dlopen()ed" + msgstr "zdieľaný objekt nemôže byÅ¥ otvorený pomocou dlopen()" + +-#: elf/dl-load.c:1216 ++#: elf/dl-load.c:1263 + msgid "cannot create searchlist" + msgstr "nie je možné vytvoriÅ¥ vyhľadávací zoznam" + +-#: elf/dl-load.c:1351 ++#: elf/dl-load.c:1398 + msgid "file too short" + msgstr "súbor je príliÅ¡ krátky" + +-#: elf/dl-load.c:1374 ++#: elf/dl-load.c:1421 + msgid "invalid ELF header" + msgstr "neprípustná ELF hlaviÄka" + +-#: elf/dl-load.c:1383 ++#: elf/dl-load.c:1430 + msgid "ELF file data encoding not big-endian" + msgstr "Kódovanie dát v ELF súbore nie je big-endian" + +-#: elf/dl-load.c:1385 ++#: elf/dl-load.c:1432 + msgid "ELF file data encoding not little-endian" + msgstr "Kódovanie dát v ELF súbore nie je little-endian" + +-#: elf/dl-load.c:1389 ++#: elf/dl-load.c:1436 + msgid "ELF file version ident does not match current one" + msgstr "Identifikácia verzie ELF súboru sa nezhoduje s aktuálnou" + +-#: elf/dl-load.c:1393 ++#: elf/dl-load.c:1440 + msgid "ELF file OS ABI invalid" + msgstr "Neplatný OS ABI ELF súboru" + +-#: elf/dl-load.c:1395 ++#: elf/dl-load.c:1442 + msgid "ELF file ABI version invalid" + msgstr "Neplatná verzia ABI ELF súboru" + +-#: elf/dl-load.c:1398 ++#: elf/dl-load.c:1445 + msgid "internal error" + msgstr "interná chyba" + +-#: elf/dl-load.c:1405 ++#: elf/dl-load.c:1452 + msgid "ELF file version does not match current one" + msgstr "Verzia súboru ELF sa nezhoduje s aktuálnou" + +-#: elf/dl-load.c:1413 ++#: elf/dl-load.c:1460 + msgid "ELF file's phentsize not the expected size" + msgstr "phentsize ELF súboru nie je oÄakávaná" + +-#: elf/dl-load.c:1419 ++#: elf/dl-load.c:1466 + msgid "only ET_DYN and ET_EXEC can be loaded" + msgstr "iba ET_DYN a ET_EXEC môžu byÅ¥ naÄítané" + +-#: elf/dl-load.c:1870 ++#: elf/dl-load.c:1917 + msgid "cannot open shared object file" + msgstr "nie je možné otvoriÅ¥ súbor zdieľaného objektu" + +-#: elf/dl-lookup.c:248 elf/dl-lookup.c:413 ++#: elf/dl-lookup.c:265 elf/dl-lookup.c:430 + msgid "relocation error" + msgstr "chyba relokácie" + +-#: elf/dl-open.c:105 ++#: elf/dl-open.c:111 + msgid "cannot extend global scope" + msgstr "nie je možné rozšíriÅ¥ globálny rozsah" + +-#: elf/dl-open.c:208 ++#: elf/dl-open.c:214 + msgid "empty dynamic string token substitution" + msgstr "prázdna substitúcia tokenu dynamického reÅ¥azca" + +-#: elf/dl-open.c:345 elf/dl-open.c:356 ++#: elf/dl-open.c:351 elf/dl-open.c:362 + msgid "cannot create scope list" + msgstr "nie je možné vytvoriÅ¥ zoznam pôsobnosti" + +-#: elf/dl-open.c:416 ++#: elf/dl-open.c:424 + msgid "cannot create TLS data structures" + msgstr "nie je možné dátové Å¡truktúry TLS" + +-#: elf/dl-open.c:478 ++#: elf/dl-open.c:486 + msgid "invalid mode for dlopen()" + msgstr "neprípustný mód pre dlopen()" + +-#: elf/dl-reloc.c:88 ++#: elf/dl-reloc.c:58 ++msgid "shared object cannot be dlopen()ed: static TLS memory too small" ++msgstr "zdieľaný objekt nemôže byÅ¥ otvorený pomocou dlopen(): statická pamäť TLS je príliÅ¡ malá" ++ ++#: elf/dl-reloc.c:118 + msgid "cannot make segment writable for relocation" + msgstr "nie je možné zmeniÅ¥ segment na zapisovateľný pre relokáciu" + +-#: elf/dl-reloc.c:174 ++#: elf/dl-reloc.c:219 + #, c-format + msgid "%s: profiler found no PLTREL in object %s\n" + msgstr "%s: profiler nenaÅ¡iel PLTREL v objekte %s\n" + +-#: elf/dl-reloc.c:186 ++#: elf/dl-reloc.c:231 + #, c-format + msgid "%s: profiler out of memory shadowing PLTREL of %s\n" + msgstr "%s: profiler vyÄerpal pamäť pri vytváraní kópie PLTREL z %s\n" + +-#: elf/dl-reloc.c:201 ++#: elf/dl-reloc.c:246 + msgid "cannot restore segment prot after reloc" + msgstr "nie je možné obnoviÅ¥ segment prot po reloc" + +@@ -5643,119 +5664,119 @@ + msgid "Configure Dynamic Linker Run Time Bindings." + msgstr "Konfigurácia runtime väzieb dynamického linkera." + +-#: elf/ldconfig.c:282 ++#: elf/ldconfig.c:294 + #, c-format + msgid "Path `%s' given more than once" + msgstr "Cesta `%s' bola zadaná viac ako raz" + +-#: elf/ldconfig.c:326 ++#: elf/ldconfig.c:338 + #, c-format + msgid "%s is not a known library type" + msgstr "%s nie je známy typ knižnice" + +-#: elf/ldconfig.c:344 ++#: elf/ldconfig.c:356 + #, c-format + msgid "Can't stat %s" + msgstr "Zlyhal stat %s" + +-#: elf/ldconfig.c:414 ++#: elf/ldconfig.c:426 + #, c-format + msgid "Can't stat %s\n" + msgstr "Zlyhal stat %s\n" + +-#: elf/ldconfig.c:424 ++#: elf/ldconfig.c:436 + #, c-format + msgid "%s is not a symbolic link\n" + msgstr "%s nie je symbolický odkaz\n" + +-#: elf/ldconfig.c:443 ++#: elf/ldconfig.c:455 + #, c-format + msgid "Can't unlink %s" + msgstr "Nie je možné odstrániÅ¥ %s" + +-#: elf/ldconfig.c:449 ++#: elf/ldconfig.c:461 + #, c-format + msgid "Can't link %s to %s" + msgstr "Nie je možné vytvoriÅ¥ odkaz %s na %s" + +-#: elf/ldconfig.c:455 ++#: elf/ldconfig.c:467 + msgid " (changed)\n" + msgstr " (zmenené)\n" + +-#: elf/ldconfig.c:457 ++#: elf/ldconfig.c:469 + msgid " (SKIPPED)\n" + msgstr " (VYNECHANÉ)\n" + +-#: elf/ldconfig.c:512 ++#: elf/ldconfig.c:524 + #, c-format + msgid "Can't find %s" + msgstr "Nie je možné nájsÅ¥ %s" + +-#: elf/ldconfig.c:528 ++#: elf/ldconfig.c:540 + #, c-format + msgid "Can't lstat %s" + msgstr "Zlyhal lstat %s" + +-#: elf/ldconfig.c:535 ++#: elf/ldconfig.c:547 + #, c-format + msgid "Ignored file %s since it is not a regular file." + msgstr "Súbor %s ignorovaný, keÄže nie je regulérnym súborom." + +-#: elf/ldconfig.c:543 ++#: elf/ldconfig.c:555 + #, c-format + msgid "No link created since soname could not be found for %s" + msgstr "Odkaz nebol vytvorený, keÄže pre %s nebolo možné nájsÅ¥ soname" + +-#: elf/ldconfig.c:634 ++#: elf/ldconfig.c:646 + #, c-format + msgid "Can't open directory %s" + msgstr "Nie je možné otvoriÅ¥ adresár %s" + +-#: elf/ldconfig.c:689 elf/ldconfig.c:736 ++#: elf/ldconfig.c:701 elf/ldconfig.c:748 + #, c-format + msgid "Cannot lstat %s" + msgstr "Zlyhal lstat %s" + +-#: elf/ldconfig.c:701 ++#: elf/ldconfig.c:713 + #, c-format + msgid "Cannot stat %s" + msgstr "Zlyhal stat %s" + +-#: elf/ldconfig.c:758 elf/readlib.c:93 ++#: elf/ldconfig.c:770 elf/readlib.c:93 + #, c-format + msgid "Input file %s not found.\n" + msgstr "Vstupný súbor %s nebol nájdený.\n" + +-#: elf/ldconfig.c:792 ++#: elf/ldconfig.c:804 + #, c-format + msgid "libc5 library %s in wrong directory" + msgstr "libc5 knižnica %s je v nesprávnom adresári" + +-#: elf/ldconfig.c:795 ++#: elf/ldconfig.c:807 + #, c-format + msgid "libc6 library %s in wrong directory" + msgstr "libc6 knižnica %s je v nesprávnom adresári" + +-#: elf/ldconfig.c:798 ++#: elf/ldconfig.c:810 + #, c-format + msgid "libc4 library %s in wrong directory" + msgstr "libc4 knižnica %s je v nesprávnom adresári" + +-#: elf/ldconfig.c:825 ++#: elf/ldconfig.c:837 + #, c-format + msgid "libraries %s and %s in directory %s have same soname but different type." + msgstr "knižnice %s a %s v adresári %s majú rovnaké soname, ale odliÅ¡ný typ." + +-#: elf/ldconfig.c:928 ++#: elf/ldconfig.c:940 + #, c-format + msgid "Can't open configuration file %s" + msgstr "Nie je možné otvoriÅ¥ konfiguraÄný súbor %s" + +-#: elf/ldconfig.c:1012 ++#: elf/ldconfig.c:1024 + msgid "Can't chdir to /" + msgstr "Nie je možné zmeniÅ¥ adresár na /" + +-#: elf/ldconfig.c:1054 ++#: elf/ldconfig.c:1066 + #, c-format + msgid "Can't open cache file directory %s\n" + msgstr "Nie je možné otvoriÅ¥ adresár cache súboru %s\n" +Binary files glibc-2.3.2/po/sv.mo and glibc-2.3.2-200304020432/po/sv.mo differ +diff -u -udbrN glibc-2.3.2/po/sv.po glibc-2.3.2-200304020432/po/sv.po +--- glibc-2.3.2/po/sv.po Mon Oct 14 22:03:36 2002 ++++ glibc-2.3.2-200304020432/po/sv.po Tue Mar 4 19:25:34 2003 +@@ -1,13 +1,13 @@ + # GNU libc message catalog for swedish +-# Copyright © 1996, 1998, 2001, 2002 Free Software Foundation, Inc. +-# Jan Djärv , 1996, 1998, 2001, 2002. +-# Revision: 1.43 ++# Copyright © 1996, 1998, 2001, 2002, 2003 Free Software Foundation, Inc. ++# Jan Djärv , 1996, 1998, 2001, 2002, 2003. ++# Revision: 1.46 + # + msgid "" + msgstr "" +-"Project-Id-Version: libc 2.3.1\n" +-"POT-Creation-Date: 2002-10-02 17:22-0700\n" +-"PO-Revision-Date: 2002-10-14 21:09+0200\n" ++"Project-Id-Version: libc 2.3.2\n" ++"POT-Creation-Date: 2003-02-22 15:34-0800\n" ++"PO-Revision-Date: 2003-03-04 18:46+0100\n" + "Last-Translator: Jan Djärv \n" + "Language-Team: Swedish \n" + "MIME-Version: 1.0\n" +@@ -260,7 +260,7 @@ + + #: iconv/iconv_prog.c:241 + #, c-format +-msgid "conversions from `%s' and to `%s' are not supported" ++msgid "conversion from `%s' and to `%s' are not supported" + msgstr "konvertering från \"%s\" och till \"%s\" stöds ej" + + #: iconv/iconv_prog.c:246 +@@ -286,7 +286,7 @@ + msgid "error while closing output file" + msgstr "fel vid stängning av utfilen" + +-#: iconv/iconv_prog.c:407 iconv/iconvconfig.c:355 locale/programs/locale.c:268 ++#: iconv/iconv_prog.c:407 iconv/iconvconfig.c:357 locale/programs/locale.c:274 + #: locale/programs/localedef.c:372 catgets/gencat.c:233 + #: malloc/memusagestat.c:602 debug/pcprofiledump.c:199 + msgid "Report bugs using the `glibcbug' script to .\n" +@@ -294,9 +294,9 @@ + "Rapportera fel med programmet \"glibcbug\" till .\n" + "Rapportera fel på översättningen till .\n" + +-#: iconv/iconv_prog.c:421 iconv/iconvconfig.c:369 locale/programs/locale.c:281 +-#: locale/programs/localedef.c:386 catgets/gencat.c:246 posix/getconf.c:904 +-#: nss/getent.c:74 nscd/nscd.c:279 nscd/nscd_nischeck.c:90 elf/ldconfig.c:259 ++#: iconv/iconv_prog.c:421 iconv/iconvconfig.c:371 locale/programs/locale.c:287 ++#: locale/programs/localedef.c:386 catgets/gencat.c:246 posix/getconf.c:910 ++#: nss/getent.c:74 nscd/nscd.c:330 nscd/nscd_nischeck.c:90 elf/ldconfig.c:271 + #: elf/sprof.c:349 + #, c-format + msgid "" +@@ -309,9 +309,9 @@ + "INGEN garanti; inte ens för SÄLJBARHET eller LÄMPLIGHET FÖR NÅGOT SPECIELLT\n" + "ÄNDAMÅL.\n" + +-#: iconv/iconv_prog.c:426 iconv/iconvconfig.c:374 locale/programs/locale.c:286 +-#: locale/programs/localedef.c:391 catgets/gencat.c:251 posix/getconf.c:909 +-#: nss/getent.c:79 nscd/nscd.c:284 nscd/nscd_nischeck.c:95 elf/ldconfig.c:264 ++#: iconv/iconv_prog.c:426 iconv/iconvconfig.c:376 locale/programs/locale.c:292 ++#: locale/programs/localedef.c:391 catgets/gencat.c:251 posix/getconf.c:915 ++#: nss/getent.c:79 nscd/nscd.c:335 nscd/nscd_nischeck.c:95 elf/ldconfig.c:276 + #: elf/sprof.c:355 + #, c-format + msgid "Written by %s.\n" +@@ -363,15 +363,15 @@ + msgid "Prefix used for all file accesses" + msgstr "Prefix att använda för alla filåtkomster" + +-#: iconv/iconvconfig.c:325 locale/programs/localedef.c:292 ++#: iconv/iconvconfig.c:327 locale/programs/localedef.c:292 + msgid "no output file produced because warning were issued" + msgstr "ingen utfil skapad på grund av varningar" + +-#: iconv/iconvconfig.c:403 ++#: iconv/iconvconfig.c:405 + msgid "while inserting in search tree" + msgstr "vid insättning i sökträd" + +-#: iconv/iconvconfig.c:1202 ++#: iconv/iconvconfig.c:1204 + msgid "cannot generate output file" + msgstr "kan inte generera utfil" + +@@ -1283,7 +1283,7 @@ + msgid "unterminated symbolic name" + msgstr "oavslutat symboliskt namn" + +-#: locale/programs/linereader.c:537 catgets/gencat.c:1166 ++#: locale/programs/linereader.c:537 catgets/gencat.c:1195 + msgid "invalid escape sequence" + msgstr "ogiltig kontrollsekvens" + +@@ -1313,39 +1313,39 @@ + msgid "trailing garbage at end of line" + msgstr "avslutande skräp vid radslutet" + +-#: locale/programs/locale.c:73 ++#: locale/programs/locale.c:75 + msgid "System information:" + msgstr "Systeminformation:" + +-#: locale/programs/locale.c:75 ++#: locale/programs/locale.c:77 + msgid "Write names of available locales" + msgstr "Skriv namn på tillgängliga lokaler" + +-#: locale/programs/locale.c:77 ++#: locale/programs/locale.c:79 + msgid "Write names of available charmaps" + msgstr "Skriv namn på tillgängliga teckenuppsättningar" + +-#: locale/programs/locale.c:78 ++#: locale/programs/locale.c:80 + msgid "Modify output format:" + msgstr "Ändra utdataformat:" + +-#: locale/programs/locale.c:79 ++#: locale/programs/locale.c:81 + msgid "Write names of selected categories" + msgstr "Skriv namn på valda kategorier" + +-#: locale/programs/locale.c:80 ++#: locale/programs/locale.c:82 + msgid "Write names of selected keywords" + msgstr "Skriv namn på valda nyckelord" + +-#: locale/programs/locale.c:81 ++#: locale/programs/locale.c:83 + msgid "Print more information" + msgstr "Skriv mer information" + +-#: locale/programs/locale.c:86 ++#: locale/programs/locale.c:88 + msgid "Get locale-specific information." + msgstr "Hämta lokal-specifik information" + +-#: locale/programs/locale.c:89 ++#: locale/programs/locale.c:91 + msgid "" + "NAME\n" + "[-a|-m]" +@@ -1353,7 +1353,7 @@ + "NAMN\n" + "[-a|-m]" + +-#: locale/programs/locale.c:488 ++#: locale/programs/locale.c:512 + msgid "while preparing output" + msgstr "när utdata förbereddes" + +@@ -1484,16 +1484,16 @@ + msgid "cannot create temporary file" + msgstr "kan inte skapa temporärfil" + +-#: locale/programs/locarchive.c:118 locale/programs/locarchive.c:302 ++#: locale/programs/locarchive.c:118 locale/programs/locarchive.c:305 + msgid "cannot initialize archive file" + msgstr "kan inte initiera arkivfil" + +-#: locale/programs/locarchive.c:125 locale/programs/locarchive.c:309 ++#: locale/programs/locarchive.c:125 locale/programs/locarchive.c:312 + msgid "cannot resize archive file" + msgstr "kan inte byta storlek på arkivfil" + +-#: locale/programs/locarchive.c:134 locale/programs/locarchive.c:318 +-#: locale/programs/locarchive.c:508 ++#: locale/programs/locarchive.c:134 locale/programs/locarchive.c:321 ++#: locale/programs/locarchive.c:511 + msgid "cannot map archive header" + msgstr "kan inte läsa arkivhuvud med mmap" + +@@ -1509,88 +1509,88 @@ + msgid "cannot map locale archive file" + msgstr "kan inte öppna lokalarkivfil med mmap" + +-#: locale/programs/locarchive.c:326 ++#: locale/programs/locarchive.c:329 + msgid "cannot lock new archive" + msgstr "kan inte låsa nytt arkiv" + +-#: locale/programs/locarchive.c:377 ++#: locale/programs/locarchive.c:380 + msgid "cannot extend locale archive file" + msgstr "kan inte utöka lokalarkivfil" + +-#: locale/programs/locarchive.c:386 ++#: locale/programs/locarchive.c:389 + msgid "cannot change mode of resized locale archive" + msgstr "kan inte ändra åtkomstläge på storleksändrat lokalarkiv" + +-#: locale/programs/locarchive.c:394 ++#: locale/programs/locarchive.c:397 + msgid "cannot rename new archive" + msgstr "kan inte byta namn på nytt arkiv" + +-#: locale/programs/locarchive.c:447 ++#: locale/programs/locarchive.c:450 + #, c-format + msgid "cannot open locale archive \"%s\"" + msgstr "kan inte öppna lokalarkiv \"%s\"" + +-#: locale/programs/locarchive.c:452 ++#: locale/programs/locarchive.c:455 + #, c-format + msgid "cannot stat locale archive \"%s\"" + msgstr "kan inte ta status på lokalarkiv \"%s\"" + +-#: locale/programs/locarchive.c:471 ++#: locale/programs/locarchive.c:474 + #, c-format + msgid "cannot lock locale archive \"%s\"" + msgstr "kan inte låsa lokalarkiv \"%s\"" + +-#: locale/programs/locarchive.c:494 ++#: locale/programs/locarchive.c:497 + msgid "cannot read archive header" + msgstr "kan inte läsa arkivhuvud" + +-#: locale/programs/locarchive.c:554 ++#: locale/programs/locarchive.c:557 + #, c-format + msgid "locale '%s' already exists" + msgstr "lokal \"%s\" finns redan" + +-#: locale/programs/locarchive.c:784 locale/programs/locarchive.c:799 +-#: locale/programs/locarchive.c:811 locale/programs/locarchive.c:823 ++#: locale/programs/locarchive.c:788 locale/programs/locarchive.c:803 ++#: locale/programs/locarchive.c:815 locale/programs/locarchive.c:827 + #: locale/programs/locfile.c:343 + msgid "cannot add to locale archive" + msgstr "kan inte lägga till till lokalarkiv" + +-#: locale/programs/locarchive.c:976 ++#: locale/programs/locarchive.c:982 + #, c-format + msgid "locale alias file `%s' not found" + msgstr "fil \"%s\" för lokalalias hittas inte" + +-#: locale/programs/locarchive.c:1118 ++#: locale/programs/locarchive.c:1126 + #, c-format + msgid "Adding %s\n" + msgstr "Lägger till %s\n" + +-#: locale/programs/locarchive.c:1124 ++#: locale/programs/locarchive.c:1132 + #, c-format + msgid "stat of \"%s\" failed: %s: ignored" + msgstr "ta status på \"%s\" misslyckades: %s: ignorerad" + +-#: locale/programs/locarchive.c:1130 ++#: locale/programs/locarchive.c:1138 + #, c-format + msgid "\"%s\" is no directory; ignored" + msgstr "\"%s\" är inte en katalog, ignorerad" + +-#: locale/programs/locarchive.c:1137 ++#: locale/programs/locarchive.c:1145 + #, c-format + msgid "cannot open directory \"%s\": %s: ignored" + msgstr "kan inte öppna katalog \"%s\": %s: ignorerad" + +-#: locale/programs/locarchive.c:1209 ++#: locale/programs/locarchive.c:1217 + #, c-format + msgid "incomplete set of locale files in \"%s\"" + msgstr "ofullständig uppsättning av lokalfiler i \"%s\"" + +-#: locale/programs/locarchive.c:1273 ++#: locale/programs/locarchive.c:1281 + #, c-format + msgid "cannot read all files in \"%s\": ignored" + msgstr "kan inte läsa alla filer i \"%s\": ignorerad" + +-#: locale/programs/locarchive.c:1343 ++#: locale/programs/locarchive.c:1351 + #, c-format + msgid "locale \"%s\" not in archive" + msgstr "lokal \"%s\" finns inte i arkivet" +@@ -1659,8 +1659,8 @@ + msgid "upper limit in range is not smaller then lower limit" + msgstr "övre gräns i intervall är inte mindre än undre gräns" + +-#: locale/programs/xmalloc.c:70 malloc/obstack.c:500 malloc/obstack.c:503 +-#: posix/getconf.c:996 ++#: locale/programs/xmalloc.c:70 malloc/obstack.c:505 malloc/obstack.c:508 ++#: posix/getconf.c:1002 + msgid "memory exhausted" + msgstr "minne slut" + +@@ -1686,7 +1686,7 @@ + msgid "Another string for testing." + msgstr "En till sträng för test." + +-#: catgets/gencat.c:111 catgets/gencat.c:115 nscd/nscd.c:79 ++#: catgets/gencat.c:111 catgets/gencat.c:115 nscd/nscd.c:84 + msgid "NAME" + msgstr "NAMN" + +@@ -1730,7 +1730,7 @@ + msgid "duplicate set definition" + msgstr "dubblerad definition av mängd" + +-#: catgets/gencat.c:446 catgets/gencat.c:619 catgets/gencat.c:648 ++#: catgets/gencat.c:446 catgets/gencat.c:623 catgets/gencat.c:677 + msgid "this is the first definition" + msgstr "detta är den första definitionen" + +@@ -1748,44 +1748,44 @@ + msgid "unknown directive `%s': line ignored" + msgstr "okänt direktiv \"%s\": rad ignorerad" + +-#: catgets/gencat.c:617 ++#: catgets/gencat.c:621 + msgid "duplicated message number" + msgstr "dubblerat meddelandenummer" + +-#: catgets/gencat.c:645 ++#: catgets/gencat.c:674 + msgid "duplicated message identifier" + msgstr "dubblerad meddelandeidentifierare" + +-#: catgets/gencat.c:702 ++#: catgets/gencat.c:731 + msgid "invalid character: message ignored" + msgstr "ogiltigt tecken: meddelandet ignorerat" + +-#: catgets/gencat.c:745 ++#: catgets/gencat.c:774 + msgid "invalid line" + msgstr "ogiltig rad" + +-#: catgets/gencat.c:799 ++#: catgets/gencat.c:828 + msgid "malformed line ignored" + msgstr "felaktig rad ignorerad" + +-#: catgets/gencat.c:963 catgets/gencat.c:1004 ++#: catgets/gencat.c:992 catgets/gencat.c:1033 + #, c-format + msgid "cannot open output file `%s'" + msgstr "kan inte öppna utfil \"%s\"" + +-#: catgets/gencat.c:1188 ++#: catgets/gencat.c:1217 + msgid "unterminated message" + msgstr "oavslutat meddelande" + +-#: catgets/gencat.c:1212 ++#: catgets/gencat.c:1241 + msgid "while opening old catalog file" + msgstr "när gammal katalogfil öppnades" + +-#: catgets/gencat.c:1303 ++#: catgets/gencat.c:1332 + msgid "conversion modules not available" + msgstr "konverteringsmoduler inte tillgängliga" + +-#: catgets/gencat.c:1329 ++#: catgets/gencat.c:1358 + msgid "cannot determine escape character" + msgstr "kan inte avgöra kontrolltecken" + +@@ -1793,7 +1793,7 @@ + msgid "makecontext: does not know how to handle more than 8 arguments\n" + msgstr "makecontext: kan inte hantera mer än 8 argument\n" + +-#: stdio-common/../sysdeps/gnu/errlist.c:12 posix/regcomp.c:178 ++#: stdio-common/../sysdeps/gnu/errlist.c:12 posix/regcomp.c:133 + #: nis/nis_error.c:29 nis/ypclnt.c:787 nis/ypclnt.c:861 + msgid "Success" + msgstr "Lyckat" +@@ -2982,23 +2982,23 @@ + msgid "%s%sUnknown signal %d\n" + msgstr "%s%sOkänd signal %d\n" + +-#: malloc/mcheck.c:296 ++#: malloc/mcheck.c:346 + msgid "memory is consistent, library is buggy\n" + msgstr "minnet är konsistent, biblioteket är felaktigt\n" + +-#: malloc/mcheck.c:299 ++#: malloc/mcheck.c:349 + msgid "memory clobbered before allocated block\n" + msgstr "minnet förstört före allokerat block\n" + +-#: malloc/mcheck.c:302 ++#: malloc/mcheck.c:352 + msgid "memory clobbered past end of allocated block\n" + msgstr "minnet förstört efter slutet på allokerat block\n" + +-#: malloc/mcheck.c:305 ++#: malloc/mcheck.c:355 + msgid "block freed twice\n" + msgstr "block frigjort två gånger\n" + +-#: malloc/mcheck.c:308 ++#: malloc/mcheck.c:358 + msgid "bogus mcheck_status, library is buggy\n" + msgstr "felaktig mcheck_status, biblioteket är felaktigt\n" + +@@ -3034,6 +3034,10 @@ + msgid "DATAFILE [OUTFILE]" + msgstr "DATAFIL [UTFIL]" + ++#: string/strerror.c:43 posix/../sysdeps/posix/gai_strerror.c:57 ++msgid "Unknown error" ++msgstr "Okänt fel" ++ + #: string/strsignal.c:69 + #, c-format + msgid "Real-time signal %d" +@@ -3058,7 +3062,7 @@ + msgid "%s: Memory exhausted: %s\n" + msgstr "%s: Minnet slut: %s\n" + +-#: timezone/zic.c:390 misc/error.c:120 ++#: timezone/zic.c:390 misc/error.c:127 misc/error.c:155 + msgid "Unknown system error" + msgstr "Okänt systemfel" + +@@ -3451,25 +3455,21 @@ + msgid "Interrupted by a signal" + msgstr "Avbruten av en signal" + +-#: posix/../sysdeps/posix/gai_strerror.c:57 +-msgid "Unknown error" +-msgstr "Okänt fel" +- +-#: posix/getconf.c:883 ++#: posix/getconf.c:889 + #, c-format + msgid "Usage: %s [-v specification] variable_name [pathname]\n" + msgstr "Användning: %s [-v specifikation] variabelnamn [sökväg]\n" + +-#: posix/getconf.c:941 ++#: posix/getconf.c:947 + #, c-format + msgid "unknown specification \"%s\"" + msgstr "okänd specifikation \"%s\"" + +-#: posix/getconf.c:968 posix/getconf.c:984 ++#: posix/getconf.c:974 posix/getconf.c:990 + msgid "undefined" + msgstr "odefinierad" + +-#: posix/getconf.c:1006 ++#: posix/getconf.c:1012 + #, c-format + msgid "Unrecognized variable `%s'" + msgstr "Okänd variabel \"%s\"" +@@ -3531,71 +3531,71 @@ + msgid "%s: option `-W %s' doesn't allow an argument\n" + msgstr "%s: flaggan \"-W %s\" tar inget argument\n" + +-#: posix/regcomp.c:181 ++#: posix/regcomp.c:136 + msgid "No match" + msgstr "Ingen träff" + +-#: posix/regcomp.c:184 ++#: posix/regcomp.c:139 + msgid "Invalid regular expression" + msgstr "Ogiltigt reguljärt uttryck" + +-#: posix/regcomp.c:187 ++#: posix/regcomp.c:142 + msgid "Invalid collation character" + msgstr "Ogiltigt kollationeringstecken" + +-#: posix/regcomp.c:190 ++#: posix/regcomp.c:145 + msgid "Invalid character class name" + msgstr "Ogiltigt teckenklassnamn" + +-#: posix/regcomp.c:193 ++#: posix/regcomp.c:148 + msgid "Trailing backslash" + msgstr "Avslutande omvänt snedstreck" + +-#: posix/regcomp.c:196 ++#: posix/regcomp.c:151 + msgid "Invalid back reference" + msgstr "Ogiltig bakåtreferens" + +-#: posix/regcomp.c:199 ++#: posix/regcomp.c:154 + msgid "Unmatched [ or [^" + msgstr "Obalanserade [ eller [^" + +-#: posix/regcomp.c:202 ++#: posix/regcomp.c:157 + msgid "Unmatched ( or \\(" + msgstr "Obalanserade ( eller \\(" + +-#: posix/regcomp.c:205 ++#: posix/regcomp.c:160 + msgid "Unmatched \\{" + msgstr "Obalanserad \\{" + +-#: posix/regcomp.c:208 ++#: posix/regcomp.c:163 + msgid "Invalid content of \\{\\}" + msgstr "Ogiltigt innehåll i \\{\\}" + +-#: posix/regcomp.c:211 ++#: posix/regcomp.c:166 + msgid "Invalid range end" + msgstr "Ogiltigt intervallslut" + +-#: posix/regcomp.c:214 ++#: posix/regcomp.c:169 + msgid "Memory exhausted" + msgstr "Minnet slut" + +-#: posix/regcomp.c:217 ++#: posix/regcomp.c:172 + msgid "Invalid preceding regular expression" + msgstr "Ogiltigt föregående reguljärt uttryck" + +-#: posix/regcomp.c:220 ++#: posix/regcomp.c:175 + msgid "Premature end of regular expression" + msgstr "För tidigt slut på reguljärt uttryck" + +-#: posix/regcomp.c:223 ++#: posix/regcomp.c:178 + msgid "Regular expression too big" + msgstr "Reguljärt uttryck för stort" + +-#: posix/regcomp.c:226 ++#: posix/regcomp.c:181 + msgid "Unmatched ) or \\)" + msgstr "Obalanserade ) eller \\)" + +-#: posix/regcomp.c:673 ++#: posix/regcomp.c:615 + msgid "No previous regular expression" + msgstr "Inget föregående reguljärt uttryck" + +@@ -3749,24 +3749,24 @@ + msgid "Service configuration to be used" + msgstr "Tjänstekonfiguration som ska användas" + +-#: nss/getent.c:136 nss/getent.c:305 ++#: nss/getent.c:136 nss/getent.c:308 + #, c-format + msgid "Enumeration not supported on %s\n" + msgstr "Uppräkning stöds inte på %s\n" + +-#: nss/getent.c:729 ++#: nss/getent.c:732 + msgid "getent - get entries from administrative database." + msgstr "getent - hämta poster från administrativ databas" + +-#: nss/getent.c:730 ++#: nss/getent.c:733 + msgid "Supported databases:" + msgstr "Databaser som stöds:" + +-#: nss/getent.c:787 nscd/nscd.c:119 nscd/nscd_nischeck.c:64 ++#: nss/getent.c:790 nscd/nscd.c:124 nscd/nscd_nischeck.c:64 + msgid "wrong number of arguments" + msgstr "fel antal argument" + +-#: nss/getent.c:797 ++#: nss/getent.c:800 + #, c-format + msgid "Unknown database: %s\n" + msgstr "Okänd databas: %s\n" +@@ -3795,68 +3795,72 @@ + msgid "invalid pointer size" + msgstr "ogiltig pekarstorlek" + +-#: inet/rcmd.c:174 inet/rcmd.c:177 ++#: inet/rcmd.c:163 inet/rcmd.c:166 ++msgid "rcmd: Cannot allocate memory\n" ++msgstr "rcmd: Kan inte allokera minne\n" ++ ++#: inet/rcmd.c:185 inet/rcmd.c:188 + msgid "rcmd: socket: All ports in use\n" + msgstr "rcmd: uttag (socket): Alla portar används\n" + +-#: inet/rcmd.c:211 ++#: inet/rcmd.c:222 + #, c-format + msgid "connect to address %s: " + msgstr "anslut till adress %s: " + +-#: inet/rcmd.c:229 ++#: inet/rcmd.c:240 + #, c-format + msgid "Trying %s...\n" + msgstr "Provar %s...\n" + +-#: inet/rcmd.c:278 ++#: inet/rcmd.c:289 + #, c-format + msgid "rcmd: write (setting up stderr): %m\n" + msgstr "rcmd: write: (sätter upp standard fel): %m\n" + +-#: inet/rcmd.c:299 ++#: inet/rcmd.c:310 + #, c-format + msgid "rcmd: poll (setting up stderr): %m\n" + msgstr "rcmd: poll (sätter upp standard fel): %m\n" + +-#: inet/rcmd.c:302 ++#: inet/rcmd.c:313 + msgid "poll: protocol failure in circuit setup\n" + msgstr "poll: protokollfel i förbindelseuppsättning\n" + +-#: inet/rcmd.c:346 ++#: inet/rcmd.c:358 + msgid "socket: protocol failure in circuit setup\n" + msgstr "uttag (socket): protokollfel i förbindelseuppsättning\n" + +-#: inet/rcmd.c:368 ++#: inet/rcmd.c:387 + #, c-format + msgid "rcmd: %s: short read" + msgstr "rcmd: %s: läsning gav för lite data" + +-#: inet/rcmd.c:524 ++#: inet/rcmd.c:549 + msgid "lstat failed" + msgstr "misslyckades ta status (lstat)" + +-#: inet/rcmd.c:526 ++#: inet/rcmd.c:551 + msgid "not regular file" + msgstr "inte en normal fil" + +-#: inet/rcmd.c:531 ++#: inet/rcmd.c:556 + msgid "cannot open" + msgstr "kan inte öppna" + +-#: inet/rcmd.c:533 ++#: inet/rcmd.c:558 + msgid "fstat failed" + msgstr "misslyckades ta status (fstat)" + +-#: inet/rcmd.c:535 ++#: inet/rcmd.c:560 + msgid "bad owner" + msgstr "olämplig ägare" + +-#: inet/rcmd.c:537 ++#: inet/rcmd.c:562 + msgid "writeable by other than owner" + msgstr "skrivbar för andra än ägaren" + +-#: inet/rcmd.c:539 ++#: inet/rcmd.c:564 + msgid "hard linked somewhere" + msgstr "hårdlänkad någonstans" + +@@ -4067,109 +4071,109 @@ + msgid "Cannot receive reply to broadcast" + msgstr "Kan inte ta emot svar på utsändning" + +-#: sunrpc/rpc_main.c:289 ++#: sunrpc/rpc_main.c:288 + #, c-format + msgid "%s: output would overwrite %s\n" + msgstr "%s: utdata skulle skriva över %s\n" + +-#: sunrpc/rpc_main.c:296 ++#: sunrpc/rpc_main.c:295 + #, c-format + msgid "%s: unable to open %s: %m\n" + msgstr "%s: kan inte öppna %s: %m\n" + +-#: sunrpc/rpc_main.c:308 ++#: sunrpc/rpc_main.c:307 + #, c-format + msgid "%s: while writing output %s: %m" + msgstr "%s: när resultatet %s skrevs: %m" + +-#: sunrpc/rpc_main.c:343 ++#: sunrpc/rpc_main.c:342 + #, c-format + msgid "cannot find C preprocessor: %s \n" + msgstr "kan inte hitta C preprocessor: %s \n" + +-#: sunrpc/rpc_main.c:351 ++#: sunrpc/rpc_main.c:350 + msgid "cannot find any C preprocessor (cpp)\n" + msgstr "kan inte hitta någon C preprocessor (cpp)\n" + +-#: sunrpc/rpc_main.c:420 ++#: sunrpc/rpc_main.c:419 + #, c-format + msgid "%s: C preprocessor failed with signal %d\n" + msgstr "%s: C preprocessorn avslutades med signal %d\n" + +-#: sunrpc/rpc_main.c:423 ++#: sunrpc/rpc_main.c:422 + #, c-format + msgid "%s: C preprocessor failed with exit code %d\n" + msgstr "%s: C preprocessorn avslutades med kod %d\n" + +-#: sunrpc/rpc_main.c:463 ++#: sunrpc/rpc_main.c:462 + #, c-format + msgid "illegal nettype :`%s'\n" + msgstr "otillåten nättyp: \"%s\"\n" + +-#: sunrpc/rpc_main.c:1105 ++#: sunrpc/rpc_main.c:1104 + msgid "rpcgen: too many defines\n" + msgstr "rpcgen: för många \"define\"\n" + +-#: sunrpc/rpc_main.c:1117 ++#: sunrpc/rpc_main.c:1116 + msgid "rpcgen: arglist coding error\n" + msgstr "rpcgen: arglist kodningsfel\n" + + #. TRANS: the file will not be removed; this is an + #. TRANS: informative message. +-#: sunrpc/rpc_main.c:1150 ++#: sunrpc/rpc_main.c:1149 + #, c-format + msgid "file `%s' already exists and may be overwritten\n" + msgstr "fil \"%s\" finns redan och kan bli överskriven\n" + +-#: sunrpc/rpc_main.c:1195 ++#: sunrpc/rpc_main.c:1194 + msgid "Cannot specify more than one input file!\n" + msgstr "Kan inte ange mer än en infil!\n" + +-#: sunrpc/rpc_main.c:1365 ++#: sunrpc/rpc_main.c:1364 + 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" + +-#: sunrpc/rpc_main.c:1374 ++#: sunrpc/rpc_main.c:1373 + msgid "Cannot use netid flag with inetd flag!\n" + msgstr "Kan inte ange netid-flaggan tillsammans med inetd-flaggan!\n" + +-#: sunrpc/rpc_main.c:1386 ++#: sunrpc/rpc_main.c:1385 + msgid "Cannot use netid flag without TIRPC!\n" + msgstr "Kan inte ange netid-flaggan utan TIRPC!\n" + +-#: sunrpc/rpc_main.c:1393 ++#: sunrpc/rpc_main.c:1392 + msgid "Cannot use table flags with newstyle!\n" + msgstr "Kan inte ange tabellflaggor med ny stil\n" + +-#: sunrpc/rpc_main.c:1412 ++#: sunrpc/rpc_main.c:1411 + msgid "\"infile\" is required for template generation flags.\n" + msgstr "\"infil\" är obligatorisk för mallgenereringsflaggor.\n" + +-#: sunrpc/rpc_main.c:1417 ++#: sunrpc/rpc_main.c:1416 + msgid "Cannot have more than one file generation flag!\n" + msgstr "Kan inte ha mer än en filgenereringsflagga!\n" + +-#: sunrpc/rpc_main.c:1426 ++#: sunrpc/rpc_main.c:1425 + #, c-format + msgid "usage: %s infile\n" + msgstr "användning: %s infil\n" + +-#: sunrpc/rpc_main.c:1427 ++#: sunrpc/rpc_main.c:1426 + #, 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" + +-#: sunrpc/rpc_main.c:1429 ++#: sunrpc/rpc_main.c:1428 + #, 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" + +-#: sunrpc/rpc_main.c:1431 ++#: sunrpc/rpc_main.c:1430 + #, c-format + msgid "\t%s [-s nettype]* [-o outfile] [infile]\n" + msgstr "\t%s [-s nättyp]* [-o utfil] [infil]\n" + +-#: sunrpc/rpc_main.c:1432 ++#: sunrpc/rpc_main.c:1431 + #, c-format + msgid "\t%s [-n netid]* [-o outfile] [infile]\n" + msgstr "\t%s [-n nätid]* [-o utfil] [infil]\n" +@@ -4698,7 +4702,7 @@ + + #: nis/nis_print.c:239 + msgid "\tAccess rights: " +-msgstr "\tÅtkomsträttigheter: " ++msgstr "\tRättigheter : " + + #: nis/nis_print.c:252 + msgid "Group Flags :" +@@ -4710,7 +4714,7 @@ + "Group Members :\n" + msgstr "" + "\n" +-"Guppmedlemmar:\n" ++"Gruppmedlemmar:\n" + + #: nis/nis_print.c:266 + #, c-format +@@ -4725,7 +4729,7 @@ + #: nis/nis_print.c:268 + #, c-format + msgid "Character Separator : %c\n" +-msgstr "Teckenseparator: %c\n" ++msgstr "Teckenseparator : %c\n" + + #: nis/nis_print.c:269 + #, c-format +@@ -4747,7 +4751,7 @@ + + #: nis/nis_print.c:277 + msgid "\t\tAccess Rights : " +-msgstr "\t\tÅtkomsträttigheter: " ++msgstr "\t\tRättigheter : " + + #: nis/nis_print.c:286 + msgid "Linked Object Type : " +@@ -4798,7 +4802,7 @@ + + #: nis/nis_print.c:324 + msgid "Access Rights : " +-msgstr "Åtkomsträttigheter: " ++msgstr "Rättigheter : " + + #: nis/nis_print.c:326 + msgid "" +@@ -4811,7 +4815,7 @@ + #: nis/nis_print.c:329 + #, c-format + msgid "Creation Time : %s" +-msgstr "Skapad: %s" ++msgstr "Skapad : %s" + + #: nis/nis_print.c:331 + #, c-format +@@ -5026,7 +5030,7 @@ + msgid "while allocating hash table entry" + msgstr "när hashtabellspost allokerades" + +-#: nscd/cache.c:150 nscd/connections.c:185 ++#: nscd/cache.c:150 nscd/connections.c:187 + #, c-format + msgid "cannot stat() file `%s': %s" + msgstr "kan inte ta status på fil \"%s\": %s" +@@ -5039,153 +5043,158 @@ + msgid "Cannot run nscd in secure mode as unprivileged user" + msgstr "Kan inte köra nscd i säkert läge som opriviligierad användare" + +-#: nscd/connections.c:199 ++#: nscd/connections.c:175 ++#, c-format ++msgid "while allocating cache: %s" ++msgstr "när cache-post allokerades: %s" ++ ++#: nscd/connections.c:200 + #, c-format + msgid "cannot open socket: %s" + msgstr "kan inte öppna uttag (socket): %s" + +-#: nscd/connections.c:217 ++#: nscd/connections.c:218 + #, c-format + msgid "cannot enable socket to accept connections: %s" + msgstr "kan inte få uttag (socket) att acceptera förbindelser: %s" + +-#: nscd/connections.c:259 ++#: nscd/connections.c:260 + #, c-format + msgid "handle_request: request received (Version = %d)" + msgstr "handle_request: begäran mottagen (version = %d)" + +-#: nscd/connections.c:265 ++#: nscd/connections.c:266 + #, 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" + +-#: nscd/connections.c:303 nscd/connections.c:325 ++#: nscd/connections.c:304 nscd/connections.c:326 + #, c-format + msgid "cannot write result: %s" + msgstr "kan inte skriva resultat: %s" + +-#: nscd/connections.c:404 nscd/connections.c:498 ++#: nscd/connections.c:405 nscd/connections.c:499 + #, c-format + msgid "error getting callers id: %s" + msgstr "kunde inte hämta anropandes identitet: %s" + +-#: nscd/connections.c:470 ++#: nscd/connections.c:471 + #, c-format + msgid "while accepting connection: %s" + msgstr "när förbindelse accepterades: %s" + +-#: nscd/connections.c:481 ++#: nscd/connections.c:482 + #, c-format + msgid "short read while reading request: %s" + msgstr "fattas data vid läsning av begäran: %s" + +-#: nscd/connections.c:517 ++#: nscd/connections.c:518 + #, c-format + msgid "key length in request too long: %d" + msgstr "nyckellängd i begäran för lång: %d" + +-#: nscd/connections.c:531 ++#: nscd/connections.c:532 + #, c-format + msgid "short read while reading request key: %s" + msgstr "fattas data vid läsning av begäransnyckel: %s" + +-#: nscd/connections.c:590 nscd/connections.c:591 nscd/connections.c:610 +-#: nscd/connections.c:623 nscd/connections.c:629 nscd/connections.c:636 ++#: nscd/connections.c:591 nscd/connections.c:592 nscd/connections.c:611 ++#: nscd/connections.c:624 nscd/connections.c:630 nscd/connections.c:637 + #, c-format + msgid "Failed to run nscd as user '%s'" + msgstr "Misslyckades att köra nscd som användare \"%s\"" + +-#: nscd/connections.c:611 ++#: nscd/connections.c:612 + msgid "getgrouplist failed" + msgstr "getgrouplist misslyckades" + +-#: nscd/connections.c:624 ++#: nscd/connections.c:625 + msgid "setgroups failed" + msgstr "setgroups misslyckades" + +-#: nscd/grpcache.c:102 nscd/hstcache.c:110 nscd/pwdcache.c:108 ++#: nscd/grpcache.c:103 nscd/hstcache.c:111 nscd/pwdcache.c:109 + msgid "while allocating key copy" + msgstr "när nyckelkopia allokerades" + +-#: nscd/grpcache.c:152 nscd/hstcache.c:167 nscd/pwdcache.c:145 ++#: nscd/grpcache.c:153 nscd/hstcache.c:168 nscd/pwdcache.c:146 + msgid "while allocating cache entry" + msgstr "när cache-post allokerades" + +-#: nscd/grpcache.c:195 nscd/hstcache.c:281 nscd/pwdcache.c:191 ++#: nscd/grpcache.c:196 nscd/hstcache.c:282 nscd/pwdcache.c:192 + #, c-format + msgid "short write in %s: %s" + msgstr "ofullständig skrivning i %s: %s" + +-#: nscd/grpcache.c:217 ++#: nscd/grpcache.c:218 + #, c-format + msgid "Haven't found \"%s\" in group cache!" + msgstr "Hittar inte \"%s\" i gruppcache!" + +-#: nscd/grpcache.c:292 ++#: nscd/grpcache.c:284 + #, c-format + msgid "Invalid numeric gid \"%s\"!" + msgstr "Ogiltigt numeriskt gruppid (gid) \"%s\"!" + +-#: nscd/grpcache.c:299 ++#: nscd/grpcache.c:291 + #, c-format + msgid "Haven't found \"%d\" in group cache!" + msgstr "Hittar inte \"%d\" i gruppcache!" + +-#: nscd/hstcache.c:303 nscd/hstcache.c:378 nscd/hstcache.c:456 +-#: nscd/hstcache.c:533 ++#: nscd/hstcache.c:304 nscd/hstcache.c:370 nscd/hstcache.c:435 ++#: nscd/hstcache.c:500 + #, c-format + msgid "Haven't found \"%s\" in hosts cache!" + msgstr "Hittar inte \"%s\" i värdcache!" + +-#: nscd/nscd.c:80 ++#: nscd/nscd.c:85 + msgid "Read configuration data from NAME" + msgstr "Läs konfigurationsdata från NAMN" + +-#: nscd/nscd.c:82 ++#: nscd/nscd.c:87 + msgid "Do not fork and display messages on the current tty" + msgstr "Skapa inte barnprocess, visa meddelanden på nuvarande tty" + +-#: nscd/nscd.c:83 ++#: nscd/nscd.c:88 + msgid "NUMBER" + msgstr "ANTAL" + +-#: nscd/nscd.c:83 ++#: nscd/nscd.c:88 + msgid "Start NUMBER threads" + msgstr "Starta ANTAL trådar" + +-#: nscd/nscd.c:84 ++#: nscd/nscd.c:89 + msgid "Shut the server down" + msgstr "Avsluta servern" + +-#: nscd/nscd.c:85 ++#: nscd/nscd.c:90 + msgid "Print current configuration statistic" + msgstr "Skriv ut nuvarande konfigurationsstatistik" + +-#: nscd/nscd.c:86 ++#: nscd/nscd.c:91 + msgid "TABLE" + msgstr "TABELL" + +-#: nscd/nscd.c:87 ++#: nscd/nscd.c:92 + msgid "Invalidate the specified cache" + msgstr "Invalidera den angivna cachen" + +-#: nscd/nscd.c:88 ++#: nscd/nscd.c:93 + msgid "TABLE,yes" + msgstr "TABELL,yes" + +-#: nscd/nscd.c:88 ++#: nscd/nscd.c:93 + msgid "Use separate cache for each user" + msgstr "Använd separat cache för varje användare" + +-#: nscd/nscd.c:93 ++#: nscd/nscd.c:98 + msgid "Name Service Cache Daemon." + msgstr "Namntjänst cache-demon" + +-#: nscd/nscd.c:126 ++#: nscd/nscd.c:131 + msgid "already running" + msgstr "kör redan" + +-#: nscd/nscd.c:192 nscd/nscd.c:212 nscd/nscd.c:218 ++#: nscd/nscd.c:243 nscd/nscd.c:263 nscd/nscd.c:269 + msgid "Only root is allowed to use this option!" + msgstr "Bara root har tillåtelse att använda denna operation!" + +@@ -5275,22 +5284,22 @@ + "%15ld%% cache träffprocent\n" + "%15s kontrollera /etc/%s för ändringar\n" + +-#: nscd/pwdcache.c:213 ++#: nscd/pwdcache.c:214 + #, c-format + msgid "Haven't found \"%s\" in password cache!" + msgstr "Hittar inte \"%s\" i lösenordscache!" + +-#: nscd/pwdcache.c:288 ++#: nscd/pwdcache.c:280 + #, c-format + msgid "Invalid numeric uid \"%s\"!" + msgstr "Ogiltigt numeriskt användarid (uid) \"%s\"!" + +-#: nscd/pwdcache.c:295 ++#: nscd/pwdcache.c:287 + #, c-format + msgid "Haven't found \"%d\" in password cache!" + msgstr "Hittar inte \"%d\" i lösenordscache!" + +-#: elf/../sysdeps/generic/dl-sysdep.c:297 ++#: elf/../sysdeps/generic/dl-sysdep.c:357 + msgid "cannot create capability list" + msgstr "kan inte skapa egenskapslista" + +@@ -5341,7 +5350,7 @@ + msgid ", OS ABI: %s %d.%d.%d" + msgstr ", OS ABI: %s %d.%d.%d" + +-#: elf/cache.c:136 elf/ldconfig.c:1033 ++#: elf/cache.c:136 elf/ldconfig.c:1045 + #, c-format + msgid "Can't open cache file %s\n" + msgstr "Kan inte öppna cache-fil \"%s\"\n" +@@ -5387,17 +5396,17 @@ + msgid "Renaming of %s to %s failed" + msgstr "Namnbyte på %s till %s misslyckades" + +-#: elf/dl-close.c:113 ++#: elf/dl-close.c:128 + msgid "shared object not open" + msgstr "delat objekt är inte öppnat" + +-#: elf/dl-close.c:357 elf/dl-open.c:436 ++#: elf/dl-close.c:486 elf/dl-open.c:444 + msgid "TLS generation counter wrapped! Please send report with the 'glibcbug' script." + msgstr "" + "Generationsräknare för TLS slog runt! Var snäll och skicka felrapport med\n" + "\"glibcbug\"-skriptet" + +-#: elf/dl-deps.c:111 elf/dl-open.c:177 ++#: elf/dl-deps.c:111 elf/dl-open.c:183 + msgid "DST not allowed in SUID/SGID programs" + msgstr "DST inte tillåten i SUID/SGID-program" + +@@ -5416,181 +5425,193 @@ + msgid "cannot allocate dependency list" + msgstr "kan inte allokera beroendelista" + +-#: elf/dl-deps.c:492 elf/dl-deps.c:547 ++#: elf/dl-deps.c:494 elf/dl-deps.c:549 + msgid "cannot allocate symbol search list" + msgstr "kan inte allokera söklista för symboler" + +-#: elf/dl-deps.c:532 ++#: elf/dl-deps.c:534 + msgid "Filters not supported with LD_TRACE_PRELINKING" + msgstr "Filter stöds ej med LD_TRACE_PRELINKING" + +-#: elf/dl-error.c:73 ++#: elf/dl-error.c:75 + msgid "DYNAMIC LINKER BUG!!!" + msgstr "FEL I DYNAMISK LÄNKARE!!!" + +-#: elf/dl-error.c:106 ++#: elf/dl-error.c:108 + msgid "error while loading shared libraries" + msgstr "fel när delade bibliotek laddades" + +-#: elf/dl-load.c:338 ++#: elf/dl-load.c:339 + msgid "cannot allocate name record" + msgstr "kan inte allokera namnpost" + +-#: elf/dl-load.c:440 elf/dl-load.c:520 elf/dl-load.c:614 elf/dl-load.c:709 ++#: elf/dl-load.c:441 elf/dl-load.c:520 elf/dl-load.c:612 elf/dl-load.c:707 + msgid "cannot create cache for search path" + msgstr "kan inte skapa cache för sökväg" + +-#: elf/dl-load.c:545 ++#: elf/dl-load.c:543 + msgid "cannot create RUNPATH/RPATH copy" + msgstr "kan inte skapa kopia av RUNPATH/RPATH" + +-#: elf/dl-load.c:600 ++#: elf/dl-load.c:598 + msgid "cannot create search path array" + msgstr "kan inte skapa säkvägslista" + +-#: elf/dl-load.c:796 ++#: elf/dl-load.c:794 + msgid "cannot stat shared object" + msgstr "kan inte ta status på delat objekt" + +-#: elf/dl-load.c:840 ++#: elf/dl-load.c:838 + msgid "cannot open zero fill device" + msgstr "kan inte öppna nollfyllnadsenhet" + +-#: elf/dl-load.c:849 elf/dl-load.c:1855 ++#: elf/dl-load.c:847 elf/dl-load.c:1902 + msgid "cannot create shared object descriptor" + msgstr "kan inte skapa delad objektdeskriptor" + +-#: elf/dl-load.c:868 elf/dl-load.c:1351 elf/dl-load.c:1434 ++#: elf/dl-load.c:866 elf/dl-load.c:1398 elf/dl-load.c:1481 + msgid "cannot read file data" + msgstr "kan inte läsa fildata" + +-#: elf/dl-load.c:908 ++#: elf/dl-load.c:906 + msgid "ELF load command alignment not page-aligned" + msgstr "ELF-laddkommando är inte på sidgräns" + +-#: elf/dl-load.c:915 ++#: elf/dl-load.c:913 + msgid "ELF load command address/offset not properly aligned" + msgstr "Address/position för ELF-laddkommando är inte på rätt bytegräns" + +-#: elf/dl-load.c:996 ++#: elf/dl-load.c:988 ++msgid "cannot allocate TLS data structures for initial thread" ++msgstr "kan inte skapa TLS-datastrukturer för första tråden" ++ ++#: elf/dl-load.c:1012 ++msgid "cannot handle TLS data" ++msgstr "kan inte hantera TLS-data" ++ ++#: elf/dl-load.c:1047 + msgid "failed to map segment from shared object" + msgstr "misslyckades att mappa segment från delat objekt" + +-#: elf/dl-load.c:1020 ++#: elf/dl-load.c:1071 + msgid "cannot dynamically load executable" + msgstr "kan inte ladda exekverbar fil dynamiskt" + +-#: elf/dl-load.c:1081 ++#: elf/dl-load.c:1132 + msgid "cannot change memory protections" + msgstr "kan inte ändra minnesskydd" + +-#: elf/dl-load.c:1100 ++#: elf/dl-load.c:1151 + msgid "cannot map zero-fill pages" + msgstr "kan inte mappa nollfyllda sidor" + +-#: elf/dl-load.c:1118 ++#: elf/dl-load.c:1169 + msgid "cannot allocate memory for program header" + msgstr "Kan inte allokera minne för programhuvud" + +-#: elf/dl-load.c:1149 ++#: elf/dl-load.c:1200 + msgid "object file has no dynamic section" + msgstr "objektfilen har ingen dynamisk sektion" + +-#: elf/dl-load.c:1193 ++#: elf/dl-load.c:1240 + msgid "shared object cannot be dlopen()ed" + msgstr "delat objekt kan inte göras dlopen() på" + +-#: elf/dl-load.c:1216 ++#: elf/dl-load.c:1263 + msgid "cannot create searchlist" + msgstr "kan inte skapa söklista" + +-#: elf/dl-load.c:1351 ++#: elf/dl-load.c:1398 + msgid "file too short" + msgstr "fil för kort" + +-#: elf/dl-load.c:1374 ++#: elf/dl-load.c:1421 + msgid "invalid ELF header" + msgstr "ogiltigt ELF-huvud" + +-#: elf/dl-load.c:1383 ++#: elf/dl-load.c:1430 + msgid "ELF file data encoding not big-endian" + msgstr "Kodning för ELF-fildata är inte \"big-endian\"" + +-#: elf/dl-load.c:1385 ++#: elf/dl-load.c:1432 + msgid "ELF file data encoding not little-endian" + msgstr "Kodning för ELF-fildata är inte \"little-endian\"" + +-#: elf/dl-load.c:1389 ++#: elf/dl-load.c:1436 + msgid "ELF file version ident does not match current one" + msgstr "ELF-filens versionsidentitet stämmer inte med nuvarande" + +-#: elf/dl-load.c:1393 ++#: elf/dl-load.c:1440 + msgid "ELF file OS ABI invalid" + msgstr "ELF-fil har felaktig version på OS-ABI" + +-#: elf/dl-load.c:1395 ++#: elf/dl-load.c:1442 + msgid "ELF file ABI version invalid" + msgstr "ELF-fil har felaktig version på ABI" + +-#: elf/dl-load.c:1398 ++#: elf/dl-load.c:1445 + msgid "internal error" + msgstr "internt fel" + +-#: elf/dl-load.c:1405 ++#: elf/dl-load.c:1452 + msgid "ELF file version does not match current one" + msgstr "ELF-filens version stämmer inte med nuvarande" + +-#: elf/dl-load.c:1413 ++#: elf/dl-load.c:1460 + msgid "ELF file's phentsize not the expected size" + msgstr "ELF-filens värde på \"phentsize\" är inte den förväntade" + +-#: elf/dl-load.c:1419 ++#: elf/dl-load.c:1466 + msgid "only ET_DYN and ET_EXEC can be loaded" + msgstr "bara ET_DYN och ET_EXEC kan laddas" + +-#: elf/dl-load.c:1870 ++#: elf/dl-load.c:1917 + msgid "cannot open shared object file" + msgstr "kan inte öppna delad objektfil" + +-#: elf/dl-lookup.c:248 elf/dl-lookup.c:413 ++#: elf/dl-lookup.c:265 elf/dl-lookup.c:430 + msgid "relocation error" + msgstr "fel vid relokering" + +-#: elf/dl-open.c:105 ++#: elf/dl-open.c:111 + msgid "cannot extend global scope" + msgstr "kan inte utöka globalt område" + +-#: elf/dl-open.c:208 ++#: elf/dl-open.c:214 + msgid "empty dynamic string token substitution" + msgstr "substitution av \"dynamic string token\" är tom" + +-#: elf/dl-open.c:345 elf/dl-open.c:356 ++#: elf/dl-open.c:351 elf/dl-open.c:362 + msgid "cannot create scope list" + msgstr "kan inte skapa omfångslista" + +-#: elf/dl-open.c:416 ++#: elf/dl-open.c:424 + msgid "cannot create TLS data structures" + msgstr "kan inte skapa datastrukturer för TLS" + +-#: elf/dl-open.c:478 ++#: elf/dl-open.c:486 + msgid "invalid mode for dlopen()" + msgstr "ogiltiga flaggor för dlopen()" + +-#: elf/dl-reloc.c:88 ++#: elf/dl-reloc.c:58 ++msgid "shared object cannot be dlopen()ed: static TLS memory too small" ++msgstr "delat objekt kan inte göras dlopen() på: statiskt TLS-minne är för litet" ++ ++#: elf/dl-reloc.c:118 + msgid "cannot make segment writable for relocation" + msgstr "kan inte göra segment skrivbart för relokering" + +-#: elf/dl-reloc.c:174 ++#: elf/dl-reloc.c:219 + #, c-format + msgid "%s: profiler found no PLTREL in object %s\n" + msgstr "%s: profileraren hittade inga PLTREL i objekt %s\n" + +-#: elf/dl-reloc.c:186 ++#: elf/dl-reloc.c:231 + #, c-format + msgid "%s: profiler out of memory shadowing PLTREL of %s\n" + msgstr "%s: profileraren fick slut minne för kopiering av PLTREL i %s\n" + +-#: elf/dl-reloc.c:201 ++#: elf/dl-reloc.c:246 + msgid "cannot restore segment prot after reloc" + msgstr "kan inte återställa segmenträttigheter efter relokering" + +@@ -5646,119 +5667,119 @@ + msgid "Configure Dynamic Linker Run Time Bindings." + msgstr "Konfigurera bindningar för den dynamiska länkaren." + +-#: elf/ldconfig.c:282 ++#: elf/ldconfig.c:294 + #, c-format + msgid "Path `%s' given more than once" + msgstr "Sökväg \"%s\" given mer än en gång" + +-#: elf/ldconfig.c:326 ++#: elf/ldconfig.c:338 + #, c-format + msgid "%s is not a known library type" + msgstr "%s är inte en känd bibliotekstyp" + +-#: elf/ldconfig.c:344 ++#: elf/ldconfig.c:356 + #, c-format + msgid "Can't stat %s" + msgstr "Kan inte ta status på %s" + +-#: elf/ldconfig.c:414 ++#: elf/ldconfig.c:426 + #, c-format + msgid "Can't stat %s\n" + msgstr "Kan inte ta status på %s\n" + +-#: elf/ldconfig.c:424 ++#: elf/ldconfig.c:436 + #, c-format + msgid "%s is not a symbolic link\n" + msgstr "%s är inte en symbolisk länk\n" + +-#: elf/ldconfig.c:443 ++#: elf/ldconfig.c:455 + #, c-format + msgid "Can't unlink %s" + msgstr "Kan inte ta bort (unlink) %s" + +-#: elf/ldconfig.c:449 ++#: elf/ldconfig.c:461 + #, c-format + msgid "Can't link %s to %s" + msgstr "Kan inte länka %s till %s" + +-#: elf/ldconfig.c:455 ++#: elf/ldconfig.c:467 + msgid " (changed)\n" + msgstr " (ändrad)\n" + +-#: elf/ldconfig.c:457 ++#: elf/ldconfig.c:469 + msgid " (SKIPPED)\n" + msgstr " (HOPPAR ÖVER)\n" + +-#: elf/ldconfig.c:512 ++#: elf/ldconfig.c:524 + #, c-format + msgid "Can't find %s" + msgstr "Kan inte hitta %s" + +-#: elf/ldconfig.c:528 ++#: elf/ldconfig.c:540 + #, c-format + msgid "Can't lstat %s" + msgstr "Kan inte ta länkstatus på %s" + +-#: elf/ldconfig.c:535 ++#: elf/ldconfig.c:547 + #, c-format + msgid "Ignored file %s since it is not a regular file." + msgstr "Ignorerar fil %s eftersom den inte är en vanlig fil" + +-#: elf/ldconfig.c:543 ++#: elf/ldconfig.c:555 + #, 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" + +-#: elf/ldconfig.c:634 ++#: elf/ldconfig.c:646 + #, c-format + msgid "Can't open directory %s" + msgstr "Kan inte öppna katalog %s" + +-#: elf/ldconfig.c:689 elf/ldconfig.c:736 ++#: elf/ldconfig.c:701 elf/ldconfig.c:748 + #, c-format + msgid "Cannot lstat %s" + msgstr "Kan inte ta status (lstat) på %s" + +-#: elf/ldconfig.c:701 ++#: elf/ldconfig.c:713 + #, c-format + msgid "Cannot stat %s" + msgstr "Kan inte ta status på %s" + +-#: elf/ldconfig.c:758 elf/readlib.c:93 ++#: elf/ldconfig.c:770 elf/readlib.c:93 + #, c-format + msgid "Input file %s not found.\n" + msgstr "Hittar inte infil %s.\n" + +-#: elf/ldconfig.c:792 ++#: elf/ldconfig.c:804 + #, c-format + msgid "libc5 library %s in wrong directory" + msgstr "libc5-bibliotek %s i fel katalog" + +-#: elf/ldconfig.c:795 ++#: elf/ldconfig.c:807 + #, c-format + msgid "libc6 library %s in wrong directory" + msgstr "libc6-bibliotek %s i fel katalog" + +-#: elf/ldconfig.c:798 ++#: elf/ldconfig.c:810 + #, c-format + msgid "libc4 library %s in wrong directory" + msgstr "libc4-bibliotek %s i fel katalog" + +-#: elf/ldconfig.c:825 ++#: elf/ldconfig.c:837 + #, 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." + +-#: elf/ldconfig.c:928 ++#: elf/ldconfig.c:940 + #, c-format + msgid "Can't open configuration file %s" + msgstr "Kan inte öppna konfigurationsfil \"%s\"" + +-#: elf/ldconfig.c:1012 ++#: elf/ldconfig.c:1024 + msgid "Can't chdir to /" + msgstr "Kan inte byta katalog till /" + +-#: elf/ldconfig.c:1054 ++#: elf/ldconfig.c:1066 + #, c-format + msgid "Can't open cache file directory %s\n" + msgstr "Kan inte läsa cache-filkatalog \"%s\"\n" +Binary files glibc-2.3.2/po/tr.mo and glibc-2.3.2-200304020432/po/tr.mo differ +diff -u -udbrN glibc-2.3.2/po/tr.po glibc-2.3.2-200304020432/po/tr.po +--- glibc-2.3.2/po/tr.po Sat Oct 5 20:15:39 2002 ++++ glibc-2.3.2-200304020432/po/tr.po Tue Mar 4 05:20:34 2003 +@@ -1,13 +1,13 @@ + # Turkish translations for GNU libc messages. +-# Copyright (C) 2002 Free Software Foundation, Inc. +-# Nilgün Belma Bugüner , 2001, 2002. ++# Copyright (C) 2003 Free Software Foundation, Inc. ++# Nilgün Belma Bugüner , 2001, ..., 2003. + # Onur Tolga ÅžehitoÄŸlu , 1998. + # + msgid "" + msgstr "" +-"Project-Id-Version: libc 2.3\n" +-"POT-Creation-Date: 2002-10-02 17:22-0700\n" +-"PO-Revision-Date: 2002-10-05 17:08+0300\n" ++"Project-Id-Version: libc 2.3.2\n" ++"POT-Creation-Date: 2003-02-22 15:34-0800\n" ++"PO-Revision-Date: 2003-03-04 05:51+0200\n" + "Last-Translator: Nilgün Belma Bugüner \n" + "Language-Team: Turkish \n" + "MIME-Version: 1.0\n" +@@ -261,8 +261,8 @@ + + #: iconv/iconv_prog.c:241 + #, c-format +-msgid "conversions from `%s' and to `%s' are not supported" +-msgstr "`%s'e ve ondan `%s'e dönüşüm desteklenmiyor" ++msgid "conversion from `%s' and to `%s' are not supported" ++msgstr "`%s'den ve `%s'e dönüşüm desteklenmiyor" + + #: iconv/iconv_prog.c:246 + #, c-format +@@ -287,7 +287,7 @@ + msgid "error while closing output file" + msgstr "çıktı dosyası kapatılırken hata" + +-#: iconv/iconv_prog.c:407 iconv/iconvconfig.c:355 locale/programs/locale.c:268 ++#: iconv/iconv_prog.c:407 iconv/iconvconfig.c:357 locale/programs/locale.c:274 + #: locale/programs/localedef.c:372 catgets/gencat.c:233 + #: malloc/memusagestat.c:602 debug/pcprofiledump.c:199 + msgid "Report bugs using the `glibcbug' script to .\n" +@@ -296,9 +296,9 @@ + "ise `glibcbug' betiÄŸini kullanarak oluÅŸturacağınız hata raporuyla\n" + " adresine bildiriniz.\n" + +-#: iconv/iconv_prog.c:421 iconv/iconvconfig.c:369 locale/programs/locale.c:281 +-#: locale/programs/localedef.c:386 catgets/gencat.c:246 posix/getconf.c:904 +-#: nss/getent.c:74 nscd/nscd.c:279 nscd/nscd_nischeck.c:90 elf/ldconfig.c:259 ++#: iconv/iconv_prog.c:421 iconv/iconvconfig.c:371 locale/programs/locale.c:287 ++#: locale/programs/localedef.c:386 catgets/gencat.c:246 posix/getconf.c:910 ++#: nss/getent.c:74 nscd/nscd.c:330 nscd/nscd_nischeck.c:90 elf/ldconfig.c:271 + #: elf/sprof.c:349 + #, c-format + msgid "" +@@ -311,9 +311,9 @@ + "HİÇBÄ°R garanti yoktur; hatta SATILABÄ°LÄ°RLİĞİ veya ÅžAHSÄ° KULLANIMINIZA\n" + "UYGUNLUÄžU için bile garanti verilmez.\n" + +-#: iconv/iconv_prog.c:426 iconv/iconvconfig.c:374 locale/programs/locale.c:286 +-#: locale/programs/localedef.c:391 catgets/gencat.c:251 posix/getconf.c:909 +-#: nss/getent.c:79 nscd/nscd.c:284 nscd/nscd_nischeck.c:95 elf/ldconfig.c:264 ++#: iconv/iconv_prog.c:426 iconv/iconvconfig.c:376 locale/programs/locale.c:292 ++#: locale/programs/localedef.c:391 catgets/gencat.c:251 posix/getconf.c:915 ++#: nss/getent.c:79 nscd/nscd.c:335 nscd/nscd_nischeck.c:95 elf/ldconfig.c:276 + #: elf/sprof.c:355 + #, c-format + msgid "Written by %s.\n" +@@ -365,15 +365,15 @@ + msgid "Prefix used for all file accesses" + msgstr "Tüm dosya eriÅŸimlerinde kullanılan önek" + +-#: iconv/iconvconfig.c:325 locale/programs/localedef.c:292 ++#: iconv/iconvconfig.c:327 locale/programs/localedef.c:292 + msgid "no output file produced because warning were issued" + msgstr "uyarı yayınlandığından üretilen bir çıktı dosyası yok" + +-#: iconv/iconvconfig.c:403 ++#: iconv/iconvconfig.c:405 + msgid "while inserting in search tree" + msgstr "arama aÄŸacına eklenirken" + +-#: iconv/iconvconfig.c:1202 ++#: iconv/iconvconfig.c:1204 + msgid "cannot generate output file" + msgstr "çıktı dosyası üretilemiyor" + +@@ -1283,7 +1283,7 @@ + msgid "unterminated symbolic name" + msgstr "sonlandırılmamış sembolik isim" + +-#: locale/programs/linereader.c:537 catgets/gencat.c:1166 ++#: locale/programs/linereader.c:537 catgets/gencat.c:1195 + msgid "invalid escape sequence" + msgstr "geçersiz escape dizisi" + +@@ -1313,39 +1313,39 @@ + msgid "trailing garbage at end of line" + msgstr "satır sonu bozuk" + +-#: locale/programs/locale.c:73 ++#: locale/programs/locale.c:75 + msgid "System information:" + msgstr "Sistem bilgileri:" + +-#: locale/programs/locale.c:75 ++#: locale/programs/locale.c:77 + msgid "Write names of available locales" + msgstr "Mevcut yerellerin isimlerini yazar" + +-#: locale/programs/locale.c:77 ++#: locale/programs/locale.c:79 + msgid "Write names of available charmaps" + msgstr "Mevcut karakter eÅŸlemlerin isimlerini yazar" + +-#: locale/programs/locale.c:78 ++#: locale/programs/locale.c:80 + msgid "Modify output format:" + msgstr "DeÄŸiÅŸtirme çıktı biçemi:" + +-#: locale/programs/locale.c:79 ++#: locale/programs/locale.c:81 + msgid "Write names of selected categories" + msgstr "SeçilmiÅŸ kategorilerin isimlerini yazar" + +-#: locale/programs/locale.c:80 ++#: locale/programs/locale.c:82 + msgid "Write names of selected keywords" + msgstr "SeçilmiÅŸ anahtar kelimelerin isimlerini yazar" + +-#: locale/programs/locale.c:81 ++#: locale/programs/locale.c:83 + msgid "Print more information" + msgstr "Daha fazla ileti basar" + +-#: locale/programs/locale.c:86 ++#: locale/programs/locale.c:88 + msgid "Get locale-specific information." + msgstr "Dile özel bilgiler alınır" + +-#: locale/programs/locale.c:89 ++#: locale/programs/locale.c:91 + msgid "" + "NAME\n" + "[-a|-m]" +@@ -1353,7 +1353,7 @@ + "Ä°SÄ°M\n" + "[-a|-m]" + +-#: locale/programs/locale.c:488 ++#: locale/programs/locale.c:512 + msgid "while preparing output" + msgstr "çıktıyı hazırlarken" + +@@ -1484,16 +1484,16 @@ + msgid "cannot create temporary file" + msgstr "geçici dosya oluÅŸturulamıyor" + +-#: locale/programs/locarchive.c:118 locale/programs/locarchive.c:302 ++#: locale/programs/locarchive.c:118 locale/programs/locarchive.c:305 + msgid "cannot initialize archive file" + msgstr "arÅŸiv dosyası ilklendirilemiyor" + +-#: locale/programs/locarchive.c:125 locale/programs/locarchive.c:309 ++#: locale/programs/locarchive.c:125 locale/programs/locarchive.c:312 + msgid "cannot resize archive file" + msgstr "arÅŸiv dosyasının boyutu deÄŸiÅŸtirilemiyor" + +-#: locale/programs/locarchive.c:134 locale/programs/locarchive.c:318 +-#: locale/programs/locarchive.c:508 ++#: locale/programs/locarchive.c:134 locale/programs/locarchive.c:321 ++#: locale/programs/locarchive.c:511 + msgid "cannot map archive header" + msgstr "arÅŸiv baÅŸlığı eÅŸlenemiyor" + +@@ -1509,88 +1509,88 @@ + msgid "cannot map locale archive file" + msgstr "yerel arÅŸiv dosyası eÅŸlenemiyor" + +-#: locale/programs/locarchive.c:326 ++#: locale/programs/locarchive.c:329 + msgid "cannot lock new archive" + msgstr "yeni arÅŸiv kilitlenemiyor" + +-#: locale/programs/locarchive.c:377 ++#: locale/programs/locarchive.c:380 + msgid "cannot extend locale archive file" + msgstr "yerel arÅŸiv dosyası geniÅŸletilemiyor" + +-#: locale/programs/locarchive.c:386 ++#: locale/programs/locarchive.c:389 + msgid "cannot change mode of resized locale archive" + msgstr "boyutu deÄŸiÅŸtirilen yerel arÅŸivin kipi deÄŸiÅŸtirilemiyor" + +-#: locale/programs/locarchive.c:394 ++#: locale/programs/locarchive.c:397 + msgid "cannot rename new archive" + msgstr "yeni arÅŸivin ismi deÄŸiÅŸtirilemiyor" + +-#: locale/programs/locarchive.c:447 ++#: locale/programs/locarchive.c:450 + #, c-format + msgid "cannot open locale archive \"%s\"" + msgstr "yerel arÅŸiv `%s' açılamıyor" + +-#: locale/programs/locarchive.c:452 ++#: locale/programs/locarchive.c:455 + #, c-format + msgid "cannot stat locale archive \"%s\"" + msgstr "\"%s\" yerel arÅŸivi durumlanamıyor" + +-#: locale/programs/locarchive.c:471 ++#: locale/programs/locarchive.c:474 + #, c-format + msgid "cannot lock locale archive \"%s\"" + msgstr "\"%s\" yerel arÅŸivi kilitlenemiyor" + +-#: locale/programs/locarchive.c:494 ++#: locale/programs/locarchive.c:497 + msgid "cannot read archive header" + msgstr "arÅŸiv baÅŸlığı okunamıyor" + +-#: locale/programs/locarchive.c:554 ++#: locale/programs/locarchive.c:557 + #, c-format + msgid "locale '%s' already exists" + msgstr "`%s' yereli zaten var" + +-#: locale/programs/locarchive.c:784 locale/programs/locarchive.c:799 +-#: locale/programs/locarchive.c:811 locale/programs/locarchive.c:823 ++#: locale/programs/locarchive.c:788 locale/programs/locarchive.c:803 ++#: locale/programs/locarchive.c:815 locale/programs/locarchive.c:827 + #: locale/programs/locfile.c:343 + msgid "cannot add to locale archive" + msgstr "yerel arÅŸive ekleme yapılamıyor" + +-#: locale/programs/locarchive.c:976 ++#: locale/programs/locarchive.c:982 + #, c-format + msgid "locale alias file `%s' not found" + msgstr "`%s' yerel isim dosyası bulunamadı" + +-#: locale/programs/locarchive.c:1118 ++#: locale/programs/locarchive.c:1126 + #, c-format + msgid "Adding %s\n" + msgstr "%s ekleniyor\n" + +-#: locale/programs/locarchive.c:1124 ++#: locale/programs/locarchive.c:1132 + #, c-format + msgid "stat of \"%s\" failed: %s: ignored" + msgstr "\"%s\" durumlaması baÅŸarısız: %s: yoksayıldı" + +-#: locale/programs/locarchive.c:1130 ++#: locale/programs/locarchive.c:1138 + #, c-format + msgid "\"%s\" is no directory; ignored" + msgstr "\"%s\" dizinsiz; yoksayıldı" + +-#: locale/programs/locarchive.c:1137 ++#: locale/programs/locarchive.c:1145 + #, c-format + msgid "cannot open directory \"%s\": %s: ignored" + msgstr "\"%s\" dizini açılamıyor: %s: yoksayıldı" + +-#: locale/programs/locarchive.c:1209 ++#: locale/programs/locarchive.c:1217 + #, c-format + msgid "incomplete set of locale files in \"%s\"" + msgstr "\"%s\" içindeki yerel dosyaları kümesi tamamlanmamış" + +-#: locale/programs/locarchive.c:1273 ++#: locale/programs/locarchive.c:1281 + #, c-format + msgid "cannot read all files in \"%s\": ignored" + msgstr "\"%s\" içindeki hiçbir dosya okunamıyor: yoksayıldı" + +-#: locale/programs/locarchive.c:1343 ++#: locale/programs/locarchive.c:1351 + #, c-format + msgid "locale \"%s\" not in archive" + msgstr "\"%s\" yeri arÅŸivde deÄŸil" +@@ -1659,8 +1659,8 @@ + msgid "upper limit in range is not smaller then lower limit" + msgstr "kapsamdaki üst sınır alt sınırdan küçük deÄŸil" + +-#: locale/programs/xmalloc.c:70 malloc/obstack.c:500 malloc/obstack.c:503 +-#: posix/getconf.c:996 ++#: locale/programs/xmalloc.c:70 malloc/obstack.c:505 malloc/obstack.c:508 ++#: posix/getconf.c:1002 + msgid "memory exhausted" + msgstr "bellek tükendi" + +@@ -1686,7 +1686,7 @@ + msgid "Another string for testing." + msgstr "Test edilecek diÄŸer dizge." + +-#: catgets/gencat.c:111 catgets/gencat.c:115 nscd/nscd.c:79 ++#: catgets/gencat.c:111 catgets/gencat.c:115 nscd/nscd.c:84 + msgid "NAME" + msgstr "Ä°SÄ°M" + +@@ -1708,7 +1708,7 @@ + "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 "" +-"Ä°leti kataloÄŸu üretilir.GÄ°RDÄ°-DOSYASI - verilirse standart girdi okunur.\n" ++"Ä°leti kataloÄŸu üretilir. GÄ°RDÄ°-DOSYASI - verilirse standart girdi okunur.\n" + "ÇIKTI-DOSYASI - verilirse standart çıktıya yazılır.\n" + + #: catgets/gencat.c:125 +@@ -1731,7 +1731,7 @@ + msgid "duplicate set definition" + msgstr "küme ataması tekrarlanmış" + +-#: catgets/gencat.c:446 catgets/gencat.c:619 catgets/gencat.c:648 ++#: catgets/gencat.c:446 catgets/gencat.c:623 catgets/gencat.c:677 + msgid "this is the first definition" + msgstr "bu ilk tanım" + +@@ -1749,44 +1749,44 @@ + msgid "unknown directive `%s': line ignored" + msgstr "bilinmeyen `%s' yönergesi: satır yoksayıldı" + +-#: catgets/gencat.c:617 ++#: catgets/gencat.c:621 + msgid "duplicated message number" + msgstr "tekrarlanmış ileti numarası" + +-#: catgets/gencat.c:645 ++#: catgets/gencat.c:674 + msgid "duplicated message identifier" + msgstr "ileti tanıtıcı tekrarlanmış" + +-#: catgets/gencat.c:702 ++#: catgets/gencat.c:731 + msgid "invalid character: message ignored" + msgstr "geçersiz karakter: ileti yoksayıldı" + +-#: catgets/gencat.c:745 ++#: catgets/gencat.c:774 + msgid "invalid line" + msgstr "satır geçersiz" + +-#: catgets/gencat.c:799 ++#: catgets/gencat.c:828 + msgid "malformed line ignored" + msgstr "hatalı satır yoksayıldı" + +-#: catgets/gencat.c:963 catgets/gencat.c:1004 ++#: catgets/gencat.c:992 catgets/gencat.c:1033 + #, c-format + msgid "cannot open output file `%s'" + msgstr "`%s' çıktı dosyası açılamıyor" + +-#: catgets/gencat.c:1188 ++#: catgets/gencat.c:1217 + msgid "unterminated message" + msgstr "sonlandırılmamış ileti" + +-#: catgets/gencat.c:1212 ++#: catgets/gencat.c:1241 + msgid "while opening old catalog file" + msgstr "eski katalog dosyası açılırken" + +-#: catgets/gencat.c:1303 ++#: catgets/gencat.c:1332 + msgid "conversion modules not available" + msgstr "dönüşüm modülleri yok" + +-#: catgets/gencat.c:1329 ++#: catgets/gencat.c:1358 + msgid "cannot determine escape character" + msgstr "öncelem karakteri saptanamıyor" + +@@ -1794,7 +1794,7 @@ + msgid "makecontext: does not know how to handle more than 8 arguments\n" + msgstr "makecontext: 8 argümandan fazlasının nasıl elde edileceÄŸi bilinmiyor\n" + +-#: stdio-common/../sysdeps/gnu/errlist.c:12 posix/regcomp.c:178 ++#: stdio-common/../sysdeps/gnu/errlist.c:12 posix/regcomp.c:133 + #: nis/nis_error.c:29 nis/ypclnt.c:787 nis/ypclnt.c:861 + msgid "Success" + msgstr "BaÅŸarılı" +@@ -2983,23 +2983,23 @@ + msgid "%s%sUnknown signal %d\n" + msgstr "%s%sBilinmeyen sinyal %d\n" + +-#: malloc/mcheck.c:296 ++#: malloc/mcheck.c:346 + msgid "memory is consistent, library is buggy\n" + msgstr "bellek tutarlı, kitaplık hatalı\n" + +-#: malloc/mcheck.c:299 ++#: malloc/mcheck.c:349 + msgid "memory clobbered before allocated block\n" + msgstr "bellek ayrılmış bloÄŸun öncesine taÅŸtı\n" + +-#: malloc/mcheck.c:302 ++#: malloc/mcheck.c:352 + msgid "memory clobbered past end of allocated block\n" + msgstr "bellek ayrılmış bloÄŸun sonrasına taÅŸtı\n" + +-#: malloc/mcheck.c:305 ++#: malloc/mcheck.c:355 + msgid "block freed twice\n" + msgstr "blok iki kere serbest bırakıldı\n" + +-#: malloc/mcheck.c:308 ++#: malloc/mcheck.c:358 + msgid "bogus mcheck_status, library is buggy\n" + msgstr "mcheck_status sahte, kitaplık hatalı\n" + +@@ -3037,6 +3037,10 @@ + msgid "DATAFILE [OUTFILE]" + msgstr "VERÄ°DOSYASI [ÇIKTIDOSYASI]" + ++#: string/strerror.c:43 posix/../sysdeps/posix/gai_strerror.c:57 ++msgid "Unknown error" ++msgstr "Bilinmeyen hata" ++ + #: string/strsignal.c:69 + #, c-format + msgid "Real-time signal %d" +@@ -3061,7 +3065,7 @@ + msgid "%s: Memory exhausted: %s\n" + msgstr "%s: Bellek tükendi: %s\n" + +-#: timezone/zic.c:390 misc/error.c:120 ++#: timezone/zic.c:390 misc/error.c:127 misc/error.c:155 + msgid "Unknown system error" + msgstr "Bilinmeyen sistem hatası" + +@@ -3454,25 +3458,21 @@ + msgid "Interrupted by a signal" + msgstr "Bir sinyal ile engellendi" + +-#: posix/../sysdeps/posix/gai_strerror.c:57 +-msgid "Unknown error" +-msgstr "Bilinmeyen hata" +- +-#: posix/getconf.c:883 ++#: posix/getconf.c:889 + #, c-format + msgid "Usage: %s [-v specification] variable_name [pathname]\n" + msgstr "Kullanımı: %s [-v özellik] deÄŸiÅŸken_ismi [dosyayolu_ismi]\n" + +-#: posix/getconf.c:941 ++#: posix/getconf.c:947 + #, c-format + msgid "unknown specification \"%s\"" + msgstr "Özellik \"%s\" bilinmiyor" + +-#: posix/getconf.c:968 posix/getconf.c:984 ++#: posix/getconf.c:974 posix/getconf.c:990 + msgid "undefined" + msgstr "atanmamış" + +-#: posix/getconf.c:1006 ++#: posix/getconf.c:1012 + #, c-format + msgid "Unrecognized variable `%s'" + msgstr "Tanınmayan deÄŸiÅŸken `%s'" +@@ -3534,71 +3534,71 @@ + msgid "%s: option `-W %s' doesn't allow an argument\n" + msgstr "%s: `-W %s' seçeneÄŸi argümansız kullanılır\n" + +-#: posix/regcomp.c:181 ++#: posix/regcomp.c:136 + msgid "No match" + msgstr "EÅŸleÅŸme yok" + +-#: posix/regcomp.c:184 ++#: posix/regcomp.c:139 + msgid "Invalid regular expression" + msgstr "Düzenli ifade geçersiz" + +-#: posix/regcomp.c:187 ++#: posix/regcomp.c:142 + msgid "Invalid collation character" + msgstr "KarşılaÅŸtırma karakteri geçersiz" + +-#: posix/regcomp.c:190 ++#: posix/regcomp.c:145 + msgid "Invalid character class name" + msgstr "Geçersiz karakter sınıfı ismi" + +-#: posix/regcomp.c:193 ++#: posix/regcomp.c:148 + msgid "Trailing backslash" + msgstr "Ä°zleyen tersbölü" + +-#: posix/regcomp.c:196 ++#: posix/regcomp.c:151 + msgid "Invalid back reference" + msgstr "Geriye baÅŸvuru geçersiz" + +-#: posix/regcomp.c:199 ++#: posix/regcomp.c:154 + msgid "Unmatched [ or [^" + msgstr "[ ya da [^ eÅŸleÅŸmiyor" + +-#: posix/regcomp.c:202 ++#: posix/regcomp.c:157 + msgid "Unmatched ( or \\(" + msgstr "( ya da \\( eÅŸleÅŸmiyor" + +-#: posix/regcomp.c:205 ++#: posix/regcomp.c:160 + msgid "Unmatched \\{" + msgstr "\\{ eÅŸleÅŸmiyor" + +-#: posix/regcomp.c:208 ++#: posix/regcomp.c:163 + msgid "Invalid content of \\{\\}" + msgstr "\\{\\} içeriÄŸi geçersiz" + +-#: posix/regcomp.c:211 ++#: posix/regcomp.c:166 + msgid "Invalid range end" + msgstr "Geçersiz kapsam sonu" + +-#: posix/regcomp.c:214 ++#: posix/regcomp.c:169 + msgid "Memory exhausted" + msgstr "Bellek tükendi" + +-#: posix/regcomp.c:217 ++#: posix/regcomp.c:172 + msgid "Invalid preceding regular expression" + msgstr "Önceleme düzenli ifadesi geçersiz" + +-#: posix/regcomp.c:220 ++#: posix/regcomp.c:175 + msgid "Premature end of regular expression" + msgstr "Düzenli ifadenin sonu eksik" + +-#: posix/regcomp.c:223 ++#: posix/regcomp.c:178 + msgid "Regular expression too big" + msgstr "Düzenli ifade çok büyük" + +-#: posix/regcomp.c:226 ++#: posix/regcomp.c:181 + msgid "Unmatched ) or \\)" + msgstr ") ya da \\) eÅŸleÅŸmiyor" + +-#: posix/regcomp.c:673 ++#: posix/regcomp.c:615 + msgid "No previous regular expression" + msgstr "Önceki düzenli ifade yok" + +@@ -3754,24 +3754,24 @@ + msgid "Service configuration to be used" + msgstr "Kullanılacak yapılandırmayı hizmete alır" + +-#: nss/getent.c:136 nss/getent.c:305 ++#: nss/getent.c:136 nss/getent.c:308 + #, c-format + msgid "Enumeration not supported on %s\n" + msgstr "Numaralama %s ile desteklenmiyor\n" + +-#: nss/getent.c:729 ++#: nss/getent.c:732 + msgid "getent - get entries from administrative database." + msgstr "getent - yönetim veritabanından girdiler alınıyor." + +-#: nss/getent.c:730 ++#: nss/getent.c:733 + msgid "Supported databases:" + msgstr "Desteklenen veritabanları:" + +-#: nss/getent.c:787 nscd/nscd.c:119 nscd/nscd_nischeck.c:64 ++#: nss/getent.c:790 nscd/nscd.c:124 nscd/nscd_nischeck.c:64 + msgid "wrong number of arguments" + msgstr "argüman sayısı hatalı" + +-#: nss/getent.c:797 ++#: nss/getent.c:800 + #, c-format + msgid "Unknown database: %s\n" + msgstr "Bilinmeyen veritabanı: %s\n" +@@ -3800,68 +3800,72 @@ + msgid "invalid pointer size" + msgstr "imleyici uzunluÄŸu geçersiz" + +-#: inet/rcmd.c:174 inet/rcmd.c:177 ++#: inet/rcmd.c:163 inet/rcmd.c:166 ++msgid "rcmd: Cannot allocate memory\n" ++msgstr "rcmd: Bellek ayrılamadı\n" ++ ++#: inet/rcmd.c:185 inet/rcmd.c:188 + msgid "rcmd: socket: All ports in use\n" + msgstr "rcmd: soket: Tüm portlar kullanımda\n" + +-#: inet/rcmd.c:211 ++#: inet/rcmd.c:222 + #, c-format + msgid "connect to address %s: " + msgstr "%s adresine baÄŸlantı:" + +-#: inet/rcmd.c:229 ++#: inet/rcmd.c:240 + #, c-format + msgid "Trying %s...\n" + msgstr "%s deneniyor...\n" + +-#: inet/rcmd.c:278 ++#: inet/rcmd.c:289 + #, c-format + msgid "rcmd: write (setting up stderr): %m\n" + msgstr "rcmd: write (stderr ayarlaması): %m\n" + +-#: inet/rcmd.c:299 ++#: inet/rcmd.c:310 + #, c-format + msgid "rcmd: poll (setting up stderr): %m\n" + msgstr "rcmd: poll (stderr ayarlaması): %m\n" + +-#: inet/rcmd.c:302 ++#: inet/rcmd.c:313 + msgid "poll: protocol failure in circuit setup\n" + msgstr "poll: devre ayarında protokol hatası\n" + +-#: inet/rcmd.c:346 ++#: inet/rcmd.c:358 + msgid "socket: protocol failure in circuit setup\n" + msgstr "soket: devre ayarında protokol hatası\n" + +-#: inet/rcmd.c:368 ++#: inet/rcmd.c:387 + #, c-format + msgid "rcmd: %s: short read" + msgstr "rcmd: %s: kısa okuma" + +-#: inet/rcmd.c:524 ++#: inet/rcmd.c:549 + msgid "lstat failed" + msgstr "lstat baÅŸarısız" + +-#: inet/rcmd.c:526 ++#: inet/rcmd.c:551 + msgid "not regular file" + msgstr "düzenli dosya deÄŸil" + +-#: inet/rcmd.c:531 ++#: inet/rcmd.c:556 + msgid "cannot open" + msgstr "açılamıyor" + +-#: inet/rcmd.c:533 ++#: inet/rcmd.c:558 + msgid "fstat failed" + msgstr "fstat baÅŸarısız" + +-#: inet/rcmd.c:535 ++#: inet/rcmd.c:560 + msgid "bad owner" + msgstr "Sahip hatalı" + +-#: inet/rcmd.c:537 ++#: inet/rcmd.c:562 + msgid "writeable by other than owner" + msgstr "sahibinden baÅŸkası yazabilir" + +-#: inet/rcmd.c:539 ++#: inet/rcmd.c:564 + msgid "hard linked somewhere" + msgstr "bir yere sabit baÄŸlı" + +@@ -4072,109 +4076,109 @@ + msgid "Cannot receive reply to broadcast" + msgstr "yayından yanıt alınamıyor" + +-#: sunrpc/rpc_main.c:289 ++#: sunrpc/rpc_main.c:288 + #, c-format + msgid "%s: output would overwrite %s\n" + msgstr "%s: çıktı %s üzerine yazacak\n" + +-#: sunrpc/rpc_main.c:296 ++#: sunrpc/rpc_main.c:295 + #, c-format + msgid "%s: unable to open %s: %m\n" + msgstr "%s: %s dosyasını açmak mümkün deÄŸil: %m\n" + +-#: sunrpc/rpc_main.c:308 ++#: sunrpc/rpc_main.c:307 + #, c-format + msgid "%s: while writing output %s: %m" + msgstr "%s: %s çıktısını yazarken: %m" + +-#: sunrpc/rpc_main.c:343 ++#: sunrpc/rpc_main.c:342 + #, c-format + msgid "cannot find C preprocessor: %s \n" + msgstr "C ön iÅŸlemci bulunamıyor: %s \n" + +-#: sunrpc/rpc_main.c:351 ++#: sunrpc/rpc_main.c:350 + msgid "cannot find any C preprocessor (cpp)\n" + msgstr "hiç C ön iÅŸlemci (cpp) bulunamadı\n" + +-#: sunrpc/rpc_main.c:420 ++#: sunrpc/rpc_main.c:419 + #, c-format + msgid "%s: C preprocessor failed with signal %d\n" + msgstr "%s: C öniÅŸlemcisi %d sinyali vererek baÅŸarısız oldu\n" + +-#: sunrpc/rpc_main.c:423 ++#: sunrpc/rpc_main.c:422 + #, c-format + msgid "%s: C preprocessor failed with exit code %d\n" + msgstr "%s: C öniÅŸlemcisi %d çıkış kodu vererek baÅŸarısız oldu\n" + +-#: sunrpc/rpc_main.c:463 ++#: sunrpc/rpc_main.c:462 + #, c-format + msgid "illegal nettype :`%s'\n" + msgstr "kuraldışı aÄŸ türü: `%s'\n" + +-#: sunrpc/rpc_main.c:1105 ++#: sunrpc/rpc_main.c:1104 + msgid "rpcgen: too many defines\n" + msgstr "rpcgen: çok fazla atama\n" + +-#: sunrpc/rpc_main.c:1117 ++#: sunrpc/rpc_main.c:1116 + msgid "rpcgen: arglist coding error\n" + msgstr "rpcgen: argüman listesi kodlama hatası\n" + + #. TRANS: the file will not be removed; this is an + #. TRANS: informative message. +-#: sunrpc/rpc_main.c:1150 ++#: sunrpc/rpc_main.c:1149 + #, c-format + msgid "file `%s' already exists and may be overwritten\n" + msgstr "`%s' dosyası zaten var ve üzerine yazılabilir\n" + +-#: sunrpc/rpc_main.c:1195 ++#: sunrpc/rpc_main.c:1194 + msgid "Cannot specify more than one input file!\n" + msgstr "Bir girdi dosyasından fazlası belirtilemez!\n" + +-#: sunrpc/rpc_main.c:1365 ++#: sunrpc/rpc_main.c:1364 + msgid "This implementation doesn't support newstyle or MT-safe code!\n" + msgstr "Bu tamamlama yenibiçimi ya da MT-safe kodu desteklemez!\n" + +-#: sunrpc/rpc_main.c:1374 ++#: sunrpc/rpc_main.c:1373 + msgid "Cannot use netid flag with inetd flag!\n" + msgstr "AÄŸKimlik flaması inetd flaması ile kullanılamaz!\n" + +-#: sunrpc/rpc_main.c:1386 ++#: sunrpc/rpc_main.c:1385 + msgid "Cannot use netid flag without TIRPC!\n" + msgstr "AÄŸKimlik flaması TIRPC olmaksızın kullanılamaz!\n" + +-#: sunrpc/rpc_main.c:1393 ++#: sunrpc/rpc_main.c:1392 + msgid "Cannot use table flags with newstyle!\n" + msgstr "Tablo flamaları yenibiçimle kullanılamaz!\n" + +-#: sunrpc/rpc_main.c:1412 ++#: sunrpc/rpc_main.c:1411 + msgid "\"infile\" is required for template generation flags.\n" + msgstr "\"girdiDosyası\" ÅŸablon üretim flamaları için gerekli.\n" + +-#: sunrpc/rpc_main.c:1417 ++#: sunrpc/rpc_main.c:1416 + msgid "Cannot have more than one file generation flag!\n" + msgstr "Birden fazla dosya üretim flaması olamaz!?\n" + +-#: sunrpc/rpc_main.c:1426 ++#: sunrpc/rpc_main.c:1425 + #, c-format + msgid "usage: %s infile\n" + msgstr "kullanımı: %s girdi-dosyası\n" + +-#: sunrpc/rpc_main.c:1427 ++#: sunrpc/rpc_main.c:1426 + #, c-format + msgid "\t%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile\n" + msgstr "\t%s [-abkCLNTM][-Disim[=deÄŸer]] [-i boyut] [-I [-K saniye]] [-Y dosyaYolu] girdiDosyası\n" + +-#: sunrpc/rpc_main.c:1429 ++#: sunrpc/rpc_main.c:1428 + #, 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 çıktıDosyası] [girdiDosyası]\n" + +-#: sunrpc/rpc_main.c:1431 ++#: sunrpc/rpc_main.c:1430 + #, c-format + msgid "\t%s [-s nettype]* [-o outfile] [infile]\n" + msgstr "\t%s [-s aÄŸTürü]* [-o çıktıDosyası] [girdiDosyası]\n" + +-#: sunrpc/rpc_main.c:1432 ++#: sunrpc/rpc_main.c:1431 + #, c-format + msgid "\t%s [-n netid]* [-o outfile] [infile]\n" + msgstr "\t%s [-n aÄŸKimlik]* [-o çıktıDosyası] [girdiDosyası]\n" +@@ -5031,7 +5035,7 @@ + msgid "while allocating hash table entry" + msgstr "arama (hash) tablosu girdisi ayrılırken" + +-#: nscd/cache.c:150 nscd/connections.c:185 ++#: nscd/cache.c:150 nscd/connections.c:187 + #, c-format + msgid "cannot stat() file `%s': %s" + msgstr "`%s' dosyası stat() olamıyor: %s" +@@ -5044,153 +5048,158 @@ + msgid "Cannot run nscd in secure mode as unprivileged user" + msgstr "nscd güvenli kipte yetkisiz kullanıcı olarak çalıştırılamaz" + +-#: nscd/connections.c:199 ++#: nscd/connections.c:175 ++#, c-format ++msgid "while allocating cache: %s" ++msgstr "arabellek girdisi ayrılırken: %s" ++ ++#: nscd/connections.c:200 + #, c-format + msgid "cannot open socket: %s" + msgstr "soket açılamıyor: %s" + +-#: nscd/connections.c:217 ++#: nscd/connections.c:218 + #, c-format + msgid "cannot enable socket to accept connections: %s" + msgstr "baÄŸlantıları kabul etmek üzere soket etkinleÅŸtirilemiyor: %s" + +-#: nscd/connections.c:259 ++#: nscd/connections.c:260 + #, c-format + msgid "handle_request: request received (Version = %d)" + msgstr "handle_request: istek alındı (Sürüm = %d)" + +-#: nscd/connections.c:265 ++#: nscd/connections.c:266 + #, c-format + msgid "cannot handle old request version %d; current version is %d" + msgstr "eski istem sürümü %d elde edilemedi; mevcut sürüm %d" + +-#: nscd/connections.c:303 nscd/connections.c:325 ++#: nscd/connections.c:304 nscd/connections.c:326 + #, c-format + msgid "cannot write result: %s" + msgstr "sonuç yazılamıyor: %s" + +-#: nscd/connections.c:404 nscd/connections.c:498 ++#: nscd/connections.c:405 nscd/connections.c:499 + #, c-format + msgid "error getting callers id: %s" + msgstr "çaÄŸrıcı kimliÄŸi alınırken hata: %s" + +-#: nscd/connections.c:470 ++#: nscd/connections.c:471 + #, c-format + msgid "while accepting connection: %s" + msgstr "baÄŸlantı kabul edilirken: %s" + +-#: nscd/connections.c:481 ++#: nscd/connections.c:482 + #, c-format + msgid "short read while reading request: %s" + msgstr "istenen okuma kısa: %s" + +-#: nscd/connections.c:517 ++#: nscd/connections.c:518 + #, c-format + msgid "key length in request too long: %d" + msgstr "istenen anahtar uzunluÄŸu fazla: %d" + +-#: nscd/connections.c:531 ++#: nscd/connections.c:532 + #, c-format + msgid "short read while reading request key: %s" + msgstr "istenen tuÅŸ okunurken kısa okuma: %s" + +-#: nscd/connections.c:590 nscd/connections.c:591 nscd/connections.c:610 +-#: nscd/connections.c:623 nscd/connections.c:629 nscd/connections.c:636 ++#: nscd/connections.c:591 nscd/connections.c:592 nscd/connections.c:611 ++#: nscd/connections.c:624 nscd/connections.c:630 nscd/connections.c:637 + #, c-format + msgid "Failed to run nscd as user '%s'" + msgstr "nscd '%s' kullanıcısı olarak çalıştırılamadı" + +-#: nscd/connections.c:611 ++#: nscd/connections.c:612 + msgid "getgrouplist failed" + msgstr "getgrouplist baÅŸarısız" + +-#: nscd/connections.c:624 ++#: nscd/connections.c:625 + msgid "setgroups failed" + msgstr "setgroups baÅŸarısız" + +-#: nscd/grpcache.c:102 nscd/hstcache.c:110 nscd/pwdcache.c:108 ++#: nscd/grpcache.c:103 nscd/hstcache.c:111 nscd/pwdcache.c:109 + msgid "while allocating key copy" + msgstr "tuÅŸ kopyası ayrılırken" + +-#: nscd/grpcache.c:152 nscd/hstcache.c:167 nscd/pwdcache.c:145 ++#: nscd/grpcache.c:153 nscd/hstcache.c:168 nscd/pwdcache.c:146 + msgid "while allocating cache entry" + msgstr "arabellek girdisi ayrılırken" + +-#: nscd/grpcache.c:195 nscd/hstcache.c:281 nscd/pwdcache.c:191 ++#: nscd/grpcache.c:196 nscd/hstcache.c:282 nscd/pwdcache.c:192 + #, c-format + msgid "short write in %s: %s" + msgstr "%s içinde kısa yazma: %s" + +-#: nscd/grpcache.c:217 ++#: nscd/grpcache.c:218 + #, c-format + msgid "Haven't found \"%s\" in group cache!" + msgstr "\"%s\" grup arabelleÄŸinde yok!" + +-#: nscd/grpcache.c:292 ++#: nscd/grpcache.c:284 + #, c-format + msgid "Invalid numeric gid \"%s\"!" + msgstr "\"%s\" grup numarası geçersiz!" + +-#: nscd/grpcache.c:299 ++#: nscd/grpcache.c:291 + #, c-format + msgid "Haven't found \"%d\" in group cache!" + msgstr "\"%d\" grup arabelleÄŸinde yok!" + +-#: nscd/hstcache.c:303 nscd/hstcache.c:378 nscd/hstcache.c:456 +-#: nscd/hstcache.c:533 ++#: nscd/hstcache.c:304 nscd/hstcache.c:370 nscd/hstcache.c:435 ++#: nscd/hstcache.c:500 + #, c-format + msgid "Haven't found \"%s\" in hosts cache!" + msgstr "\"%s\" makinalar arabelleÄŸinde yok!" + +-#: nscd/nscd.c:80 ++#: nscd/nscd.c:85 + msgid "Read configuration data from NAME" + msgstr "Yapılandırma verisini Ä°SÄ°M den okur" + +-#: nscd/nscd.c:82 ++#: nscd/nscd.c:87 + msgid "Do not fork and display messages on the current tty" + msgstr "Ãœzerinde çalışılan tty de iletiler ayrılmaz ve gösterilir" + +-#: nscd/nscd.c:83 ++#: nscd/nscd.c:88 + msgid "NUMBER" + msgstr "SAYI" + +-#: nscd/nscd.c:83 ++#: nscd/nscd.c:88 + msgid "Start NUMBER threads" + msgstr "SAYIlı baÅŸlıkları baÅŸlatır" + +-#: nscd/nscd.c:84 ++#: nscd/nscd.c:89 + msgid "Shut the server down" + msgstr "Sunucuyu indirir" + +-#: nscd/nscd.c:85 ++#: nscd/nscd.c:90 + msgid "Print current configuration statistic" + msgstr "Åžu anki yapılandırma istatistiklerini basar" + +-#: nscd/nscd.c:86 ++#: nscd/nscd.c:91 + msgid "TABLE" + msgstr "TABLO" + +-#: nscd/nscd.c:87 ++#: nscd/nscd.c:92 + msgid "Invalidate the specified cache" + msgstr "Belirtilen arabellek geçersiz kılındı" + +-#: nscd/nscd.c:88 ++#: nscd/nscd.c:93 + msgid "TABLE,yes" + msgstr "TABLO,evet" + +-#: nscd/nscd.c:88 ++#: nscd/nscd.c:93 + msgid "Use separate cache for each user" + msgstr "Her kullanıcı için ayrı arabellek kullanılır" + +-#: nscd/nscd.c:93 ++#: nscd/nscd.c:98 + msgid "Name Service Cache Daemon." + msgstr "Name Service Cache Daemon." + +-#: nscd/nscd.c:126 ++#: nscd/nscd.c:131 + msgid "already running" + msgstr "Zaten çalışıyor" + +-#: nscd/nscd.c:192 nscd/nscd.c:212 nscd/nscd.c:218 ++#: nscd/nscd.c:243 nscd/nscd.c:263 nscd/nscd.c:269 + msgid "Only root is allowed to use this option!" + msgstr "Bu seçenek sadece root tarafından kullanılabilir!" + +@@ -5280,22 +5289,22 @@ + "%15ld%% arabellekleme oranı\n" + " /etc/%s'deki deÄŸiÅŸiklikler için %15s kontrol uygulandı\n" + +-#: nscd/pwdcache.c:213 ++#: nscd/pwdcache.c:214 + #, c-format + msgid "Haven't found \"%s\" in password cache!" + msgstr "\"%s\" parola arabelleÄŸinde yok!" + +-#: nscd/pwdcache.c:288 ++#: nscd/pwdcache.c:280 + #, c-format + msgid "Invalid numeric uid \"%s\"!" + msgstr "\"%s\" kullanıcı numarası geçersiz!" + +-#: nscd/pwdcache.c:295 ++#: nscd/pwdcache.c:287 + #, c-format + msgid "Haven't found \"%d\" in password cache!" + msgstr "\"%d\" parola arabelleÄŸinde yok!" + +-#: elf/../sysdeps/generic/dl-sysdep.c:297 ++#: elf/../sysdeps/generic/dl-sysdep.c:357 + msgid "cannot create capability list" + msgstr "yetenek listesi oluÅŸturulamıyor" + +@@ -5346,7 +5355,7 @@ + msgid ", OS ABI: %s %d.%d.%d" + msgstr ", OS ABI: %s %d.%d.%d" + +-#: elf/cache.c:136 elf/ldconfig.c:1033 ++#: elf/cache.c:136 elf/ldconfig.c:1045 + #, c-format + msgid "Can't open cache file %s\n" + msgstr "Arabellek dosyası %s açılamıyor\n" +@@ -5392,15 +5401,15 @@ + msgid "Renaming of %s to %s failed" + msgstr "%s'in ismi %s olarak deÄŸiÅŸtirilemedi" + +-#: elf/dl-close.c:113 ++#: elf/dl-close.c:128 + msgid "shared object not open" + msgstr "paylaşımlı nesne açık deÄŸil" + +-#: elf/dl-close.c:357 elf/dl-open.c:436 ++#: elf/dl-close.c:486 elf/dl-open.c:444 + msgid "TLS generation counter wrapped! Please send report with the 'glibcbug' script." + msgstr "TLS üretecinin sayacı baÅŸa döndü! Lütfen 'glibcbug' betiÄŸini kullanarak bir hata raporu gönderin." + +-#: elf/dl-deps.c:111 elf/dl-open.c:177 ++#: elf/dl-deps.c:111 elf/dl-open.c:183 + msgid "DST not allowed in SUID/SGID programs" + msgstr "SUID/SGID programlarda DST'ye izin verilmez" + +@@ -5417,181 +5426,193 @@ + msgid "cannot allocate dependency list" + msgstr "bağımlılık listesi ayrılamadı" + +-#: elf/dl-deps.c:492 elf/dl-deps.c:547 ++#: elf/dl-deps.c:494 elf/dl-deps.c:549 + msgid "cannot allocate symbol search list" + msgstr "sembol arama listesi ayrılamadı" + +-#: elf/dl-deps.c:532 ++#: elf/dl-deps.c:534 + msgid "Filters not supported with LD_TRACE_PRELINKING" + msgstr "LD_TRACE_PRELINKING'li süzgeçler destenlenmez" + +-#: elf/dl-error.c:73 ++#: elf/dl-error.c:75 + msgid "DYNAMIC LINKER BUG!!!" + msgstr "DÄ°NAMÄ°K BAÄžLAYICI HATASI!!!" + +-#: elf/dl-error.c:106 ++#: elf/dl-error.c:108 + msgid "error while loading shared libraries" + msgstr "paylaşımlı kitaplıklar yüklenirken hata oluÅŸtu" + +-#: elf/dl-load.c:338 ++#: elf/dl-load.c:339 + msgid "cannot allocate name record" + msgstr "isim kaydı ayrılamadı" + +-#: elf/dl-load.c:440 elf/dl-load.c:520 elf/dl-load.c:614 elf/dl-load.c:709 ++#: elf/dl-load.c:441 elf/dl-load.c:520 elf/dl-load.c:612 elf/dl-load.c:707 + msgid "cannot create cache for search path" + msgstr "dosya arama yolu için arabellek oluÅŸturulamıyor" + +-#: elf/dl-load.c:545 ++#: elf/dl-load.c:543 + msgid "cannot create RUNPATH/RPATH copy" + msgstr "RUNPATH/RPATH kopyası oluÅŸturulamıyor" + +-#: elf/dl-load.c:600 ++#: elf/dl-load.c:598 + msgid "cannot create search path array" + msgstr "dosya arama yolu dizisi oluÅŸturulamıyor" + +-#: elf/dl-load.c:796 ++#: elf/dl-load.c:794 + msgid "cannot stat shared object" + msgstr "paylaşımlı nesne durumlanamıyor" + +-#: elf/dl-load.c:840 ++#: elf/dl-load.c:838 + msgid "cannot open zero fill device" + msgstr "sıfırlar içeren aygıt açılamaz" + +-#: elf/dl-load.c:849 elf/dl-load.c:1855 ++#: elf/dl-load.c:847 elf/dl-load.c:1902 + msgid "cannot create shared object descriptor" + msgstr "paylaşımlı nesne tanımlayıcı oluÅŸturulamıyor" + +-#: elf/dl-load.c:868 elf/dl-load.c:1351 elf/dl-load.c:1434 ++#: elf/dl-load.c:866 elf/dl-load.c:1398 elf/dl-load.c:1481 + msgid "cannot read file data" + msgstr "dosya verisi okunamıyor" + +-#: elf/dl-load.c:908 ++#: elf/dl-load.c:906 + msgid "ELF load command alignment not page-aligned" + msgstr "ELF yükleme komutu hizalaması sayfa-hizalamalı deÄŸil" + +-#: elf/dl-load.c:915 ++#: elf/dl-load.c:913 + msgid "ELF load command address/offset not properly aligned" + msgstr "ELF yükleme komutu adresi/baÅŸvurusu gereÄŸi gibi hizalanamıyor" + +-#: elf/dl-load.c:996 ++#: elf/dl-load.c:988 ++msgid "cannot allocate TLS data structures for initial thread" ++msgstr "ilk kanak için TLS veri yapıları oluÅŸturulamıyor" ++ ++#: elf/dl-load.c:1012 ++msgid "cannot handle TLS data" ++msgstr "TLS verisi alınamıyor" ++ ++#: elf/dl-load.c:1047 + msgid "failed to map segment from shared object" + msgstr "parça paylaşımlı nesneden eÅŸleÅŸtirilemedi" + +-#: elf/dl-load.c:1020 ++#: elf/dl-load.c:1071 + msgid "cannot dynamically load executable" + msgstr "çalıştırılabilir dosya dinamik olarak yüklenemiyor" + +-#: elf/dl-load.c:1081 ++#: elf/dl-load.c:1132 + msgid "cannot change memory protections" + msgstr "bellek korumaları deÄŸiÅŸtirilemiyor" + +-#: elf/dl-load.c:1100 ++#: elf/dl-load.c:1151 + msgid "cannot map zero-fill pages" + msgstr "sıfırlar içeren sayfalar eÅŸleÅŸtirilemez" + +-#: elf/dl-load.c:1118 ++#: elf/dl-load.c:1169 + msgid "cannot allocate memory for program header" + msgstr "uygulama baÅŸlığı için bellek ayrılamadı" + +-#: elf/dl-load.c:1149 ++#: elf/dl-load.c:1200 + msgid "object file has no dynamic section" + msgstr "nesne dosyasının dinamik bölümü yok" + +-#: elf/dl-load.c:1193 ++#: elf/dl-load.c:1240 + msgid "shared object cannot be dlopen()ed" + msgstr "paylaşımlı nesne dlopen()'lanamıyor" + +-#: elf/dl-load.c:1216 ++#: elf/dl-load.c:1263 + msgid "cannot create searchlist" + msgstr "arama listesi oluÅŸturulamıyor" + +-#: elf/dl-load.c:1351 ++#: elf/dl-load.c:1398 + msgid "file too short" + msgstr "dosya çok küçük" + +-#: elf/dl-load.c:1374 ++#: elf/dl-load.c:1421 + msgid "invalid ELF header" + msgstr "ELF baÅŸlığı geçersiz" + +-#: elf/dl-load.c:1383 ++#: elf/dl-load.c:1430 + msgid "ELF file data encoding not big-endian" + msgstr "ELF dosyası verisinin kodlaması en-kıymetli-bayt-ilk (big-endian) deÄŸil" + +-#: elf/dl-load.c:1385 ++#: elf/dl-load.c:1432 + msgid "ELF file data encoding not little-endian" + msgstr "ELF dosyası verisinin kodlaması en-kıymetli-bayt-son (little-endian) deÄŸil" + +-#: elf/dl-load.c:1389 ++#: elf/dl-load.c:1436 + msgid "ELF file version ident does not match current one" + msgstr "ELF dosyası sürüm kimliÄŸi mevcut biriyle eÅŸleÅŸmiyor" + +-#: elf/dl-load.c:1393 ++#: elf/dl-load.c:1440 + msgid "ELF file OS ABI invalid" + msgstr "ELF dosyası OS ABI geçersiz" + +-#: elf/dl-load.c:1395 ++#: elf/dl-load.c:1442 + msgid "ELF file ABI version invalid" + msgstr "ELF dosyası ABI sürümü geçersiz" + +-#: elf/dl-load.c:1398 ++#: elf/dl-load.c:1445 + msgid "internal error" + msgstr "iç hata" + +-#: elf/dl-load.c:1405 ++#: elf/dl-load.c:1452 + msgid "ELF file version does not match current one" + msgstr "ELF dosyası sürümü mevcut biriyle eÅŸleÅŸmiyor" + +-#: elf/dl-load.c:1413 ++#: elf/dl-load.c:1460 + msgid "ELF file's phentsize not the expected size" + msgstr "ELF dosyasının phent uzunluÄŸu beklenen uzunlukta deÄŸil" + +-#: elf/dl-load.c:1419 ++#: elf/dl-load.c:1466 + msgid "only ET_DYN and ET_EXEC can be loaded" + msgstr "sadece ET_DYN ve ET_EXEC yüklü olabilir" + +-#: elf/dl-load.c:1870 ++#: elf/dl-load.c:1917 + msgid "cannot open shared object file" + msgstr "paylaşımlı nesne dosyası açılamıyor" + +-#: elf/dl-lookup.c:248 elf/dl-lookup.c:413 ++#: elf/dl-lookup.c:265 elf/dl-lookup.c:430 + msgid "relocation error" + msgstr "yeniden konumlama hatası" + +-#: elf/dl-open.c:105 ++#: elf/dl-open.c:111 + msgid "cannot extend global scope" + msgstr "genel kapsam geniÅŸletilemiyor" + +-#: elf/dl-open.c:208 ++#: elf/dl-open.c:214 + msgid "empty dynamic string token substitution" + msgstr "boÅŸ dinamik dizge simge ikamesi" + +-#: elf/dl-open.c:345 elf/dl-open.c:356 ++#: elf/dl-open.c:351 elf/dl-open.c:362 + msgid "cannot create scope list" + msgstr "etki alanı listesi oluÅŸturulamıyor" + +-#: elf/dl-open.c:416 ++#: elf/dl-open.c:424 + msgid "cannot create TLS data structures" + msgstr "TLS veri yapıları oluÅŸturulamıyor" + +-#: elf/dl-open.c:478 ++#: elf/dl-open.c:486 + msgid "invalid mode for dlopen()" + msgstr "dlopen() için kip geçersiz" + +-#: elf/dl-reloc.c:88 ++#: elf/dl-reloc.c:58 ++msgid "shared object cannot be dlopen()ed: static TLS memory too small" ++msgstr "paylaşımlı nesne dlopen()'lanamıyor: statik TLS belleÄŸi çok küçük" ++ ++#: elf/dl-reloc.c:118 + msgid "cannot make segment writable for relocation" + msgstr "yeniden konumlama için parça yazılabilir yapılamıyor" + +-#: elf/dl-reloc.c:174 ++#: elf/dl-reloc.c:219 + #, c-format + msgid "%s: profiler found no PLTREL in object %s\n" + msgstr "%s: profiler %s nesnesinde PLTREL bulamadı\n" + +-#: elf/dl-reloc.c:186 ++#: elf/dl-reloc.c:231 + #, c-format + msgid "%s: profiler out of memory shadowing PLTREL of %s\n" + msgstr "%s: %s PLTREL gölgelenirken profiler bellekdışı\n" + +-#: elf/dl-reloc.c:201 ++#: elf/dl-reloc.c:246 + msgid "cannot restore segment prot after reloc" + msgstr "reloc iÅŸleminden sonra prot segmanı eski haline getirilemedi" + +@@ -5647,119 +5668,119 @@ + msgid "Configure Dynamic Linker Run Time Bindings." + msgstr "Dinamik BaÄŸlayıcının Ä°cra Zamanı Bağıntılarını Yapılandırır." + +-#: elf/ldconfig.c:282 ++#: elf/ldconfig.c:294 + #, c-format + msgid "Path `%s' given more than once" + msgstr "`%s' dosya yolu birden fazla verilmiÅŸ" + +-#: elf/ldconfig.c:326 ++#: elf/ldconfig.c:338 + #, c-format + msgid "%s is not a known library type" + msgstr "%s bilinen bir kitaplık türü deÄŸil" + +-#: elf/ldconfig.c:344 ++#: elf/ldconfig.c:356 + #, c-format + msgid "Can't stat %s" + msgstr "stat %s yapılamıyor" + +-#: elf/ldconfig.c:414 ++#: elf/ldconfig.c:426 + #, c-format + msgid "Can't stat %s\n" + msgstr "stat %s yapılamıyor\n" + +-#: elf/ldconfig.c:424 ++#: elf/ldconfig.c:436 + #, c-format + msgid "%s is not a symbolic link\n" + msgstr "%s bir sembolik baÄŸ deÄŸil\n" + +-#: elf/ldconfig.c:443 ++#: elf/ldconfig.c:455 + #, c-format + msgid "Can't unlink %s" + msgstr "%s bağı kaldırılamadı" + +-#: elf/ldconfig.c:449 ++#: elf/ldconfig.c:461 + #, c-format + msgid "Can't link %s to %s" + msgstr "%s den %s'e baÄŸ yapılamıyor" + +-#: elf/ldconfig.c:455 ++#: elf/ldconfig.c:467 + msgid " (changed)\n" + msgstr " (deÄŸiÅŸti)\n" + +-#: elf/ldconfig.c:457 ++#: elf/ldconfig.c:469 + msgid " (SKIPPED)\n" + msgstr " (ATLANDI)\n" + +-#: elf/ldconfig.c:512 ++#: elf/ldconfig.c:524 + #, c-format + msgid "Can't find %s" + msgstr "%s bulunamıyor" + +-#: elf/ldconfig.c:528 ++#: elf/ldconfig.c:540 + #, c-format + msgid "Can't lstat %s" + msgstr "lstat %s yapılamıyor" + +-#: elf/ldconfig.c:535 ++#: elf/ldconfig.c:547 + #, c-format + msgid "Ignored file %s since it is not a regular file." + msgstr "Normal bir dosya olmadığından %s dosyası yoksayıldı" + +-#: elf/ldconfig.c:543 ++#: elf/ldconfig.c:555 + #, c-format + msgid "No link created since soname could not be found for %s" + msgstr "%s için kitaplık ismi bulunamadığından baÄŸ oluÅŸturulmadı" + +-#: elf/ldconfig.c:634 ++#: elf/ldconfig.c:646 + #, c-format + msgid "Can't open directory %s" + msgstr "%s dizini açılamıyor" + +-#: elf/ldconfig.c:689 elf/ldconfig.c:736 ++#: elf/ldconfig.c:701 elf/ldconfig.c:748 + #, c-format + msgid "Cannot lstat %s" + msgstr "lstat %s yapılamıyor" + +-#: elf/ldconfig.c:701 ++#: elf/ldconfig.c:713 + #, c-format + msgid "Cannot stat %s" + msgstr "stat %s yapılamıyor" + +-#: elf/ldconfig.c:758 elf/readlib.c:93 ++#: elf/ldconfig.c:770 elf/readlib.c:93 + #, c-format + msgid "Input file %s not found.\n" + msgstr "Girdi dosyası %s bulunamadı.\n" + +-#: elf/ldconfig.c:792 ++#: elf/ldconfig.c:804 + #, c-format + msgid "libc5 library %s in wrong directory" + msgstr "libc5 kitaplığı %s yanlış dizinde" + +-#: elf/ldconfig.c:795 ++#: elf/ldconfig.c:807 + #, c-format + msgid "libc6 library %s in wrong directory" + msgstr "libc6 kitaplığı %s yanlış dizinde" + +-#: elf/ldconfig.c:798 ++#: elf/ldconfig.c:810 + #, c-format + msgid "libc4 library %s in wrong directory" + msgstr "libc4 kitaplığı %s yanlış dizinde" + +-#: elf/ldconfig.c:825 ++#: elf/ldconfig.c:837 + #, c-format + msgid "libraries %s and %s in directory %s have same soname but different type." + msgstr "%s ve %s kitaplıkları %s dizininde ve aynı isme sahip oldukları halde farklı türde." + +-#: elf/ldconfig.c:928 ++#: elf/ldconfig.c:940 + #, c-format + msgid "Can't open configuration file %s" + msgstr "Yapılandırma dosyası %s açılamıyor" + +-#: elf/ldconfig.c:1012 ++#: elf/ldconfig.c:1024 + msgid "Can't chdir to /" + msgstr "/ dizinine geçilemiyor" + +-#: elf/ldconfig.c:1054 ++#: elf/ldconfig.c:1066 + #, c-format + msgid "Can't open cache file directory %s\n" + msgstr "Arabellek dosyasının dizini %s açılamıyor\n" +Binary files glibc-2.3.2/po/zh_CN.mo and glibc-2.3.2-200304020432/po/zh_CN.mo differ +Binary files glibc-2.3.2/po/zh_TW.mo and glibc-2.3.2-200304020432/po/zh_TW.mo differ +diff -u -udbrN glibc-2.3.2/posix/Makefile glibc-2.3.2-200304020432/posix/Makefile +--- glibc-2.3.2/posix/Makefile Sun Feb 23 10:23:05 2003 ++++ glibc-2.3.2-200304020432/posix/Makefile Wed Mar 19 23:32:19 2003 +@@ -75,7 +75,7 @@ + tst-chmod bug-regex1 bug-regex2 bug-regex3 bug-regex4 \ + tst-gnuglob tst-regex bug-regex5 bug-regex6 bug-regex7 \ + bug-regex8 bug-regex9 bug-regex10 bug-regex11 bug-regex12 \ +- bug-regex13 bug-regex14 bug-regex15 bug-regex16 ++ bug-regex13 bug-regex14 bug-regex15 bug-regex16 tst-nice + ifeq (yes,$(build-shared)) + test-srcs := globtest + tests += wordexp-test tst-exec tst-spawn +diff -u -udbrN glibc-2.3.2/posix/confstr.c glibc-2.3.2-200304020432/posix/confstr.c +--- glibc-2.3.2/posix/confstr.c Wed Feb 12 22:15:00 2003 ++++ glibc-2.3.2-200304020432/posix/confstr.c Wed Mar 5 04:02:26 2003 +@@ -143,12 +143,13 @@ + + case _CS_GNU_LIBC_VERSION: + string = "glibc " VERSION; +- string_len = strlen (string); ++ string_len = sizeof ("glibc " VERSION); ++ break; + + case _CS_GNU_LIBPTHREAD_VERSION: + #ifdef LIBPTHREAD_VERSION + string = LIBPTHREAD_VERSION; +- string_len = strlen (string); ++ string_len = sizeof LIBPTHREAD_VERSION; + break; + #else + /* No thread library. */ +diff -u -udbrN glibc-2.3.2/posix/fnmatch.c glibc-2.3.2-200304020432/posix/fnmatch.c +--- glibc-2.3.2/posix/fnmatch.c Sun Aug 4 06:32:39 2002 ++++ glibc-2.3.2-200304020432/posix/fnmatch.c Sun Mar 16 02:03:46 2003 +@@ -1,4 +1,5 @@ +-/* Copyright (C) 1991-93,96-99,2000,01,02 Free Software Foundation, Inc. ++/* Copyright (C) 1991,1992,1993,1996,1997,1998,1999,2000,2001,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 +@@ -333,7 +334,7 @@ + /* Convert the strings into wide characters. */ + memset (&ps, '\0', sizeof (ps)); + n = mbsrtowcs (NULL, &pattern, 0, &ps); +- if (__builtin_expect (n, 0) == (size_t) -1) ++ if (__builtin_expect (n == (size_t) -1, 0)) + /* Something wrong. + XXX Do we have to set `errno' to something which mbsrtows hasn't + already done? */ +@@ -344,7 +345,7 @@ + + assert (mbsinit (&ps)); + n = mbsrtowcs (NULL, &string, 0, &ps); +- if (__builtin_expect (n, 0) == (size_t) -1) ++ if (__builtin_expect (n == (size_t) -1, 0)) + /* Something wrong. + XXX Do we have to set `errno' to something which mbsrtows hasn't + already done? */ +diff -u -udbrN glibc-2.3.2/posix/fnmatch_loop.c glibc-2.3.2-200304020432/posix/fnmatch_loop.c +--- glibc-2.3.2/posix/fnmatch_loop.c Mon Mar 11 09:32:00 2002 ++++ glibc-2.3.2-200304020432/posix/fnmatch_loop.c Sun Mar 16 04:22:23 2003 +@@ -1,4 +1,5 @@ +-/* Copyright (C) 1991-1993, 1996-2000, 2001 Free Software Foundation, Inc. ++/* Copyright (C) 1991,1992,1993,1996,1997,1998,1999,2000,2001,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 +@@ -539,11 +540,13 @@ + if (! is_range) + { + # ifdef WIDE_CHAR_VERSION +- for (c1 = 0; c1 < wextra[idx]; ++c1) ++ for (c1 = 0; ++ (int32_t) c1 < wextra[idx]; ++ ++c1) + if (n[c1] != wextra[1 + c1]) + break; + +- if (c1 == wextra[idx]) ++ if ((int32_t) c1 == wextra[idx]) + goto matched; + # else + for (c1 = 0; c1 < extra[idx]; ++c1) +@@ -932,7 +935,7 @@ + case L('/'): + if (NO_LEADING_PERIOD (flags)) + { +- if (n == string_end || c != *n) ++ if (n == string_end || c != (UCHAR) *n) + return FNM_NOMATCH; + + new_no_leading_period = 1; +diff -u -udbrN glibc-2.3.2/posix/getconf.c glibc-2.3.2-200304020432/posix/getconf.c +--- glibc-2.3.2/posix/getconf.c Wed Feb 12 22:09:19 2003 ++++ glibc-2.3.2-200304020432/posix/getconf.c Fri Mar 14 07:20:08 2003 +@@ -865,6 +865,9 @@ + #ifdef _CS_GNU_LIBPTHREAD_VERSION + { "GNU_LIBPTHREAD_VERSION", _CS_GNU_LIBPTHREAD_VERSION, CONFSTR }, + #endif ++#ifdef _PC_2_SYMLINKS ++ { "POSIX2_SYMLINKS", _PC_2_SYMLINKS, PATHCONF }, ++#endif + + { NULL, 0, SYSCONF } + }; +diff -u -udbrN glibc-2.3.2/posix/glob/ChangeLog glibc-2.3.2-200304020432/posix/glob/ChangeLog +--- glibc-2.3.2/posix/glob/ChangeLog Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/posix/glob/ChangeLog Fri Jul 26 02:34:28 1996 +@@ -0,0 +1,23 @@ ++Sat Jul 20 21:55:31 1996 Roland McGrath ++ ++ Win32 hacks from . ++ * posix/glob.c [WIN32]: Don't include ; don't use d_ino; ++ use void * for my_realloc; include for alloca. ++ (glob) [WIN32]: Use "c:/users/default" for ~ if no HOME variable. ++ * posix/fnmatch.h [WIN32]: Use prototypes even if [!__STDC__]. ++ * posix/glob.h: Likewise. ++ ++Fri Jul 19 16:56:41 1996 Roland McGrath ++ ++ * posix/glob.h [!_AMIGA && !VMS]: Check this instead of just [!_AMIGA] ++ for `struct stat;' forward decl. ++ ++Sat Jun 22 10:44:09 1996 Roland McGrath ++ ++ * posix/glob.c: Include only [HAVE_ALLOCA_H], not [sparc]. ++ ++Fri Jun 21 00:27:51 1996 Roland McGrath ++ ++ * posix/fnmatch.c (fnmatch): Fix \*[*?]+ case to increment name ptr ++ only for ?s, not for *s. Fix from Chet Ramey. ++ +diff -u -udbrN glibc-2.3.2/posix/glob/Makefile.ami glibc-2.3.2-200304020432/posix/glob/Makefile.ami +--- glibc-2.3.2/posix/glob/Makefile.ami Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/posix/glob/Makefile.ami Tue Aug 27 00:40:48 2002 +@@ -0,0 +1,69 @@ ++# Makefile for standalone distribution of libglob.a (fnmatch, glob). ++ ++# Copyright (C) 1991, 92, 93, 94, 95, 97 Free Software Foundation, Inc. ++# This file is part of the GNU C Library. ++ ++# This 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. ++ ++# This 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. ++ ++# Ultrix 2.2 make doesn't expand the value of VPATH. ++VPATH = /glob/ ++# This must repeat the value, because configure will remove `VPATH = .'. ++srcdir = /glob/ ++ ++CC = sc ++RM = delete ++CPPFLAGS = ++CFLAGS = ++ ++# Information determined by configure. ++DEFS = Define HAVE_HEADER_STDC Define HAVE_UNISTD_H Define HAVE_STRING_H \ ++ Define HAVE_DIRENT_H ++ ++# How to invoke ar. ++AR = join ++ARFLAGS = as ++ ++# How to invoke ranlib. ++RANLIB = ; ++ ++.PHONY: all ++all: glob.lib ++ ++glob.lib : glob.o fnmatch.o ++ $(AR) $(ARFLAGS) $@ glob.o fnmatch.o ++ $(RANLIB) $@ ++ ++# For some reason, Unix make wants the dependencies on the source files. ++# Otherwise it refuses to use an implicit rule! ++# And, get this: it doesn't work to use $(srcdir)foo.c!! ++glob.o: $(srcdir)glob.h $(srcdir)fnmatch.h glob.c ++fnmatch.o: $(srcdir)fnmatch.h fnmatch.c ++ ++OUTPUT_OPTION = ++.c.o: ++ $(CC) IDir "" \ ++ $(DEFS) $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION) ++ ++.PHONY: clean realclean glob-clean glob-realclean distclean ++clean glob-clean: ++ -$(RM) glob.lib "#?.o" core ++distclean glob-realclean: clean ++ -$(RM) TAGS tags Makefile config.status config.h config.log ++realcean: distclean ++ ++# For inside the C library. ++glob.tar glob.tar.Z: ++ $(MAKE) -C .. $@ +diff -u -udbrN glibc-2.3.2/posix/glob/Makefile.in glibc-2.3.2-200304020432/posix/glob/Makefile.in +--- glibc-2.3.2/posix/glob/Makefile.in Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/posix/glob/Makefile.in Tue Aug 27 00:39:49 2002 +@@ -0,0 +1,66 @@ ++# Makefile for standalone distribution of libglob.a (fnmatch, glob). ++ ++# Copyright (C) 1991, 92, 93, 94, 95 Free Software Foundation, Inc. ++# This file is part of the GNU C Library. ++ ++# This 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. ++ ++# This 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 this library; see the file COPYING.LIB. If ++# not, write to the Free Software Foundation, Inc., 59 Temple Place, ++# Suite 330, Boston, MA 02111 USA. ++ ++# Ultrix 2.2 make doesn't expand the value of VPATH. ++VPATH = @srcdir@ ++# This must repeat the value, because configure will remove `VPATH = .'. ++srcdir = @srcdir@ ++ ++CC = @CC@ ++CPPFLAGS = @CPPFLAGS@ ++CFLAGS = @CFLAGS@ ++ ++# Information determined by configure. ++DEFS = @DEFS@ ++ ++# How to invoke ar. ++AR = @AR@ ++ARFLAGS = rv ++ ++# How to invoke ranlib. ++RANLIB = @RANLIB@ ++ ++.PHONY: all ++all: libglob.a ++ ++libglob.a: glob.o fnmatch.o ++ $(AR) $(ARFLAGS) $@ glob.o fnmatch.o ++ $(RANLIB) $@ ++ ++# For some reason, Unix make wants the dependencies on the source files. ++# Otherwise it refuses to use an implicit rule! ++# And, get this: it doesn't work to use $(srcdir)/foo.c!! ++glob.o: $(srcdir)/glob.h $(srcdir)/fnmatch.h glob.c ++fnmatch.o: $(srcdir)/fnmatch.h fnmatch.c ++ ++.c.o: ++ $(CC) -I. -I$(srcdir) -c \ ++ $(DEFS) $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION) ++ ++.PHONY: clean realclean glob-clean glob-realclean distclean ++clean glob-clean: ++ -rm -f libglob.a *.o core ++distclean glob-realclean: clean ++ -rm -f TAGS tags Makefile config.status config.h config.log ++realcean: distclean ++ ++# For inside the C library. ++glob.tar glob.tar.Z: ++ $(MAKE) -C .. $@ +diff -u -udbrN glibc-2.3.2/posix/glob/SCOPTIONS glibc-2.3.2-200304020432/posix/glob/SCOPTIONS +--- glibc-2.3.2/posix/glob/SCOPTIONS Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/posix/glob/SCOPTIONS Thu May 9 19:54:36 1996 +@@ -0,0 +1,13 @@ ++ERRORREXX ++OPTIMIZE ++NOVERSION ++OPTIMIZERTIME ++OPTIMIZERALIAS ++DEFINE INCLUDEDIR="include:" ++DEFINE LIBDIR="lib:" ++DEFINE NO_ALLOCA ++DEFINE NO_FLOAT ++DEFINE NO_ARCHIVES ++IGNORE=161 ++IGNORE=100 ++STARTUP=cres +diff -u -udbrN glibc-2.3.2/posix/glob/SMakefile glibc-2.3.2-200304020432/posix/glob/SMakefile +--- glibc-2.3.2/posix/glob/SMakefile Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/posix/glob/SMakefile Fri Jul 6 06:55:38 2001 +@@ -0,0 +1,68 @@ ++# Makefile for standalone distribution of libglob.a (fnmatch, glob). ++# Copyright (C) 1991, 92, 93, 94, 95, 97 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. ++ ++# Ultrix 2.2 make doesn't expand the value of VPATH. ++VPATH = /glob/ ++# This must repeat the value, because configure will remove `VPATH = .'. ++srcdir = /glob/ ++ ++CC = sc ++CPPFLAGS = ++CFLAGS = ++MAKE = smake ++RM = delete ++ ++# Information determined by configure. ++DEFS = Define HAVE_HEADER_STDC Define HAVE_UNISTD_H Define HAVE_STRING_H \ ++ Define HAVE_DIRENT_H ++ ++# How to invoke ar. ++AR = join ++ARFLAGS = as ++ ++# How to invoke ranlib. ++RANLIB = ; ++ ++.PHONY: all ++all: glob.lib ++ ++glob.lib : glob.o fnmatch.o ++ $(AR) $(ARFLAGS) $@ glob.o fnmatch.o ++ $(RANLIB) $@ ++ ++# For some reason, Unix make wants the dependencies on the source files. ++# Otherwise it refuses to use an implicit rule! ++# And, get this: it doesn't work to use $(srcdir)foo.c!! ++glob.o: $(srcdir)glob.h $(srcdir)fnmatch.h glob.c ++fnmatch.o: $(srcdir)fnmatch.h fnmatch.c ++ ++.c.o: ++ $(CC) IDir "" \ ++ $(DEFS) $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION) ++ ++.PHONY: clean realclean glob-clean glob-realclean distclean ++clean glob-clean: ++ -$(RM) -f glob.lib *.o core ++distclean glob-realclean: clean ++ -$(RM) -f TAGS tags Makefile config.status config.h config.log ++realcean: distclean ++ ++# For inside the C library. ++glob.tar glob.tar.Z: ++ $(MAKE) -C .. $@ +diff -u -udbrN glibc-2.3.2/posix/glob/configure glibc-2.3.2-200304020432/posix/glob/configure +--- glibc-2.3.2/posix/glob/configure Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/posix/glob/configure Fri Mar 1 18:19:22 1996 +@@ -0,0 +1,1664 @@ ++#! /bin/sh ++ ++# Guess values for system-dependent variables and create Makefiles. ++# Generated automatically using autoconf version 2.7 ++# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. ++# ++# This configure script is free software; the Free Software Foundation ++# gives unlimited permission to copy, distribute and modify it. ++ ++# Defaults: ++ac_help= ++ac_default_prefix=/usr/local ++# Any additions from configure.in: ++ ++# Initialize some variables set by options. ++# The variables have the same names as the options, with ++# dashes changed to underlines. ++build=NONE ++cache_file=./config.cache ++exec_prefix=NONE ++host=NONE ++no_create= ++nonopt=NONE ++no_recursion= ++prefix=NONE ++program_prefix=NONE ++program_suffix=NONE ++program_transform_name=s,x,x, ++silent= ++site= ++srcdir= ++target=NONE ++verbose= ++x_includes=NONE ++x_libraries=NONE ++bindir='${exec_prefix}/bin' ++sbindir='${exec_prefix}/sbin' ++libexecdir='${exec_prefix}/libexec' ++datadir='${prefix}/share' ++sysconfdir='${prefix}/etc' ++sharedstatedir='${prefix}/com' ++localstatedir='${prefix}/var' ++libdir='${exec_prefix}/lib' ++includedir='${prefix}/include' ++oldincludedir='/usr/include' ++infodir='${prefix}/info' ++mandir='${prefix}/man' ++ ++# Initialize some other variables. ++subdirs= ++MFLAGS= MAKEFLAGS= ++ ++ac_prev= ++for ac_option ++do ++ ++ # If the previous option needs an argument, assign it. ++ if test -n "$ac_prev"; then ++ eval "$ac_prev=\$ac_option" ++ ac_prev= ++ continue ++ fi ++ ++ case "$ac_option" in ++ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; ++ *) ac_optarg= ;; ++ esac ++ ++ # Accept the important Cygnus configure options, so we can diagnose typos. ++ ++ case "$ac_option" in ++ ++ -bindir | --bindir | --bindi | --bind | --bin | --bi) ++ ac_prev=bindir ;; ++ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) ++ bindir="$ac_optarg" ;; ++ ++ -build | --build | --buil | --bui | --bu) ++ ac_prev=build ;; ++ -build=* | --build=* | --buil=* | --bui=* | --bu=*) ++ build="$ac_optarg" ;; ++ ++ -cache-file | --cache-file | --cache-fil | --cache-fi \ ++ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ++ ac_prev=cache_file ;; ++ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ ++ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) ++ cache_file="$ac_optarg" ;; ++ ++ -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ++ ac_prev=datadir ;; ++ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ ++ | --da=*) ++ datadir="$ac_optarg" ;; ++ ++ -disable-* | --disable-*) ++ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` ++ # Reject names that are not valid shell variable names. ++ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then ++ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } ++ fi ++ ac_feature=`echo $ac_feature| sed 's/-/_/g'` ++ eval "enable_${ac_feature}=no" ;; ++ ++ -enable-* | --enable-*) ++ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` ++ # Reject names that are not valid shell variable names. ++ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then ++ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } ++ fi ++ ac_feature=`echo $ac_feature| sed 's/-/_/g'` ++ case "$ac_option" in ++ *=*) ;; ++ *) ac_optarg=yes ;; ++ esac ++ eval "enable_${ac_feature}='$ac_optarg'" ;; ++ ++ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ ++ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ ++ | --exec | --exe | --ex) ++ ac_prev=exec_prefix ;; ++ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ ++ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ ++ | --exec=* | --exe=* | --ex=*) ++ exec_prefix="$ac_optarg" ;; ++ ++ -gas | --gas | --ga | --g) ++ # Obsolete; use --with-gas. ++ with_gas=yes ;; ++ ++ -help | --help | --hel | --he) ++ # Omit some internal or obsolete options to make the list less imposing. ++ # This message is too long to be a string in the A/UX 3.1 sh. ++ cat << EOF ++Usage: configure [options] [host] ++Options: [defaults in brackets after descriptions] ++Configuration: ++ --cache-file=FILE cache test results in FILE ++ --help print this message ++ --no-create do not create output files ++ --quiet, --silent do not print \`checking...' messages ++ --version print the version of autoconf that created configure ++Directory and file names: ++ --prefix=PREFIX install architecture-independent files in PREFIX ++ [$ac_default_prefix] ++ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX ++ [same as prefix] ++ --bindir=DIR user executables in DIR [EPREFIX/bin] ++ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] ++ --libexecdir=DIR program executables in DIR [EPREFIX/libexec] ++ --datadir=DIR read-only architecture-independent data in DIR ++ [PREFIX/share] ++ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] ++ --sharedstatedir=DIR modifiable architecture-independent data in DIR ++ [PREFIX/com] ++ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] ++ --libdir=DIR object code libraries in DIR [EPREFIX/lib] ++ --includedir=DIR C header files in DIR [PREFIX/include] ++ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] ++ --infodir=DIR info documentation in DIR [PREFIX/info] ++ --mandir=DIR man documentation in DIR [PREFIX/man] ++ --srcdir=DIR find the sources in DIR [configure dir or ..] ++ --program-prefix=PREFIX prepend PREFIX to installed program names ++ --program-suffix=SUFFIX append SUFFIX to installed program names ++ --program-transform-name=PROGRAM ++ run sed PROGRAM on installed program names ++EOF ++ cat << EOF ++Host type: ++ --build=BUILD configure for building on BUILD [BUILD=HOST] ++ --host=HOST configure for HOST [guessed] ++ --target=TARGET configure for TARGET [TARGET=HOST] ++Features and packages: ++ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) ++ --enable-FEATURE[=ARG] include FEATURE [ARG=yes] ++ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] ++ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) ++ --x-includes=DIR X include files are in DIR ++ --x-libraries=DIR X library files are in DIR ++EOF ++ if test -n "$ac_help"; then ++ echo "--enable and --with options recognized:$ac_help" ++ fi ++ exit 0 ;; ++ ++ -host | --host | --hos | --ho) ++ ac_prev=host ;; ++ -host=* | --host=* | --hos=* | --ho=*) ++ host="$ac_optarg" ;; ++ ++ -includedir | --includedir | --includedi | --included | --include \ ++ | --includ | --inclu | --incl | --inc) ++ ac_prev=includedir ;; ++ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ ++ | --includ=* | --inclu=* | --incl=* | --inc=*) ++ includedir="$ac_optarg" ;; ++ ++ -infodir | --infodir | --infodi | --infod | --info | --inf) ++ ac_prev=infodir ;; ++ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) ++ infodir="$ac_optarg" ;; ++ ++ -libdir | --libdir | --libdi | --libd) ++ ac_prev=libdir ;; ++ -libdir=* | --libdir=* | --libdi=* | --libd=*) ++ libdir="$ac_optarg" ;; ++ ++ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ ++ | --libexe | --libex | --libe) ++ ac_prev=libexecdir ;; ++ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ ++ | --libexe=* | --libex=* | --libe=*) ++ libexecdir="$ac_optarg" ;; ++ ++ -localstatedir | --localstatedir | --localstatedi | --localstated \ ++ | --localstate | --localstat | --localsta | --localst \ ++ | --locals | --local | --loca | --loc | --lo) ++ ac_prev=localstatedir ;; ++ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ ++ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ ++ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) ++ localstatedir="$ac_optarg" ;; ++ ++ -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ++ ac_prev=mandir ;; ++ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) ++ mandir="$ac_optarg" ;; ++ ++ -nfp | --nfp | --nf) ++ # Obsolete; use --without-fp. ++ with_fp=no ;; ++ ++ -no-create | --no-create | --no-creat | --no-crea | --no-cre \ ++ | --no-cr | --no-c) ++ no_create=yes ;; ++ ++ -no-recursion | --no-recursion | --no-recursio | --no-recursi \ ++ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ++ no_recursion=yes ;; ++ ++ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ ++ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ ++ | --oldin | --oldi | --old | --ol | --o) ++ ac_prev=oldincludedir ;; ++ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ ++ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ ++ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) ++ oldincludedir="$ac_optarg" ;; ++ ++ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ++ ac_prev=prefix ;; ++ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ++ prefix="$ac_optarg" ;; ++ ++ -program-prefix | --program-prefix | --program-prefi | --program-pref \ ++ | --program-pre | --program-pr | --program-p) ++ ac_prev=program_prefix ;; ++ -program-prefix=* | --program-prefix=* | --program-prefi=* \ ++ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) ++ program_prefix="$ac_optarg" ;; ++ ++ -program-suffix | --program-suffix | --program-suffi | --program-suff \ ++ | --program-suf | --program-su | --program-s) ++ ac_prev=program_suffix ;; ++ -program-suffix=* | --program-suffix=* | --program-suffi=* \ ++ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) ++ program_suffix="$ac_optarg" ;; ++ ++ -program-transform-name | --program-transform-name \ ++ | --program-transform-nam | --program-transform-na \ ++ | --program-transform-n | --program-transform- \ ++ | --program-transform | --program-transfor \ ++ | --program-transfo | --program-transf \ ++ | --program-trans | --program-tran \ ++ | --progr-tra | --program-tr | --program-t) ++ ac_prev=program_transform_name ;; ++ -program-transform-name=* | --program-transform-name=* \ ++ | --program-transform-nam=* | --program-transform-na=* \ ++ | --program-transform-n=* | --program-transform-=* \ ++ | --program-transform=* | --program-transfor=* \ ++ | --program-transfo=* | --program-transf=* \ ++ | --program-trans=* | --program-tran=* \ ++ | --progr-tra=* | --program-tr=* | --program-t=*) ++ program_transform_name="$ac_optarg" ;; ++ ++ -q | -quiet | --quiet | --quie | --qui | --qu | --q \ ++ | -silent | --silent | --silen | --sile | --sil) ++ silent=yes ;; ++ ++ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ++ ac_prev=sbindir ;; ++ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ ++ | --sbi=* | --sb=*) ++ sbindir="$ac_optarg" ;; ++ ++ -sharedstatedir | --sharedstatedir | --sharedstatedi \ ++ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ ++ | --sharedst | --shareds | --shared | --share | --shar \ ++ | --sha | --sh) ++ ac_prev=sharedstatedir ;; ++ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ ++ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ ++ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ ++ | --sha=* | --sh=*) ++ sharedstatedir="$ac_optarg" ;; ++ ++ -site | --site | --sit) ++ ac_prev=site ;; ++ -site=* | --site=* | --sit=*) ++ site="$ac_optarg" ;; ++ ++ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ++ ac_prev=srcdir ;; ++ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ++ srcdir="$ac_optarg" ;; ++ ++ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ ++ | --syscon | --sysco | --sysc | --sys | --sy) ++ ac_prev=sysconfdir ;; ++ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ ++ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) ++ sysconfdir="$ac_optarg" ;; ++ ++ -target | --target | --targe | --targ | --tar | --ta | --t) ++ ac_prev=target ;; ++ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) ++ target="$ac_optarg" ;; ++ ++ -v | -verbose | --verbose | --verbos | --verbo | --verb) ++ verbose=yes ;; ++ ++ -version | --version | --versio | --versi | --vers) ++ echo "configure generated by autoconf version 2.7" ++ exit 0 ;; ++ ++ -with-* | --with-*) ++ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` ++ # Reject names that are not valid shell variable names. ++ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then ++ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } ++ fi ++ ac_package=`echo $ac_package| sed 's/-/_/g'` ++ case "$ac_option" in ++ *=*) ;; ++ *) ac_optarg=yes ;; ++ esac ++ eval "with_${ac_package}='$ac_optarg'" ;; ++ ++ -without-* | --without-*) ++ ac_package=`echo $ac_option|sed -e 's/-*without-//'` ++ # Reject names that are not valid shell variable names. ++ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then ++ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } ++ fi ++ ac_package=`echo $ac_package| sed 's/-/_/g'` ++ eval "with_${ac_package}=no" ;; ++ ++ --x) ++ # Obsolete; use --with-x. ++ with_x=yes ;; ++ ++ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ ++ | --x-incl | --x-inc | --x-in | --x-i) ++ ac_prev=x_includes ;; ++ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ ++ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) ++ x_includes="$ac_optarg" ;; ++ ++ -x-libraries | --x-libraries | --x-librarie | --x-librari \ ++ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ++ ac_prev=x_libraries ;; ++ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ ++ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) ++ x_libraries="$ac_optarg" ;; ++ ++ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } ++ ;; ++ ++ *) ++ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then ++ echo "configure: warning: $ac_option: invalid host type" 1>&2 ++ fi ++ if test "x$nonopt" != xNONE; then ++ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ++ fi ++ nonopt="$ac_option" ++ ;; ++ ++ esac ++done ++ ++if test -n "$ac_prev"; then ++ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } ++fi ++ ++trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 ++ ++# File descriptor usage: ++# 0 standard input ++# 1 file creation ++# 2 errors and warnings ++# 3 some systems may open it to /dev/tty ++# 4 used on the Kubota Titan ++# 6 checking for... messages and results ++# 5 compiler messages saved in config.log ++if test "$silent" = yes; then ++ exec 6>/dev/null ++else ++ exec 6>&1 ++fi ++exec 5>./config.log ++ ++echo "\ ++This file contains any messages produced by compilers while ++running configure, to aid debugging if configure makes a mistake. ++" 1>&5 ++ ++# Strip out --no-create and --no-recursion so they do not pile up. ++# Also quote any args containing shell metacharacters. ++ac_configure_args= ++for ac_arg ++do ++ case "$ac_arg" in ++ -no-create | --no-create | --no-creat | --no-crea | --no-cre \ ++ | --no-cr | --no-c) ;; ++ -no-recursion | --no-recursion | --no-recursio | --no-recursi \ ++ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; ++ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) ++ ac_configure_args="$ac_configure_args '$ac_arg'" ;; ++ *) ac_configure_args="$ac_configure_args $ac_arg" ;; ++ esac ++done ++ ++# NLS nuisances. ++# Only set LANG and LC_ALL to C if already set. ++# These must not be set unconditionally because not all systems understand ++# e.g. LANG=C (notably SCO). ++if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi ++if test "${LANG+set}" = set; then LANG=C; export LANG; fi ++ ++# confdefs.h avoids OS command line length limits that DEFS can exceed. ++rm -rf conftest* confdefs.h ++# AIX cpp loses on an empty file, so make sure it contains at least a newline. ++echo > confdefs.h ++ ++# A filename unique to this package, relative to the directory that ++# configure is in, which we can look for to find out if srcdir is correct. ++ac_unique_file=fnmatch.c ++ ++# Find the source files, if location was not specified. ++if test -z "$srcdir"; then ++ ac_srcdir_defaulted=yes ++ # Try the directory containing this script, then its parent. ++ ac_prog=$0 ++ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` ++ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. ++ srcdir=$ac_confdir ++ if test ! -r $srcdir/$ac_unique_file; then ++ srcdir=.. ++ fi ++else ++ ac_srcdir_defaulted=no ++fi ++if test ! -r $srcdir/$ac_unique_file; then ++ if test "$ac_srcdir_defaulted" = yes; then ++ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } ++ else ++ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } ++ fi ++fi ++srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` ++ ++# Prefer explicitly selected file to automatically selected ones. ++if test -z "$CONFIG_SITE"; then ++ if test "x$prefix" != xNONE; then ++ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" ++ else ++ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" ++ fi ++fi ++for ac_site_file in $CONFIG_SITE; do ++ if test -r "$ac_site_file"; then ++ echo "loading site script $ac_site_file" ++ . "$ac_site_file" ++ fi ++done ++ ++if test -r "$cache_file"; then ++ echo "loading cache $cache_file" ++ . $cache_file ++else ++ echo "creating cache $cache_file" ++ > $cache_file ++fi ++ ++ac_ext=c ++# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ++ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' ++ ++if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then ++ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. ++ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then ++ ac_n= ac_c=' ++' ac_t=' ' ++ else ++ ac_n=-n ac_c= ac_t= ++ fi ++else ++ ac_n= ac_c='\c' ac_t= ++fi ++ ++ # Extract the first word of "gcc", so it can be a program name with args. ++set dummy gcc; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$CC"; then ++ ac_cv_prog_CC="$CC" # Let the user override the test. ++else ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" ++ for ac_dir in $PATH; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ ac_cv_prog_CC="gcc" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++fi ++fi ++CC="$ac_cv_prog_CC" ++if test -n "$CC"; then ++ echo "$ac_t""$CC" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++if test -z "$CC"; then ++ # Extract the first word of "cc", so it can be a program name with args. ++set dummy cc; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$CC"; then ++ ac_cv_prog_CC="$CC" # Let the user override the test. ++else ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" ++ ac_prog_rejected=no ++ for ac_dir in $PATH; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then ++ ac_prog_rejected=yes ++ continue ++ fi ++ ac_cv_prog_CC="cc" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++if test $ac_prog_rejected = yes; then ++ # We found a bogon in the path, so make sure we never use it. ++ set dummy $ac_cv_prog_CC ++ shift ++ if test $# -gt 0; then ++ # We chose a different compiler from the bogus one. ++ # However, it has the same basename, so the bogon will be chosen ++ # first if we set CC to just the basename; use the full file name. ++ shift ++ set dummy "$ac_dir/$ac_word" "$@" ++ shift ++ ac_cv_prog_CC="$@" ++ fi ++fi ++fi ++fi ++CC="$ac_cv_prog_CC" ++if test -n "$CC"; then ++ echo "$ac_t""$CC" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } ++fi ++ ++echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ++ ac_cv_prog_gcc=yes ++else ++ ac_cv_prog_gcc=no ++fi ++fi ++ ++echo "$ac_t""$ac_cv_prog_gcc" 1>&6 ++if test $ac_cv_prog_gcc = yes; then ++ GCC=yes ++ if test "${CFLAGS+set}" != set; then ++ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_prog_gcc_g'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ echo 'void f(){}' > conftest.c ++if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ++ ac_cv_prog_gcc_g=yes ++else ++ ac_cv_prog_gcc_g=no ++fi ++rm -f conftest* ++ ++fi ++ ++echo "$ac_t""$ac_cv_prog_gcc_g" 1>&6 ++ if test $ac_cv_prog_gcc_g = yes; then ++ CFLAGS="-g -O" ++ else ++ CFLAGS="-O" ++ fi ++ fi ++else ++ GCC= ++ test "${CFLAGS+set}" = set || CFLAGS="-g" ++fi ++ ++# Extract the first word of "ar", so it can be a program name with args. ++set dummy ar; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$AR"; then ++ ac_cv_prog_AR="$AR" # Let the user override the test. ++else ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" ++ for ac_dir in $PATH; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ ac_cv_prog_AR="ar" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++ test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar" ++fi ++fi ++AR="$ac_cv_prog_AR" ++if test -n "$AR"; then ++ echo "$ac_t""$AR" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++# Extract the first word of "ranlib", so it can be a program name with args. ++set dummy ranlib; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$RANLIB"; then ++ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. ++else ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" ++ for ac_dir in $PATH; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ ac_cv_prog_RANLIB="ranlib" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" ++fi ++fi ++RANLIB="$ac_cv_prog_RANLIB" ++if test -n "$RANLIB"; then ++ echo "$ac_t""$RANLIB" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 ++# On Suns, sometimes $CPP names a directory. ++if test -n "$CPP" && test -d "$CPP"; then ++ CPP= ++fi ++if test -z "$CPP"; then ++if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ # This must be in double quotes, not single quotes, because CPP may get ++ # substituted into the Makefile and "${CC-cc}" will confuse make. ++ CPP="${CC-cc} -E" ++ # On the NeXT, cc -E runs the code through the compiler's parser, ++ # not just through cpp. ++ cat > conftest.$ac_ext < ++Syntax Error ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:715: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out` ++if test -z "$ac_err"; then ++ : ++else ++ echo "$ac_err" >&5 ++ rm -rf conftest* ++ CPP="${CC-cc} -E -traditional-cpp" ++ cat > conftest.$ac_ext < ++Syntax Error ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:730: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out` ++if test -z "$ac_err"; then ++ : ++else ++ echo "$ac_err" >&5 ++ rm -rf conftest* ++ CPP=/lib/cpp ++fi ++rm -f conftest* ++fi ++rm -f conftest* ++ ac_cv_prog_CPP="$CPP" ++fi ++ CPP="$ac_cv_prog_CPP" ++else ++ ac_cv_prog_CPP="$CPP" ++fi ++echo "$ac_t""$CPP" 1>&6 ++ echo $ac_n "checking for AIX""... $ac_c" 1>&6 ++cat > conftest.$ac_ext <&5 | ++ egrep "yes" >/dev/null 2>&1; then ++ rm -rf conftest* ++ echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF ++#define _ALL_SOURCE 1 ++EOF ++ ++else ++ rm -rf conftest* ++ echo "$ac_t""no" 1>&6 ++fi ++rm -f conftest* ++ ++ ++ac_safe=`echo "minix/config.h" | tr './\055' '___'` ++echo $ac_n "checking for minix/config.h""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:783: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ MINIX=yes ++else ++ echo "$ac_t""no" 1>&6 ++MINIX= ++fi ++ ++if test "$MINIX" = yes; then ++ cat >> confdefs.h <<\EOF ++#define _POSIX_SOURCE 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define _POSIX_1_SOURCE 2 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define _MINIX 1 ++EOF ++ ++fi ++ ++echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6 ++if test -d /etc/conf/kconfig.d && ++ grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1 ++then ++ echo "$ac_t""yes" 1>&6 ++ ISC=yes # If later tests want to check for ISC. ++ cat >> confdefs.h <<\EOF ++#define _POSIX_SOURCE 1 ++EOF ++ ++ if test "$GCC" = yes; then ++ CC="$CC -posix" ++ else ++ CC="$CC -Xp" ++ fi ++else ++ echo "$ac_t""no" 1>&6 ++ ISC= ++fi ++ ++echo $ac_n "checking for working const""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <j = 5; ++} ++{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ ++ const int foo = 10; ++} ++ ++; return 0; } ++EOF ++if { (eval echo configure:893: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ ac_cv_c_const=yes ++else ++ rm -rf conftest* ++ ac_cv_c_const=no ++fi ++rm -f conftest* ++ ++fi ++ ++echo "$ac_t""$ac_cv_c_const" 1>&6 ++if test $ac_cv_c_const = no; then ++ cat >> confdefs.h <<\EOF ++#define const ++EOF ++ ++fi ++ ++# If we cannot run a trivial program, we must be cross compiling. ++echo $ac_n "checking whether cross-compiling""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_c_cross'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test "$cross_compiling" = yes; then ++ ac_cv_c_cross=yes ++else ++cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } ++if test -s conftest && (./conftest; exit) 2>/dev/null; then ++ ac_cv_c_cross=no ++else ++ ac_cv_c_cross=yes ++fi ++fi ++rm -fr conftest* ++fi ++ ++echo "$ac_t""$ac_cv_c_cross" 1>&6 ++cross_compiling=$ac_cv_c_cross ++ ++echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++#include ++#include ++#include ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:951: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ ac_cv_header_stdc=yes ++else ++ echo "$ac_err" >&5 ++ rm -rf conftest* ++ ac_cv_header_stdc=no ++fi ++rm -f conftest* ++ ++if test $ac_cv_header_stdc = yes; then ++ # SunOS 4.x string.h does not declare mem*, contrary to ANSI. ++cat > conftest.$ac_ext < ++EOF ++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ++ egrep "memchr" >/dev/null 2>&1; then ++ : ++else ++ rm -rf conftest* ++ ac_cv_header_stdc=no ++fi ++rm -f conftest* ++ ++fi ++ ++if test $ac_cv_header_stdc = yes; then ++ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. ++cat > conftest.$ac_ext < ++EOF ++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ++ egrep "free" >/dev/null 2>&1; then ++ : ++else ++ rm -rf conftest* ++ ac_cv_header_stdc=no ++fi ++rm -f conftest* ++ ++fi ++ ++if test $ac_cv_header_stdc = yes; then ++ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. ++if test "$cross_compiling" = yes; then ++ : ++else ++cat > conftest.$ac_ext < ++#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') ++#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) ++#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) ++int main () { int i; for (i = 0; i < 256; i++) ++if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); ++exit (0); } ++ ++EOF ++{ (eval echo configure:1016: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } ++if test -s conftest && (./conftest; exit) 2>/dev/null; then ++ : ++else ++ ac_cv_header_stdc=no ++fi ++fi ++rm -fr conftest* ++fi ++fi ++ ++echo "$ac_t""$ac_cv_header_stdc" 1>&6 ++if test $ac_cv_header_stdc = yes; then ++ cat >> confdefs.h <<\EOF ++#define STDC_HEADERS 1 ++EOF ++ ++fi ++ ++for ac_hdr in memory.h unistd.h string.h ++do ++ac_safe=`echo "$ac_hdr" | tr './\055' '___'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:1048: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | tr 'abcdefghijklmnopqrstuvwxyz./\055' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ___'` ++ cat >> confdefs.h <&6 ++fi ++done ++ ++ac_header_dirent=no ++for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h ++do ++ac_safe=`echo "$ac_hdr" | tr './\055' '___'` ++echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++#include <$ac_hdr> ++int main() { return 0; } ++int t() { ++DIR *dirp = 0; ++; return 0; } ++EOF ++if { (eval echo configure:1090: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ eval "ac_cv_header_dirent_$ac_safe=yes" ++else ++ rm -rf conftest* ++ eval "ac_cv_header_dirent_$ac_safe=no" ++fi ++rm -f conftest* ++ ++fi ++if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | tr 'abcdedfghijklmnopqrstuvwxyz./\055' 'ABCDEDFGHIJKLMNOPQRSTUVWXYZ___'` ++ cat >> confdefs.h <&6 ++fi ++done ++# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. ++if test $ac_header_dirent = dirent.h; then ++echo $ac_n "checking for -ldir""... $ac_c" 1>&6 ++ac_lib_var=`echo dir | tr '.-/+' '___p'` ++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ ac_save_LIBS="$LIBS" ++LIBS="-ldir $LIBS" ++cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=yes" ++else ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=no" ++fi ++rm -f conftest* ++LIBS="$ac_save_LIBS" ++ ++fi ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ LIBS="$LIBS -ldir" ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++else ++echo $ac_n "checking for -lx""... $ac_c" 1>&6 ++ac_lib_var=`echo x | tr '.-/+' '___p'` ++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ ac_save_LIBS="$LIBS" ++LIBS="-lx $LIBS" ++cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=yes" ++else ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=no" ++fi ++rm -f conftest* ++LIBS="$ac_save_LIBS" ++ ++fi ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ LIBS="$LIBS -lx" ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++fi ++ ++echo $ac_n "checking whether closedir returns void""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_func_closedir_void'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test "$cross_compiling" = yes; then ++ ac_cv_func_closedir_void=yes ++else ++cat > conftest.$ac_ext < ++#include <$ac_header_dirent> ++int closedir(); main() { exit(closedir(opendir(".")) != 0); } ++EOF ++{ (eval echo configure:1198: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } ++if test -s conftest && (./conftest; exit) 2>/dev/null; then ++ ac_cv_func_closedir_void=no ++else ++ ac_cv_func_closedir_void=yes ++fi ++fi ++rm -fr conftest* ++fi ++ ++echo "$ac_t""$ac_cv_func_closedir_void" 1>&6 ++if test $ac_cv_func_closedir_void = yes; then ++ cat >> confdefs.h <<\EOF ++#define CLOSEDIR_VOID 1 ++EOF ++ ++fi ++ ++# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works ++# for constant arguments. Useless! ++echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++int main() { return 0; } ++int t() { ++char *p = alloca(2 * sizeof(int)); ++; return 0; } ++EOF ++if { (eval echo configure:1231: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then ++ rm -rf conftest* ++ ac_cv_header_alloca_h=yes ++else ++ rm -rf conftest* ++ ac_cv_header_alloca_h=no ++fi ++rm -f conftest* ++ ++fi ++ ++echo "$ac_t""$ac_cv_header_alloca_h" 1>&6 ++if test $ac_cv_header_alloca_h = yes; then ++ cat >> confdefs.h <<\EOF ++#define HAVE_ALLOCA_H 1 ++EOF ++ ++fi ++ ++echo $ac_n "checking for alloca""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_func_alloca'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++# else ++# ifdef _AIX ++ #pragma alloca ++# else ++# ifndef alloca /* predefined by HP cc +Olibcalls */ ++char *alloca (); ++# endif ++# endif ++# endif ++#endif ++ ++int main() { return 0; } ++int t() { ++char *p = (char *) alloca(1); ++; return 0; } ++EOF ++if { (eval echo configure:1279: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then ++ rm -rf conftest* ++ ac_cv_func_alloca=yes ++else ++ rm -rf conftest* ++ ac_cv_func_alloca=no ++fi ++rm -f conftest* ++ ++fi ++ ++echo "$ac_t""$ac_cv_func_alloca" 1>&6 ++if test $ac_cv_func_alloca = yes; then ++ cat >> confdefs.h <<\EOF ++#define HAVE_ALLOCA 1 ++EOF ++ ++fi ++ ++if test $ac_cv_func_alloca = no; then ++ # The SVR3 libPW and SVR4 libucb both contain incompatible functions ++ # that cause trouble. Some versions do not even contain alloca or ++ # contain a buggy version. If you still want to use their alloca, ++ # use ar to extract alloca.o from them instead of compiling alloca.c. ++ ALLOCA=alloca.o ++ cat >> confdefs.h <<\EOF ++#define C_ALLOCA 1 ++EOF ++ ++ ++echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <&5 | ++ egrep "webecray" >/dev/null 2>&1; then ++ rm -rf conftest* ++ ac_cv_os_cray=yes ++else ++ rm -rf conftest* ++ ac_cv_os_cray=no ++fi ++rm -f conftest* ++ ++fi ++ ++echo "$ac_t""$ac_cv_os_cray" 1>&6 ++if test $ac_cv_os_cray = yes; then ++for ac_func in _getb67 GETB67 getb67; do ++ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++char $ac_func(); ++ ++int main() { return 0; } ++int t() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:1365: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++ ++fi ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ cat >> confdefs.h <&6 ++fi ++ ++done ++fi ++ ++echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 ++if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test "$cross_compiling" = yes; then ++ ac_cv_c_stack_direction=0 ++else ++cat > conftest.$ac_ext < addr) ? 1 : -1; ++} ++main () ++{ ++ exit (find_stack_direction() < 0); ++} ++EOF ++{ (eval echo configure:1416: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } ++if test -s conftest && (./conftest; exit) 2>/dev/null; then ++ ac_cv_c_stack_direction=1 ++else ++ ac_cv_c_stack_direction=-1 ++fi ++fi ++rm -fr conftest* ++fi ++ ++echo "$ac_t""$ac_cv_c_stack_direction" 1>&6 ++cat >> confdefs.h <&6 ++if eval "test \"`echo '$''{'ac_cv_func_strcoll'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test "$cross_compiling" = yes; then ++ ac_cv_func_strcoll=no ++else ++cat > conftest.$ac_ext < ++main () ++{ ++ exit (strcoll ("abc", "def") >= 0 || ++ strcoll ("ABC", "DEF") >= 0 || ++ strcoll ("123", "456") >= 0); ++} ++EOF ++{ (eval echo configure:1451: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } ++if test -s conftest && (./conftest; exit) 2>/dev/null; then ++ ac_cv_func_strcoll=yes ++else ++ ac_cv_func_strcoll=no ++fi ++fi ++rm -fr conftest* ++fi ++ ++echo "$ac_t""$ac_cv_func_strcoll" 1>&6 ++if test $ac_cv_func_strcoll = yes; then ++ cat >> confdefs.h <<\EOF ++#define HAVE_STRCOLL 1 ++EOF ++ ++fi ++ ++trap '' 1 2 15 ++cat > confcache <<\EOF ++# This file is a shell script that caches the results of configure ++# tests run on this system so they can be shared between configure ++# scripts and configure runs. It is not useful on other systems. ++# If it contains results you don't want to keep, you may remove or edit it. ++# ++# By default, configure uses ./config.cache as the cache file, ++# creating it if it does not exist already. You can give configure ++# the --cache-file=FILE option to use a different cache file; that is ++# what configure does when it calls configure scripts in ++# subdirectories, so they share the cache. ++# Giving --cache-file=/dev/null disables caching, for debugging configure. ++# config.status only pays attention to the cache file if you give it the ++# --recheck option to rerun configure. ++# ++EOF ++# Ultrix sh set writes to stderr and can't be redirected directly, ++# and sets the high bit in the cache file unless we assign to the vars. ++(set) 2>&1 | ++ sed -n "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=\${\1='\2'}/p" \ ++ >> confcache ++if cmp -s $cache_file confcache; then ++ : ++else ++ if test -w $cache_file; then ++ echo "updating cache $cache_file" ++ cat confcache > $cache_file ++ else ++ echo "not updating unwritable cache $cache_file" ++ fi ++fi ++rm -f confcache ++ ++trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 ++ ++test "x$prefix" = xNONE && prefix=$ac_default_prefix ++# Let make expand exec_prefix. ++test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' ++ ++# Any assignment to VPATH causes Sun make to only execute ++# the first set of double-colon rules, so remove it if not needed. ++# If there is a colon in the path, we need to keep it. ++if test "x$srcdir" = x.; then ++ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' ++fi ++ ++trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 ++ ++# Transform confdefs.h into DEFS. ++# Protect against shell expansion while executing Makefile rules. ++# Protect against Makefile macro expansion. ++cat > conftest.defs <<\EOF ++s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g ++s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g ++s%\[%\\&%g ++s%\]%\\&%g ++s%\$%$$%g ++EOF ++DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` ++rm -f conftest.defs ++ ++ ++# Without the "./", some shells look in PATH for config.status. ++: ${CONFIG_STATUS=./config.status} ++ ++echo creating $CONFIG_STATUS ++rm -f $CONFIG_STATUS ++cat > $CONFIG_STATUS </dev/null | sed 1q`: ++# ++# $0 $ac_configure_args ++# ++# Compiler output produced by configure, useful for debugging ++# configure, is in ./config.log if it exists. ++ ++ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" ++for ac_option ++do ++ case "\$ac_option" in ++ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ++ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" ++ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; ++ -version | --version | --versio | --versi | --vers | --ver | --ve | --v) ++ echo "$CONFIG_STATUS generated by autoconf version 2.7" ++ exit 0 ;; ++ -help | --help | --hel | --he | --h) ++ echo "\$ac_cs_usage"; exit 0 ;; ++ *) echo "\$ac_cs_usage"; exit 1 ;; ++ esac ++done ++ ++ac_given_srcdir=$srcdir ++ ++trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 ++EOF ++cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF ++$ac_vpsub ++$extrasub ++s%@CFLAGS@%$CFLAGS%g ++s%@CPPFLAGS@%$CPPFLAGS%g ++s%@CXXFLAGS@%$CXXFLAGS%g ++s%@DEFS@%$DEFS%g ++s%@LDFLAGS@%$LDFLAGS%g ++s%@LIBS@%$LIBS%g ++s%@exec_prefix@%$exec_prefix%g ++s%@prefix@%$prefix%g ++s%@program_transform_name@%$program_transform_name%g ++s%@bindir@%$bindir%g ++s%@sbindir@%$sbindir%g ++s%@libexecdir@%$libexecdir%g ++s%@datadir@%$datadir%g ++s%@sysconfdir@%$sysconfdir%g ++s%@sharedstatedir@%$sharedstatedir%g ++s%@localstatedir@%$localstatedir%g ++s%@libdir@%$libdir%g ++s%@includedir@%$includedir%g ++s%@oldincludedir@%$oldincludedir%g ++s%@infodir@%$infodir%g ++s%@mandir@%$mandir%g ++s%@CC@%$CC%g ++s%@AR@%$AR%g ++s%@RANLIB@%$RANLIB%g ++s%@CPP@%$CPP%g ++s%@ALLOCA@%$ALLOCA%g ++ ++CEOF ++EOF ++cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF ++for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then ++ # Support "outfile[:infile]", defaulting infile="outfile.in". ++ case "$ac_file" in ++ *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` ++ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; ++ *) ac_file_in="${ac_file}.in" ;; ++ esac ++ ++ # Adjust relative srcdir, etc. for subdirectories. ++ ++ # Remove last slash and all that follows it. Not all systems have dirname. ++ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` ++ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then ++ # The file is in a subdirectory. ++ test ! -d "$ac_dir" && mkdir "$ac_dir" ++ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" ++ # A "../" for each directory in $ac_dir_suffix. ++ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` ++ else ++ ac_dir_suffix= ac_dots= ++ fi ++ ++ case "$ac_given_srcdir" in ++ .) srcdir=. ++ if test -z "$ac_dots"; then top_srcdir=. ++ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; ++ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; ++ *) # Relative path. ++ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" ++ top_srcdir="$ac_dots$ac_given_srcdir" ;; ++ esac ++ ++ echo creating "$ac_file" ++ rm -f "$ac_file" ++ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." ++ case "$ac_file" in ++ *Makefile*) ac_comsub="1i\\ ++# $configure_input" ;; ++ *) ac_comsub= ;; ++ esac ++ sed -e "$ac_comsub ++s%@configure_input@%$configure_input%g ++s%@srcdir@%$srcdir%g ++s%@top_srcdir@%$top_srcdir%g ++" -f conftest.subs $ac_given_srcdir/$ac_file_in > $ac_file ++fi; done ++rm -f conftest.subs ++ ++ ++ ++exit 0 ++EOF ++chmod +x $CONFIG_STATUS ++rm -fr confdefs* $ac_clean_files ++test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 ++ +diff -u -udbrN glibc-2.3.2/posix/glob/configure.bat glibc-2.3.2-200304020432/posix/glob/configure.bat +--- glibc-2.3.2/posix/glob/configure.bat Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/posix/glob/configure.bat Thu Mar 9 02:19:41 1995 +@@ -0,0 +1,26 @@ ++@echo off ++echo Configuring glob for GO32 ++rem This batch file assumes a unix-type "sed" program ++ ++echo # Makefile generated by "configure.bat"> Makefile ++ ++if exist config.sed del config.sed ++ ++echo "s/@srcdir@/./ ">> config.sed ++echo "s/@CC@/gcc/ ">> config.sed ++echo "s/@CFLAGS@/-O2 -g/ ">> config.sed ++echo "s/@CPPFLAGS@/-DHAVE_CONFIG_H -I../ ">> config.sed ++echo "s/@AR@/ar/ ">> config.sed ++echo "s/@RANLIB@/ranlib/ ">> config.sed ++echo "s/@LDFLAGS@// ">> config.sed ++echo "s/@DEFS@// ">> config.sed ++echo "s/@ALLOCA@// ">> config.sed ++echo "s/@LIBS@// ">> config.sed ++echo "s/@LIBOBJS@// ">> config.sed ++echo "s/^Makefile *:/_Makefile:/ ">> config.sed ++echo "s/^config.h *:/_config.h:/ ">> config.sed ++ ++sed -e "s/^\"//" -e "s/\"$//" -e "s/[ ]*$//" config.sed > config2.sed ++sed -f config2.sed Makefile.in >> Makefile ++del config.sed ++del config2.sed +diff -u -udbrN glibc-2.3.2/posix/glob/configure.in glibc-2.3.2-200304020432/posix/glob/configure.in +--- glibc-2.3.2/posix/glob/configure.in Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/posix/glob/configure.in Thu Feb 23 03:30:35 1995 +@@ -0,0 +1,19 @@ ++dnl Process this file with autoconf to produce a configure script. ++AC_INIT(fnmatch.c) dnl A distinctive file to look for in srcdir. ++AC_PREREQ(2.1) dnl Minimum Autoconf version required. ++AC_PROG_CC ++AC_CHECK_PROG(AR, ar, ar, ar) ++AC_PROG_RANLIB ++AC_PROG_CPP dnl Later checks need this. ++dnl These two want to come early. ++AC_AIX ++AC_MINIX ++AC_ISC_POSIX ++AC_CONST ++AC_HEADER_STDC ++AC_CHECK_HEADERS(memory.h unistd.h string.h) ++AC_HEADER_DIRENT ++AC_FUNC_CLOSEDIR_VOID ++AC_FUNC_ALLOCA ++AC_FUNC_STRCOLL ++AC_OUTPUT(Makefile) +diff -u -udbrN glibc-2.3.2/posix/tst-nice.c glibc-2.3.2-200304020432/posix/tst-nice.c +--- glibc-2.3.2/posix/tst-nice.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/posix/tst-nice.c Thu Mar 20 12:40:36 2003 +@@ -0,0 +1,66 @@ ++/* Copyright (C) 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 ++ 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 ++ ++ ++/* Test that nice() does not incorrectly return 0. */ ++static int ++do_test (void) ++{ ++ int ret; ++ const int incr = 10; ++ int old; ++ ++ /* Discover current nice value. */ ++ errno = 0; ++ old = nice (0); ++ if (old == -1 && errno != 0) ++ { ++ printf ("break: nice(%d) return: %d, %m\n", 0, old); ++ return 1; ++ } ++ ++ /* Nice ourselves up. */ ++ errno = 0; ++ ret = nice (incr); ++ if (ret == -1 && errno != 0) ++ { ++ printf ("break: nice(%d) return: %d, %m\n", incr, ret); ++ return 1; ++ } ++ ++ /* Check for return value being zero when it shouldn't. Cannot simply ++ check for expected value since nice values are capped at 2^n-1. ++ But we assume that we didn't start at the cap and so should have ++ increased some. */ ++ if (ret <= old) ++ { ++ printf ("FAIL: retval (%d) of nice(%d) != %d\n", ret, incr, old + incr); ++ return 1; ++ } ++ ++ printf ("PASS: nice(%d) from %d return: %d\n", incr, old, ret); ++ ++ return 0; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff -u -udbrN glibc-2.3.2/resolv/Makefile glibc-2.3.2-200304020432/resolv/Makefile +--- glibc-2.3.2/resolv/Makefile Wed Feb 26 00:40:08 2003 ++++ glibc-2.3.2-200304020432/resolv/Makefile Sat Mar 1 23:15:00 2003 +@@ -93,6 +93,8 @@ + tst-leaks-ENV = MALLOC_TRACE=$(objpfx)tst-leaks.mtrace + $(objpfx)mtrace-tst-leaks: $(objpfx)tst-leaks.out + $(common-objpfx)malloc/mtrace $(objpfx)tst-leaks.mtrace > $@ ++ifeq (no,$(cross-compiling)) + ifneq (no,$(PERL)) + tests: $(objpfx)mtrace-tst-leaks ++endif + endif +diff -u -udbrN glibc-2.3.2/rt/tst-aio7.c glibc-2.3.2-200304020432/rt/tst-aio7.c +--- glibc-2.3.2/rt/tst-aio7.c Tue Oct 1 00:02:39 2002 ++++ glibc-2.3.2-200304020432/rt/tst-aio7.c Sat Mar 8 19:54:21 2003 +@@ -1,5 +1,5 @@ + /* Test for AIO POSIX compliance. +- Copyright (C) 2001,02 Free Software Foundation, Inc. ++ Copyright (C) 2001,02, 03 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 +@@ -117,12 +117,13 @@ + + /* Test for aio_suspend() suspending even if completed elements in list. */ + { +- const int BYTES = 8, ELEMS = 2; ++#define BYTES 8 ++ const int ELEMS = 2; + int i, r, fd; +- char buff[BYTES]; ++ static char buff[BYTES]; + char name[] = "/tmp/aio7.XXXXXX"; + struct timespec timeout; +- struct aiocb cb0, cb1; ++ static struct aiocb cb0, cb1; + struct aiocb *list[ELEMS]; + + fd = mkstemp (name); +@@ -180,6 +181,9 @@ + puts ("aio_suspend([done,blocked],2,3) suspended thread"); + ++result; + } ++ ++ /* Note that CB1 is still pending, and so cannot be an auto variable. ++ Thus we also test that exiting with an outstanding request works. */ + } + + return result; +diff -u -udbrN glibc-2.3.2/scripts/abilist.awk glibc-2.3.2-200304020432/scripts/abilist.awk +--- glibc-2.3.2/scripts/abilist.awk Mon Dec 23 20:11:45 2002 ++++ glibc-2.3.2-200304020432/scripts/abilist.awk Wed Apr 2 06:00:03 2003 +@@ -1,6 +1,33 @@ + # This awk script processes the output of objdump --dynamic-syms + # into a simple format that should not change when the ABI is not changing. + ++BEGIN { ++ if (combine_fullname) ++ combine = 1; ++ if (combine) ++ parse_names = 1; ++} ++ ++# Per-file header. ++/[^ :]+\.so\.[0-9.]+:[ ]+.file format .*$/ { ++ emit(0); ++ ++ seen_opd = 0; ++ ++ sofullname = $1; ++ sub(/:$/, "", sofullname); ++ soname = sofullname; ++ sub(/^.*\//, "", soname); ++ sub(/\.so\.[0-9.]+$/, "", soname); ++ ++ suppress = ((filename_regexp != "" && sofullname !~ filename_regexp) \ ++ || (libname_regexp != "" && soname !~ libname_regexp)); ++ ++ next ++} ++ ++suppress { next } ++ + # Normalize columns. + /^[0-9a-fA-F]+ / { sub(/ /, " - ") } + +@@ -22,14 +49,18 @@ + + if (version == "GLIBC_PRIVATE") next; + ++ desc = ""; + if (type == "D" && $4 == ".tbss") { + type = "T"; + } + else if (type == "D" && $4 == ".opd") { +- type = "O"; ++ type = "F"; + size = ""; ++ if (seen_opd < 0) ++ type = "O"; ++ seen_opd = 1; + } +- else if (type == "DO" && $4 == "*ABS*") { ++ else if ($4 == "*ABS*") { + type = "A"; + size = ""; + } +@@ -37,15 +68,26 @@ + type = "D"; + } + else if (type == "DF") { ++ if (symbol ~ /^\./ && seen_opd >= 0) ++ next; ++ seen_opd = -1; + type = "F"; + size = ""; + } + else { +- print symbol, version, weak, "?", type, $4, $5; +- next; ++ desc = symbol " " version " " weak " ? " type " " $4 " " $5; ++ } ++ if (size == " 0x") { ++ desc = symbol " " version " " weak " ? " type " " $4 " " $5; + } + +- desc = " " symbol " " (weak == "w" ? tolower(type) : type) size; ++ # Disabled -- weakness should not matter to shared library ABIs any more. ++ #if (weak == "w") type = tolower(type); ++ if (desc == "") ++ desc = " " symbol " " type size; ++ ++ if (combine) ++ version = soname " " version (combine_fullname ? " " sofullname : ""); + + if (version in versions) { + versions[version] = versions[version] "\n" desc; +@@ -63,8 +105,12 @@ + print "Don't grok this line:", $0 + } + +-END { +- nverlist = 0; ++function emit(end) { ++ if (!end && (combine || ! parse_names || soname == "")) ++ return; ++ tofile = parse_names && !combine; ++ ++ nverslist = 0; + for (version in versions) { + if (nverslist == 0) { + verslist = version; +@@ -92,13 +138,42 @@ + ++nverslist; + } + ++ if (tofile) { ++ out = prefix soname ".symlist"; ++ if (soname in outfiles) ++ out = out "." ++outfiles[soname]; ++ else ++ outfiles[soname] = 1; ++ printf "" > out; ++ } ++ + split(verslist, order, "\n"); + for (i = 1; i <= nverslist; ++i) { + version = order[i]; + +- print version; ++ if (tofile) { ++ print version >> out; ++ close(out); ++ outpipe = "sort >> " out; ++ } ++ else { ++ if (combine) ++ print ""; ++ print prefix version; + outpipe = "sort"; ++ } + print versions[version] | outpipe; + close(outpipe); ++ ++ delete versions[version]; + } ++ for (version in versions) ++ delete versions[version]; ++ ++ if (tofile) ++ print "wrote", out, "for", sofullname; ++} ++ ++END { ++ emit(1); + } +diff -u -udbrN glibc-2.3.2/scripts/merge-abilist.awk glibc-2.3.2-200304020432/scripts/merge-abilist.awk +--- glibc-2.3.2/scripts/merge-abilist.awk Thu Jan 16 18:28:31 2003 ++++ glibc-2.3.2-200304020432/scripts/merge-abilist.awk Mon Mar 3 08:11:44 2003 +@@ -12,9 +12,11 @@ + # function F + # variable D 0x4 + ++BEGIN { current = "UNSET" } ++ + /^[^| ]/ { + if (NF < 2 && config == "") { +- print "BAD LINE:", $0 > "/dev/stderr"; ++ print FILENAME ":" FNR ": BAD SET LINE:", $0 > "/dev/stderr"; + exit 2; + } + +@@ -44,8 +46,8 @@ + } + + /^\| / { +- if (NF < 3) { +- print "BAD LINE:", $0 > "/dev/stderr"; ++ if (NF < 3 || current == "UNSET") { ++ print FILENAME ":" FNR ": BAD | LINE:", $0 > "/dev/stderr"; + exit 2; + } + +@@ -61,12 +63,20 @@ + + { + if (current == "") next; ++ if (current == "UNSET") { ++ print FILENAME ":" FNR ": IGNORED LINE:", $0 > "/dev/stderr"; ++ next; ++ } + + ns = split(seen[$0], s, ","); + nc = split(current, c, ","); + for (i = 1; i <= nc; ++i) { ++ if (c[i] == "") ++ continue; + # Sorted insert. + for (j = 1; j <= ns; ++j) { ++ if (c[i] == s[j]) ++ break; + if (c[i] < s[j]) { + for (k = ns; k >= j; --k) + s[k + 1] = s[k]; +@@ -75,7 +85,7 @@ + break; + } + } +- if (j >= ns) ++ if (j > ns) + s[++ns] = c[i]; + } + +@@ -97,7 +107,9 @@ + ns = split("", s); + for (configs in stanzas) { + # Sorted insert. +- for (j = 1; j <= ns; ++j) ++ for (j = 1; j <= ns; ++j) { ++ if (configs == s[j]) ++ break; + if (configs < s[j]) { + for (k = ns; k >= j; --k) + s[k + 1] = s[k]; +@@ -105,7 +117,8 @@ + ++ns; + break; + } +- if (j >= ns) ++ } ++ if (j > ns) + s[++ns] = configs; + } + +@@ -118,15 +131,22 @@ + # S[I] is a sorted, comma-separated list of SET:CONFIG pairs. + # All we have to do is pretty-print them. + nc = split(s[i], c, ","); +- lastvers = ""; ++ lastvers = lastconf = ""; + for (j = 1; j <= nc; ++j) { + split(c[j], temp, ":"); + version = temp[1]; + conf = temp[2]; + if (version != lastvers) + printf "%s%s", (lastvers != "" ? "\n| " : ""), version; ++ # Hack: if CONF is foo.*/bar and LASTCONF was foo.*, ++ # then we can omit the foo.*/bar since foo.* matches already. ++ # Note we don't update LASTCONF, so foo.*/baz next time will match too. ++ else if ((slash = index(conf, ".*/")) > 0 && \ ++ substr(conf, 1, slash + 2 - 1) == lastconf) ++ continue; + printf " %s", conf; + lastvers = version; ++ lastconf = conf; + } + print ""; + outpipe = "sort"; +diff -u -udbrN glibc-2.3.2/scripts/rpm2dynsym.sh glibc-2.3.2-200304020432/scripts/rpm2dynsym.sh +--- glibc-2.3.2/scripts/rpm2dynsym.sh Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/scripts/rpm2dynsym.sh Thu Mar 27 23:48:49 2003 +@@ -0,0 +1,36 @@ ++#!/bin/sh ++ ++# This script takes rpm package files, finds *.so.N files in them, ++# and runs objdump --dynamic-syms on them. The arguments are rpm file ++# names. For each rpm, it creates an output file with the name ++# "NAME-VERSION-RELEASE.ARCH.dynsym", the variable parts being extracted ++# from the rpm's headers (not its file name). Each file contains the ++# collected objdump output for all the *.so.N files in the corresponding rpm. ++# This can be processed with abilist.awk or sent to someone who will do that. ++# This does not do a lot of error-checking, so you should always watch stderr ++# and sanity-check the resulting output files. ++ ++RPM=${RPM:-rpm} ++RPM2CPIO=${RPM2CPIO:-rpm2cpio} ++CPIO=${CPIO:-cpio} ++OBJDUMP=${OBJDUMP:-objdump} ++ ++unpackdir=/tmp/rpm2dynsym$$ ++trap 'rm -rf $unpackdir' 0 1 2 15 ++ ++for rpm; do ++ name=`$RPM -qp $rpm --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n'` ++ mkdir $unpackdir || exit ++ $RPM2CPIO "$rpm" | { ++ cd $unpackdir ++ $CPIO -i -d --no-absolute-filenames -uv '*.so.*' '*.so' 2>&1 | ++ while read file b; do ++ test x"$b" = x || break ++ case "$file" in ++ *.so.[0-9]*) $OBJDUMP --dynamic-syms $file ;; ++ esac ++ done ++ } > $name.dynsym ++ echo wrote $name.dynsym for $rpm ++ rm -rf $unpackdir ++done +diff -u -udbrN glibc-2.3.2/signal/Makefile glibc-2.3.2-200304020432/signal/Makefile +--- glibc-2.3.2/signal/Makefile Sat Jul 7 21:21:17 2001 ++++ glibc-2.3.2-200304020432/signal/Makefile Tue Apr 1 08:49:23 2003 +@@ -1,4 +1,5 @@ +-# Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98 Free Software Foundation, Inc. ++# Copyright (C) 1991,1992,1993,1994,1995,1996,1997,1998,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 +@@ -37,7 +38,7 @@ + allocrtsig sigtimedwait sigwaitinfo sigqueue \ + sighold sigrelse sigignore sigset + +-tests := tst-signal ++tests := tst-signal tst-sigset + + distribute := sigsetops.h testrtsig.h sigset-cvt-mask.h + +diff -u -udbrN glibc-2.3.2/signal/tst-sigset.c glibc-2.3.2-200304020432/signal/tst-sigset.c +--- glibc-2.3.2/signal/tst-sigset.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/signal/tst-sigset.c Tue Apr 1 08:49:23 2003 +@@ -0,0 +1,43 @@ ++/* Test sig*set functions. */ ++ ++#include ++#include ++ ++#define TEST_FUNCTION do_test () ++static int ++do_test (void) ++{ ++ int result = 0; ++ int sig = -1; ++ ++#define TRY(call) \ ++ if (call) \ ++ { \ ++ printf ("%s (sig = %d): %m\n", #call, sig); \ ++ result = 1; \ ++ } \ ++ else ++ ++ ++ sigset_t set; ++ TRY (sigemptyset (&set) != 0); ++ ++#ifdef SIGRTMAX ++ int max_sig = SIGRTMAX; ++#else ++ int max_sig = NSIG - 1; ++#endif ++ ++ for (sig = 1; sig <= max_sig; ++sig) ++ { ++ TRY (sigismember (&set, sig) != 0); ++ TRY (sigaddset (&set, sig) != 0); ++ TRY (sigismember (&set, sig) == 0); ++ TRY (sigdelset (&set, sig) != 0); ++ TRY (sigismember (&set, sig) != 0); ++ } ++ ++ return result; ++} ++ ++#include "../test-skeleton.c" +diff -u -udbrN glibc-2.3.2/stdio-common/_itoa.c glibc-2.3.2-200304020432/stdio-common/_itoa.c +--- glibc-2.3.2/stdio-common/_itoa.c Tue Mar 12 20:27:44 2002 ++++ glibc-2.3.2-200304020432/stdio-common/_itoa.c Fri Mar 14 04:59:41 2003 +@@ -1,5 +1,6 @@ + /* Internal function for converting integers to ASCII. +- Copyright (C) 1994,1995,1996,1999,2000,2002 Free Software Foundation, Inc. ++ Copyright (C) 1994, 1995, 1996, 1999, 2000, 2002, 2003 ++ Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Torbjorn Granlund + and Ulrich Drepper . +@@ -81,41 +82,41 @@ + const struct base_table_t _itoa_base_table[] attribute_hidden = + { + #if BITS_PER_MP_LIMB == 64 +- /* 2 */ {SEL1(0ul) 1, 1}, +- /* 3 */ {SEL1(0xaaaaaaaaaaaaaaabul) 0, 1}, +- /* 4 */ {SEL1(0ul) 1, 2}, +- /* 5 */ {SEL1(0xcccccccccccccccdul) 0, 2}, +- /* 6 */ {SEL1(0xaaaaaaaaaaaaaaabul) 0, 2}, +- /* 7 */ {SEL1(0x2492492492492493ul) 1, 3}, +- /* 8 */ {SEL1(0ul) 1, 3}, +- /* 9 */ {SEL1(0xe38e38e38e38e38ful) 0, 3}, +- /* 10 */ {SEL1(0xcccccccccccccccdul) 0, 3}, +- /* 11 */ {SEL1(0x2e8ba2e8ba2e8ba3ul) 0, 1}, +- /* 12 */ {SEL1(0xaaaaaaaaaaaaaaabul) 0, 3}, +- /* 13 */ {SEL1(0x4ec4ec4ec4ec4ec5ul) 0, 2}, +- /* 14 */ {SEL1(0x2492492492492493ul) 1, 4}, +- /* 15 */ {SEL1(0x8888888888888889ul) 0, 3}, +- /* 16 */ {SEL1(0ul) 1, 4}, +- /* 17 */ {SEL1(0xf0f0f0f0f0f0f0f1ul) 0, 4}, +- /* 18 */ {SEL1(0xe38e38e38e38e38ful) 0, 4}, +- /* 19 */ {SEL1(0xd79435e50d79435ful) 0, 4}, +- /* 20 */ {SEL1(0xcccccccccccccccdul) 0, 4}, +- /* 21 */ {SEL1(0x8618618618618619ul) 1, 5}, +- /* 22 */ {SEL1(0x2e8ba2e8ba2e8ba3ul) 0, 2}, +- /* 23 */ {SEL1(0x642c8590b21642c9ul) 1, 5}, +- /* 24 */ {SEL1(0xaaaaaaaaaaaaaaabul) 0, 4}, +- /* 25 */ {SEL1(0x47ae147ae147ae15ul) 1, 5}, +- /* 26 */ {SEL1(0x4ec4ec4ec4ec4ec5ul) 0, 3}, +- /* 27 */ {SEL1(0x97b425ed097b425ful) 0, 4}, +- /* 28 */ {SEL1(0x2492492492492493ul) 1, 5}, +- /* 29 */ {SEL1(0x1a7b9611a7b9611bul) 1, 5}, +- /* 30 */ {SEL1(0x8888888888888889ul) 0, 4}, +- /* 31 */ {SEL1(0x0842108421084211ul) 1, 5}, +- /* 32 */ {SEL1(0ul) 1, 5}, +- /* 33 */ {SEL1(0x0f83e0f83e0f83e1ul) 0, 1}, +- /* 34 */ {SEL1(0xf0f0f0f0f0f0f0f1ul) 0, 5}, +- /* 35 */ {SEL1(0xea0ea0ea0ea0ea0ful) 0, 5}, +- /* 36 */ {SEL1(0xe38e38e38e38e38ful) 0, 5} ++ /* 2 */ {SEL1(0ull) 1, 1}, ++ /* 3 */ {SEL1(0xaaaaaaaaaaaaaaabull) 0, 1}, ++ /* 4 */ {SEL1(0ull) 1, 2}, ++ /* 5 */ {SEL1(0xcccccccccccccccdull) 0, 2}, ++ /* 6 */ {SEL1(0xaaaaaaaaaaaaaaabull) 0, 2}, ++ /* 7 */ {SEL1(0x2492492492492493ull) 1, 3}, ++ /* 8 */ {SEL1(0ull) 1, 3}, ++ /* 9 */ {SEL1(0xe38e38e38e38e38full) 0, 3}, ++ /* 10 */ {SEL1(0xcccccccccccccccdull) 0, 3}, ++ /* 11 */ {SEL1(0x2e8ba2e8ba2e8ba3ull) 0, 1}, ++ /* 12 */ {SEL1(0xaaaaaaaaaaaaaaabull) 0, 3}, ++ /* 13 */ {SEL1(0x4ec4ec4ec4ec4ec5ull) 0, 2}, ++ /* 14 */ {SEL1(0x2492492492492493ull) 1, 4}, ++ /* 15 */ {SEL1(0x8888888888888889ull) 0, 3}, ++ /* 16 */ {SEL1(0ull) 1, 4}, ++ /* 17 */ {SEL1(0xf0f0f0f0f0f0f0f1ull) 0, 4}, ++ /* 18 */ {SEL1(0xe38e38e38e38e38full) 0, 4}, ++ /* 19 */ {SEL1(0xd79435e50d79435full) 0, 4}, ++ /* 20 */ {SEL1(0xcccccccccccccccdull) 0, 4}, ++ /* 21 */ {SEL1(0x8618618618618619ull) 1, 5}, ++ /* 22 */ {SEL1(0x2e8ba2e8ba2e8ba3ull) 0, 2}, ++ /* 23 */ {SEL1(0x642c8590b21642c9ull) 1, 5}, ++ /* 24 */ {SEL1(0xaaaaaaaaaaaaaaabull) 0, 4}, ++ /* 25 */ {SEL1(0x47ae147ae147ae15ull) 1, 5}, ++ /* 26 */ {SEL1(0x4ec4ec4ec4ec4ec5ull) 0, 3}, ++ /* 27 */ {SEL1(0x97b425ed097b425full) 0, 4}, ++ /* 28 */ {SEL1(0x2492492492492493ull) 1, 5}, ++ /* 29 */ {SEL1(0x1a7b9611a7b9611bull) 1, 5}, ++ /* 30 */ {SEL1(0x8888888888888889ull) 0, 4}, ++ /* 31 */ {SEL1(0x0842108421084211ull) 1, 5}, ++ /* 32 */ {SEL1(0ull) 1, 5}, ++ /* 33 */ {SEL1(0x0f83e0f83e0f83e1ull) 0, 1}, ++ /* 34 */ {SEL1(0xf0f0f0f0f0f0f0f1ull) 0, 5}, ++ /* 35 */ {SEL1(0xea0ea0ea0ea0ea0full) 0, 5}, ++ /* 36 */ {SEL1(0xe38e38e38e38e38full) 0, 5} + #endif + #if BITS_PER_MP_LIMB == 32 + /* 2 */ {SEL1(0ul) 1, 1, {0, 31, 0x80000000ul SEL2(0xfffffffful)}}, +diff -u -udbrN glibc-2.3.2/stdio-common/sscanf.c glibc-2.3.2-200304020432/stdio-common/sscanf.c +--- glibc-2.3.2/stdio-common/sscanf.c Sat Aug 10 20:09:08 2002 ++++ glibc-2.3.2-200304020432/stdio-common/sscanf.c Wed Mar 5 20:58:03 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1991,95,96,98,2002 Free Software Foundation, Inc. ++/* Copyright (C) 1991,1995,1996,1998,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 +@@ -27,9 +27,7 @@ + /* Read formatted input from S, according to the format string FORMAT. */ + /* VARARGS2 */ + int +-sscanf (s, format) +- const char *s; +- const char *format; ++sscanf (const char *s, const char *format, ...) + { + va_list arg; + int done; +diff -u -udbrN glibc-2.3.2/stdlib/cxa_finalize.c glibc-2.3.2-200304020432/stdlib/cxa_finalize.c +--- glibc-2.3.2/stdlib/cxa_finalize.c Fri Dec 6 11:43:29 2002 ++++ glibc-2.3.2-200304020432/stdlib/cxa_finalize.c Fri Mar 21 08:45:55 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc. ++/* Copyright (C) 1999, 2001, 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 +@@ -18,7 +18,7 @@ + + #include + #include +-#include ++#include + #include "exit.h" + #include + +@@ -36,7 +36,8 @@ + for (f = &funcs->fns[funcs->idx - 1]; f >= &funcs->fns[0]; --f) + if ((d == NULL || d == f->func.cxa.dso_handle) + /* We don't want to run this cleanup more than once. */ +- && compare_and_swap (&f->flavor, ef_cxa, ef_free)) ++ && ! atomic_compare_and_exchange_bool_acq (&f->flavor, ef_free, ++ ef_cxa)) + (*f->func.cxa.fn) (f->func.cxa.arg, 0); + } + +diff -u -udbrN glibc-2.3.2/stdlib/fpioconst.c glibc-2.3.2-200304020432/stdlib/fpioconst.c +--- glibc-2.3.2/stdlib/fpioconst.c Mon Mar 11 09:32:01 2002 ++++ glibc-2.3.2-200304020432/stdlib/fpioconst.c Fri Mar 14 04:59:41 2003 +@@ -1,5 +1,6 @@ + /* Table of MP integer constants 10^(2^i), used for floating point <-> decimal. +- Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. ++ Copyright (C) 1995, 1996, 1997, 1998, 1999, 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 +@@ -235,195 +236,198 @@ + { + #define TENS_P0_IDX 0 + #define TENS_P0_SIZE 2 +- [TENS_P0_IDX] = 0x0000000000000000, 0x000000000000000a, ++ [TENS_P0_IDX] = 0x0000000000000000ull, 0x000000000000000aull, + + #define TENS_P1_IDX (TENS_P0_IDX + TENS_P0_SIZE) + #define TENS_P1_SIZE 2 +- [TENS_P1_IDX] = 0x0000000000000000, 0x0000000000000064, ++ [TENS_P1_IDX] = 0x0000000000000000ull, 0x0000000000000064ull, + + #define TENS_P2_IDX (TENS_P1_IDX + TENS_P1_SIZE) + #define TENS_P2_SIZE 2 +- [TENS_P2_IDX] = 0x0000000000000000, 0x0000000000002710, ++ [TENS_P2_IDX] = 0x0000000000000000ull, 0x0000000000002710ull, + + #define TENS_P3_IDX (TENS_P2_IDX + TENS_P2_SIZE) + #define TENS_P3_SIZE 2 +- [TENS_P3_IDX] = 0x0000000000000000, 0x0000000005f5e100, ++ [TENS_P3_IDX] = 0x0000000000000000ull, 0x0000000005f5e100ull, + + #define TENS_P4_IDX (TENS_P3_IDX + TENS_P3_SIZE) + #define TENS_P4_SIZE 2 +- [TENS_P4_IDX] = 0x0000000000000000, 0x002386f26fc10000, ++ [TENS_P4_IDX] = 0x0000000000000000ull, 0x002386f26fc10000ull, + + #define TENS_P5_IDX (TENS_P4_IDX + TENS_P4_SIZE) + #define TENS_P5_SIZE 3 +- [TENS_P5_IDX] = 0x0000000000000000, 0x85acef8100000000, 0x000004ee2d6d415b, ++ [TENS_P5_IDX] = 0x0000000000000000ull, 0x85acef8100000000ull, ++ 0x000004ee2d6d415bull, + + #define TENS_P6_IDX (TENS_P5_IDX + TENS_P5_SIZE) + #define TENS_P6_SIZE 5 +- [TENS_P6_IDX] = 0x0000000000000000, 0x0000000000000000, 0x6e38ed64bf6a1f01, +- 0xe93ff9f4daa797ed, 0x0000000000184f03, ++ [TENS_P6_IDX] = 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x6e38ed64bf6a1f01ull, 0xe93ff9f4daa797edull, 0x0000000000184f03ull, + + #define TENS_P7_IDX (TENS_P6_IDX + TENS_P6_SIZE) + #define TENS_P7_SIZE 8 +- [TENS_P7_IDX] = 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x03df99092e953e01, 0x2374e42f0f1538fd, 0xc404dc08d3cff5ec, +- 0xa6337f19bccdb0da, 0x0000024ee91f2603, ++ [TENS_P7_IDX] = 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x03df99092e953e01ull, 0x2374e42f0f1538fdull, ++ 0xc404dc08d3cff5ecull, 0xa6337f19bccdb0daull, 0x0000024ee91f2603ull, + + #define TENS_P8_IDX (TENS_P7_IDX + TENS_P7_SIZE) + #define TENS_P8_SIZE 15 +- [TENS_P8_IDX] = 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0xbed3875b982e7c01, +- 0x12152f87d8d99f72, 0xcf4a6e706bde50c6, 0x26b2716ed595d80f, +- 0x1d153624adc666b0, 0x63ff540e3c42d35a, 0x65f9ef17cc5573c0, +- 0x80dcc7f755bc28f2, 0x5fdcefcef46eeddc, 0x00000000000553f7, ++ [TENS_P8_IDX] = 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0xbed3875b982e7c01ull, 0x12152f87d8d99f72ull, 0xcf4a6e706bde50c6ull, ++ 0x26b2716ed595d80full, 0x1d153624adc666b0ull, 0x63ff540e3c42d35aull, ++ 0x65f9ef17cc5573c0ull, 0x80dcc7f755bc28f2ull, 0x5fdcefcef46eeddcull, ++ 0x00000000000553f7ull, + #ifndef __NO_LONG_DOUBLE_MATH + # define TENS_P9_IDX (TENS_P8_IDX + TENS_P8_SIZE) + # define TENS_P9_SIZE 28 +- [TENS_P9_IDX] = 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x77f27267fc6cf801, 0x5d96976f8f9546dc, 0xc31e1ad9b83a8a97, +- 0x94e6574746c40513, 0x4475b579c88976c1, 0xaa1da1bf28f8733b, +- 0x1e25cfea703ed321, 0xbc51fb2eb21a2f22, 0xbfa3edac96e14f5d, +- 0xe7fc7153329c57ae, 0x85a91924c3fc0695, 0xb2908ee0f95f635e, +- 0x1366732a93abade4, 0x69be5b0e9449775c, 0xb099bc817343afac, +- 0xa269974845a71d46, 0x8a0b1f138cb07303, 0xc1d238d98cab8a97, +- 0x0000001c633415d4, ++ [TENS_P9_IDX] = 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x77f27267fc6cf801ull, 0x5d96976f8f9546dcull, ++ 0xc31e1ad9b83a8a97ull, 0x94e6574746c40513ull, 0x4475b579c88976c1ull, ++ 0xaa1da1bf28f8733bull, 0x1e25cfea703ed321ull, 0xbc51fb2eb21a2f22ull, ++ 0xbfa3edac96e14f5dull, 0xe7fc7153329c57aeull, 0x85a91924c3fc0695ull, ++ 0xb2908ee0f95f635eull, 0x1366732a93abade4ull, 0x69be5b0e9449775cull, ++ 0xb099bc817343afacull, 0xa269974845a71d46ull, 0x8a0b1f138cb07303ull, ++ 0xc1d238d98cab8a97ull, 0x0000001c633415d4ull, + + # define TENS_P10_IDX (TENS_P9_IDX + TENS_P9_SIZE) + # define TENS_P10_SIZE 55 +- [TENS_P10_IDX] = 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0xf55b2b722919f001, +- 0x1ec29f866e7c215b, 0x15c51a88991c4e87, 0x4c7d1e1a140ac535, +- 0x0ed1440ecc2cd819, 0x7de16cfb896634ee, 0x9fce837d1e43f61f, +- 0x233e55c7231d2b9c, 0xf451218b65dc60d7, 0xc96359861c5cd134, +- 0xa7e89431922bbb9f, 0x62be695a9f9f2a07, 0x045b7a748e1042c4, +- 0x8ad822a51abe1de3, 0xd814b505ba34c411, 0x8fc51a16bf3fdeb3, +- 0xf56deeecb1b896bc, 0xb6f4654b31fb6bfd, 0x6b7595fb101a3616, +- 0x80d98089dc1a47fe, 0x9a20288280bda5a5, 0xfc8f1f9031eb0f66, +- 0xe26a7b7e976a3310, 0x3ce3a0b8df68368a, 0x75a351a28e4262ce, +- 0x445975836cb0b6c9, 0xc356e38a31b5653f, 0x0190fba035faaba6, +- 0x88bc491b9fc4ed52, 0x005b80411640114a, 0x1e8d4649f4f3235e, +- 0x73c5534936a8de06, 0xc1a6970ca7e6bd2a, 0xd2db49ef47187094, +- 0xae6209d4926c3f5b, 0x34f4a3c62d433949, 0xd9d61a05d4305d94, +- 0x0000000000000325, ++ [TENS_P10_IDX] = 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0xf55b2b722919f001ull, 0x1ec29f866e7c215bull, 0x15c51a88991c4e87ull, ++ 0x4c7d1e1a140ac535ull, 0x0ed1440ecc2cd819ull, 0x7de16cfb896634eeull, ++ 0x9fce837d1e43f61full, 0x233e55c7231d2b9cull, 0xf451218b65dc60d7ull, ++ 0xc96359861c5cd134ull, 0xa7e89431922bbb9full, 0x62be695a9f9f2a07ull, ++ 0x045b7a748e1042c4ull, 0x8ad822a51abe1de3ull, 0xd814b505ba34c411ull, ++ 0x8fc51a16bf3fdeb3ull, 0xf56deeecb1b896bcull, 0xb6f4654b31fb6bfdull, ++ 0x6b7595fb101a3616ull, 0x80d98089dc1a47feull, 0x9a20288280bda5a5ull, ++ 0xfc8f1f9031eb0f66ull, 0xe26a7b7e976a3310ull, 0x3ce3a0b8df68368aull, ++ 0x75a351a28e4262ceull, 0x445975836cb0b6c9ull, 0xc356e38a31b5653full, ++ 0x0190fba035faaba6ull, 0x88bc491b9fc4ed52ull, 0x005b80411640114aull, ++ 0x1e8d4649f4f3235eull, 0x73c5534936a8de06ull, 0xc1a6970ca7e6bd2aull, ++ 0xd2db49ef47187094ull, 0xae6209d4926c3f5bull, 0x34f4a3c62d433949ull, ++ 0xd9d61a05d4305d94ull, 0x0000000000000325ull, + + # define TENS_P11_IDX (TENS_P10_IDX + TENS_P10_SIZE) + # define TENS_P11_SIZE 108 +- [TENS_P11_IDX] = 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0xe30968651333e001, 0x49e28dcfb27d4d3f, 0xee87e354ec2e4721, +- 0x368b8abbb6067584, 0x2ed56d55a5e5a191, 0xea50d142fd827773, +- 0x98342c9e51b78db2, 0x866ed6f1c850dabc, 0x9279498719342c12, +- 0x66912e4ad2f869c2, 0x57a7842d71c7fd8f, 0xfb7fedcc235552eb, +- 0x38209ce1f3861ce0, 0x34c101349713b449, 0xa7a8289c8c6c54de, +- 0xe3cb64f32dbb6643, 0xe3892ee98074ff01, 0xa8f16f9210c17f94, +- 0x967abbb3a8281ed6, 0x9952fbed5a151440, 0xafe609c313b41e44, +- 0xf111821fa2bca416, 0x91bac974fb1264b4, 0x8e48ff35d6c7d6ab, +- 0xc4a656654419bd43, 0x33554c36685e5510, 0x0dbd21feab498697, +- 0x982da4663cfe491d, 0x9e110c7bcbea4ca7, 0x5fc5a04779c56b8a, +- 0x1aa9f44484d80e2e, 0x6a57b1ab730f203c, 0x87a7dc62d752f7a6, +- 0x40660460944545ff, 0xc9ac375d77c1a42f, 0x744695f0e866d7ef, +- 0xa1fc6b9681428c85, 0x7bf03c19d7917c7b, 0x5715f7915b33eb41, +- 0xdb0708fd8f6cae5f, 0x785ce6b7b125ac8e, 0x6f46eadb56c6815b, +- 0x195355d84eeebeee, 0x9d7389c0a244de3c, 0xcf99d01953761abd, +- 0x0d76ce39de9ec24b, 0x2e55ecee70beb181, 0xf56d9d4bd5f86079, +- 0x13ef5a83fb8886fb, 0x3f3389a4408f43c5, 0x58ccf45cfad37943, +- 0x415c7f3ef82df846, 0x8b3d5cf42915e818, 0xf8dbb57a6a445f27, +- 0x8ad803ecca8f0070, 0x038f9245b2e87c34, 0xc7c9dee0bedd8a6c, +- 0x2ad3fa140eac7d56, 0xf775677ce0de0840, 0x92be221ef1bd0ad5, +- 0xce9d04a487fa1fb9, 0x3f6f7024d2c36fa9, 0x907855eeb028af62, +- 0x4efac5dcd83e49d6, 0x77cd8c6be7151aab, 0x0af908b40a753b7d, +- 0xe50f30278c983623, 0x1d08e2d694222771, 0xf2ee5ca6f7e928e6, +- 0x11eb962b1b61b93c, 0xce2bcba19648b21c, 0x7bbebe3034f77154, +- 0x8ce329ace526a319, 0xb5dc53d5de4a74d2, 0x000000000009e8b3, ++ [TENS_P11_IDX] = 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0xe30968651333e001ull, 0x49e28dcfb27d4d3full, ++ 0xee87e354ec2e4721ull, 0x368b8abbb6067584ull, 0x2ed56d55a5e5a191ull, ++ 0xea50d142fd827773ull, 0x98342c9e51b78db2ull, 0x866ed6f1c850dabcull, ++ 0x9279498719342c12ull, 0x66912e4ad2f869c2ull, 0x57a7842d71c7fd8full, ++ 0xfb7fedcc235552ebull, 0x38209ce1f3861ce0ull, 0x34c101349713b449ull, ++ 0xa7a8289c8c6c54deull, 0xe3cb64f32dbb6643ull, 0xe3892ee98074ff01ull, ++ 0xa8f16f9210c17f94ull, 0x967abbb3a8281ed6ull, 0x9952fbed5a151440ull, ++ 0xafe609c313b41e44ull, 0xf111821fa2bca416ull, 0x91bac974fb1264b4ull, ++ 0x8e48ff35d6c7d6abull, 0xc4a656654419bd43ull, 0x33554c36685e5510ull, ++ 0x0dbd21feab498697ull, 0x982da4663cfe491dull, 0x9e110c7bcbea4ca7ull, ++ 0x5fc5a04779c56b8aull, 0x1aa9f44484d80e2eull, 0x6a57b1ab730f203cull, ++ 0x87a7dc62d752f7a6ull, 0x40660460944545ffull, 0xc9ac375d77c1a42full, ++ 0x744695f0e866d7efull, 0xa1fc6b9681428c85ull, 0x7bf03c19d7917c7bull, ++ 0x5715f7915b33eb41ull, 0xdb0708fd8f6cae5full, 0x785ce6b7b125ac8eull, ++ 0x6f46eadb56c6815bull, 0x195355d84eeebeeeull, 0x9d7389c0a244de3cull, ++ 0xcf99d01953761abdull, 0x0d76ce39de9ec24bull, 0x2e55ecee70beb181ull, ++ 0xf56d9d4bd5f86079ull, 0x13ef5a83fb8886fbull, 0x3f3389a4408f43c5ull, ++ 0x58ccf45cfad37943ull, 0x415c7f3ef82df846ull, 0x8b3d5cf42915e818ull, ++ 0xf8dbb57a6a445f27ull, 0x8ad803ecca8f0070ull, 0x038f9245b2e87c34ull, ++ 0xc7c9dee0bedd8a6cull, 0x2ad3fa140eac7d56ull, 0xf775677ce0de0840ull, ++ 0x92be221ef1bd0ad5ull, 0xce9d04a487fa1fb9ull, 0x3f6f7024d2c36fa9ull, ++ 0x907855eeb028af62ull, 0x4efac5dcd83e49d6ull, 0x77cd8c6be7151aabull, ++ 0x0af908b40a753b7dull, 0xe50f30278c983623ull, 0x1d08e2d694222771ull, ++ 0xf2ee5ca6f7e928e6ull, 0x11eb962b1b61b93cull, 0xce2bcba19648b21cull, ++ 0x7bbebe3034f77154ull, 0x8ce329ace526a319ull, 0xb5dc53d5de4a74d2ull, ++ 0x000000000009e8b3ull, + + # define TENS_P12_IDX (TENS_P11_IDX + TENS_P11_SIZE) + # define TENS_P12_SIZE 214 +- [TENS_P12_IDX] = 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, +- 0x0000000000000000, 0x0000000000000000, 0xd4724e8d2a67c001, +- 0xf89a1e908efe7ae7, 0x54e05154ef084117, 0x506be82913b1bb51, +- 0xe599574efb29b172, 0x806c0ed3f0da6146, 0x45155e93b86ae5be, +- 0x7e1e7c34c0591cc2, 0x1d1f4cce7c4823da, 0xd6bfdf759b8ba1e8, +- 0xc2dfae78e341be10, 0x0f237f1a016b67b2, 0xaf6a25743dbeabcd, +- 0x142e0e80cab3e6d7, 0x2c23481161959127, 0xcb4bf98287009701, +- 0x88052f8cf8169c84, 0xbc13176168dde6d4, 0x54ab9c41ff0b0905, +- 0x1a1c304e7613b224, 0x441c2d473bfe167b, 0x78f061814f6cea9c, +- 0x30c7ae41eb659fb8, 0xa1ebcad7947e0d0e, 0x2130504dd97d9556, +- 0xf2acd5071a8309cb, 0xfd82373a3f8ec72a, 0x280f4d3295a842bc, +- 0x811a4f04f3618ac0, 0xd3967a1b6dc3a5b4, 0xdcfe388f15b8c898, +- 0x8738b909454eb2a0, 0x2bd9cc1110c4e996, 0x655fec303297cd0c, +- 0xf4090ee8ae0725b1, 0x398c6fed037d19ee, 0xc994a4503b9af26b, +- 0x75a697b2b5341743, 0x3ccb5b92ac50b9c1, 0xa8329761ffe06205, +- 0xeb83cadbdfea5242, 0x3c20ee69e79dadf7, 0x7021b97a1e0a6817, +- 0x176ca776743074fa, 0xeca19beb77fb8af6, 0xaf63b71292baf1de, +- 0xa4eb8f8cde35c88b, 0x40b464a0e137d5e9, 0x42923bbd87d1cde8, +- 0x2e2690f3cd8f62ff, 0x59c89f1b095edc16, 0x5138753d1fa8fd5d, +- 0x80152f18390a2b29, 0xf984d83e2dd8d925, 0xc19e1faf7a872e74, +- 0xecf9b5d0ed4d542d, 0xc53c0adf9462ea75, 0x37a2d4390caea134, +- 0x2181327ec8fa2e8a, 0x2d2408206e7bb827, 0x5893d4b850be10e0, +- 0x1f2b2322ab312bb9, 0xbf627ede440b3f25, 0xb608b89572dac789, +- 0x86deb3f078787e2a, 0xbb9373f46fee7aab, 0xf7d8b57e27ecf57b, +- 0x3d04e8d2fca26a9f, 0x3172826ac9df13cb, 0xa8fcd8e0cd9e8d7c, +- 0x307641d9b2c39497, 0x2608c4cf1cc939c1, 0x3d326a7eb6d1c7bf, +- 0x8e13e25feeaf19e6, 0x2dfe6d97ee63302b, 0xe41d3cc425971d58, +- 0xab8db59a0a80627c, 0xe90afb779eea37c8, 0x9ee3352c90ca19cf, +- 0xfe78d6823613c850, 0x5b060904788f6e50, 0x3fecb534b71bd1a4, +- 0x20c33857b32c450c, 0x0239f4cea6e9cfda, 0xa19adb9548497187, +- 0x95aca6a8b492ed8a, 0xcf1b23504dcd6cd9, 0x1a67778cfbe8b12a, +- 0xc32da38338eb3acc, 0xa03f40a8fb126ab1, 0xe9ce4724ed5bf546, +- 0x73a130d84c4a74fd, 0xa2ebd6c1d9960e2d, 0x6f233b7c94ab6feb, +- 0x8e7b9a7349126080, 0xd298f9994b8c9091, 0xa96ddeff35e836b5, +- 0x6b0dd9bc96119b31, 0x282566fbc6cc3f8d, 0xd6769f3b72b882e7, +- 0x00fc509ba674343d, 0xd6266a3fdcbf7789, 0x4e89541bae9641fd, +- 0x53400d0311953407, 0xe5b533458e0dd75a, 0x108b89bc108f19ad, +- 0xe03b2b6341a4c954, 0x97aced8e437b3d7f, 0x2c5508c2cbd66670, +- 0x5c4f2ef0650ebc69, 0x9985a2df904ff6bf, 0x5ed8d2399faddd9e, +- 0xe3e51cb925585832, 0x56c02d9a0ff4f1d4, 0xc1a08a138c4ef804, +- 0xe6d2767113fd01c8, 0x9d0176cca7c234f4, 0x4d8bfa89d0d73df2, +- 0x2b17e0b2544f10cd, 0xfd86fe49b70a5c7d, 0x214495bbdf373f41, +- 0x00d313d584e857fd, 0xa4ba47440496fcbe, 0xaec29e6ee8cac982, +- 0x7000a51987ec7038, 0xff66e42caeee333b, 0x03b4f63b8afd6b25, +- 0x5ab8d9c7bd7991dc, 0x48741a6c2ed4684e, 0x2fdc6349af06940d, +- 0xe974996fb03d7ecd, 0x52ec8721ac7867f9, 0x8edd2d00bcdd9d4a, +- 0x41c759f83557de06, 0xa75409f23956d4b9, 0xb6100fab123cd8a1, +- 0x2e8d623b3e7b21e2, 0xbca35f7792959da2, 0x35fcb457200c03a5, +- 0xf74eb9281bb6c6e4, 0x87cc1d213d5d0b54, 0x18ae42404964046f, +- 0x8bd2b496d868b275, 0xc234d8f51c5563f4, 0xf9151ffff868e970, +- 0x271133eeae7be4a2, 0x25254932bb0fd922, 0x104bcd64a60a9fc0, +- 0x0000006230290145 ++ [TENS_P12_IDX] = 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, ++ 0xd4724e8d2a67c001ull, 0xf89a1e908efe7ae7ull, 0x54e05154ef084117ull, ++ 0x506be82913b1bb51ull, 0xe599574efb29b172ull, 0x806c0ed3f0da6146ull, ++ 0x45155e93b86ae5beull, 0x7e1e7c34c0591cc2ull, 0x1d1f4cce7c4823daull, ++ 0xd6bfdf759b8ba1e8ull, 0xc2dfae78e341be10ull, 0x0f237f1a016b67b2ull, ++ 0xaf6a25743dbeabcdull, 0x142e0e80cab3e6d7ull, 0x2c23481161959127ull, ++ 0xcb4bf98287009701ull, 0x88052f8cf8169c84ull, 0xbc13176168dde6d4ull, ++ 0x54ab9c41ff0b0905ull, 0x1a1c304e7613b224ull, 0x441c2d473bfe167bull, ++ 0x78f061814f6cea9cull, 0x30c7ae41eb659fb8ull, 0xa1ebcad7947e0d0eull, ++ 0x2130504dd97d9556ull, 0xf2acd5071a8309cbull, 0xfd82373a3f8ec72aull, ++ 0x280f4d3295a842bcull, 0x811a4f04f3618ac0ull, 0xd3967a1b6dc3a5b4ull, ++ 0xdcfe388f15b8c898ull, 0x8738b909454eb2a0ull, 0x2bd9cc1110c4e996ull, ++ 0x655fec303297cd0cull, 0xf4090ee8ae0725b1ull, 0x398c6fed037d19eeull, ++ 0xc994a4503b9af26bull, 0x75a697b2b5341743ull, 0x3ccb5b92ac50b9c1ull, ++ 0xa8329761ffe06205ull, 0xeb83cadbdfea5242ull, 0x3c20ee69e79dadf7ull, ++ 0x7021b97a1e0a6817ull, 0x176ca776743074faull, 0xeca19beb77fb8af6ull, ++ 0xaf63b71292baf1deull, 0xa4eb8f8cde35c88bull, 0x40b464a0e137d5e9ull, ++ 0x42923bbd87d1cde8ull, 0x2e2690f3cd8f62ffull, 0x59c89f1b095edc16ull, ++ 0x5138753d1fa8fd5dull, 0x80152f18390a2b29ull, 0xf984d83e2dd8d925ull, ++ 0xc19e1faf7a872e74ull, 0xecf9b5d0ed4d542dull, 0xc53c0adf9462ea75ull, ++ 0x37a2d4390caea134ull, 0x2181327ec8fa2e8aull, 0x2d2408206e7bb827ull, ++ 0x5893d4b850be10e0ull, 0x1f2b2322ab312bb9ull, 0xbf627ede440b3f25ull, ++ 0xb608b89572dac789ull, 0x86deb3f078787e2aull, 0xbb9373f46fee7aabull, ++ 0xf7d8b57e27ecf57bull, 0x3d04e8d2fca26a9full, 0x3172826ac9df13cbull, ++ 0xa8fcd8e0cd9e8d7cull, 0x307641d9b2c39497ull, 0x2608c4cf1cc939c1ull, ++ 0x3d326a7eb6d1c7bfull, 0x8e13e25feeaf19e6ull, 0x2dfe6d97ee63302bull, ++ 0xe41d3cc425971d58ull, 0xab8db59a0a80627cull, 0xe90afb779eea37c8ull, ++ 0x9ee3352c90ca19cfull, 0xfe78d6823613c850ull, 0x5b060904788f6e50ull, ++ 0x3fecb534b71bd1a4ull, 0x20c33857b32c450cull, 0x0239f4cea6e9cfdaull, ++ 0xa19adb9548497187ull, 0x95aca6a8b492ed8aull, 0xcf1b23504dcd6cd9ull, ++ 0x1a67778cfbe8b12aull, 0xc32da38338eb3accull, 0xa03f40a8fb126ab1ull, ++ 0xe9ce4724ed5bf546ull, 0x73a130d84c4a74fdull, 0xa2ebd6c1d9960e2dull, ++ 0x6f233b7c94ab6febull, 0x8e7b9a7349126080ull, 0xd298f9994b8c9091ull, ++ 0xa96ddeff35e836b5ull, 0x6b0dd9bc96119b31ull, 0x282566fbc6cc3f8dull, ++ 0xd6769f3b72b882e7ull, 0x00fc509ba674343dull, 0xd6266a3fdcbf7789ull, ++ 0x4e89541bae9641fdull, 0x53400d0311953407ull, 0xe5b533458e0dd75aull, ++ 0x108b89bc108f19adull, 0xe03b2b6341a4c954ull, 0x97aced8e437b3d7full, ++ 0x2c5508c2cbd66670ull, 0x5c4f2ef0650ebc69ull, 0x9985a2df904ff6bfull, ++ 0x5ed8d2399faddd9eull, 0xe3e51cb925585832ull, 0x56c02d9a0ff4f1d4ull, ++ 0xc1a08a138c4ef804ull, 0xe6d2767113fd01c8ull, 0x9d0176cca7c234f4ull, ++ 0x4d8bfa89d0d73df2ull, 0x2b17e0b2544f10cdull, 0xfd86fe49b70a5c7dull, ++ 0x214495bbdf373f41ull, 0x00d313d584e857fdull, 0xa4ba47440496fcbeull, ++ 0xaec29e6ee8cac982ull, 0x7000a51987ec7038ull, 0xff66e42caeee333bull, ++ 0x03b4f63b8afd6b25ull, 0x5ab8d9c7bd7991dcull, 0x48741a6c2ed4684eull, ++ 0x2fdc6349af06940dull, 0xe974996fb03d7ecdull, 0x52ec8721ac7867f9ull, ++ 0x8edd2d00bcdd9d4aull, 0x41c759f83557de06ull, 0xa75409f23956d4b9ull, ++ 0xb6100fab123cd8a1ull, 0x2e8d623b3e7b21e2ull, 0xbca35f7792959da2ull, ++ 0x35fcb457200c03a5ull, 0xf74eb9281bb6c6e4ull, 0x87cc1d213d5d0b54ull, ++ 0x18ae42404964046full, 0x8bd2b496d868b275ull, 0xc234d8f51c5563f4ull, ++ 0xf9151ffff868e970ull, 0x271133eeae7be4a2ull, 0x25254932bb0fd922ull, ++ 0x104bcd64a60a9fc0ull, 0x0000006230290145ull + #endif + }; + +diff -u -udbrN glibc-2.3.2/stdlib/fpioconst.h glibc-2.3.2-200304020432/stdlib/fpioconst.h +--- glibc-2.3.2/stdlib/fpioconst.h Tue Mar 12 10:24:56 2002 ++++ glibc-2.3.2-200304020432/stdlib/fpioconst.h Fri Mar 14 05:21:27 2003 +@@ -1,5 +1,6 @@ + /* Header file for constants used in floating point <-> decimal conversions. +- Copyright (C) 1995,1996,1997,1998,1999,2002 Free Software Foundation, Inc. ++ Copyright (C) 1995, 1996, 1997, 1998, 1999, 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 +@@ -22,7 +23,7 @@ + + #include + #include +-#include "gmp.h" ++#include + + + /* These values are used by __printf_fp, where they are noncritical (if the +diff -u -udbrN glibc-2.3.2/stdlib/stdlib.h glibc-2.3.2-200304020432/stdlib/stdlib.h +--- glibc-2.3.2/stdlib/stdlib.h Wed Aug 28 04:11:33 2002 ++++ glibc-2.3.2-200304020432/stdlib/stdlib.h Sat Mar 1 23:31:46 2003 +@@ -410,7 +410,9 @@ + /* Read a number from a string S in base 64 as above. */ + extern long int a64l (__const char *__s) __THROW __attribute_pure__; + ++#endif /* Use SVID || extended X/Open. */ + ++#if defined __USE_SVID || defined __USE_XOPEN_EXTENDED || defined __USE_BSD + # include /* we need int32_t... */ + + /* These are the functions that actually do things. The `random', `srandom', +@@ -463,7 +465,7 @@ + extern int setstate_r (char *__restrict __statebuf, + struct random_data *__restrict __buf) __THROW; + # endif /* Use misc. */ +-#endif /* Use SVID || extended X/Open. */ ++#endif /* Use SVID || extended X/Open || BSD. */ + + + __BEGIN_NAMESPACE_STD +diff -u -udbrN glibc-2.3.2/stdlib/strtod.c glibc-2.3.2-200304020432/stdlib/strtod.c +--- glibc-2.3.2/stdlib/strtod.c Sat Feb 22 10:10:31 2003 ++++ glibc-2.3.2-200304020432/stdlib/strtod.c Sat Mar 29 20:04:35 2003 +@@ -64,9 +64,11 @@ + /* The gmp headers need some configuration frobs. */ + #define HAVE_ALLOCA 1 + ++/* Include gmp-mparam.h first, such that definitions of _SHORT_LIMB ++ and _LONG_LONG_LIMB in it can take effect into gmp.h. */ ++#include + #include + #include +-#include + #include + #include "fpioconst.h" + +@@ -157,7 +159,7 @@ + # define MAX_FAC_PER_LIMB 1000000000UL + #elif BITS_PER_MP_LIMB == 64 + # define MAX_DIG_PER_LIMB 19 +-# define MAX_FAC_PER_LIMB 10000000000000000000UL ++# define MAX_FAC_PER_LIMB 10000000000000000000ULL + #else + # error "mp_limb_t size " BITS_PER_MP_LIMB "not accounted for" + #endif +@@ -166,14 +168,14 @@ + /* Local data structure. */ + static const mp_limb_t _tens_in_limb[MAX_DIG_PER_LIMB + 1] = + { 0, 10, 100, +- 1000, 10000, 100000, +- 1000000, 10000000, 100000000, +- 1000000000 ++ 1000, 10000, 100000L, ++ 1000000L, 10000000L, 100000000L, ++ 1000000000L + #if BITS_PER_MP_LIMB > 32 +- , 10000000000U, 100000000000U, +- 1000000000000U, 10000000000000U, 100000000000000U, +- 1000000000000000U, 10000000000000000U, 100000000000000000U, +- 1000000000000000000U, 10000000000000000000U ++ , 10000000000ULL, 100000000000ULL, ++ 1000000000000ULL, 10000000000000ULL, 100000000000000ULL, ++ 1000000000000000ULL, 10000000000000000ULL, 100000000000000000ULL, ++ 1000000000000000000ULL, 10000000000000000000ULL + #endif + #if BITS_PER_MP_LIMB > 64 + #error "Need to expand tens_in_limb table to" MAX_DIG_PER_LIMB +@@ -566,7 +568,7 @@ + for (cnt = 0; decimal[cnt] != '\0'; ++cnt) + if (cp[cnt] != decimal[cnt]) + break; +- if (decimal[cnt] == '\0' && cp[1] >= '0' && cp[1] <= '9') ++ if (decimal[cnt] == '\0' && cp[cnt] >= '0' && cp[cnt] <= '9') + { + /* We accept it. This funny construct is here only to indent + the code directly. */ +@@ -880,7 +882,7 @@ + if (dig_no == int_no && dig_no > 0 && exponent < 0) + do + { +- while (expp[-1] < L_('0') || expp[-1] > L_('9')) ++ while (! (base == 16 ? ISXDIGIT (expp[-1]) : ISDIGIT (expp[-1]))) + --expp; + + if (expp[-1] != L_('0')) +diff -u -udbrN glibc-2.3.2/stdlib/tst-strtod.c glibc-2.3.2-200304020432/stdlib/tst-strtod.c +--- glibc-2.3.2/stdlib/tst-strtod.c Sat Feb 22 10:08:26 2003 ++++ glibc-2.3.2-200304020432/stdlib/tst-strtod.c Thu Mar 20 02:06:11 2003 +@@ -71,6 +71,7 @@ + { "-Inf", -HUGE_VAL, '\0', 0 }, + { "+InFiNiTy", HUGE_VAL, '\0', 0 }, + #endif ++ { "0x80000Ap-23", 0x80000Ap-23, '\0', 0 }, + { NULL, 0, '\0', 0 } + }; + +diff -u -udbrN glibc-2.3.2/sysdeps/alpha/fpu/libm-test-ulps glibc-2.3.2-200304020432/sysdeps/alpha/fpu/libm-test-ulps +--- glibc-2.3.2/sysdeps/alpha/fpu/libm-test-ulps Mon Aug 19 19:57:42 2002 ++++ glibc-2.3.2-200304020432/sysdeps/alpha/fpu/libm-test-ulps Sun Mar 23 01:52:10 2003 +@@ -94,7 +94,7 @@ + idouble: 1 + + # ccos +-Test "Imaginary part of: ccos (-2 - 3 i) == -4.1896256909688072301 - 9.1092278937553365979 i": ++Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": + float: 1 + ifloat: 1 + Test "Real part of: ccos (0.75 + 1.25 i) == 1.38173873063425888530729933139078645 - 1.09193013555397466170919531722024128 i": +@@ -107,10 +107,10 @@ + ifloat: 1 + + # ccosh +-Test "Real part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Real part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Imaginary part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 + Test "Real part of: ccosh (0.75 + 1.25 i) == 0.408242591877968807788852146397499084 + 0.780365930845853240391326216300863152 i": +@@ -145,7 +145,7 @@ + Test "Imaginary part of: clog10 (-0 - inf i) == inf - pi/2*log10(e) i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: clog10 (-2 - 3 i) == 0.5569716761534183846 - 0.9375544629863747085 i": ++Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": + double: 1 + float: 5 + idouble: 1 +@@ -239,7 +239,7 @@ + ifloat: 2 + + # csinh +-Test "Imaginary part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i": ++Test "Imaginary part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": + double: 1 + idouble: 1 + Test "Real part of: csinh (0.75 + 1.25 i) == 0.259294854551162779153349830618433028 + 1.22863452409509552219214606515777594 i": +@@ -258,7 +258,7 @@ + ifloat: 1 + + # ctan +-Test "Real part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i": ++Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": + double: 1 + idouble: 1 + Test "Imaginary part of: ctan (0.75 + 1.25 i) == 0.160807785916206426725166058173438663 + 0.975363285031235646193581759755216379 i": +@@ -266,7 +266,7 @@ + idouble: 1 + + # ctanh +-Test "Real part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i": ++Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": + double: 1 + float: 2 + idouble: 1 +@@ -453,12 +453,12 @@ + ifloat: 2 + + # lgamma +-Test "lgamma (0.7) == 0.26086724653166651439": ++Test "lgamma (0.7) == 0.260867246531666514385732417016759578": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +-Test "lgamma (1.2) == -0.853740900033158497197e-1": ++Test "lgamma (1.2) == -0.853740900033158497197028392998854470e-1": + double: 1 + float: 2 + idouble: 1 +@@ -513,7 +513,7 @@ + Test "tgamma (0.5) == sqrt (pi)": + float: 1 + ifloat: 1 +-Test "tgamma (0.7) == 1.29805533264755778568": ++Test "tgamma (0.7) == 1.29805533264755778568117117915281162": + double: 1 + float: 1 + idouble: 1 +diff -u -udbrN glibc-2.3.2/sysdeps/arm/libm-test-ulps glibc-2.3.2-200304020432/sysdeps/arm/libm-test-ulps +--- glibc-2.3.2/sysdeps/arm/libm-test-ulps Tue Apr 17 20:55:56 2001 ++++ glibc-2.3.2-200304020432/sysdeps/arm/libm-test-ulps Sun Mar 23 01:52:10 2003 +@@ -134,7 +134,7 @@ + idouble: 1 + + # ccos +-Test "Imaginary part of: ccos (-2 - 3 i) == -4.1896256909688072301 - 9.1092278937553365979 i": ++Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": + float: 1 + ifloat: 1 + Test "Real part of: ccos (0.7 + 1.2 i) == 1.3848657645312111080 - 0.97242170335830028619 i": +@@ -145,10 +145,10 @@ + idouble: 1 + + # ccosh +-Test "Real part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Real part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Imaginary part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 + Test "Real part of: ccosh (0.7 + 1.2 i) == 0.4548202223691477654 + 0.7070296600921537682 i": +@@ -187,7 +187,7 @@ + Test "Imaginary part of: clog10 (-0 - inf i) == inf - pi/2*log10(e) i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: clog10 (-2 - 3 i) == 0.5569716761534183846 - 0.9375544629863747085 i": ++Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": + double: 1 + float: 5 + idouble: 1 +@@ -280,7 +280,7 @@ + ifloat: 1 + + # csinh +-Test "Imaginary part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i": ++Test "Imaginary part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": + double: 1 + idouble: 1 + Test "Real part of: csinh (0.7 + 1.2 i) == 0.27487868678117583582 + 1.1698665727426565139 i": +@@ -307,7 +307,7 @@ + ifloat: 1 + + # ctan +-Test "Real part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i": ++Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": + double: 1 + idouble: 1 + Test "Real part of: ctan (0.7 + 1.2 i) == 0.1720734197630349001 + 0.9544807059989405538 i": +@@ -320,7 +320,7 @@ + ifloat: 1 + + # ctanh +-Test "Real part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i": ++Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": + double: 1 + float: 2 + idouble: 1 +@@ -509,12 +509,12 @@ + ifloat: 2 + + # lgamma +-Test "lgamma (0.7) == 0.26086724653166651439": ++Test "lgamma (0.7) == 0.260867246531666514385732417016759578": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +-Test "lgamma (1.2) == -0.853740900033158497197e-1": ++Test "lgamma (1.2) == -0.853740900033158497197028392998854470e-1": + double: 1 + float: 2 + idouble: 1 +@@ -604,7 +604,7 @@ + Test "tgamma (0.5) == sqrt (pi)": + float: 1 + ifloat: 1 +-Test "tgamma (0.7) == 1.29805533264755778568": ++Test "tgamma (0.7) == 1.29805533264755778568117117915281162": + double: 1 + float: 1 + idouble: 1 +diff -u -udbrN glibc-2.3.2/sysdeps/arm/sysdep.h glibc-2.3.2-200304020432/sysdeps/arm/sysdep.h +--- glibc-2.3.2/sysdeps/arm/sysdep.h Sat Jul 7 21:21:19 2001 ++++ glibc-2.3.2-200304020432/sysdeps/arm/sysdep.h Fri Mar 21 21:51:59 2003 +@@ -1,5 +1,5 @@ + /* Assembler macros for ARM. +- Copyright (C) 1997, 1998 Free Software Foundation, Inc. ++ Copyright (C) 1997, 1998, 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 +@@ -76,7 +76,7 @@ + #define CALL_MCOUNT \ + str lr,[sp, #-4]! ; \ + bl PLTJMP(mcount) ; \ +- ldr lr, [sp], #4 ++ ldr lr, [sp], #4 ; + #else + #define CALL_MCOUNT /* Do nothing. */ + #endif +diff -u -udbrN glibc-2.3.2/sysdeps/generic/bits/atomic.h glibc-2.3.2-200304020432/sysdeps/generic/bits/atomic.h +--- glibc-2.3.2/sysdeps/generic/bits/atomic.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/generic/bits/atomic.h Sun Mar 23 00:00:14 2003 +@@ -0,0 +1,43 @@ ++/* Copyright (C) 2003 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper , 2003. ++ ++ 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 _BITS_ATOMIC_H ++#define _BITS_ATOMIC_H 1 ++ ++/* We have by default no support for atomic operations. So define ++ them non-atomic. If this is a problem somebody will have to come ++ up with real definitions. */ ++ ++/* The only basic operation needed is compare and exchange. */ ++#define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \ ++ ({ __typeof (mem) __gmemp = (mem); \ ++ __typeof (*mem) __gret = *__gmemp; \ ++ __typeof (*mem) __gnewval = (newval); \ ++ \ ++ if (__gret == (oldval)) \ ++ *__gmemp = __gnewval; \ ++ __gret; }) ++ ++#define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \ ++ ({ __typeof (mem) __gmemp = (mem); \ ++ __typeof (*mem) __gnewval = (newval); \ ++ \ ++ *__gmemp == (oldval) ? (*__gmemp = __gnewval, 0) : 1; }) ++ ++#endif /* bits/atomic.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/generic/bits/confname.h glibc-2.3.2-200304020432/sysdeps/generic/bits/confname.h +--- glibc-2.3.2/sysdeps/generic/bits/confname.h Mon Feb 24 02:38:15 2003 ++++ glibc-2.3.2-200304020432/sysdeps/generic/bits/confname.h Fri Mar 14 07:20:58 2003 +@@ -62,8 +62,10 @@ + #define _PC_REC_XFER_ALIGN _PC_REC_XFER_ALIGN + _PC_ALLOC_SIZE_MIN, + #define _PC_ALLOC_SIZE_MIN _PC_ALLOC_SIZE_MIN +- _PC_SYMLINK_MAX ++ _PC_SYMLINK_MAX, + #define _PC_SYMLINK_MAX _PC_SYMLINK_MAX ++ _PC_2_SYMLINKS ++#define _PC_2_SYMLINKS _PC_2_SYMLINKS + }; + + /* Values for the argument to `sysconf'. */ +diff -u -udbrN glibc-2.3.2/sysdeps/generic/bits/time.h glibc-2.3.2-200304020432/sysdeps/generic/bits/time.h +--- glibc-2.3.2/sysdeps/generic/bits/time.h Wed Oct 23 08:21:18 2002 ++++ glibc-2.3.2-200304020432/sysdeps/generic/bits/time.h Mon Mar 3 05:42:14 2003 +@@ -1,5 +1,5 @@ + /* System-dependent timing definitions. Generic version. +- Copyright (C) 1996,1997,1999,2000,2001,2002 Free Software Foundation, Inc. ++ Copyright (C) 1996,1997,1999-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 +@@ -44,6 +44,8 @@ + # ifdef __USE_POSIX199309 + /* Identifier for system-wide realtime clock. */ + # define CLOCK_REALTIME 0 ++/* Monotonic system-wide clock. */ ++# define CLOCK_MONOTONIC 1 + /* High-resolution timer from the CPU. */ + # define CLOCK_PROCESS_CPUTIME_ID 2 + /* Thread-specific CPU-time clock. */ +diff -u -udbrN glibc-2.3.2/sysdeps/generic/bits/typesizes.h glibc-2.3.2-200304020432/sysdeps/generic/bits/typesizes.h +--- glibc-2.3.2/sysdeps/generic/bits/typesizes.h Thu Oct 24 01:48:45 2002 ++++ glibc-2.3.2-200304020432/sysdeps/generic/bits/typesizes.h Tue Mar 25 21:33:05 2003 +@@ -1,5 +1,5 @@ + /* bits/typesizes.h -- underlying types for *_t. Generic version. +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 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 +@@ -54,7 +54,7 @@ + #define __SWBLK_T_TYPE __SLONGWORD_TYPE + #define __KEY_T_TYPE __S32_TYPE + #define __CLOCKID_T_TYPE __S32_TYPE +-#define __TIMER_T_TYPE __S32_TYPE ++#define __TIMER_T_TYPE void * + #define __BLKSIZE_T_TYPE __SLONGWORD_TYPE + #define __FSID_T_TYPE struct { int __val[2]; } + +diff -u -udbrN glibc-2.3.2/sysdeps/generic/dl-sysdep.c glibc-2.3.2-200304020432/sysdeps/generic/dl-sysdep.c +--- glibc-2.3.2/sysdeps/generic/dl-sysdep.c Sun Feb 23 06:04:15 2003 ++++ glibc-2.3.2-200304020432/sysdeps/generic/dl-sysdep.c Sun Mar 16 00:09:21 2003 +@@ -140,6 +140,9 @@ + GL(dl_sysinfo) = av->a_un.a_val; + break; + #endif ++#ifdef DL_PLATFORM_AUXV ++ DL_PLATFORM_AUXV ++#endif + } + + #ifdef DL_SYSDEP_OSCHECK +@@ -338,7 +341,7 @@ + + /* Determine the total size of all strings together. */ + if (cnt == 1) +- total = temp[0].len; ++ total = temp[0].len + 1; + else + { + total = (1UL << (cnt - 2)) * (temp[0].len + temp[cnt - 1].len + 2); +diff -u -udbrN glibc-2.3.2/sysdeps/generic/dl-sysdep.h glibc-2.3.2-200304020432/sysdeps/generic/dl-sysdep.h +--- glibc-2.3.2/sysdeps/generic/dl-sysdep.h Thu Dec 19 19:36:08 2002 ++++ glibc-2.3.2-200304020432/sysdeps/generic/dl-sysdep.h Tue Mar 4 08:56:25 2003 +@@ -1,5 +1,5 @@ + /* System-specific settings for dynamic linker code. Generic version. +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 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 +@@ -17,6 +17,9 @@ + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + ++#ifndef _DL_SYSDEP_H ++#define _DL_SYSDEP_H 1 ++ + /* This macro must be defined to either 0 or 1. + + If 1, then an errno global variable hidden in ld.so will work right with +@@ -30,3 +33,5 @@ + #else + # define RTLD_PRIVATE_ERRNO 0 + #endif ++ ++#endif /* dl-sysdep.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/generic/dl-tls.c glibc-2.3.2-200304020432/sysdeps/generic/dl-tls.c +--- glibc-2.3.2/sysdeps/generic/dl-tls.c Thu Jan 30 21:58:27 2003 ++++ glibc-2.3.2-200304020432/sysdeps/generic/dl-tls.c Thu Mar 6 07:40:43 2003 +@@ -294,7 +294,7 @@ + + /* Allocate a correctly aligned chunk of memory. */ + result = __libc_memalign (GL(dl_tls_static_align), size); +- if (__builtin_expect (result != NULL, 0)) ++ if (__builtin_expect (result != NULL, 1)) + { + /* Allocate the DTV. */ + void *allocated = result; +@@ -415,6 +415,9 @@ + dtv_t *dtv = GET_DTV (tcb); + + /* The array starts with dtv[-1]. */ ++#ifdef SHARED ++ if (dtv != GL(dl_initial_dtv)) ++#endif + free (dtv - 1); + + if (dealloc_tcb) +diff -u -udbrN glibc-2.3.2/sysdeps/generic/elf/backtracesyms.c glibc-2.3.2-200304020432/sysdeps/generic/elf/backtracesyms.c +--- glibc-2.3.2/sysdeps/generic/elf/backtracesyms.c Sat Jul 7 21:21:22 2001 ++++ glibc-2.3.2-200304020432/sysdeps/generic/elf/backtracesyms.c Mon Mar 10 10:12:11 2003 +@@ -1,5 +1,5 @@ + /* Return list with names for address in backtrace. +- Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ++ Copyright (C) 1998,1999,2000,2001,2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1998. + +@@ -48,7 +48,7 @@ + /* Fill in the information we can get from `dladdr'. */ + for (cnt = 0; cnt < size; ++cnt) + { +- status[cnt] = _dl_addr (array[cnt], &info[cnt]); ++ status[cnt] = _dl_addr (array[cnt], &info[cnt], NULL, NULL); + if (status[cnt] && info[cnt].dli_fname && info[cnt].dli_fname[0] != '\0') + /* We have some info, compute the length of the string which will be + "() [+offset]. */ +diff -u -udbrN glibc-2.3.2/sysdeps/generic/elf/backtracesymsfd.c glibc-2.3.2-200304020432/sysdeps/generic/elf/backtracesymsfd.c +--- glibc-2.3.2/sysdeps/generic/elf/backtracesymsfd.c Sat Jul 7 21:21:22 2001 ++++ glibc-2.3.2-200304020432/sysdeps/generic/elf/backtracesymsfd.c Mon Mar 10 10:12:11 2003 +@@ -1,5 +1,5 @@ + /* Write formatted list with names for addresses in backtrace to a file. +- Copyright (C) 1998, 2000 Free Software Foundation, Inc. ++ Copyright (C) 1998, 2000, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1998. + +@@ -48,7 +48,7 @@ + Dl_info info; + size_t last = 0; + +- if (_dl_addr (array[cnt], &info) ++ if (_dl_addr (array[cnt], &info, NULL, NULL) + && info.dli_fname && info.dli_fname[0] != '\0') + { + /* Name of the file. */ +diff -u -udbrN glibc-2.3.2/sysdeps/generic/ldconfig.h glibc-2.3.2-200304020432/sysdeps/generic/ldconfig.h +--- glibc-2.3.2/sysdeps/generic/ldconfig.h Sun Sep 15 04:18:58 2002 ++++ glibc-2.3.2-200304020432/sysdeps/generic/ldconfig.h Fri Mar 14 06:32:49 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1999, 2000 Free Software Foundation, Inc. ++/* Copyright (C) 1999, 2000, 2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Jaeger , 1999. + +@@ -32,6 +32,8 @@ + #define FLAG_X8664_LIB64 0x0300 + #define FLAG_S390_LIB64 0x0400 + #define FLAG_POWERPC_LIB64 0x0500 ++#define FLAG_MIPS64_LIBN32 0x0600 ++#define FLAG_MIPS64_LIBN64 0x0700 + + /* Declared in cache.c. */ + extern void print_cache (const char *cache_name); +diff -u -udbrN glibc-2.3.2/sysdeps/generic/ldsodefs.h glibc-2.3.2-200304020432/sysdeps/generic/ldsodefs.h +--- glibc-2.3.2/sysdeps/generic/ldsodefs.h Fri Jan 3 21:42:47 2003 ++++ glibc-2.3.2-200304020432/sysdeps/generic/ldsodefs.h Thu Mar 27 02:15:04 2003 +@@ -97,9 +97,16 @@ + /* Reloc type classes as returned by elf_machine_type_class(). + ELF_RTYPE_CLASS_PLT means this reloc should not be satisfied by + some PLT symbol, ELF_RTYPE_CLASS_COPY means this reloc should not be +- satisfied by any symbol in the executable. */ ++ satisfied by any symbol in the executable. Some architectures do ++ not support copy relocations. In this case we define the macro to ++ zero so that the code for handling them gets automatically optimized ++ out. */ + #define ELF_RTYPE_CLASS_PLT 1 +-#define ELF_RTYPE_CLASS_COPY 2 ++#ifndef DL_NO_COPY_RELOCS ++# define ELF_RTYPE_CLASS_COPY 2 ++#else ++# define ELF_RTYPE_CLASS_COPY 0 ++#endif + + /* ELF uses the PF_x macros to specify the segment permissions, mmap + uses PROT_xxx. In most cases the three macros have the values 1, 2, +@@ -552,6 +559,16 @@ + /* Cache the locations of MAP's hash table. */ + extern void _dl_setup_hash (struct link_map *map) + internal_function attribute_hidden; ++ ++ ++/* Collect the directories in the search path for LOADER's dependencies. ++ The data structure is defined in . If COUNTING is true, ++ SI->dls_cnt and SI->dls_size are set; if false, those must be as set ++ by a previous call with COUNTING set, and SI must point to SI->dls_size ++ bytes to be used in filling in the result. */ ++extern void _dl_rtld_di_serinfo (struct link_map *loader, ++ Dl_serinfo *si, bool counting) ++ internal_function; + + + /* Search loaded objects' symbol tables for a definition of the symbol +diff -u -udbrN glibc-2.3.2/sysdeps/generic/libc-start.c glibc-2.3.2-200304020432/sysdeps/generic/libc-start.c +--- glibc-2.3.2/sysdeps/generic/libc-start.c Fri Feb 14 23:59:15 2003 ++++ glibc-2.3.2-200304020432/sysdeps/generic/libc-start.c Tue Mar 18 02:54:24 2003 +@@ -44,21 +44,50 @@ + #endif + + +-extern int BP_SYM (__libc_start_main) (int (*main) (int, char **, char **), ++#ifdef LIBC_START_MAIN ++# define STATIC static inline ++#else ++# define STATIC ++# define LIBC_START_MAIN BP_SYM (__libc_start_main) ++#endif ++ ++STATIC int LIBC_START_MAIN (int (*main) (int, char **, char ** ++#ifdef MAIN_AUXVEC_ARG ++ , void * ++#endif ++ ++ ), + int argc, + char *__unbounded *__unbounded ubp_av, ++#ifdef LIBC_START_MAIN_AUXVEC_ARG ++ ElfW(auxv_t) *__unbounded auxvec, ++#endif ++#ifdef INIT_MAIN_ARGS ++ __typeof (main) init, ++#else + void (*init) (void), ++#endif + void (*fini) (void), + void (*rtld_fini) (void), + void *__unbounded stack_end) + __attribute__ ((noreturn)); + +-int +-/* GKM FIXME: GCC: this should get __BP_ prefix by virtue of the +- BPs in the arglist of startup_info.main and startup_info.init. */ +-BP_SYM (__libc_start_main) (int (*main) (int, char **, char **), ++STATIC int ++LIBC_START_MAIN (int (*main) (int, char **, char ** ++#ifdef MAIN_AUXVEC_ARG ++ , void * ++#endif ++ ), + int argc, char *__unbounded *__unbounded ubp_av, +- void (*init) (void), void (*fini) (void), ++#ifdef LIBC_START_MAIN_AUXVEC_ARG ++ ElfW(auxv_t) *__unbounded auxvec, ++#endif ++#ifdef INIT_MAIN_ARGS ++ __typeof (main) init, ++#else ++ void (*init) (void), ++#endif ++ void (*fini) (void), + void (*rtld_fini) (void), void *__unbounded stack_end) + { + char *__unbounded *__unbounded ubp_ev = &ubp_av[argc + 1]; +@@ -80,13 +109,18 @@ + + #ifndef SHARED + # ifdef HAVE_AUX_VECTOR +- void *__unbounded *__unbounded auxvec; + /* First process the auxiliary vector since we need to find the + program header to locate an eventually present PT_TLS entry. */ +- for (auxvec = (void *__unbounded *__unbounded) ubp_ev; +- *auxvec != NULL; ++auxvec); +- ++auxvec; +- _dl_aux_init ((ElfW(auxv_t) *) auxvec); ++# ifndef LIBC_START_MAIN_AUXVEC_ARG ++ ElfW(auxv_t) *__unbounded auxvec; ++ { ++ char *__unbounded *__unbounded evp = ubp_ev; ++ while (*evp++ != NULL) ++ ; ++ auxvec = (ElfW(auxv_t) *__unbounded) evp; ++ } ++# endif ++ _dl_aux_init (auxvec); + # endif + # ifdef DL_SYSDEP_OSCHECK + if (!__libc_multiple_libcs) +@@ -136,7 +170,14 @@ + _dl_debug_printf ("\ninitialize program: %s\n\n", argv[0]); + #endif + if (init) +- (*init) (); ++ (*init) ( ++#ifdef INIT_MAIN_ARGS ++ argc, argv, __environ ++# ifdef MAIN_AUXVEC_ARG ++ , auxvec ++# endif ++#endif ++ ); + + #ifdef SHARED + if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) +@@ -149,7 +190,12 @@ + { + /* XXX This is where the try/finally handling must be used. */ + +- result = main (argc, argv, __environ); ++ result = main (argc, argv, __environ ++#ifdef MAIN_AUXVEC_ARG ++ , auxvec ++#endif ++ ++ ); + } + #ifdef HAVE_CANCELBUF + else +@@ -158,12 +204,11 @@ + /* One less thread. Decrement the counter. If it is zero we + terminate the entire process. */ + result = 0; +- int *const ptr; + # ifdef SHARED +- ptr = __libc_pthread_functions.ptr_nthreads; ++ int *const ptr = __libc_pthread_functions.ptr_nthreads; + # else + extern int __nptl_nthreads __attribute ((weak)); +- ptr = &__nptl_nthreads; ++ int *const ptr = &__nptl_nthreads; + # endif + + if (! atomic_decrement_and_test (ptr)) +diff -u -udbrN glibc-2.3.2/sysdeps/generic/remap_file_pages.c glibc-2.3.2-200304020432/sysdeps/generic/remap_file_pages.c +--- glibc-2.3.2/sysdeps/generic/remap_file_pages.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/generic/remap_file_pages.c Mon Mar 3 10:44:55 2003 +@@ -0,0 +1,35 @@ ++/* Copyright (C) 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 ++ 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 ++ ++/* Remap arbitrary pages of a shared backing store within an existing ++ VMA. */ ++ ++int ++__remap_file_pages (void *start, size_t size, int prot, size_t pgoff, ++ int flags) ++{ ++ __set_errno (ENOSYS); ++ return -1; ++} ++ ++stub_warning (remap_file_pages) ++#include ++weak_alias (__remap_file_pages, remap_file_pages) +diff -u -udbrN glibc-2.3.2/sysdeps/gnu/siglist.c glibc-2.3.2-200304020432/sysdeps/gnu/siglist.c +--- glibc-2.3.2/sysdeps/gnu/siglist.c Sat Dec 21 19:38:36 2002 ++++ glibc-2.3.2-200304020432/sysdeps/gnu/siglist.c Tue Apr 1 07:51:02 2003 +@@ -1,5 +1,5 @@ + /* Define list of all signal numbers and their names. +- Copyright (C) 1997, 1998, 1999, 2000, 2002 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 +@@ -31,11 +31,6 @@ + }; + strong_alias (__new_sys_siglist, _sys_siglist_internal) + +-#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1) +-strong_alias (_sys_siglist_internal, __old_sys_siglist) +-declare_symbol (__old_sys_siglist, object, OLD_SIGLIST_SIZE * __WORDSIZE / 8) +-#endif +- + const char *const __new_sys_sigabbrev[NSIG] = + { + #define init_sig(sig, abbrev, desc) [sig] = abbrev, +@@ -45,6 +40,9 @@ + strong_alias (__new_sys_sigabbrev, _sys_sigabbrev_internal) + + #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1) ++strong_alias (_sys_siglist_internal, __old_sys_siglist) ++declare_symbol (__old_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) + +@@ -54,7 +52,26 @@ + 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 ++strong_alias (_sys_siglist_internal, __old2_sys_siglist) ++declare_symbol (__old2_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); ++ ++strong_alias (__new_sys_siglist, _new_sys_siglist) ++versioned_symbol (libc, __new_sys_siglist, _sys_siglist, GLIBC_2_3_3); ++versioned_symbol (libc, _new_sys_siglist, sys_siglist, GLIBC_2_3_3); ++versioned_symbol (libc, __new_sys_sigabbrev, sys_sigabbrev, GLIBC_2_3_3); ++#else + strong_alias (__new_sys_siglist, _new_sys_siglist) + versioned_symbol (libc, __new_sys_siglist, _sys_siglist, GLIBC_2_1); + versioned_symbol (libc, _new_sys_siglist, sys_siglist, GLIBC_2_1); + versioned_symbol (libc, __new_sys_sigabbrev, sys_sigabbrev, GLIBC_2_1); ++#endif +diff -u -udbrN glibc-2.3.2/sysdeps/hppa/fpu/libm-test-ulps glibc-2.3.2-200304020432/sysdeps/hppa/fpu/libm-test-ulps +--- glibc-2.3.2/sysdeps/hppa/fpu/libm-test-ulps Tue Nov 19 07:40:57 2002 ++++ glibc-2.3.2-200304020432/sysdeps/hppa/fpu/libm-test-ulps Sun Mar 23 01:52:10 2003 +@@ -94,7 +94,7 @@ + idouble: 1 + + # ccos +-Test "Imaginary part of: ccos (-2 - 3 i) == -4.1896256909688072301 - 9.1092278937553365979 i": ++Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": + float: 1 + ifloat: 1 + Test "Real part of: ccos (0.75 + 1.25 i) == 1.38173873063425888530729933139078645 - 1.09193013555397466170919531722024128 i": +@@ -107,10 +107,10 @@ + ifloat: 1 + + # ccosh +-Test "Real part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Real part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Imaginary part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 + Test "Real part of: ccosh (0.75 + 1.25 i) == 0.408242591877968807788852146397499084 + 0.780365930845853240391326216300863152 i": +@@ -145,7 +145,7 @@ + Test "Imaginary part of: clog10 (-0 - inf i) == inf - pi/2*log10(e) i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: clog10 (-2 - 3 i) == 0.5569716761534183846 - 0.9375544629863747085 i": ++Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": + double: 1 + float: 5 + idouble: 1 +@@ -239,7 +239,7 @@ + ifloat: 2 + + # csinh +-Test "Imaginary part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i": ++Test "Imaginary part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": + double: 1 + idouble: 1 + Test "Real part of: csinh (0.75 + 1.25 i) == 0.259294854551162779153349830618433028 + 1.22863452409509552219214606515777594 i": +@@ -258,7 +258,7 @@ + ifloat: 1 + + # ctan +-Test "Real part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i": ++Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": + double: 1 + idouble: 1 + Test "Imaginary part of: ctan (0.75 + 1.25 i) == 0.160807785916206426725166058173438663 + 0.975363285031235646193581759755216379 i": +@@ -266,7 +266,7 @@ + idouble: 1 + + # ctanh +-Test "Real part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i": ++Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": + double: 1 + float: 2 + idouble: 1 +@@ -453,12 +453,12 @@ + ifloat: 2 + + # lgamma +-Test "lgamma (0.7) == 0.26086724653166651439": ++Test "lgamma (0.7) == 0.260867246531666514385732417016759578": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +-Test "lgamma (1.2) == -0.853740900033158497197e-1": ++Test "lgamma (1.2) == -0.853740900033158497197028392998854470e-1": + double: 1 + float: 2 + idouble: 1 +@@ -513,7 +513,7 @@ + Test "tgamma (0.5) == sqrt (pi)": + float: 1 + ifloat: 1 +-Test "tgamma (0.7) == 1.29805533264755778568": ++Test "tgamma (0.7) == 1.29805533264755778568117117915281162": + double: 1 + float: 1 + idouble: 1 +diff -u -udbrN glibc-2.3.2/sysdeps/i386/fpu/libm-test-ulps glibc-2.3.2-200304020432/sysdeps/i386/fpu/libm-test-ulps +--- glibc-2.3.2/sysdeps/i386/fpu/libm-test-ulps Thu Feb 27 23:27:36 2003 ++++ glibc-2.3.2-200304020432/sysdeps/i386/fpu/libm-test-ulps Sat Mar 22 07:14:23 2003 +@@ -121,7 +121,7 @@ + ldouble: 1 + + # ccos +-Test "Imaginary part of: ccos (-2 - 3 i) == -4.1896256909688072301 - 9.1092278937553365979 i": ++Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": + float: 1 + ifloat: 1 + ildouble: 1 +@@ -136,7 +136,7 @@ + ldouble: 1 + + # ccosh +-Test "Imaginary part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Imaginary part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + double: 1 + float: 1 + idouble: 1 +@@ -181,7 +181,7 @@ + float: 1 + idouble: 1 + ifloat: 1 +-Test "Imaginary part of: clog10 (-2 - 3 i) == 0.5569716761534183846 - 0.9375544629863747085 i": ++Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": + double: 1 + idouble: 1 + ildouble: 1 +@@ -343,10 +343,10 @@ + ifloat: 1 + + # csinh +-Test "Real part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i": ++Test "Real part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": + double: 1 + idouble: 1 +-Test "Imaginary part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i": ++Test "Imaginary part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": + double: 1 + float: 1 + idouble: 1 +@@ -363,10 +363,12 @@ + ifloat: 1 + + # ctan +-Test "Real part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i": ++Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": ++double: 1 ++idouble: 1 + ildouble: 439 + ldouble: 439 +-Test "Imaginary part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i": ++Test "Imaginary part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": + float: 1 + ifloat: 1 + ildouble: 2 +@@ -381,10 +383,10 @@ + ldouble: 3 + + # ctanh +-Test "Real part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i": ++Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": + ildouble: 5 + ldouble: 5 +-Test "Imaginary part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i": ++Test "Imaginary part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": + float: 1 + ifloat: 1 + ildouble: 25 +@@ -624,12 +626,12 @@ + idouble: 1 + ildouble: 1 + ldouble: 1 +-Test "lgamma (0.7) == 0.26086724653166651439": ++Test "lgamma (0.7) == 0.260867246531666514385732417016759578": + float: 1 + ifloat: 1 + double: 1 + idouble: 1 +-Test "lgamma (1.2) == -0.853740900033158497197e-1": ++Test "lgamma (1.2) == -0.853740900033158497197028392998854470e-1": + double: 1 + float: 2 + idouble: 1 +@@ -693,7 +695,7 @@ + Test "tgamma (0.5) == sqrt (pi)": + float: 1 + ifloat: 1 +-Test "tgamma (0.7) == 1.29805533264755778568": ++Test "tgamma (0.7) == 1.29805533264755778568117117915281162": + double: 1 + float: 1 + idouble: 1 +@@ -1057,11 +1059,15 @@ + ldouble: 2 + + Function: Real part of "ctan": ++double: 1 ++idouble: 1 + ildouble: 439 + ldouble: 439 + + Function: Imaginary part of "ctan": ++double: 1 + float: 1 ++idouble: 1 + ifloat: 1 + ildouble: 3 + ldouble: 3 +diff -u -udbrN glibc-2.3.2/sysdeps/i386/i486/atomicity.h glibc-2.3.2-200304020432/sysdeps/i386/i486/atomicity.h +--- glibc-2.3.2/sysdeps/i386/i486/atomicity.h Sat Jul 7 21:21:23 2001 ++++ glibc-2.3.2-200304020432/sysdeps/i386/i486/atomicity.h Thu Jan 1 01:00:00 1970 +@@ -1,57 +0,0 @@ +-/* Low-level functions for atomic operations. ix86 version, x >= 4. +- Copyright (C) 1997, 2000, 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 +- 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 _ATOMICITY_H +-#define _ATOMICITY_H 1 +- +-#include +- +- +-static inline uint32_t +-__attribute__ ((unused)) +-exchange_and_add (volatile uint32_t *mem, uint32_t val) +-{ +- register uint32_t result; +- __asm__ __volatile__ ("lock; xaddl %0,%1" +- : "=r" (result), "=m" (*mem) : "0" (val), "1" (*mem)); +- return result; +-} +- +-static inline void +-__attribute__ ((unused)) +-atomic_add (volatile uint32_t *mem, int val) +-{ +- __asm__ __volatile__ ("lock; addl %1,%0" +- : "=m" (*mem) : "ir" (val), "0" (*mem)); +-} +- +-static inline char +-__attribute__ ((unused)) +-compare_and_swap (volatile long int *p, long int oldval, long int newval) +-{ +- char ret; +- long int readval; +- +- __asm__ __volatile__ ("lock; cmpxchgl %3, %1; sete %0" +- : "=q" (ret), "=m" (*p), "=a" (readval) +- : "r" (newval), "1" (*p), "a" (oldval)); +- return ret; +-} +- +-#endif /* atomicity.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/i386/i486/bits/atomic.h glibc-2.3.2-200304020432/sysdeps/i386/i486/bits/atomic.h +--- glibc-2.3.2/sysdeps/i386/i486/bits/atomic.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/i386/i486/bits/atomic.h Sat Mar 22 01:05:02 2003 +@@ -0,0 +1,359 @@ ++/* Copyright (C) 2002, 2003 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. */ ++ ++#include ++ ++ ++typedef int8_t atomic8_t; ++typedef uint8_t uatomic8_t; ++typedef int_fast8_t atomic_fast8_t; ++typedef uint_fast8_t uatomic_fast8_t; ++ ++typedef int16_t atomic16_t; ++typedef uint16_t uatomic16_t; ++typedef int_fast16_t atomic_fast16_t; ++typedef uint_fast16_t uatomic_fast16_t; ++ ++typedef int32_t atomic32_t; ++typedef uint32_t uatomic32_t; ++typedef int_fast32_t atomic_fast32_t; ++typedef uint_fast32_t uatomic_fast32_t; ++ ++typedef int64_t atomic64_t; ++typedef uint64_t uatomic64_t; ++typedef int_fast64_t atomic_fast64_t; ++typedef uint_fast64_t uatomic_fast64_t; ++ ++typedef intptr_t atomicptr_t; ++typedef uintptr_t uatomicptr_t; ++typedef intmax_t atomic_max_t; ++typedef uintmax_t uatomic_max_t; ++ ++ ++#ifndef LOCK ++# ifdef UP ++# define LOCK /* nothing */ ++# else ++# define LOCK "lock;" ++# endif ++#endif ++ ++ ++#define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \ ++ ({ __typeof (*mem) ret; \ ++ __asm __volatile (LOCK "cmpxchgb %b2, %1" \ ++ : "=a" (ret), "=m" (*mem) \ ++ : "q" (newval), "m" (*mem), "0" (oldval)); \ ++ ret; }) ++ ++#define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \ ++ ({ __typeof (*mem) ret; \ ++ __asm __volatile (LOCK "cmpxchgw %w2, %1" \ ++ : "=a" (ret), "=m" (*mem) \ ++ : "r" (newval), "m" (*mem), "0" (oldval)); \ ++ ret; }) ++ ++#define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \ ++ ({ __typeof (*mem) ret; \ ++ __asm __volatile (LOCK "cmpxchgl %2, %1" \ ++ : "=a" (ret), "=m" (*mem) \ ++ : "r" (newval), "m" (*mem), "0" (oldval)); \ ++ 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 ++ such an operation. So don't define any code for now. If it is ++ really going to be used the code below can be used on Intel Pentium ++ and later, but NOT on i486. */ ++#if 1 ++# define __arch_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) \ ++ ({ __typeof (*mem) ret; \ ++ __asm __volatile ("xchgl %2, %%ebx\n\t" \ ++ LOCK "cmpxchg8b %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)); \ ++ ret; }) ++# else ++# define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \ ++ ({ __typeof (*mem) ret; \ ++ __asm __volatile (LOCK "cmpxchg8b %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)); \ ++ ret; }) ++# endif ++#endif ++ ++ ++/* Note that we need no lock prefix. */ ++#define atomic_exchange(mem, newvalue) \ ++ ({ __typeof (*mem) result; \ ++ if (sizeof (*mem) == 1) \ ++ __asm __volatile ("xchgb %b0, %1" \ ++ : "=r" (result), "=m" (*mem) \ ++ : "0" (newvalue), "m" (*mem)); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile ("xchgw %w0, %1" \ ++ : "=r" (result), "=m" (*mem) \ ++ : "0" (newvalue), "m" (*mem)); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile ("xchgl %0, %1" \ ++ : "=r" (result), "=m" (*mem) \ ++ : "0" (newvalue), "m" (*mem)); \ ++ else \ ++ { \ ++ result = 0; \ ++ abort (); \ ++ } \ ++ result; }) ++ ++ ++#define atomic_exchange_and_add(mem, value) \ ++ ({ __typeof (*mem) result; \ ++ __typeof (value) addval = (value); \ ++ if (sizeof (*mem) == 1) \ ++ __asm __volatile (LOCK "xaddb %b0, %1" \ ++ : "=r" (result), "=m" (*mem) \ ++ : "0" (addval), "m" (*mem)); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile (LOCK "xaddw %w0, %1" \ ++ : "=r" (result), "=m" (*mem) \ ++ : "0" (addval), "m" (*mem)); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile (LOCK "xaddl %0, %1" \ ++ : "=r" (result), "=m" (*mem) \ ++ : "0" (addval), "m" (*mem)); \ ++ else \ ++ { \ ++ __typeof (mem) memp = (mem); \ ++ do \ ++ result = *memp; \ ++ while (__arch_compare_and_exchange_val_64_acq (memp, \ ++ result + addval, \ ++ result) == result); \ ++ } \ ++ result; }) ++ ++ ++#define atomic_add(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 "addb %b1, %0" \ ++ : "=m" (*mem) \ ++ : "ir" (value), "m" (*mem)); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile (LOCK "addw %w1, %0" \ ++ : "=m" (*mem) \ ++ : "ir" (value), "m" (*mem)); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile (LOCK "addl %1, %0" \ ++ : "=m" (*mem) \ ++ : "ir" (value), "m" (*mem)); \ ++ else \ ++ { \ ++ __typeof (value) addval = (value); \ ++ __typeof (*mem) oldval; \ ++ __typeof (mem) memp = (mem); \ ++ do \ ++ oldval = *memp; \ ++ while (__arch_compare_and_exchange_val_64_acq \ ++ (memp, oldval + addval, oldval) == oldval); \ ++ } \ ++ }) ++ ++ ++#define atomic_add_negative(mem, value) \ ++ ({ unsigned char __result; \ ++ if (sizeof (*mem) == 1) \ ++ __asm __volatile (LOCK "addb %b2, %0; sets %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "iq" (value), "m" (*mem)); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile (LOCK "addw %w2, %0; sets %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "ir" (value), "m" (*mem)); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile (LOCK "addl %2, %0; sets %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "ir" (value), "m" (*mem)); \ ++ else \ ++ abort (); \ ++ __result; }) ++ ++ ++#define atomic_add_zero(mem, value) \ ++ ({ unsigned char __result; \ ++ if (sizeof (*mem) == 1) \ ++ __asm __volatile (LOCK "addb %b2, %0; setz %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "ir" (value), "m" (*mem)); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile (LOCK "addw %w2, %0; setz %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "ir" (value), "m" (*mem)); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile (LOCK "addl %2, %0; setz %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "ir" (value), "m" (*mem)); \ ++ else \ ++ abort (); \ ++ __result; }) ++ ++ ++#define atomic_increment(mem) \ ++ (void) ({ if (sizeof (*mem) == 1) \ ++ __asm __volatile (LOCK "incb %b0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem)); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile (LOCK "incw %w0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem)); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile (LOCK "incl %0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem)); \ ++ else \ ++ { \ ++ __typeof (*mem) oldval; \ ++ __typeof (mem) memp = (mem); \ ++ do \ ++ oldval = *memp; \ ++ while (__arch_compare_and_exchange_val_64_acq \ ++ (memp, oldval + 1, oldval) == oldval); \ ++ } \ ++ }) ++ ++ ++#define atomic_increment_and_test(mem) \ ++ ({ unsigned char __result; \ ++ if (sizeof (*mem) == 1) \ ++ __asm __volatile (LOCK "incb %0; sete %b1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "m" (*mem)); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile (LOCK "incw %0; sete %w1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "m" (*mem)); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile (LOCK "incl %0; sete %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "m" (*mem)); \ ++ else \ ++ abort (); \ ++ __result; }) ++ ++ ++#define atomic_decrement(mem) \ ++ (void) ({ if (sizeof (*mem) == 1) \ ++ __asm __volatile (LOCK "decb %b0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem)); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile (LOCK "decw %w0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem)); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile (LOCK "decl %0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem)); \ ++ else \ ++ { \ ++ __typeof (*mem) oldval; \ ++ __typeof (mem) memp = (mem); \ ++ do \ ++ oldval = *memp; \ ++ while (__arch_compare_and_exchange_val_64_acq \ ++ (memp, oldval - 1, oldval) == oldval); \ ++ } \ ++ }) ++ ++ ++#define atomic_decrement_and_test(mem) \ ++ ({ unsigned char __result; \ ++ if (sizeof (*mem) == 1) \ ++ __asm __volatile (LOCK "decb %b0; sete %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "m" (*mem)); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile (LOCK "decw %w0; sete %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "m" (*mem)); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile (LOCK "decl %0; sete %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "m" (*mem)); \ ++ else \ ++ abort (); \ ++ __result; }) ++ ++ ++#define atomic_bit_set(mem, bit) \ ++ (void) ({ if (sizeof (*mem) == 1) \ ++ __asm __volatile (LOCK "orb %b2, %0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem), "ir" (1 << (bit))); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile (LOCK "orw %w2, %0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem), "ir" (1 << (bit))); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile (LOCK "orl %2, %0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem), "ir" (1 << (bit))); \ ++ else \ ++ abort (); \ ++ }) ++ ++ ++#define atomic_bit_test_set(mem, bit) \ ++ ({ unsigned char __result; \ ++ if (sizeof (*mem) == 1) \ ++ __asm __volatile (LOCK "btsb %3, %1; setc %0" \ ++ : "=q" (__result), "=m" (*mem) \ ++ : "m" (*mem), "ir" (bit)); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile (LOCK "btsw %3, %1; setc %0" \ ++ : "=q" (__result), "=m" (*mem) \ ++ : "m" (*mem), "ir" (bit)); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile (LOCK "btsl %3, %1; setc %0" \ ++ : "=q" (__result), "=m" (*mem) \ ++ : "m" (*mem), "ir" (bit)); \ ++ else \ ++ abort (); \ ++ __result; }) +diff -u -udbrN glibc-2.3.2/sysdeps/i386/sysdep.h glibc-2.3.2-200304020432/sysdeps/i386/sysdep.h +--- glibc-2.3.2/sysdeps/i386/sysdep.h Thu Jan 9 20:43:34 2003 ++++ glibc-2.3.2-200304020432/sysdeps/i386/sysdep.h Mon Mar 10 10:10:46 2003 +@@ -64,6 +64,14 @@ + ASM_SIZE_DIRECTIVE(name) \ + STABS_FUN_END(name) + ++#ifdef HAVE_CPP_ASM_DEBUGINFO ++/* Disable that goop, because we just pass -g through to the assembler ++ and it generates proper line number information directly. */ ++# define STABS_CURRENT_FILE1(name) ++# define STABS_CURRENT_FILE(name) ++# define STABS_FUN(name) ++# define STABS_FUN_END(name) ++#else + /* Remove the following two lines once the gdb bug is fixed. */ + #define STABS_CURRENT_FILE(name) \ + STABS_CURRENT_FILE1 (#name) +@@ -77,6 +85,7 @@ + .stabs #namestr,36,0,0,name; + #define STABS_FUN_END(name) \ + 1: .stabs "",36,0,0,1b-name; ++#endif + + /* If compiled for profiling, call `mcount' at the start of each function. */ + #ifdef PROF +diff -u -udbrN glibc-2.3.2/sysdeps/ia64/atomicity.h glibc-2.3.2-200304020432/sysdeps/ia64/atomicity.h +--- glibc-2.3.2/sysdeps/ia64/atomicity.h Sat Jul 7 21:21:23 2001 ++++ glibc-2.3.2-200304020432/sysdeps/ia64/atomicity.h Thu Jan 1 01:00:00 1970 +@@ -1,48 +0,0 @@ +-/* Low-level functions for atomic operations. IA-64 version. +- Copyright (C) 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 +- 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 _ATOMICITY_H +-#define _ATOMICITY_H 1 +- +-#include +-#include +- +- +-static inline uint32_t +-__attribute__ ((unused)) +-exchange_and_add (volatile uint32_t *mem, uint32_t val) +-{ +- return __sync_fetch_and_add (mem, val); +-} +- +-static inline void +-__attribute__ ((unused)) +-atomic_add (volatile uint32_t *mem, int val) +-{ +- __sync_fetch_and_add (mem, val); +-} +- +-static inline int +-__attribute__ ((unused)) +-compare_and_swap (volatile long int *p, long int oldval, long int newval) +-{ +- return __sync_bool_compare_and_swap (p, oldval, newval); +-} +- +-#endif /* atomicity.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/ia64/bits/atomic.h glibc-2.3.2-200304020432/sysdeps/ia64/bits/atomic.h +--- glibc-2.3.2/sysdeps/ia64/bits/atomic.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/ia64/bits/atomic.h Wed Mar 26 05:01:47 2003 +@@ -0,0 +1,129 @@ ++/* Copyright (C) 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 ++ 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 ++ ++typedef int8_t atomic8_t; ++typedef uint8_t uatomic8_t; ++typedef int_fast8_t atomic_fast8_t; ++typedef uint_fast8_t uatomic_fast8_t; ++ ++typedef int16_t atomic16_t; ++typedef uint16_t uatomic16_t; ++typedef int_fast16_t atomic_fast16_t; ++typedef uint_fast16_t uatomic_fast16_t; ++ ++typedef int32_t atomic32_t; ++typedef uint32_t uatomic32_t; ++typedef int_fast32_t atomic_fast32_t; ++typedef uint_fast32_t uatomic_fast32_t; ++ ++typedef int64_t atomic64_t; ++typedef uint64_t uatomic64_t; ++typedef int_fast64_t atomic_fast64_t; ++typedef uint_fast64_t uatomic_fast64_t; ++ ++typedef intptr_t atomicptr_t; ++typedef uintptr_t uatomicptr_t; ++typedef intmax_t atomic_max_t; ++typedef uintmax_t uatomic_max_t; ++ ++ ++#define __arch_compare_and_exchange_bool_8_acq(mem, newval, oldval) \ ++ (abort (), 0) ++ ++#define __arch_compare_and_exchange_bool_16_acq(mem, newval, oldval) \ ++ (abort (), 0) ++ ++#define __arch_compare_and_exchange_bool_32_acq(mem, newval, oldval) \ ++ (!__sync_bool_compare_and_swap_si ((int *) (mem), (int) (long) (oldval), \ ++ (int) (long) (newval))) ++ ++#define __arch_compare_and_exchange_bool_64_acq(mem, newval, oldval) \ ++ (!__sync_bool_compare_and_swap_di ((long *) (mem), (long) (oldval), \ ++ (long) (newval))) ++ ++#define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \ ++ (abort (), 0) ++ ++#define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \ ++ (abort (), 0) ++ ++#define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \ ++ __sync_val_compare_and_swap_si ((int *) (mem), (int) (long) (oldval), \ ++ (int) (long) (newval)) ++ ++#define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \ ++ __sync_val_compare_and_swap_di ((long *) (mem), (long) (oldval), \ ++ (long) (newval)) ++ ++/* Atomically store newval and return the old value. */ ++#define atomic_exchange(mem, value) \ ++ ({ __typeof (*mem) __result; \ ++ if (sizeof (*mem) == 4) \ ++ __result = __sync_lock_test_and_set_si ((int *) (mem), (int) (value)); \ ++ else if (sizeof (*mem) == 8) \ ++ __result = __sync_lock_test_and_set_di ((long *) (mem), \ ++ (long) (value)); \ ++ else \ ++ abort (); \ ++ __result; }) ++ ++ ++#define atomic_exchange_and_add(mem, value) \ ++ ({ __typeof (*mem) __result; \ ++ if (sizeof (*mem) == 4) \ ++ __result = __sync_fetch_and_add_si ((int *) (mem), (int) (value)); \ ++ else if (sizeof (*mem) == 8) \ ++ __result = __sync_fetch_and_add_di ((long *) (mem), (long) (value)); \ ++ else \ ++ abort (); \ ++ __result; }) ++ ++#define atomic_decrement_if_positive(mem) \ ++ ({ __typeof (*mem) __oldval, __val; \ ++ __typeof (mem) __memp = (mem); \ ++ \ ++ __val = (*__memp); \ ++ do \ ++ { \ ++ __oldval = __val; \ ++ if (__builtin_expect (__val <= 0, 0)) \ ++ break; \ ++ __val = atomic_compare_and_exchange_val_acq (__memp, __oldval - 1, \ ++ __oldval); \ ++ } \ ++ while (__builtin_expect (__val != __oldval, 0)); \ ++ __oldval; }) ++ ++#define atomic_bit_test_set(mem, bit) \ ++ ({ __typeof (*mem) __oldval, __val; \ ++ __typeof (mem) __memp = (mem); \ ++ __typeof (*mem) __mask = ((__typeof (*mem)) 1 << (bit)); \ ++ \ ++ __val = (*__memp); \ ++ do \ ++ { \ ++ __oldval = __val; \ ++ __val = atomic_compare_and_exchange_val_acq (__memp, \ ++ __oldval | __mask, \ ++ __oldval); \ ++ } \ ++ while (__builtin_expect (__val != __oldval, 0)); \ ++ __oldval & __mask; }) +diff -u -udbrN glibc-2.3.2/sysdeps/ia64/dl-fptr.c glibc-2.3.2-200304020432/sysdeps/ia64/dl-fptr.c +--- glibc-2.3.2/sysdeps/ia64/dl-fptr.c Wed Nov 13 22:41:52 2002 ++++ glibc-2.3.2-200304020432/sysdeps/ia64/dl-fptr.c Mon Mar 3 10:45:09 2003 +@@ -1,5 +1,5 @@ + /* Manage function descriptors. IA-64 version. +- Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1999,2000,2001,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 +diff -u -udbrN glibc-2.3.2/sysdeps/ia64/dl-lookupcfg.h glibc-2.3.2-200304020432/sysdeps/ia64/dl-lookupcfg.h +--- glibc-2.3.2/sysdeps/ia64/dl-lookupcfg.h Wed Jan 30 01:22:50 2002 ++++ glibc-2.3.2-200304020432/sysdeps/ia64/dl-lookupcfg.h Thu Mar 27 02:15:24 2003 +@@ -1,5 +1,5 @@ + /* Configuration of lookup functions. +- Copyright (C) 2000, 2001 Free Software Foundation, Inc. ++ Copyright (C) 2000, 2001, 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 +@@ -23,11 +23,13 @@ + #define ELF_FUNCTION_PTR_IS_SPECIAL + #define DL_UNMAP_IS_SPECIAL + ++/* We do not support copy relocations for IA-64. */ ++#define DL_NO_COPY_RELOCS ++ + /* Forward declaration. */ + struct link_map; + +-extern void *_dl_symbol_address (const struct link_map *map, +- const Elf64_Sym *ref); ++extern void *_dl_symbol_address (struct link_map *map, const Elf64_Sym *ref); + + #define DL_SYMBOL_ADDRESS(map, ref) _dl_symbol_address(map, ref) + +diff -u -udbrN glibc-2.3.2/sysdeps/ia64/dl-machine.h glibc-2.3.2-200304020432/sysdeps/ia64/dl-machine.h +--- glibc-2.3.2/sysdeps/ia64/dl-machine.h Sun Jan 12 09:37:35 2003 ++++ glibc-2.3.2-200304020432/sysdeps/ia64/dl-machine.h Sat Mar 29 20:18:10 2003 +@@ -301,8 +301,10 @@ + "_start:\n" \ + "0: { .mii\n" \ + " .prologue\n" \ +-" .save ar.pfs, r32\n" \ + " .save rp, r0\n" \ ++" .body\n" \ ++" .prologue\n" \ ++" .save ar.pfs, r32\n" \ + " alloc loc0 = ar.pfs, 0, 3, 4, 0\n" \ + " .body\n" \ + " mov r2 = ip\n" \ +@@ -332,9 +334,11 @@ + " .proc _dl_start_user#\n" \ + "_dl_start_user:\n" \ + " .prologue\n" \ +-" .save ar.pfs, r32\n" \ + " .save rp, r0\n" \ + " .body\n" \ ++" .prologue\n" \ ++" .save ar.pfs, r32\n" \ ++" .body\n" \ + " { .mii\n" \ + " /* Save the pointer to the user entry point fptr in loc2. */\n" \ + " mov loc2 = ret0\n" \ +diff -u -udbrN glibc-2.3.2/sysdeps/ia64/dl-symaddr.c glibc-2.3.2-200304020432/sysdeps/ia64/dl-symaddr.c +--- glibc-2.3.2/sysdeps/ia64/dl-symaddr.c Thu Jul 26 01:53:58 2001 ++++ glibc-2.3.2-200304020432/sysdeps/ia64/dl-symaddr.c Mon Mar 3 10:45:09 2003 +@@ -1,5 +1,5 @@ + /* Get the symbol address. IA-64 version. +- Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2000, 2001, 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 +@@ -21,7 +21,7 @@ + #include + + void * +-_dl_symbol_address (const struct link_map *map, const Elf64_Sym *ref) ++_dl_symbol_address (struct link_map *map, const Elf64_Sym *ref) + { + Elf64_Addr value = (map ? map->l_addr : 0) + ref->st_value; + +diff -u -udbrN glibc-2.3.2/sysdeps/ia64/elf/start.S glibc-2.3.2-200304020432/sysdeps/ia64/elf/start.S +--- glibc-2.3.2/sysdeps/ia64/elf/start.S Tue Dec 10 04:41:52 2002 ++++ glibc-2.3.2-200304020432/sysdeps/ia64/elf/start.S Sat Mar 29 20:18:27 2003 +@@ -40,6 +40,9 @@ + .type _start,@function + _start: + .prologue ++ .save rp, r0 ++ .body ++ .prologue + { .mlx + alloc r2 = ar.pfs,0,0,7,0 + movl r3 = FPSR_DEFAULT +@@ -76,8 +79,7 @@ + { .mmi + ld8 out3 = [out3] /* pointer to `init' function descriptor */ + ld8 out4 = [out4] /* pointer to `fini' function descriptor */ +- .save rp, r4 +- mov r4 = r0 /* terminate unwind chain with a NULL return-pointer */ ++ nop 0 + } + .body + { .mib +diff -u -udbrN glibc-2.3.2/sysdeps/ia64/fpu/libm-test-ulps glibc-2.3.2-200304020432/sysdeps/ia64/fpu/libm-test-ulps +--- glibc-2.3.2/sysdeps/ia64/fpu/libm-test-ulps Fri Jun 21 00:06:37 2002 ++++ glibc-2.3.2-200304020432/sysdeps/ia64/fpu/libm-test-ulps Fri Mar 28 00:26:48 2003 +@@ -1,10 +1,5 @@ + # Begin of automatic generation + +-# acos +-Test "acos (0.0625) == 1.50825556499840522843072005474337068": +-ildouble: 622 +-ldouble: 622 +- + # cacos + Test "Imaginary part of: cacos (0.75 + 1.25 i) == 1.11752014915610270578240049553777969 - 1.13239363160530819522266333696834467 i": + float: 1 +@@ -84,7 +79,7 @@ + idouble: 1 + + # ccos +-Test "Imaginary part of: ccos (-2 - 3 i) == -4.1896256909688072301 - 9.1092278937553365979 i": ++Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": + float: 1 + ifloat: 1 + ildouble: 1 +@@ -99,7 +94,7 @@ + ldouble: 1 + + # ccosh +-Test "Imaginary part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Imaginary part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + double: 1 + float: 1 + idouble: 1 +@@ -122,8 +117,6 @@ + Test "Real part of: cexp (0.75 + 1.25 i) == 0.667537446429131586942201977015932112 + 2.00900045494094876258347228145863909 i": + float: 1 + ifloat: 1 +-ildouble: 202 +-ldouble: 202 + Test "Imaginary part of: cexp (0.75 + 1.25 i) == 0.667537446429131586942201977015932112 + 2.00900045494094876258347228145863909 i": + ildouble: 1 + ldouble: 1 +@@ -146,7 +139,7 @@ + float: 1 + idouble: 1 + ifloat: 1 +-Test "Imaginary part of: clog10 (-2 - 3 i) == 0.5569716761534183846 - 0.9375544629863747085 i": ++Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": + double: 1 + idouble: 1 + ildouble: 1 +@@ -223,6 +216,9 @@ + ifloat: 1 + + # cos ++Test "cos (0.80190127184058835) == 0.69534156199418473": ++double: 1 ++idouble: 1 + Test "cos (M_PI_6l * 2.0) == 0.5": + double: 1 + float: 1 +@@ -247,8 +243,6 @@ + Test "Real part of: cpow (0.75 + 1.25 i, 0.0 + 1.0 i) == 0.331825439177608832276067945276730566 + 0.131338600281188544930936345230903032 i": + float: 1 + ifloat: 1 +-ildouble: 587 +-ldouble: 587 + Test "Imaginary part of: cpow (0.75 + 1.25 i, 0.0 + 1.0 i) == 0.331825439177608832276067945276730566 + 0.131338600281188544930936345230903032 i": + float: 1 + ifloat: 1 +@@ -259,8 +253,8 @@ + float: 4 + idouble: 1 + ifloat: 4 +-ildouble: 768 +-ldouble: 768 ++ildouble: 1 ++ldouble: 1 + Test "Imaginary part of: cpow (0.75 + 1.25 i, 0.75 + 1.25 i) == 0.117506293914473555420279832210420483 + 0.346552747708338676483025352060418001 i": + ildouble: 1 + ldouble: 1 +@@ -272,8 +266,8 @@ + float: 3 + idouble: 2 + ifloat: 3 +-ildouble: 370 +-ldouble: 370 ++ildouble: 3 ++ldouble: 3 + Test "Real part of: cpow (2 + 0 i, 10 + 0 i) == 1024.0 + 0.0 i": + ildouble: 1 + ldouble: 1 +@@ -308,10 +302,10 @@ + ifloat: 1 + + # csinh +-Test "Real part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i": ++Test "Real part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": + double: 1 + idouble: 1 +-Test "Imaginary part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i": ++Test "Imaginary part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": + double: 1 + float: 1 + idouble: 1 +@@ -336,14 +330,16 @@ + ifloat: 1 + + # ctan +-Test "Real part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i": ++Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": + double: 1 + idouble: 1 +-ildouble: 436 +-ldouble: 436 +-Test "Imaginary part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i": ++ildouble: 2 ++ldouble: 2 ++Test "Imaginary part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": + float: 1 + ifloat: 1 ++ildouble: 1 ++ldouble: 1 + Test "Real part of: ctan (0.75 + 1.25 i) == 0.160807785916206426725166058173438663 + 0.975363285031235646193581759755216379 i": + ildouble: 1 + ldouble: 1 +@@ -354,10 +350,10 @@ + ifloat: 1 + + # ctanh +-Test "Real part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i": ++Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": + ildouble: 1 + ldouble: 1 +-Test "Imaginary part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i": ++Test "Imaginary part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": + float: 1 + ifloat: 1 + ildouble: 24 +@@ -584,12 +580,12 @@ + Test "lgamma (-0.5) == log(2*sqrt(pi))": + ildouble: 1 + ldouble: 1 +-Test "lgamma (0.7) == 0.26086724653166651439": ++Test "lgamma (0.7) == 0.260867246531666514385732417016759578": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +-Test "lgamma (1.2) == -0.853740900033158497197e-1": ++Test "lgamma (1.2) == -0.853740900033158497197028392998854470e-1": + double: 1 + float: 2 + idouble: 1 +@@ -610,6 +606,9 @@ + ldouble: 1 + + # sincos ++Test "sincos (0.80190127184058835, &sin_res, &cos_res) puts 0.69534156199418473 in cos_res": ++double: 1 ++idouble: 1 + Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res": + double: 1 + float: 1 +@@ -646,7 +645,7 @@ + Test "tgamma (0.5) == sqrt (pi)": + float: 1 + ifloat: 1 +-Test "tgamma (0.7) == 1.29805533264755778568": ++Test "tgamma (0.7) == 1.29805533264755778568117117915281162": + double: 1 + float: 1 + idouble: 1 +@@ -794,10 +793,6 @@ + idouble: 1 + + # Maximal error of functions: +-Function: "acos": +-ildouble: 622 +-ldouble: 622 +- + Function: Imaginary part of "cacos": + float: 1 + ifloat: 1 +@@ -889,8 +884,6 @@ + Function: Real part of "cexp": + float: 1 + ifloat: 1 +-ildouble: 202 +-ldouble: 202 + + Function: Imaginary part of "cexp": + float: 1 +@@ -933,8 +926,8 @@ + float: 5 + idouble: 2 + ifloat: 5 +-ildouble: 768 +-ldouble: 768 ++ildouble: 3 ++ldouble: 3 + + Function: Imaginary part of "cpow": + double: 2 +@@ -977,14 +970,16 @@ + Function: Real part of "ctan": + double: 1 + idouble: 1 +-ildouble: 436 +-ldouble: 436 ++ildouble: 2 ++ldouble: 2 + + Function: Imaginary part of "ctan": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 ++ildouble: 1 ++ldouble: 1 + + Function: Real part of "ctanh": + double: 1 +diff -u -udbrN glibc-2.3.2/sysdeps/ieee754/dbl-64/dbl2mpn.c glibc-2.3.2-200304020432/sysdeps/ieee754/dbl-64/dbl2mpn.c +--- glibc-2.3.2/sysdeps/ieee754/dbl-64/dbl2mpn.c Sat Jul 7 21:21:24 2001 ++++ glibc-2.3.2-200304020432/sysdeps/ieee754/dbl-64/dbl2mpn.c Fri Mar 14 04:59:34 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc. ++/* Copyright (C) 1993,1994,1995,1996,1997,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 +@@ -45,7 +45,7 @@ + #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" +@@ -101,7 +101,8 @@ + } + else + /* Add the implicit leading one bit for a normalized number. */ +- res_ptr[N - 1] |= 1L << (DBL_MANT_DIG - 1 - ((N - 1) * BITS_PER_MP_LIMB)); ++ res_ptr[N - 1] |= (mp_limb_t) 1 << (DBL_MANT_DIG - 1 ++ - ((N - 1) * BITS_PER_MP_LIMB)); + + return N; + } +diff -u -udbrN glibc-2.3.2/sysdeps/ieee754/dbl-64/mpn2dbl.c glibc-2.3.2-200304020432/sysdeps/ieee754/dbl-64/mpn2dbl.c +--- glibc-2.3.2/sysdeps/ieee754/dbl-64/mpn2dbl.c Sat Jul 7 21:21:24 2001 ++++ glibc-2.3.2-200304020432/sysdeps/ieee754/dbl-64/mpn2dbl.c Fri Mar 14 04:59:34 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. ++/* Copyright (C) 1995,1996,1997,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 +@@ -34,10 +34,12 @@ + u.ieee.exponent = expt + IEEE754_DOUBLE_BIAS; + #if BITS_PER_MP_LIMB == 32 + u.ieee.mantissa1 = frac_ptr[0]; +- u.ieee.mantissa0 = frac_ptr[1] & ((1 << (DBL_MANT_DIG - 32)) - 1); ++ u.ieee.mantissa0 = frac_ptr[1] & (((mp_limb_t) 1 ++ << (DBL_MANT_DIG - 32)) - 1); + #elif BITS_PER_MP_LIMB == 64 +- u.ieee.mantissa1 = frac_ptr[0] & ((1L << 32) - 1); +- u.ieee.mantissa0 = (frac_ptr[0] >> 32) & ((1 << (DBL_MANT_DIG - 32)) - 1); ++ u.ieee.mantissa1 = frac_ptr[0] & (((mp_limb_t) 1 << 32) - 1); ++ u.ieee.mantissa0 = (frac_ptr[0] >> 32) & (((mp_limb_t) 1 ++ << (DBL_MANT_DIG - 32)) - 1); + #else + #error "mp_limb size " BITS_PER_MP_LIMB "not accounted for" + #endif +diff -u -udbrN glibc-2.3.2/sysdeps/ieee754/flt-32/mpn2flt.c glibc-2.3.2-200304020432/sysdeps/ieee754/flt-32/mpn2flt.c +--- glibc-2.3.2/sysdeps/ieee754/flt-32/mpn2flt.c Sat Jul 7 21:21:24 2001 ++++ glibc-2.3.2-200304020432/sysdeps/ieee754/flt-32/mpn2flt.c Fri Mar 14 04:59:34 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1995, 1997 Free Software Foundation, Inc. ++/* Copyright (C) 1995,1997,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 +@@ -33,7 +33,7 @@ + u.ieee.negative = sign; + u.ieee.exponent = expt + IEEE754_FLOAT_BIAS; + #if BITS_PER_MP_LIMB > FLT_MANT_DIG +- u.ieee.mantissa = frac_ptr[0] & ((1 << FLT_MANT_DIG) - 1); ++ u.ieee.mantissa = frac_ptr[0] & (((mp_limb_t) 1 << FLT_MANT_DIG) - 1); + #else + #error "mp_limb size " BITS_PER_MP_LIMB "not accounted for" + #endif +diff -u -udbrN glibc-2.3.2/sysdeps/ieee754/ldbl-128/ldbl2mpn.c glibc-2.3.2-200304020432/sysdeps/ieee754/ldbl-128/ldbl2mpn.c +--- glibc-2.3.2/sysdeps/ieee754/ldbl-128/ldbl2mpn.c Thu Jul 11 05:09:36 2002 ++++ glibc-2.3.2-200304020432/sysdeps/ieee754/ldbl-128/ldbl2mpn.c Fri Mar 14 04:59:34 2003 +@@ -1,4 +1,5 @@ +-/* Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. ++/* Copyright (C) 1995,1996,1997,1998,1999,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 +@@ -49,8 +50,8 @@ + #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.mantissa2 << 32) | u.ieee.mantissa3; +- res_ptr[1] = ((unsigned long int) u.ieee.mantissa0 << 32) | u.ieee.mantissa1; ++ res_ptr[0] = ((mp_limb_t) u.ieee.mantissa2 << 32) | u.ieee.mantissa3; ++ res_ptr[1] = ((mp_limb_t) u.ieee.mantissa0 << 32) | u.ieee.mantissa1; + #define N 2 + #else + #error "mp_limb size " BITS_PER_MP_LIMB "not accounted for" +@@ -133,7 +134,8 @@ + } + else + /* Add the implicit leading one bit for a normalized number. */ +- res_ptr[N - 1] |= 1L << (LDBL_MANT_DIG - 1 - ((N - 1) * BITS_PER_MP_LIMB)); ++ res_ptr[N - 1] |= (mp_limb_t) 1 << (LDBL_MANT_DIG - 1 ++ - ((N - 1) * BITS_PER_MP_LIMB)); + + return N; + } +diff -u -udbrN glibc-2.3.2/sysdeps/ieee754/ldbl-128/mpn2ldbl.c glibc-2.3.2-200304020432/sysdeps/ieee754/ldbl-128/mpn2ldbl.c +--- glibc-2.3.2/sysdeps/ieee754/ldbl-128/mpn2ldbl.c Sat Jul 7 21:21:24 2001 ++++ glibc-2.3.2-200304020432/sysdeps/ieee754/ldbl-128/mpn2ldbl.c Fri Mar 14 04:59:34 2003 +@@ -1,4 +1,5 @@ +-/* Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. ++/* Copyright (C) 1995,1996,1997,1998,1999,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 +@@ -37,12 +38,14 @@ + u.ieee.mantissa3 = frac_ptr[0]; + u.ieee.mantissa2 = frac_ptr[1]; + u.ieee.mantissa1 = frac_ptr[2]; +- u.ieee.mantissa0 = frac_ptr[3] & ((1 << (LDBL_MANT_DIG - 96)) - 1); ++ u.ieee.mantissa0 = frac_ptr[3] & (((mp_limb_t) 1 ++ << (LDBL_MANT_DIG - 96)) - 1); + #elif BITS_PER_MP_LIMB == 64 +- u.ieee.mantissa3 = frac_ptr[0] & ((1L << 32) - 1); ++ u.ieee.mantissa3 = frac_ptr[0] & (((mp_limb_t) 1 << 32) - 1); + u.ieee.mantissa2 = frac_ptr[0] >> 32; +- u.ieee.mantissa1 = frac_ptr[1] & ((1L << 32) - 1); +- u.ieee.mantissa0 = (frac_ptr[1] >> 32) & ((1 << (LDBL_MANT_DIG - 96)) - 1); ++ u.ieee.mantissa1 = frac_ptr[1] & (((mp_limb_t) 1 << 32) - 1); ++ u.ieee.mantissa0 = (frac_ptr[1] >> 32) & (((mp_limb_t) 1 ++ << (LDBL_MANT_DIG - 96)) - 1); + #else + #error "mp_limb size " BITS_PER_MP_LIMB "not accounted for" + #endif +diff -u -udbrN glibc-2.3.2/sysdeps/ieee754/ldbl-96/ldbl2mpn.c glibc-2.3.2-200304020432/sysdeps/ieee754/ldbl-96/ldbl2mpn.c +--- glibc-2.3.2/sysdeps/ieee754/ldbl-96/ldbl2mpn.c Sat Jul 7 21:21:24 2001 ++++ glibc-2.3.2-200304020432/sysdeps/ieee754/ldbl-96/ldbl2mpn.c Fri Mar 14 04:59:34 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. ++/* Copyright (C) 1995,1996,1997,1998,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 +@@ -47,7 +47,7 @@ + #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" +diff -u -udbrN glibc-2.3.2/sysdeps/ieee754/ldbl-96/mpn2ldbl.c glibc-2.3.2-200304020432/sysdeps/ieee754/ldbl-96/mpn2ldbl.c +--- glibc-2.3.2/sysdeps/ieee754/ldbl-96/mpn2ldbl.c Sat Jul 7 21:21:24 2001 ++++ glibc-2.3.2-200304020432/sysdeps/ieee754/ldbl-96/mpn2ldbl.c Fri Mar 14 04:59:34 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. ++/* Copyright (C) 1995,1996,1997,1998,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 +@@ -37,7 +37,7 @@ + u.ieee.mantissa1 = frac_ptr[0]; + u.ieee.mantissa0 = frac_ptr[1]; + #elif BITS_PER_MP_LIMB == 64 +- u.ieee.mantissa1 = frac_ptr[0] & ((1L << 32) - 1); ++ u.ieee.mantissa1 = frac_ptr[0] & (((mp_limb_t) 1 << 32) - 1); + u.ieee.mantissa0 = frac_ptr[0] >> 32; + #else + #error "mp_limb size " BITS_PER_MP_LIMB "not accounted for" +diff -u -udbrN glibc-2.3.2/sysdeps/m68k/dl-machine.h glibc-2.3.2-200304020432/sysdeps/m68k/dl-machine.h +--- glibc-2.3.2/sysdeps/m68k/dl-machine.h Sun Jan 26 22:07:32 2003 ++++ glibc-2.3.2-200304020432/sysdeps/m68k/dl-machine.h Sat Mar 1 16:33:11 2003 +@@ -1,5 +1,5 @@ + /* Machine-dependent ELF dynamic relocation inline functions. m68k version. +- Copyright (C) 1996-2001, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1996-2001, 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 +@@ -158,7 +158,7 @@ + | Save the user entry point address in %a4.\n\ + move.l %d0, %a4\n\ + | Remember the highest stack address.\n\ +- lea __libc_stack_end(%pc), %a0\n\ ++ move.l __libc_stack_end@GOTPC(%pc), %a0\n\ + move.l %sp, (%a0)\n\ + | See if we were run as a command with the executable file\n\ + | name as an extra leading argument.\n\ +diff -u -udbrN glibc-2.3.2/sysdeps/m68k/fpu/libm-test-ulps glibc-2.3.2-200304020432/sysdeps/m68k/fpu/libm-test-ulps +--- glibc-2.3.2/sysdeps/m68k/fpu/libm-test-ulps Sun Jan 12 08:54:07 2003 ++++ glibc-2.3.2-200304020432/sysdeps/m68k/fpu/libm-test-ulps Sat Mar 22 22:17:47 2003 +@@ -119,10 +119,10 @@ + ldouble: 1 + + # ccos +-Test "Real part of: ccos (-2 - 3 i) == -4.1896256909688072301 - 9.1092278937553365979 i": ++Test "Real part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: ccos (-2 - 3 i) == -4.1896256909688072301 - 9.1092278937553365979 i": ++Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": + float: 1 + ifloat: 1 + ildouble: 1 +@@ -139,10 +139,10 @@ + ldouble: 1 + + # ccosh +-Test "Real part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Real part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Imaginary part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 + ildouble: 1 +@@ -189,10 +189,10 @@ + Test "Imaginary part of: clog10 (-0 - inf i) == inf - pi/2*log10(e) i": + float: 1 + ifloat: 1 +-Test "Real part of: clog10 (-2 - 3 i) == 0.5569716761534183846 - 0.9375544629863747085 i": ++Test "Real part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": + ildouble: 1 + ldouble: 1 +-Test "Imaginary part of: clog10 (-2 - 3 i) == 0.5569716761534183846 - 0.9375544629863747085 i": ++Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": + ildouble: 1 + ldouble: 1 + Test "Imaginary part of: clog10 (-3 + inf i) == inf + pi/2*log10(e) i": +@@ -336,10 +336,10 @@ + ldouble: 1 + + # csin +-Test "Real part of: csin (-2 - 3 i) == -9.1544991469114295734 + 4.1689069599665643507 i": ++Test "Real part of: csin (-2 - 3 i) == -9.15449914691142957346729954460983256 + 4.16890695996656435075481305885375484 i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: csin (-2 - 3 i) == -9.1544991469114295734 + 4.1689069599665643507 i": ++Test "Imaginary part of: csin (-2 - 3 i) == -9.15449914691142957346729954460983256 + 4.16890695996656435075481305885375484 i": + float: 1 + ifloat: 1 + Test "Real part of: csin (0.75 + 1.25 i) == 1.28722291002649188575873510790565441 + 1.17210635989270256101081285116138863 i": +@@ -352,10 +352,10 @@ + ifloat: 1 + + # csinh +-Test "Real part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i": ++Test "Real part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i": ++Test "Imaginary part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": + float: 1 + ifloat: 1 + ildouble: 2 +@@ -370,10 +370,10 @@ + ifloat: 1 + + # ctan +-Test "Real part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i": ++Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": + ildouble: 439 + ldouble: 439 +-Test "Imaginary part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i": ++Test "Imaginary part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": + ildouble: 1 + ldouble: 1 + Test "Real part of: ctan (0.75 + 1.25 i) == 0.160807785916206426725166058173438663 + 0.975363285031235646193581759755216379 i": +@@ -384,10 +384,10 @@ + ldouble: 2 + + # ctanh +-Test "Real part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i": ++Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": + ildouble: 2 + ldouble: 2 +-Test "Imaginary part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i": ++Test "Imaginary part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": + ildouble: 25 + ldouble: 25 + Test "Imaginary part of: ctanh (0 + pi/4 i) == 0.0 + 1.0 i": +@@ -599,12 +599,12 @@ + Test "lgamma (0.5) == log(sqrt(pi))": + ildouble: 1 + ldouble: 1 +-Test "lgamma (0.7) == 0.26086724653166651439": ++Test "lgamma (0.7) == 0.260867246531666514385732417016759578": + float: 1 + ifloat: 1 + ildouble: 1 + ldouble: 1 +-Test "lgamma (1.2) == -0.853740900033158497197e-1": ++Test "lgamma (1.2) == -0.853740900033158497197028392998854470e-1": + double: 1 + float: 2 + idouble: 1 +@@ -698,7 +698,7 @@ + ifloat: 1 + ildouble: 1 + ldouble: 1 +-Test "tgamma (0.7) == 1.29805533264755778568": ++Test "tgamma (0.7) == 1.29805533264755778568117117915281162": + double: 1 + float: 1 + idouble: 1 +diff -u -udbrN glibc-2.3.2/sysdeps/m68k/m68020/atomicity.h glibc-2.3.2-200304020432/sysdeps/m68k/m68020/atomicity.h +--- glibc-2.3.2/sysdeps/m68k/m68020/atomicity.h Wed Aug 15 18:14:06 2001 ++++ glibc-2.3.2-200304020432/sysdeps/m68k/m68020/atomicity.h Thu Jan 1 01:00:00 1970 +@@ -1,64 +0,0 @@ +-/* Low-level functions for atomic operations. m680x0 version, x >= 2. +- Copyright (C) 1997 Free Software Foundation, Inc. +- Contributed by Andreas Schwab . +- 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 _ATOMICITY_H +-#define _ATOMICITY_H 1 +- +-#include +- +- +-static inline int +-__attribute__ ((unused)) +-exchange_and_add (volatile uint32_t *mem, int val) +-{ +- register int result = *mem; +- register int temp; +- __asm__ __volatile__ ("1: move%.l %0,%1;" +- " add%.l %2,%1;" +- " cas%.l %0,%1,%3;" +- " jbne 1b" +- : "=d" (result), "=&d" (temp) +- : "d" (val), "m" (*mem), "0" (result) : "memory"); +- return result; +-} +- +-static inline void +-__attribute__ ((unused)) +-atomic_add (volatile uint32_t *mem, int val) +-{ +- /* XXX Use cas here as well? */ +- __asm__ __volatile__ ("add%.l %0,%1" +- : : "id" (val), "m" (*mem) : "memory"); +-} +- +-static inline int +-__attribute__ ((unused)) +-compare_and_swap (volatile long int *p, long int oldval, long int newval) +-{ +- char ret; +- long int readval; +- +- __asm__ __volatile__ ("cas%.l %2,%3,%1; seq %0" +- : "=dm" (ret), "=m" (*p), "=d" (readval) +- : "d" (newval), "m" (*p), "2" (oldval)); +- return ret; +-} +- +-#endif /* atomicity.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/m68k/m68020/bits/atomic.h glibc-2.3.2-200304020432/sysdeps/m68k/m68020/bits/atomic.h +--- glibc-2.3.2/sysdeps/m68k/m68020/bits/atomic.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/m68k/m68020/bits/atomic.h Mon Mar 31 18:01:09 2003 +@@ -0,0 +1,261 @@ ++/* Copyright (C) 2003 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Andreas Schwab , 2003. ++ ++ 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 ++ ++ ++typedef int8_t atomic8_t; ++typedef uint8_t uatomic8_t; ++typedef int_fast8_t atomic_fast8_t; ++typedef uint_fast8_t uatomic_fast8_t; ++ ++typedef int16_t atomic16_t; ++typedef uint16_t uatomic16_t; ++typedef int_fast16_t atomic_fast16_t; ++typedef uint_fast16_t uatomic_fast16_t; ++ ++typedef int32_t atomic32_t; ++typedef uint32_t uatomic32_t; ++typedef int_fast32_t atomic_fast32_t; ++typedef uint_fast32_t uatomic_fast32_t; ++ ++typedef int64_t atomic64_t; ++typedef uint64_t uatomic64_t; ++typedef int_fast64_t atomic_fast64_t; ++typedef uint_fast64_t uatomic_fast64_t; ++ ++typedef intptr_t atomicptr_t; ++typedef uintptr_t uatomicptr_t; ++typedef intmax_t atomic_max_t; ++typedef uintmax_t uatomic_max_t; ++ ++#define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \ ++ ({ __typeof (*(mem)) __ret; \ ++ __asm __volatile ("cas%.b %0,%2,%1" \ ++ : "=d" (__ret), "=m" (*(mem)) \ ++ : "d" (newval), "m" (*(mem)), "0" (oldval)); \ ++ __ret; }) ++ ++#define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \ ++ ({ __typeof (*(mem)) __ret; \ ++ __asm __volatile ("cas%.w %0,%2,%1" \ ++ : "=d" (__ret), "=m" (*(mem)) \ ++ : "d" (newval), "m" (*(mem)), "0" (oldval)); \ ++ __ret; }) ++ ++#define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \ ++ ({ __typeof (*(mem)) __ret; \ ++ __asm __volatile ("cas%.l %0,%2,%1" \ ++ : "=d" (__ret), "=m" (*(mem)) \ ++ : "d" (newval), "m" (*(mem)), "0" (oldval)); \ ++ __ret; }) ++ ++# define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \ ++ ({ __typeof (*(mem)) __ret; \ ++ __typeof (mem) __memp = (mem); \ ++ __asm __volatile ("cas2%.l %0:%R0,%1:%R1,(%2):(%3)" \ ++ : "=d" (__ret) \ ++ : "d" (newval), "r" (__memp), \ ++ "r" ((char *) __memp + 4), "0" (oldval) \ ++ : "memory"); \ ++ __ret; }) ++ ++#define atomic_exchange(mem, newvalue) \ ++ ({ __typeof (*(mem)) __result = *(mem); \ ++ if (sizeof (*(mem)) == 1) \ ++ __asm __volatile ("1: cas%.b %0,%2,%1;" \ ++ " jbne 1b" \ ++ : "=d" (__result), "=m" (*(mem)) \ ++ : "d" (newvalue), "m" (*(mem)), "0" (__result)); \ ++ else if (sizeof (*(mem)) == 2) \ ++ __asm __volatile ("1: cas%.w %0,%2,%1;" \ ++ " jbne 1b" \ ++ : "=d" (__result), "=m" (*(mem)) \ ++ : "d" (newvalue), "m" (*(mem)), "0" (__result)); \ ++ else if (sizeof (*(mem)) == 4) \ ++ __asm __volatile ("1: cas%.l %0,%2,%1;" \ ++ " jbne 1b" \ ++ : "=d" (__result), "=m" (*(mem)) \ ++ : "d" (newvalue), "m" (*(mem)), "0" (__result)); \ ++ else \ ++ { \ ++ __typeof (mem) __memp = (mem); \ ++ __asm __volatile ("1: cas2%.l %0:%R0,%1:%R1,(%2):(%3);" \ ++ " jbne 1b" \ ++ : "=d" (__result) \ ++ : "d" (newvalue), "r" (__memp), \ ++ "r" ((char *) __memp + 4), "0" (__result) \ ++ : "memory"); \ ++ } \ ++ __result; }) ++ ++#define atomic_exchange_and_add(mem, value) \ ++ ({ __typeof (*(mem)) __result = *(mem); \ ++ __typeof (*(mem)) __temp; \ ++ if (sizeof (*(mem)) == 1) \ ++ __asm __volatile ("1: move%.b %0,%2;" \ ++ " add%.b %3,%2;" \ ++ " cas%.b %0,%2,%1;" \ ++ " jbne 1b" \ ++ : "=d" (__result), "=m" (*(mem)), \ ++ "=&d" (__temp) \ ++ : "d" (value), "1" (*(mem)), "0" (__result)); \ ++ else if (sizeof (*(mem)) == 2) \ ++ __asm __volatile ("1: move%.w %0,%2;" \ ++ " add%.w %3,%2;" \ ++ " cas%.w %0,%2,%1;" \ ++ " jbne 1b" \ ++ : "=d" (__result), "=m" (*(mem)), \ ++ "=&d" (__temp) \ ++ : "d" (value), "1" (*(mem)), "0" (__result)); \ ++ else if (sizeof (*(mem)) == 4) \ ++ __asm __volatile ("1: move%.l %0,%2;" \ ++ " add%.l %3,%2;" \ ++ " cas%.l %0,%2,%1;" \ ++ " jbne 1b" \ ++ : "=d" (__result), "=m" (*(mem)), \ ++ "=&d" (__temp) \ ++ : "d" (value), "1" (*(mem)), "0" (__result)); \ ++ else \ ++ { \ ++ __typeof (mem) __memp = (mem); \ ++ __asm __volatile ("1: move%.l %0,%1;" \ ++ " move%.l %R0,%R1;" \ ++ " add%.l %2,%1;" \ ++ " addx%.l %R2,%R1;" \ ++ " cas2%.l %0:%R0,%1:%R1,(%3):(%4);" \ ++ " jbne 1b" \ ++ : "=d" (__result), "=&d" (__temp) \ ++ : "d" (value), "r" (__memp), \ ++ "r" ((char *) __memp + 4), "0" (__result) \ ++ : "memory"); \ ++ } \ ++ __result; }) ++ ++#define atomic_add(mem, value) \ ++ (void) ({ if (sizeof (*(mem)) == 1) \ ++ __asm __volatile ("add%.b %1,%0" \ ++ : "=m" (*(mem)) \ ++ : "id" (value), "0" (*(mem))); \ ++ else if (sizeof (*(mem)) == 2) \ ++ __asm __volatile ("add%.w %1,%0" \ ++ : "=m" (*(mem)) \ ++ : "id" (value), "0" (*(mem))); \ ++ else if (sizeof (*(mem)) == 4) \ ++ __asm __volatile ("add%.l %1,%0" \ ++ : "=m" (*(mem)) \ ++ : "id" (value), "0" (*(mem))); \ ++ else \ ++ { \ ++ __typeof (mem) __memp = (mem); \ ++ __typeof (*(mem)) __oldval = *__memp; \ ++ __typeof (*(mem)) __temp; \ ++ __asm __volatile ("1: move%.l %0,%1;" \ ++ " move%.l %R0,%R1;" \ ++ " add%.l %2,%1;" \ ++ " addx%.l %R2,%R1;" \ ++ " cas2%.l %0:%R0,%1:%R1,(%3):(%4);" \ ++ " jbne 1b" \ ++ : "=d" (__oldval), "=&d" (__temp) \ ++ : "d" (value), "r" (__memp), \ ++ "r" ((char *) __memp + 4), "0" (__oldval) \ ++ : "memory"); \ ++ } \ ++ }) ++ ++#define atomic_increment_and_test(mem) \ ++ ({ char __result; \ ++ if (sizeof (*(mem)) == 1) \ ++ __asm __volatile ("addq%.b %#1,%1; seq %0" \ ++ : "=dm" (__result), "=m" (*(mem)) \ ++ : "1" (*(mem))); \ ++ else if (sizeof (*(mem)) == 2) \ ++ __asm __volatile ("addq%.w %#1,%1; seq %0" \ ++ : "=dm" (__result), "=m" (*(mem)) \ ++ : "1" (*(mem))); \ ++ else if (sizeof (*(mem)) == 4) \ ++ __asm __volatile ("addq%.l %#1,%1; seq %0" \ ++ : "=dm" (__result), "=m" (*(mem)) \ ++ : "1" (*(mem))); \ ++ else \ ++ { \ ++ __typeof (mem) __memp = (mem); \ ++ __typeof (*(mem)) __oldval = *__memp; \ ++ __typeof (*(mem)) __temp; \ ++ __asm __volatile ("1: move%.l %1,%2;" \ ++ " move%.l %R1,%R2;" \ ++ " addq%.l %#1,%2;" \ ++ " addx%.l %5,%R2;" \ ++ " seq %0;" \ ++ " cas2%.l %1:%R1,%2:%R2,(%3):(%4);" \ ++ " jbne 1b" \ ++ : "=&dm" (__result), "=d" (__oldval), \ ++ "=&d" (__temp) \ ++ : "r" (__memp), "r" ((char *) __memp + 4), \ ++ "d" (0), "1" (__oldval) \ ++ : "memory"); \ ++ } \ ++ __result; }) ++ ++#define atomic_decrement_and_test(mem) \ ++ ({ char __result; \ ++ if (sizeof (*(mem)) == 1) \ ++ __asm __volatile ("subq%.b %#1,%1; seq %0" \ ++ : "=dm" (__result), "=m" (*(mem)) \ ++ : "1" (*(mem))); \ ++ else if (sizeof (*(mem)) == 2) \ ++ __asm __volatile ("subq%.w %#1,%1; seq %0" \ ++ : "=dm" (__result), "=m" (*(mem)) \ ++ : "1" (*(mem))); \ ++ else if (sizeof (*(mem)) == 4) \ ++ __asm __volatile ("subq%.l %#1,%1; seq %0" \ ++ : "=dm" (__result), "=m" (*(mem)) \ ++ : "1" (*(mem))); \ ++ else \ ++ { \ ++ __typeof (mem) __memp = (mem); \ ++ __typeof (*(mem)) __oldval = *__memp; \ ++ __typeof (*(mem)) __temp; \ ++ __asm __volatile ("1: move%.l %1,%2;" \ ++ " move%.l %R1,%R2;" \ ++ " subq%.l %#1,%2;" \ ++ " subx%.l %5,%R2;" \ ++ " seq %0;" \ ++ " cas2%.l %1:%R1,%2:%R2,(%3):(%4);" \ ++ " jbne 1b" \ ++ : "=&dm" (__result), "=d" (__oldval), \ ++ "=&d" (__temp) \ ++ : "r" (__memp), "r" ((char *) __memp + 4), \ ++ "d" (0), "1" (__oldval) \ ++ : "memory"); \ ++ } \ ++ __result; }) ++ ++#define atomic_bit_set(mem, bit) \ ++ __asm __volatile ("bfset %0{%1,#1}" \ ++ : "=m" (*(mem)) \ ++ : "di" (sizeof (*(mem)) * 8 - (bit) - 1), "m" (*(mem))) ++ ++#define atomic_bit_test_set(mem, bit) \ ++ ({ char __result; \ ++ __asm __volatile ("bfset %1{%2,#1}; sne %0" \ ++ : "=dm" (__result), "=m" (*(mem)) \ ++ : "di" (sizeof (*(mem)) * 8 - (bit) - 1), \ ++ "m" (*(mem))); \ ++ __result; }) +diff -u -udbrN glibc-2.3.2/sysdeps/mips/Implies glibc-2.3.2-200304020432/sysdeps/mips/Implies +--- glibc-2.3.2/sysdeps/mips/Implies Sat Jan 29 08:28:21 2000 ++++ glibc-2.3.2-200304020432/sysdeps/mips/Implies Sat Mar 29 09:15:28 2003 +@@ -1,4 +1,3 @@ +-wordsize-32 + # MIPS uses IEEE 754 floating point. + ieee754/flt-32 + ieee754/dbl-64 +diff -u -udbrN glibc-2.3.2/sysdeps/mips/add_n.S glibc-2.3.2-200304020432/sysdeps/mips/add_n.S +--- glibc-2.3.2/sysdeps/mips/add_n.S Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/add_n.S Fri Mar 14 04:59:37 2003 +@@ -1,7 +1,7 @@ + /* MIPS2 __mpn_add_n -- Add two limb vectors of the same length > 0 and + store sum in a third limb vector. + +-Copyright (C) 1995, 2000 Free Software Foundation, Inc. ++Copyright (C) 1995, 2000, 2002, 2003 Free Software Foundation, Inc. + + This file is part of the GNU MP Library. + +@@ -43,12 +43,12 @@ + + addiu $7,$7,-1 + and $9,$7,4-1 /* number of limbs in first loop */ +- beq $9,$0,.L0 /* if multiple of 4 limbs, skip first loop */ ++ beq $9,$0,L(L0) /* if multiple of 4 limbs, skip first loop */ + move $2,$0 + + subu $7,$7,$9 + +-.Loop0: addiu $9,$9,-1 ++L(Loop0): addiu $9,$9,-1 + lw $12,4($5) + addu $11,$11,$2 + lw $13,4($6) +@@ -62,13 +62,13 @@ + addiu $6,$6,4 + move $10,$12 + move $11,$13 +- bne $9,$0,.Loop0 ++ bne $9,$0,L(Loop0) + addiu $4,$4,4 + +-.L0: beq $7,$0,.Lend ++L(L0): beq $7,$0,L(end) + nop + +-.Loop: addiu $7,$7,-4 ++L(Loop): addiu $7,$7,-4 + + lw $12,4($5) + addu $11,$11,$2 +@@ -109,10 +109,10 @@ + addiu $5,$5,16 + addiu $6,$6,16 + +- bne $7,$0,.Loop ++ bne $7,$0,L(Loop) + addiu $4,$4,16 + +-.Lend: addu $11,$11,$2 ++L(end): addu $11,$11,$2 + sltu $8,$11,$2 + addu $11,$10,$11 + sltu $2,$11,$10 +diff -u -udbrN glibc-2.3.2/sysdeps/mips/addmul_1.S glibc-2.3.2-200304020432/sysdeps/mips/addmul_1.S +--- glibc-2.3.2/sysdeps/mips/addmul_1.S Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/addmul_1.S Fri Mar 14 04:59:37 2003 +@@ -1,7 +1,7 @@ + /* MIPS __mpn_addmul_1 -- Multiply a limb vector with a single limb and + add the product to a second limb vector. + +-Copyright (C) 1995, 2000 Free Software Foundation, Inc. ++Copyright (C) 1995, 2000, 2002, 2003 Free Software Foundation, Inc. + + This file is part of the GNU MP Library. + +@@ -46,14 +46,14 @@ + multu $8,$7 + + addiu $6,$6,-1 +- beq $6,$0,$LC0 ++ beq $6,$0,L(LC0) + move $2,$0 /* zero cy2 */ + + addiu $6,$6,-1 +- beq $6,$0,$LC1 ++ beq $6,$0,L(LC1) + lw $8,0($5) /* load new s1 limb as early as possible */ + +-Loop: lw $10,0($4) ++L(Loop): lw $10,0($4) + mflo $3 + mfhi $9 + addiu $5,$5,4 +@@ -67,11 +67,11 @@ + addu $2,$2,$10 + sw $3,0($4) + addiu $4,$4,4 +- bne $6,$0,Loop /* should be "bnel" */ ++ bne $6,$0,L(Loop) /* should be "bnel" */ + addu $2,$9,$2 /* add high product limb and carry from addition */ + + /* cool down phase 1 */ +-$LC1: lw $10,0($4) ++L(LC1): lw $10,0($4) + mflo $3 + mfhi $9 + addu $3,$3,$2 +@@ -85,7 +85,7 @@ + addu $2,$9,$2 /* add high product limb and carry from addition */ + + /* cool down phase 0 */ +-$LC0: lw $10,0($4) ++L(LC0): lw $10,0($4) + mflo $3 + mfhi $9 + addu $3,$3,$2 +diff -u -udbrN glibc-2.3.2/sysdeps/mips/atomicity.h glibc-2.3.2-200304020432/sysdeps/mips/atomicity.h +--- glibc-2.3.2/sysdeps/mips/atomicity.h Tue Jul 16 02:52:17 2002 ++++ glibc-2.3.2-200304020432/sysdeps/mips/atomicity.h Fri Mar 14 06:30:31 2003 +@@ -1,5 +1,5 @@ + /* Low-level functions for atomic operations. Mips version. +- Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++ Copyright (C) 2001, 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 +@@ -32,7 +32,9 @@ + ("/* Inline exchange & add */\n" + "1:\n\t" + ".set push\n\t" ++#if _MIPS_SIM == _MIPS_SIM_ABI32 + ".set mips2\n\t" ++#endif + "ll %0,%3\n\t" + "addu %1,%4,%0\n\t" + "sc %1,%2\n\t" +@@ -56,7 +58,9 @@ + ("/* Inline atomic add */\n" + "1:\n\t" + ".set push\n\t" ++#if _MIPS_SIM == _MIPS_SIM_ABI32 + ".set mips2\n\t" ++#endif + "ll %0,%2\n\t" + "addu %0,%3,%0\n\t" + "sc %0,%1\n\t" +@@ -78,12 +82,22 @@ + ("/* Inline compare & swap */\n" + "1:\n\t" + ".set push\n\t" ++#if _MIPS_SIM == _MIPS_SIM_ABI32 + ".set mips2\n\t" ++#endif ++#if defined _ABI64 && _MIPS_SIM == _ABI64 ++ "lld %1,%5\n\t" ++#else + "ll %1,%5\n\t" ++#endif + "move %0,$0\n\t" + "bne %1,%3,2f\n\t" + "move %0,%4\n\t" ++#if defined _ABI64 && _MIPS_SIM == _ABI64 ++ "scd %0,%2\n\t" ++#else + "sc %0,%2\n\t" ++#endif + ".set pop\n\t" + "beqz %0,1b\n" + "2:\n\t" +diff -u -udbrN glibc-2.3.2/sysdeps/mips/bits/endian.h glibc-2.3.2-200304020432/sysdeps/mips/bits/endian.h +--- glibc-2.3.2/sysdeps/mips/bits/endian.h Wed Nov 26 04:52:55 1997 ++++ glibc-2.3.2-200304020432/sysdeps/mips/bits/endian.h Sat Mar 29 09:15:28 2003 +@@ -5,4 +5,9 @@ + # error "Never use directly; include instead." + #endif + +-#define __BYTE_ORDER __BIG_ENDIAN ++#if __MIPSEB ++# define __BYTE_ORDER __BIG_ENDIAN ++#endif ++#if __MIPSEL ++# define __BYTE_ORDER __LITTLE_ENDIAN ++#endif +diff -u -udbrN glibc-2.3.2/sysdeps/mips/bits/setjmp.h glibc-2.3.2-200304020432/sysdeps/mips/bits/setjmp.h +--- glibc-2.3.2/sysdeps/mips/bits/setjmp.h Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/bits/setjmp.h Thu Mar 20 23:29:44 2003 +@@ -1,5 +1,6 @@ + /* Define the machine-dependent type `jmp_buf'. MIPS version. +- Copyright (C) 1992,93,95,97,2000 Free Software Foundation, Inc. ++ Copyright (C) 1992, 1993, 1995, 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 +@@ -23,26 +24,47 @@ + + typedef struct + { ++#if _MIPS_SIM == _MIPS_SIM_ABI32 + /* Program counter. */ +- void * __pc; ++ __ptr_t __pc; + + /* Stack pointer. */ +- void * __sp; ++ __ptr_t __sp; + + /* Callee-saved registers s0 through s7. */ + int __regs[8]; + + /* The frame pointer. */ +- void * __fp; ++ __ptr_t __fp; + + /* The global pointer. */ +- void * __gp; ++ __ptr_t __gp; ++#else ++ /* Program counter. */ ++ __extension__ long long __pc; ++ ++ /* Stack pointer. */ ++ __extension__ long long __sp; ++ ++ /* Callee-saved registers s0 through s7. */ ++ __extension__ long long __regs[8]; ++ ++ /* The frame pointer. */ ++ __extension__ long long __fp; ++ ++ /* The global pointer. */ ++ __extension__ long long __gp; ++#endif + + /* Floating point status register. */ + int __fpc_csr; + + /* Callee-saved floating point registers. */ ++#if defined _ABI64 && _MIPS_SIM == _ABI64 ++ double __fpregs[8]; ++#else + double __fpregs[6]; ++#endif + } __jmp_buf[1]; + + #ifdef __USE_MISC +diff -u -udbrN glibc-2.3.2/sysdeps/mips/bits/wordsize.h glibc-2.3.2-200304020432/sysdeps/mips/bits/wordsize.h +--- glibc-2.3.2/sysdeps/mips/bits/wordsize.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/mips/bits/wordsize.h Mon Mar 17 16:47:12 2003 +@@ -0,0 +1,19 @@ ++/* Copyright (C) 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 ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#define __WORDSIZE _MIPS_SZPTR +diff -u -udbrN glibc-2.3.2/sysdeps/mips/dl-machine.h glibc-2.3.2-200304020432/sysdeps/mips/dl-machine.h +--- glibc-2.3.2/sysdeps/mips/dl-machine.h Wed Feb 12 10:42:22 2003 ++++ glibc-2.3.2-200304020432/sysdeps/mips/dl-machine.h Sat Mar 22 13:50:46 2003 +@@ -32,6 +32,8 @@ + #error ENTRY_POINT needs to be defined for MIPS. + #endif + ++#include ++ + /* The offset of gp from GOT might be system-dependent. It's set by + ld. The same value is also */ + #define OFFSET_GP_GOT 0x7ff0 +@@ -72,6 +74,13 @@ + static inline int __attribute_used__ + elf_machine_matches_host (const ElfW(Ehdr) *ehdr) + { ++#if _MIPS_SIM == _MIPS_SIM_ABI32 || _MIPS_SIM == _MIPS_SIM_NABI32 ++ /* Don't link o32 and n32 together. */ ++ if (((ehdr->e_flags & EF_MIPS_ABI2) != 0) ++ != (_MIPS_SIM != _MIPS_SIM_ABI32)) ++ return 0; ++#endif ++ + switch (ehdr->e_machine) + { + case EM_MIPS: +@@ -91,7 +100,7 @@ + + /* Return the link-time address of _DYNAMIC. Conveniently, this is the + first element of the GOT. This must be inlined in a function which +- uses global data. */ ++ uses global data. We assume its $gp points to the primary GOT. */ + static inline ElfW(Addr) + elf_machine_dynamic (void) + { +@@ -99,6 +108,9 @@ + return *elf_mips_got_from_gpreg (gp); + } + ++#define STRINGXP(X) __STRING(X) ++#define STRINGXV(X) STRINGV_(X) ++#define STRINGV_(...) # __VA_ARGS__ + + /* Return the run-time load address of the shared object. */ + static inline ElfW(Addr) +@@ -106,10 +118,10 @@ + { + ElfW(Addr) addr; + asm (" .set noreorder\n" +- " la %0, here\n" +- " bltzal $0, here\n" ++ " " STRINGXP (PTR_LA) " %0, 0f\n" ++ " bltzal $0, 0f\n" + " nop\n" +- "here: subu %0, $31, %0\n" ++ "0: " STRINGXP (PTR_SUBU) " %0, $31, %0\n" + " .set reorder\n" + : "=r" (addr) + : /* No inputs */ +@@ -118,7 +130,11 @@ + } + + /* The MSB of got[1] of a gnu object is set to identify gnu objects. */ +-#define ELF_MIPS_GNU_GOT1_MASK 0x80000000 ++#if defined _ABI64 && _MIPS_SIM == _ABI64 ++# define ELF_MIPS_GNU_GOT1_MASK 0x8000000000000000L ++#else ++# define ELF_MIPS_GNU_GOT1_MASK 0x80000000L ++#endif + + /* We can't rely on elf_machine_got_rel because _dl_object_relocation_scope + fiddles with global data. */ +@@ -242,6 +258,55 @@ + return NULL; + } + ++#if _MIPS_SIM == _MIPS_SIM_ABI32 ++#define ELF_DL_FRAME_SIZE 40 ++ ++#define ELF_DL_SAVE_ARG_REGS "\ ++ sw $15, 36($29)\n \ ++ sw $4, 16($29)\n \ ++ sw $5, 20($29)\n \ ++ sw $6, 24($29)\n \ ++ sw $7, 28($29)\n \ ++" ++ ++#define ELF_DL_RESTORE_ARG_REGS "\ ++ lw $31, 36($29)\n \ ++ lw $4, 16($29)\n \ ++ lw $5, 20($29)\n \ ++ lw $6, 24($29)\n \ ++ lw $7, 28($29)\n \ ++" ++ ++#define IFABIO32(X) X ++ ++#else /* _MIPS_SIM == _MIPS_SIM_NABI32 || _MIPS_SIM == _MIPS_SIM_ABI64 */ ++ ++#define ELF_DL_FRAME_SIZE 64 ++ ++#define ELF_DL_SAVE_ARG_REGS "\ ++ sd $15, 56($29)\n \ ++ sd $4, 8($29)\n \ ++ sd $5, 16($29)\n \ ++ sd $6, 24($29)\n \ ++ sd $7, 32($29)\n \ ++ sd $8, 40($29)\n \ ++ sd $9, 48($29)\n \ ++" ++ ++#define ELF_DL_RESTORE_ARG_REGS "\ ++ ld $31, 56($29)\n \ ++ ld $4, 8($29)\n \ ++ ld $5, 16($29)\n \ ++ ld $6, 24($29)\n \ ++ ld $7, 32($29)\n \ ++ ld $8, 40($29)\n \ ++ ld $9, 48($29)\n \ ++" ++ ++#define IFABIO32(X) ++ ++#endif ++ + /* Define mips specific runtime resolver. The function __dl_runtime_resolve + is called from assembler function _dl_runtime_resolve which converts + special argument registers t7 ($15) and t8 ($24): +@@ -272,9 +337,8 @@ + { \ + struct link_map *l = elf_machine_runtime_link_map (old_gpreg, stub_pc); \ + const ElfW(Sym) *const symtab \ +- = (const void *) D_PTR (l, l_info[DT_SYMTAB]); \ +- const char *strtab \ +- = (const void *) D_PTR (l, l_info[DT_STRTAB]); \ ++ = (const ElfW(Sym) *) D_PTR (l, l_info[DT_SYMTAB]); \ ++ const char *strtab = (const void *) D_PTR (l, l_info[DT_STRTAB]); \ + ElfW(Addr) *got \ + = (ElfW(Addr) *) D_PTR (l, l_info[DT_PLTGOT]); \ + const ElfW(Word) local_gotno \ +@@ -333,36 +397,30 @@ + .type _dl_runtime_resolve,@function\n \ + .ent _dl_runtime_resolve\n \ + _dl_runtime_resolve:\n \ +- .frame $29, 40, $31\n \ ++ .frame $29, " STRINGXP(ELF_DL_FRAME_SIZE) ", $31\n \ + .set noreorder\n \ + # Save GP.\n \ + move $3, $28\n \ ++ # Save arguments and sp value in stack.\n \ ++ " STRINGXP(PTR_SUBIU) " $29, " STRINGXP(ELF_DL_FRAME_SIZE) "\n \ + # Modify t9 ($25) so as to point .cpload instruction.\n \ +- addu $25, 8\n \ ++ " IFABIO32(STRINGXP(PTR_ADDIU) " $25, 12\n") " \ + # Compute GP.\n \ +- .cpload $25\n \ ++ " STRINGXP(SETUP_GP) "\n \ ++ " STRINGXV(SETUP_GP64 (0, _dl_runtime_resolve)) "\n \ + .set reorder\n \ + # Save slot call pc.\n \ + move $2, $31\n \ +- # Save arguments and sp value in stack.\n \ +- subu $29, 40\n \ +- .cprestore 32\n \ +- sw $15, 36($29)\n \ +- sw $4, 16($29)\n \ +- sw $5, 20($29)\n \ +- sw $6, 24($29)\n \ +- sw $7, 28($29)\n \ ++ " IFABIO32(STRINGXP(CPRESTORE(32))) "\n \ ++ " ELF_DL_SAVE_ARG_REGS " \ + move $4, $24\n \ + move $5, $15\n \ + move $6, $3\n \ + move $7, $2\n \ + jal __dl_runtime_resolve\n \ +- lw $31, 36($29)\n \ +- lw $4, 16($29)\n \ +- lw $5, 20($29)\n \ +- lw $6, 24($29)\n \ +- lw $7, 28($29)\n \ +- addu $29, 40\n \ ++ " ELF_DL_RESTORE_ARG_REGS " \ ++ " STRINGXP(RESTORE_GP64) "\n \ ++ " STRINGXP(PTR_ADDIU) " $29, " STRINGXP(ELF_DL_FRAME_SIZE) "\n \ + move $25, $2\n \ + jr $25\n \ + .end _dl_runtime_resolve\n \ +@@ -374,7 +432,6 @@ + #define ELF_MACHINE_USER_ADDRESS_MASK 0x80000000UL + + +- + /* Initial entry point code for the dynamic linker. + The C function `_dl_start' is the real entry point; + its return value is the user program's entry point. +@@ -392,71 +449,71 @@ + + #define RTLD_START asm (\ + ".text\n"\ +- _RTLD_PROLOGUE(ENTRY_POINT)\ +- ".set noreorder\n\ +- bltzal $0, 0f\n\ +- nop\n\ +-0: .cpload $31\n\ +- .set reorder\n\ ++ _RTLD_PROLOGUE(ENTRY_POINT) "\ ++ " STRINGXV(SETUP_GPX($25)) "\n\ ++ " STRINGXV(SETUP_GPX64($18,$25)) "\n\ + # i386 ABI book says that the first entry of GOT holds\n\ + # the address of the dynamic structure. Though MIPS ABI\n\ + # doesn't say nothing about this, I emulate this here.\n\ +- la $4, _DYNAMIC\n\ ++ " STRINGXP(PTR_LA) " $4, _DYNAMIC\n\ + # Subtract OFFSET_GP_GOT\n\ +- sw $4, -0x7ff0($28)\n\ ++ " STRINGXP(PTR_S) " $4, -0x7ff0($28)\n\ + move $4, $29\n\ +- subu $29, 16\n\ ++ " STRINGXP(PTR_SUBIU) " $29, 16\n\ + \n\ +- la $8, coff\n\ +- bltzal $8, coff\n\ +-coff: subu $8, $31, $8\n\ ++ " STRINGXP(PTR_LA) " $8, .Lcoff\n\ ++ bltzal $8, .Lcoff\n\ ++.Lcoff: " STRINGXP(PTR_SUBU) " $8, $31, $8\n\ + \n\ +- la $25, _dl_start\n\ +- addu $25, $8\n\ ++ " STRINGXP(PTR_LA) " $25, _dl_start\n\ ++ " STRINGXP(PTR_ADDU) " $25, $8\n\ + jalr $25\n\ + \n\ +- addiu $29, 16\n\ ++ " STRINGXP(PTR_ADDIU) " $29, 16\n\ + # Get the value of label '_dl_start_user' in t9 ($25).\n\ +- la $25, _dl_start_user\n\ ++ " STRINGXP(PTR_LA) " $25, _dl_start_user\n\ + .globl _dl_start_user\n\ ++ .type _dl_start_user,@function\n\ ++ .ent _dl_start_user\n\ + _dl_start_user:\n\ +- .set noreorder\n\ +- .cpload $25\n\ +- .set reorder\n\ ++ " STRINGXP(SETUP_GP) "\n\ ++ " STRINGXV(SETUP_GP64($18,_dl_start_user)) "\n\ + move $16, $28\n\ + # Save the user entry point address in a saved register.\n\ + move $17, $2\n\ + # Store the highest stack address\n\ +- sw $29, __libc_stack_end\n\ ++ " STRINGXP(PTR_S) " $29, __libc_stack_end\n\ + # See if we were run as a command with the executable file\n\ + # name as an extra leading argument.\n\ + lw $2, _dl_skip_args\n\ + beq $2, $0, 1f\n\ + # Load the original argument count.\n\ +- lw $4, 0($29)\n\ ++ " STRINGXP(PTR_L) " $4, 0($29)\n\ + # Subtract _dl_skip_args from it.\n\ + subu $4, $2\n\ + # Adjust the stack pointer to skip _dl_skip_args words.\n\ +- sll $2, 2\n\ +- addu $29, $2\n\ ++ sll $2, " STRINGXP (PTRLOG) "\n\ ++ " STRINGXP(PTR_ADDU) " $29, $2\n\ + # Save back the modified argument count.\n\ +- sw $4, 0($29)\n\ ++ " STRINGXP(PTR_S) " $4, 0($29)\n\ + 1: # Call _dl_init (struct link_map *main_map, int argc, char **argv, char **env) \n\ +- lw $4, _rtld_local\n\ +- lw $5, 0($29)\n\ +- la $6, 4($29)\n\ +- sll $7, $5, 2\n\ +- addu $7, $7, $6\n\ +- addu $7, $7, 4\n\ +- subu $29, 16\n\ ++ " STRINGXP(PTR_L) " $4, _rtld_local\n\ ++ " STRINGXP(PTR_L) /* or lw??? fixme */ " $5, 0($29)\n\ ++ " STRINGXP(PTR_LA) " $6, " STRINGXP (PTRSIZE) "($29)\n\ ++ sll $7, $5, " STRINGXP (PTRLOG) "\n\ ++ " STRINGXP(PTR_ADDU) " $7, $7, $6\n\ ++ " STRINGXP(PTR_ADDU) " $7, $7, " STRINGXP (PTRSIZE) " \n\ ++ " STRINGXP(PTR_SUBIU) " $29, 32\n\ ++ " STRINGXP(SAVE_GP(16)) "\n\ + # Call the function to run the initializers.\n\ + jal _dl_init_internal\n\ +- addiu $29, 16\n\ ++ " STRINGXP(PTR_ADDIU) " $29, 32\n\ + # Pass our finalizer function to the user in $2 as per ELF ABI.\n\ +- la $2, _dl_fini\n\ ++ " STRINGXP(PTR_LA) " $2, _dl_fini\n\ + # Jump to the user entry point.\n\ + move $25, $17\n\ +- jr $25\n\t"\ ++ jr $25\n\ ++ .end _dl_start_user\n\t"\ + _RTLD_EPILOGUE(ENTRY_POINT)\ + ".previous"\ + ); +@@ -472,9 +529,15 @@ + MAP is the object containing the reloc. */ + + static inline void ++#ifdef RTLD_BOOTSTRAP ++ __attribute__ ((always_inline)) ++#endif + elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc, + const ElfW(Sym) *sym, const struct r_found_version *version, +- ElfW(Addr) *const reloc_addr) ++ /* We use void* because the location to be relocated ++ is not required to be properly aligned for a ++ ELFW(Addr). */ ++ void /* ElfW(Addr) */ *const reloc_addr) + { + const unsigned long int r_type = ELFW(R_TYPE) (reloc->r_info); + +@@ -490,21 +553,46 @@ + + switch (r_type) + { ++#if _MIPS_SIM == _MIPS_SIM_ABI64 ++ case (R_MIPS_64 << 8) | R_MIPS_REL32: ++#else + case R_MIPS_REL32: ++#endif + { + int symidx = ELFW(R_SYM) (reloc->r_info); ++ ElfW(Addr) reloc_value; ++ ++ /* Support relocations on mis-aligned offsets. Should we ever ++ implement RELA, this should be replaced with an assignment ++ from reloc->r_addend. */ ++ __builtin_memcpy (&reloc_value, reloc_addr, sizeof (reloc_value)); + + if (symidx) + { + const ElfW(Word) gotsym + = (const ElfW(Word)) map->l_info[DT_MIPS (GOTSYM)]->d_un.d_val; + +- if (symidx < gotsym) ++ if ((ElfW(Word))symidx < gotsym) + { ++ /* This wouldn't work for a symbol imported from other ++ libraries for which there's no GOT entry, but MIPS ++ requires every symbol referenced in a dynamic ++ relocation to have a GOT entry in the primary GOT, ++ so we only get here for locally-defined symbols. ++ For section symbols, we should *NOT* be adding ++ sym->st_value (per the definition of the meaning of ++ S in reloc expressions in the ELF64 MIPS ABI), ++ since it should have already been added to ++ reloc_value by the linker, but older versions of ++ GNU ld didn't add it, and newer versions don't emit ++ useless relocations to section symbols any more, so ++ it is safe to keep on adding sym->st_value, even ++ though it's not ABI compliant. Some day we should ++ bite the bullet and stop doing this. */ + #ifndef RTLD_BOOTSTRAP + if (map != &GL(dl_rtld_map)) + #endif +- *reloc_addr += sym->st_value + map->l_addr; ++ reloc_value += sym->st_value + map->l_addr; + } + else + { +@@ -515,7 +603,7 @@ + = (const ElfW(Word)) + map->l_info[DT_MIPS (LOCAL_GOTNO)]->d_un.d_val; + +- *reloc_addr += got[symidx + local_gotno - gotsym]; ++ reloc_value += got[symidx + local_gotno - gotsym]; + #endif + } + } +@@ -523,11 +611,27 @@ + #ifndef RTLD_BOOTSTRAP + if (map != &GL(dl_rtld_map)) + #endif +- *reloc_addr += map->l_addr; ++ reloc_value += map->l_addr; ++ ++ __builtin_memcpy (reloc_addr, &reloc_value, sizeof (reloc_value)); + } + break; + case R_MIPS_NONE: /* Alright, Wilbur. */ + break; ++#if _MIPS_SIM == _MIPS_SIM_ABI64 ++ case R_MIPS_64: ++ /* For full compliance with the ELF64 ABI, one must precede the ++ _REL32/_64 pair of relocations with a _64 relocation, such ++ that the in-place addend is read as a 64-bit value. IRIX ++ didn't pick up on this requirement, so we treat the ++ _REL32/_64 relocation as a 64-bit relocation even if it's by ++ itself. For ABI compliance, we ignore such _64 dummy ++ relocations. For RELA, this may be simply removed, since ++ it's totally unnecessary. */ ++ if (ELFW(R_SYM) (reloc->r_info) == 0) ++ break; ++ /* Fall through. */ ++#endif + default: + _dl_reloc_bad_type (map, r_type, 0); + break; +@@ -536,7 +640,7 @@ + + static inline void + elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc, +- ElfW(Addr) *const reloc_addr) ++ void /* ElfW(Addr) */ *const reloc_addr) + { + /* XXX Nothing to do. There is no relative relocation, right? */ + } +@@ -661,7 +765,7 @@ + of got[1] of a gnu object is set to identify gnu objects. + Where we can store l for non gnu objects? XXX */ + if ((got[1] & ELF_MIPS_GNU_GOT1_MASK) != 0) +- got[1] = (ElfW(Addr)) ((unsigned) l | ELF_MIPS_GNU_GOT1_MASK); ++ got[1] = ((ElfW(Addr)) l | ELF_MIPS_GNU_GOT1_MASK); + else + _dl_mips_gnu_objects = 0; + } +diff -u -udbrN glibc-2.3.2/sysdeps/mips/elf/ldsodefs.h glibc-2.3.2-200304020432/sysdeps/mips/elf/ldsodefs.h +--- glibc-2.3.2/sysdeps/mips/elf/ldsodefs.h Wed Feb 6 23:56:54 2002 ++++ glibc-2.3.2-200304020432/sysdeps/mips/elf/ldsodefs.h Sat Mar 22 16:07:05 2003 +@@ -1,5 +1,5 @@ + /* Run-time dynamic linker data structures for loaded ELF shared objects. +- Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++ Copyright (C) 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 +@@ -17,9 +17,93 @@ + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + ++#ifndef _MIPS_LDSODEFS_H ++#define _MIPS_LDSODEFS_H + + /* The MIPS ABI specifies that the dynamic section has to be read-only. */ + + #define DL_RO_DYN_SECTION 1 + + #include_next ++ ++/* The 64-bit MIPS ELF ABI uses an unusual reloc format. Each ++ relocation entry specifies up to three actual relocations, all at ++ the same address. The first relocation which required a symbol ++ uses the symbol in the r_sym field. The second relocation which ++ requires a symbol uses the symbol in the r_ssym field. If all ++ three relocations require a symbol, the third one uses a zero ++ value. ++ ++ We define these structures in internal headers because we're not ++ sure we want to make them part of the ABI yet. Eventually, some of ++ this may move into elf/elf.h. */ ++ ++/* An entry in a 64 bit SHT_REL section. */ ++ ++typedef struct ++{ ++ Elf32_Word r_sym; /* Symbol index */ ++ unsigned char r_ssym; /* Special symbol for 2nd relocation */ ++ unsigned char r_type3; /* 3rd relocation type */ ++ unsigned char r_type2; /* 2nd relocation type */ ++ unsigned char r_type1; /* 1st relocation type */ ++} _Elf64_Mips_R_Info; ++ ++typedef union ++{ ++ Elf64_Xword r_info_number; ++ _Elf64_Mips_R_Info r_info_fields; ++} _Elf64_Mips_R_Info_union; ++ ++typedef struct ++{ ++ Elf64_Addr r_offset; /* Address */ ++ _Elf64_Mips_R_Info_union r_info; /* Relocation type and symbol index */ ++} Elf64_Mips_Rel; ++ ++typedef struct ++{ ++ Elf64_Addr r_offset; /* Address */ ++ _Elf64_Mips_R_Info_union r_info; /* Relocation type and symbol index */ ++ Elf64_Sxword r_addend; /* Addend */ ++} Elf64_Mips_Rela; ++ ++#define ELF64_MIPS_R_SYM(i) \ ++ ((__extension__ (_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_sym) ++#define ELF64_MIPS_R_TYPE(i) \ ++ (((_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_type1 \ ++ | ((Elf32_Word)(__extension__ (_Elf64_Mips_R_Info_union)(i) \ ++ ).r_info_fields.r_type2 << 8) \ ++ | ((Elf32_Word)(__extension__ (_Elf64_Mips_R_Info_union)(i) \ ++ ).r_info_fields.r_type3 << 16) \ ++ | ((Elf32_Word)(__extension__ (_Elf64_Mips_R_Info_union)(i) \ ++ ).r_info_fields.r_ssym << 24)) ++#define ELF64_MIPS_R_INFO(sym, type) \ ++ (__extension__ (_Elf64_Mips_R_Info_union) \ ++ (__extension__ (_Elf64_Mips_R_Info) \ ++ { (sym), ELF64_MIPS_R_SSYM (type), \ ++ ELF64_MIPS_R_TYPE3 (type), \ ++ ELF64_MIPS_R_TYPE2 (type), \ ++ ELF64_MIPS_R_TYPE1 (type) \ ++ }).r_info_number) ++/* These macros decompose the value returned by ELF64_MIPS_R_TYPE, and ++ compose it back into a value that it can be used as an argument to ++ ELF64_MIPS_R_INFO. */ ++#define ELF64_MIPS_R_SSYM(i) (((i) >> 24) & 0xff) ++#define ELF64_MIPS_R_TYPE3(i) (((i) >> 16) & 0xff) ++#define ELF64_MIPS_R_TYPE2(i) (((i) >> 8) & 0xff) ++#define ELF64_MIPS_R_TYPE1(i) ((i) & 0xff) ++#define ELF64_MIPS_R_TYPEENC(type1, type2, type3, ssym) \ ++ ((type1) \ ++ | ((Elf32_Word)(type2) << 8) \ ++ | ((Elf32_Word)(type3) << 16) \ ++ | ((Elf32_Word)(ssym) << 24)) ++ ++#undef ELF64_R_SYM ++#define ELF64_R_SYM(i) ELF64_MIPS_R_SYM (i) ++#undef ELF64_R_TYPE ++#define ELF64_R_TYPE(i) ELF64_MIPS_R_TYPE (i) ++#undef ELF64_R_INFO ++#define ELF64_R_INFO(sym, type) ELF64_MIPS_R_INFO ((sym), (type)) ++ ++#endif +diff -u -udbrN glibc-2.3.2/sysdeps/mips/elf/start.S glibc-2.3.2-200304020432/sysdeps/mips/elf/start.S +--- glibc-2.3.2/sysdeps/mips/elf/start.S Tue Dec 10 04:41:54 2002 ++++ glibc-2.3.2-200304020432/sysdeps/mips/elf/start.S Mon Mar 17 16:47:12 2003 +@@ -1,5 +1,6 @@ + /* Startup code compliant to the ELF Mips ABI. +- Copyright (C) 1995, 1997, 2000, 2001, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1995, 1997, 2000, 2001, 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 +@@ -19,6 +20,7 @@ + + #define __ASSEMBLY__ 1 + #include ++#include + + #ifndef ENTRY_POINT + #error ENTRY_POINT needs to be defined for start.S on MIPS/ELF. +@@ -52,42 +54,41 @@ + char **argv, void (*init) (void), void (*fini) (void), + void (*rtld_fini) (void), void *stack_end) + */ +-#ifdef __PIC__ +-/* A macro to (re)initialize gp. We can get the run time address of 0f in +- ra ($31) by blezal instruction. In this early phase, we can't save gp +- in stack and .cprestore doesn't work properly. So we set gp by using +- this macro. */ +-#define SET_GP \ +- .set noreorder; \ +- bltzal $0,0f; \ +- nop; \ +-0: .cpload $31; \ +- .set reorder; +-#endif + + .text + .globl ENTRY_POINT + .type ENTRY_POINT,@function + ENTRY_POINT: + #ifdef __PIC__ +- SET_GP ++ SETUP_GPX($0) ++ SETUP_GPX64($25,$0) + #else +- la $28, _gp /* Setup GP correctly if we're non-PIC. */ +-#endif ++ PTR_LA $28, _gp /* Setup GP correctly if we're non-PIC. */ + move $31, $0 ++#endif + +- la $4, main /* main */ +- lw $5, 0($29) /* argc */ +- addu $6, $29, 4 /* argv */ +- /* Allocate space on the stack for seven arguments and make sure +- the stack is aligned to double words (8 bytes). */ +- and $29, 0xfffffff8 +- subu $29, 32 +- la $7, __libc_csu_init /* init */ +- la $8, __libc_csu_fini +- sw $8, 16($29) /* fini */ +- sw $2, 20($29) /* rtld_fini */ +- sw $29, 24($29) /* stack_end */ ++ PTR_LA $4, main /* main */ ++ PTR_L $5, 0($29) /* argc */ ++ PTR_ADDIU $6, $29, PTRSIZE /* argv */ ++ ++ /* Allocate space on the stack for seven arguments (o32 only) ++ and make sure the stack is aligned to double words (8 bytes) ++ on o32 and quad words (16 bytes) on n32 and n64. */ ++ ++ and $29, -2 * SZREG ++#if _MIPS_SIM == _MIPS_SIM_ABI32 ++ PTR_SUBIU $29, 32 ++#endif ++ PTR_LA $7, __libc_csu_init /* init */ ++ PTR_LA $8, __libc_csu_fini ++#if _MIPS_SIM == _MIPS_SIM_ABI32 ++ PTR_S $8, 16($29) /* fini */ ++ PTR_S $2, 20($29) /* rtld_fini */ ++ PTR_S $29, 24($29) /* stack_end */ ++#else ++ move $9, $2 /* rtld_fini */ ++ move $10, $29 /* stack_end */ ++#endif + jal __libc_start_main + hlt: b hlt /* Crash if somehow it does return. */ + +diff -u -udbrN glibc-2.3.2/sysdeps/mips/fpu/bits/mathdef.h glibc-2.3.2-200304020432/sysdeps/mips/fpu/bits/mathdef.h +--- glibc-2.3.2/sysdeps/mips/fpu/bits/mathdef.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/mips/fpu/bits/mathdef.h Fri Mar 14 16:30:43 2003 +@@ -0,0 +1,48 @@ ++/* Copyright (C) 1997, 1998, 1999, 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 ++ 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. */ ++ ++#if !defined _MATH_H && !defined _COMPLEX_H ++# error "Never use directly; include instead" ++#endif ++ ++#if defined __USE_ISOC99 && defined _MATH_H && !defined _MATH_H_MATHDEF ++# define _MATH_H_MATHDEF 1 ++ ++/* Normally, there is no long double type and the `float' and `double' ++ expressions are evaluated as `double'. */ ++typedef double float_t; /* `float' expressions are evaluated as ++ `double'. */ ++typedef double double_t; /* `double' expressions are evaluated as ++ `double'. */ ++ ++/* Define `INFINITY' as value of type `float'. */ ++# define INFINITY HUGE_VALF ++ ++ ++/* The values returned by `ilogb' for 0 and NaN respectively. */ ++# define FP_ILOGB0 (-2147483647) ++# define FP_ILOGBNAN 2147483647 ++ ++#endif /* ISO C99 */ ++ ++#if ! defined __NO_LONG_DOUBLE_MATH && _MIPS_SIM == _MIPS_SIM_ABI32 ++/* Signal that we do not really have a `long double'. This disables the ++ declaration of all the `long double' function variants. */ ++# define __NO_LONG_DOUBLE_MATH 1 ++#endif +diff -u -udbrN glibc-2.3.2/sysdeps/mips/fpu/libm-test-ulps glibc-2.3.2-200304020432/sysdeps/mips/fpu/libm-test-ulps +--- glibc-2.3.2/sysdeps/mips/fpu/libm-test-ulps Wed Oct 16 01:39:37 2002 ++++ glibc-2.3.2-200304020432/sysdeps/mips/fpu/libm-test-ulps Sun Mar 23 01:52:10 2003 +@@ -94,7 +94,7 @@ + idouble: 1 + + # ccos +-Test "Imaginary part of: ccos (-2 - 3 i) == -4.1896256909688072301 - 9.1092278937553365979 i": ++Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": + float: 1 + ifloat: 1 + Test "Real part of: ccos (0.75 + 1.25 i) == 1.38173873063425888530729933139078645 - 1.09193013555397466170919531722024128 i": +@@ -107,10 +107,10 @@ + ifloat: 1 + + # ccosh +-Test "Real part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Real part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Imaginary part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 + Test "Real part of: ccosh (0.75 + 1.25 i) == 0.408242591877968807788852146397499084 + 0.780365930845853240391326216300863152 i": +@@ -145,7 +145,7 @@ + Test "Imaginary part of: clog10 (-0 - inf i) == inf - pi/2*log10(e) i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: clog10 (-2 - 3 i) == 0.5569716761534183846 - 0.9375544629863747085 i": ++Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": + double: 1 + float: 5 + idouble: 1 +@@ -239,7 +239,7 @@ + ifloat: 2 + + # csinh +-Test "Imaginary part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i": ++Test "Imaginary part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": + double: 1 + idouble: 1 + Test "Real part of: csinh (0.75 + 1.25 i) == 0.259294854551162779153349830618433028 + 1.22863452409509552219214606515777594 i": +@@ -258,7 +258,7 @@ + ifloat: 1 + + # ctan +-Test "Real part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i": ++Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": + double: 1 + idouble: 1 + Test "Imaginary part of: ctan (0.75 + 1.25 i) == 0.160807785916206426725166058173438663 + 0.975363285031235646193581759755216379 i": +@@ -266,7 +266,7 @@ + idouble: 1 + + # ctanh +-Test "Real part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i": ++Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": + double: 1 + float: 2 + idouble: 1 +@@ -453,12 +453,12 @@ + ifloat: 2 + + # lgamma +-Test "lgamma (0.7) == 0.26086724653166651439": ++Test "lgamma (0.7) == 0.260867246531666514385732417016759578": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +-Test "lgamma (1.2) == -0.853740900033158497197e-1": ++Test "lgamma (1.2) == -0.853740900033158497197028392998854470e-1": + double: 1 + float: 2 + idouble: 1 +@@ -513,7 +513,7 @@ + Test "tgamma (0.5) == sqrt (pi)": + float: 1 + ifloat: 1 +-Test "tgamma (0.7) == 1.29805533264755778568": ++Test "tgamma (0.7) == 1.29805533264755778568117117915281162": + double: 1 + float: 1 + idouble: 1 +diff -u -udbrN glibc-2.3.2/sysdeps/mips/ieee754.h glibc-2.3.2-200304020432/sysdeps/mips/ieee754.h +--- glibc-2.3.2/sysdeps/mips/ieee754.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/mips/ieee754.h Thu Mar 20 18:59:45 2003 +@@ -0,0 +1,325 @@ ++/* Copyright (C) 1992, 1995, 1996, 1999, 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 ++ 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 _IEEE754_H ++ ++#define _IEEE754_H 1 ++#include ++ ++#include ++ ++#include ++ ++__BEGIN_DECLS ++ ++union ieee754_float ++ { ++ float f; ++ ++ /* This is the IEEE 754 single-precision format. */ ++ struct ++ { ++#if __BYTE_ORDER == __BIG_ENDIAN ++ unsigned int negative:1; ++ unsigned int exponent:8; ++ unsigned int mantissa:23; ++#endif /* Big endian. */ ++#if __BYTE_ORDER == __LITTLE_ENDIAN ++ unsigned int mantissa:23; ++ unsigned int exponent:8; ++ unsigned int negative:1; ++#endif /* Little endian. */ ++ } ieee; ++ ++ /* This format makes it easier to see if a NaN is a signalling NaN. */ ++ struct ++ { ++#if __BYTE_ORDER == __BIG_ENDIAN ++ unsigned int negative:1; ++ unsigned int exponent:8; ++ unsigned int quiet_nan:1; ++ unsigned int mantissa:22; ++#endif /* Big endian. */ ++#if __BYTE_ORDER == __LITTLE_ENDIAN ++ unsigned int mantissa:22; ++ unsigned int quiet_nan:1; ++ unsigned int exponent:8; ++ unsigned int negative:1; ++#endif /* Little endian. */ ++ } ieee_nan; ++ }; ++ ++#define IEEE754_FLOAT_BIAS 0x7f /* Added to exponent. */ ++ ++ ++union ieee754_double ++ { ++ double d; ++ ++ /* This is the IEEE 754 double-precision format. */ ++ struct ++ { ++#if __BYTE_ORDER == __BIG_ENDIAN ++ unsigned int negative:1; ++ unsigned int exponent:11; ++ /* Together these comprise the mantissa. */ ++ unsigned int mantissa0:20; ++ unsigned int mantissa1:32; ++#endif /* Big endian. */ ++#if __BYTE_ORDER == __LITTLE_ENDIAN ++# if __FLOAT_WORD_ORDER == BIG_ENDIAN ++ unsigned int mantissa0:20; ++ unsigned int exponent:11; ++ unsigned int negative:1; ++ unsigned int mantissa1:32; ++# else ++ /* Together these comprise the mantissa. */ ++ unsigned int mantissa1:32; ++ unsigned int mantissa0:20; ++ unsigned int exponent:11; ++ unsigned int negative:1; ++# endif ++#endif /* Little endian. */ ++ } ieee; ++ ++ /* This format makes it easier to see if a NaN is a signalling NaN. */ ++ struct ++ { ++#if __BYTE_ORDER == __BIG_ENDIAN ++ unsigned int negative:1; ++ unsigned int exponent:11; ++ unsigned int quiet_nan:1; ++ /* Together these comprise the mantissa. */ ++ unsigned int mantissa0:19; ++ unsigned int mantissa1:32; ++#else ++# if __FLOAT_WORD_ORDER == BIG_ENDIAN ++ unsigned int mantissa0:19; ++ unsigned int quiet_nan:1; ++ unsigned int exponent:11; ++ unsigned int negative:1; ++ unsigned int mantissa1:32; ++# else ++ /* Together these comprise the mantissa. */ ++ unsigned int mantissa1:32; ++ unsigned int mantissa0:19; ++ unsigned int quiet_nan:1; ++ unsigned int exponent:11; ++ unsigned int negative:1; ++# endif ++#endif ++ } ieee_nan; ++ }; ++ ++#define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */ ++ ++#if LDBL_MANT_DIG == 113 ++ ++union ieee854_long_double ++ { ++ long double d; ++ ++ /* This is the IEEE 854 quad-precision format. */ ++ struct ++ { ++#if __BYTE_ORDER == __BIG_ENDIAN ++ unsigned int negative:1; ++ unsigned int exponent:15; ++ /* Together these comprise the mantissa. */ ++ unsigned int mantissa0:16; ++ unsigned int mantissa1:32; ++ unsigned int mantissa2:32; ++ unsigned int mantissa3:32; ++#endif /* Big endian. */ ++#if __BYTE_ORDER == __LITTLE_ENDIAN ++ /* Together these comprise the mantissa. */ ++ unsigned int mantissa3:32; ++ unsigned int mantissa2:32; ++ unsigned int mantissa1:32; ++ unsigned int mantissa0:16; ++ unsigned int exponent:15; ++ unsigned int negative:1; ++#endif /* Little endian. */ ++ } ieee; ++ ++ /* This format makes it easier to see if a NaN is a signalling NaN. */ ++ struct ++ { ++#if __BYTE_ORDER == __BIG_ENDIAN ++ unsigned int negative:1; ++ unsigned int exponent:15; ++ unsigned int quiet_nan:1; ++ /* Together these comprise the mantissa. */ ++ unsigned int mantissa0:15; ++ unsigned int mantissa1:32; ++ unsigned int mantissa2:32; ++ unsigned int mantissa3:32; ++#endif /* Big endian. */ ++#if __BYTE_ORDER == __LITTLE_ENDIAN ++ /* Together these comprise the mantissa. */ ++ unsigned int mantissa3:32; ++ unsigned int mantissa2:32; ++ unsigned int mantissa1:32; ++ unsigned int mantissa0:15; ++ unsigned int quiet_nan:1; ++ unsigned int exponent:15; ++ unsigned int negative:1; ++#endif /* Little endian. */ ++ } ieee_nan; ++ }; ++ ++#define IEEE854_LONG_DOUBLE_BIAS 0x3fff /* Added to exponent. */ ++ ++#elif LDBL_MANT_DIG == 64 ++ ++union ieee854_long_double ++ { ++ long double d; ++ ++ /* This is the IEEE 854 double-extended-precision format. */ ++ struct ++ { ++#if __BYTE_ORDER == __BIG_ENDIAN ++ unsigned int negative:1; ++ unsigned int exponent:15; ++ unsigned int empty:16; ++ unsigned int mantissa0:32; ++ unsigned int mantissa1:32; ++#endif ++#if __BYTE_ORDER == __LITTLE_ENDIAN ++# if __FLOAT_WORD_ORDER == BIG_ENDIAN ++ unsigned int exponent:15; ++ unsigned int negative:1; ++ unsigned int empty:16; ++ unsigned int mantissa0:32; ++ unsigned int mantissa1:32; ++# else ++ unsigned int mantissa1:32; ++ unsigned int mantissa0:32; ++ unsigned int exponent:15; ++ unsigned int negative:1; ++ unsigned int empty:16; ++# endif ++#endif ++ } ieee; ++ ++ /* This is for NaNs in the IEEE 854 double-extended-precision format. */ ++ struct ++ { ++#if __BYTE_ORDER == __BIG_ENDIAN ++ unsigned int negative:1; ++ unsigned int exponent:15; ++ unsigned int empty:16; ++ unsigned int one:1; ++ unsigned int quiet_nan:1; ++ unsigned int mantissa0:30; ++ unsigned int mantissa1:32; ++#endif ++#if __BYTE_ORDER == __LITTLE_ENDIAN ++# if __FLOAT_WORD_ORDER == BIG_ENDIAN ++ unsigned int exponent:15; ++ unsigned int negative:1; ++ unsigned int empty:16; ++ unsigned int mantissa0:30; ++ unsigned int quiet_nan:1; ++ unsigned int one:1; ++ unsigned int mantissa1:32; ++# else ++ unsigned int mantissa1:32; ++ unsigned int mantissa0:30; ++ unsigned int quiet_nan:1; ++ unsigned int one:1; ++ unsigned int exponent:15; ++ unsigned int negative:1; ++ unsigned int empty:16; ++# endif ++#endif ++ } ieee_nan; ++ }; ++ ++#define IEEE854_LONG_DOUBLE_BIAS 0x3fff ++ ++#elif LDBL_MANT_DIG == 53 ++ ++union ieee854_long_double ++ { ++ long double d; ++ ++ /* This is the IEEE 754 double-precision format. */ ++ struct ++ { ++#if __BYTE_ORDER == __BIG_ENDIAN ++ unsigned int negative:1; ++ unsigned int exponent:11; ++ /* Together these comprise the mantissa. */ ++ unsigned int mantissa0:20; ++ unsigned int mantissa1:32; ++#endif /* Big endian. */ ++#if __BYTE_ORDER == __LITTLE_ENDIAN ++# if __FLOAT_WORD_ORDER == BIG_ENDIAN ++ unsigned int mantissa0:20; ++ unsigned int exponent:11; ++ unsigned int negative:1; ++ unsigned int mantissa1:32; ++# else ++ /* Together these comprise the mantissa. */ ++ unsigned int mantissa1:32; ++ unsigned int mantissa0:20; ++ unsigned int exponent:11; ++ unsigned int negative:1; ++# endif ++#endif /* Little endian. */ ++ } ieee; ++ ++ /* This format makes it easier to see if a NaN is a signalling NaN. */ ++ struct ++ { ++#if __BYTE_ORDER == __BIG_ENDIAN ++ unsigned int negative:1; ++ unsigned int exponent:11; ++ unsigned int quiet_nan:1; ++ /* Together these comprise the mantissa. */ ++ unsigned int mantissa0:19; ++ unsigned int mantissa1:32; ++#else ++# if __FLOAT_WORD_ORDER == BIG_ENDIAN ++ unsigned int mantissa0:19; ++ unsigned int quiet_nan:1; ++ unsigned int exponent:11; ++ unsigned int negative:1; ++ unsigned int mantissa1:32; ++# else ++ /* Together these comprise the mantissa. */ ++ unsigned int mantissa1:32; ++ unsigned int mantissa0:19; ++ unsigned int quiet_nan:1; ++ unsigned int exponent:11; ++ unsigned int negative:1; ++# endif ++#endif ++ } ieee_nan; ++ }; ++ ++#define IEEE854_LONG_DOUBLE_BIAS 0x3ff /* Added to exponent. */ ++ ++#endif /* LDBL_MANT_DIG == 53 */ ++ ++__END_DECLS ++ ++#endif /* ieee754.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/mips/lshift.S glibc-2.3.2-200304020432/sysdeps/mips/lshift.S +--- glibc-2.3.2/sysdeps/mips/lshift.S Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/lshift.S Fri Mar 14 04:59:37 2003 +@@ -1,6 +1,6 @@ + /* MIPS2 __mpn_lshift -- + +-Copyright (C) 1995, 2000 Free Software Foundation, Inc. ++Copyright (C) 1995, 2000, 2002, 2003 Free Software Foundation, Inc. + + This file is part of the GNU MP Library. + +@@ -44,12 +44,12 @@ + addu $4,$4,$2 /* make r4 point at end of res */ + addiu $6,$6,-1 + and $9,$6,4-1 /* number of limbs in first loop */ +- beq $9,$0,.L0 /* if multiple of 4 limbs, skip first loop */ ++ beq $9,$0,L(L0) /* if multiple of 4 limbs, skip first loop */ + srl $2,$10,$13 /* compute function result */ + + subu $6,$6,$9 + +-.Loop0: lw $3,-8($5) ++L(Loop0): lw $3,-8($5) + addiu $4,$4,-4 + addiu $5,$5,-4 + addiu $9,$9,-1 +@@ -57,13 +57,13 @@ + srl $12,$3,$13 + move $10,$3 + or $8,$11,$12 +- bne $9,$0,.Loop0 ++ bne $9,$0,L(Loop0) + sw $8,0($4) + +-.L0: beq $6,$0,.Lend ++L(L0): beq $6,$0,L(Lend) + nop + +-.Loop: lw $3,-8($5) ++L(Loop): lw $3,-8($5) + addiu $4,$4,-16 + addiu $6,$6,-4 + sll $11,$10,$7 +@@ -89,10 +89,10 @@ + + addiu $5,$5,-16 + or $8,$14,$9 +- bgtz $6,.Loop ++ bgtz $6,L(Loop) + sw $8,0($4) + +-.Lend: sll $8,$10,$7 ++L(Lend): sll $8,$10,$7 + j $31 + sw $8,-4($4) + END (__mpn_lshift) +diff -u -udbrN glibc-2.3.2/sysdeps/mips/machine-gmon.h glibc-2.3.2-200304020432/sysdeps/mips/machine-gmon.h +--- glibc-2.3.2/sysdeps/mips/machine-gmon.h Wed Feb 13 08:30:11 2002 ++++ glibc-2.3.2-200304020432/sysdeps/mips/machine-gmon.h Mon Mar 17 16:53:37 2003 +@@ -1,5 +1,6 @@ + /* Machine-specific calling sequence for `mcount' profiling function. MIPS +- Copyright (C) 1996, 1997, 2000, 2001, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1996, 1997, 2000, 2001, 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 +@@ -20,14 +21,17 @@ + #define _MCOUNT_DECL(frompc,selfpc) \ + static void __attribute_used__ __mcount (u_long frompc, u_long selfpc) + +-/* Call __mcount with our the return PC for our caller, ++/* Call __mcount with the return PC for our caller, + and the return PC our caller will return to. */ ++ ++#if _MIPS_SIM == _MIPS_SIM_ABI32 ++ + #ifdef __PIC__ +-#define CPLOAD ".cpload $25;" +-#define CPRESTORE ".cprestore 44\n\t" ++# define CPLOAD ".cpload $25;" ++# define CPRESTORE ".cprestore 44\n\t" + #else +-#define CPLOAD +-#define CPRESTORE ++# define CPLOAD ++# define CPRESTORE + #endif + + #define MCOUNT asm(\ +@@ -66,3 +70,70 @@ + ".set reorder;\n\t" \ + ".set at\n\t" \ + ".end _mcount"); ++ ++#else ++ ++#ifdef __PIC__ ++# define CPSETUP ".cpsetup $25, 88, _mcount;" ++# define CPRETURN ".cpreturn;" ++#else ++# define CPSETUP ++# define CPRETURN ++#endif ++ ++#if defined _ABIN32 && _MIPS_SIM == _ABIN32 ++# define PTR_ADDU_STRING "add" /* no u */ ++# define PTR_SUBU_STRING "sub" /* no u */ ++#elif defined _ABI64 && _MIPS_SIM == _ABI64 ++# define PTR_ADDU_STRING "daddu" ++# define PTR_SUBU_STRING "dsubu" ++#else ++# error "Unknown ABI" ++#endif ++ ++#define MCOUNT asm(\ ++ ".globl _mcount;\n\t" \ ++ ".align 3;\n\t" \ ++ ".type _mcount,@function;\n\t" \ ++ ".ent _mcount\n\t" \ ++ "_mcount:\n\t" \ ++ ".frame $sp,88,$31\n\t" \ ++ ".set noreorder;\n\t" \ ++ ".set noat;\n\t" \ ++ PTR_SUBU_STRING " $29,$29,96;\n\t" \ ++ CPSETUP \ ++ "sd $4,24($29);\n\t" \ ++ "sd $5,32($29);\n\t" \ ++ "sd $6,40($29);\n\t" \ ++ "sd $7,48($29);\n\t" \ ++ "sd $8,56($29);\n\t" \ ++ "sd $9,64($29);\n\t" \ ++ "sd $10,72($29);\n\t" \ ++ "sd $11,80($29);\n\t" \ ++ "sd $2,16($29);\n\t" \ ++ "sd $1,0($29);\n\t" \ ++ "sd $31,8($29);\n\t" \ ++ "move $5,$31;\n\t" \ ++ "move $4,$1;\n\t" \ ++ "jal __mcount;\n\t" \ ++ "nop;\n\t" \ ++ "ld $4,24($29);\n\t" \ ++ "ld $5,32($29);\n\t" \ ++ "ld $6,40($29);\n\t" \ ++ "ld $7,48($29);\n\t" \ ++ "ld $8,56($29);\n\t" \ ++ "ld $9,64($29);\n\t" \ ++ "ld $10,72($29);\n\t" \ ++ "ld $11,80($29);\n\t" \ ++ "ld $2,16($29);\n\t" \ ++ "ld $31,8($29);\n\t" \ ++ "ld $1,0($29);\n\t" \ ++ CPRETURN \ ++ PTR_ADDU_STRING " $29,$29,96;\n\t" \ ++ "j $31;\n\t" \ ++ "move $31,$1;\n\t" \ ++ ".set reorder;\n\t" \ ++ ".set at\n\t" \ ++ ".end _mcount"); ++ ++#endif +diff -u -udbrN glibc-2.3.2/sysdeps/mips/memcpy.S glibc-2.3.2-200304020432/sysdeps/mips/memcpy.S +--- glibc-2.3.2/sysdeps/mips/memcpy.S Tue Sep 10 13:22:59 2002 ++++ glibc-2.3.2-200304020432/sysdeps/mips/memcpy.S Fri Mar 21 22:39:39 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 2002 Free Software Foundation, Inc. ++/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Hartvig Ekner , 2002. + +@@ -21,12 +21,7 @@ + #include + + +-/* void *memcpy(void *s1, const void *s2, size_t n); +- +- This routine could be optimized further for MIPS64, but this is left +- as an exercise for the future. When it is done, the file should be kept +- as a sisterfile to this one, and placed in the sysdeps/mips/mips64 +- directory. */ ++/* void *memcpy(void *s1, const void *s2, size_t n); */ + + #if __BYTE_ORDER == __BIG_ENDIAN + # define LWHI lwl /* high part is left in big-endian */ +@@ -44,27 +39,29 @@ + .set noreorder + + slti t0, a2, 8 # Less than 8? +- bne t0, zero, $last8 ++ bne t0, zero, L(last8) + move v0, a0 # Setup exit value before too late + + xor t0, a1, a0 # Find a0/a1 displacement + andi t0, 0x3 +- bne t0, zero, $shift # Go handle the unaligned case ++ bne t0, zero, L(shift) # Go handle the unaligned case + subu t1, zero, a1 + andi t1, 0x3 # a0/a1 are aligned, but are we +- beq t1, zero, $chk8w # starting in the middle of a word? ++ beq t1, zero, L(chk8w) # starting in the middle of a word? + subu a2, t1 + LWHI t0, 0(a1) # Yes we are... take care of that + addu a1, t1 + SWHI t0, 0(a0) + addu a0, t1 + +-$chk8w: andi t0, a2, 0x1f # 32 or more bytes left? +- beq t0, a2, $chk1w ++L(chk8w): ++ andi t0, a2, 0x1f # 32 or more bytes left? ++ beq t0, a2, L(chk1w) + subu a3, a2, t0 # Yes + addu a3, a1 # a3 = end address of loop + move a2, t0 # a2 = what will be left after loop +-$lop8w: lw t0, 0(a1) # Loop taking 8 words at a time ++L(lop8w): ++ lw t0, 0(a1) # Loop taking 8 words at a time + lw t1, 4(a1) + lw t2, 8(a1) + lw t3, 12(a1) +@@ -81,49 +78,57 @@ + sw t4, -16(a0) + sw t5, -12(a0) + sw t6, -8(a0) +- bne a1, a3, $lop8w ++ bne a1, a3, L(lop8w) + sw t7, -4(a0) + +-$chk1w: andi t0, a2, 0x3 # 4 or more bytes left? +- beq t0, a2, $last8 ++L(chk1w): ++ andi t0, a2, 0x3 # 4 or more bytes left? ++ beq t0, a2, L(last8) + subu a3, a2, t0 # Yes, handle them one word at a time + addu a3, a1 # a3 again end address + move a2, t0 +-$lop1w: lw t0, 0(a1) ++L(lop1w): ++ lw t0, 0(a1) + addiu a0, 4 + addiu a1, 4 +- bne a1, a3, $lop1w ++ bne a1, a3, L(lop1w) + sw t0, -4(a0) + +-$last8: blez a2, $lst8e # Handle last 8 bytes, one at a time ++L(last8): ++ blez a2, L(lst8e) # Handle last 8 bytes, one at a time + addu a3, a2, a1 +-$lst8l: lb t0, 0(a1) ++L(lst8l): ++ lb t0, 0(a1) + addiu a0, 1 + addiu a1, 1 +- bne a1, a3, $lst8l ++ bne a1, a3, L(lst8l) + sb t0, -1(a0) +-$lst8e: jr ra # Bye, bye ++L(lst8e): ++ jr ra # Bye, bye + nop + +-$shift: subu a3, zero, a0 # Src and Dest unaligned ++L(shift): ++ subu a3, zero, a0 # Src and Dest unaligned + andi a3, 0x3 # (unoptimized case...) +- beq a3, zero, $shft1 ++ beq a3, zero, L(shft1) + subu a2, a3 # a2 = bytes left + LWHI t0, 0(a1) # Take care of first odd part + LWLO t0, 3(a1) + addu a1, a3 + SWHI t0, 0(a0) + addu a0, a3 +-$shft1: andi t0, a2, 0x3 ++L(shft1): ++ andi t0, a2, 0x3 + subu a3, a2, t0 + addu a3, a1 +-$shfth: LWHI t1, 0(a1) # Limp through, word by word ++L(shfth): ++ LWHI t1, 0(a1) # Limp through, word by word + LWLO t1, 3(a1) + addiu a0, 4 + addiu a1, 4 +- bne a1, a3, $shfth ++ bne a1, a3, L(shfth) + sw t1, -4(a0) +- b $last8 # Handle anything which may be left ++ b L(last8) # Handle anything which may be left + move a2, t0 + + .set reorder +diff -u -udbrN glibc-2.3.2/sysdeps/mips/memset.S glibc-2.3.2-200304020432/sysdeps/mips/memset.S +--- glibc-2.3.2/sysdeps/mips/memset.S Tue Sep 10 13:22:59 2002 ++++ glibc-2.3.2-200304020432/sysdeps/mips/memset.S Fri Mar 21 22:39:39 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 2002 Free Software Foundation, Inc. ++/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Hartvig Ekner , 2002. + +@@ -21,12 +21,7 @@ + #include + + +-/* void *memset(void *s, int c, size_t n). +- +- This routine could be optimized further for MIPS64, but this is left +- as an exercise for the future. When it is done, the file should be kept +- as a sisterfile to this one, and placed in the sysdeps/mips/mips64 +- directory. */ ++/* void *memset(void *s, int c, size_t n). */ + + #if __BYTE_ORDER == __BIG_ENDIAN + # define SWHI swl /* high part is left in big-endian */ +@@ -38,45 +33,52 @@ + .set noreorder + + slti t1, a2, 8 # Less than 8? +- bne t1, zero, $last8 ++ bne t1, zero, L(last8) + move v0, a0 # Setup exit value before too late + +- beq a1, zero, $ueven # If zero pattern, no need to extend ++ beq a1, zero, L(ueven) # If zero pattern, no need to extend + andi a1, 0xff # Avoid problems with bogus arguments + sll t0, a1, 8 + or a1, t0 + sll t0, a1, 16 + or a1, t0 # a1 is now pattern in full word + +-$ueven: subu t0, zero, a0 # Unaligned address? ++L(ueven): ++ subu t0, zero, a0 # Unaligned address? + andi t0, 0x3 +- beq t0, zero, $chkw ++ beq t0, zero, L(chkw) + subu a2, t0 + SWHI a1, 0(a0) # Yes, handle first unaligned part + addu a0, t0 # Now both a0 and a2 are updated + +-$chkw: andi t0, a2, 0x7 # Enough left for one loop iteration? +- beq t0, a2, $chkl ++L(chkw): ++ andi t0, a2, 0x7 # Enough left for one loop iteration? ++ beq t0, a2, L(chkl) + subu a3, a2, t0 + addu a3, a0 # a3 is last loop address +1 + move a2, t0 # a2 is now # of bytes left after loop +-$loopw: addiu a0, 8 # Handle 2 words pr. iteration ++L(loopw): ++ addiu a0, 8 # Handle 2 words pr. iteration + sw a1, -8(a0) +- bne a0, a3, $loopw ++ bne a0, a3, L(loopw) + sw a1, -4(a0) + +-$chkl: andi t0, a2, 0x4 # Check if there is at least a full +- beq t0, zero, $last8 # word remaining after the loop ++L(chkl): ++ andi t0, a2, 0x4 # Check if there is at least a full ++ beq t0, zero, L(last8) # word remaining after the loop + subu a2, t0 + sw a1, 0(a0) # Yes... + addiu a0, 4 + +-$last8: blez a2, $exit # Handle last 8 bytes (if cnt>0) ++L(last8): ++ blez a2, L(exit) # Handle last 8 bytes (if cnt>0) + addu a3, a2, a0 # a3 is last address +1 +-$lst8l: addiu a0, 1 +- bne a0, a3, $lst8l ++L(lst8l): ++ addiu a0, 1 ++ bne a0, a3, L(lst8l) + sb a1, -1(a0) +-$exit: j ra # Bye, bye ++L(exit): ++ j ra # Bye, bye + nop + + .set reorder +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips32/Implies glibc-2.3.2-200304020432/sysdeps/mips/mips32/Implies +--- glibc-2.3.2/sysdeps/mips/mips32/Implies Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips32/Implies Sat Mar 29 09:15:28 2003 +@@ -0,0 +1,2 @@ ++mips ++wordsize-32 +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips32/Makefile glibc-2.3.2-200304020432/sysdeps/mips/mips32/Makefile +--- glibc-2.3.2/sysdeps/mips/mips32/Makefile Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips32/Makefile Sat Mar 29 09:15:28 2003 +@@ -0,0 +1,3 @@ ++ifeq ($(filter -mabi=32,$(CC)),) ++CC += -mabi=32 ++endif +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/Implies glibc-2.3.2-200304020432/sysdeps/mips/mips64/Implies +--- glibc-2.3.2/sysdeps/mips/mips64/Implies Wed Jul 14 09:27:44 1999 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/Implies Mon Mar 17 17:20:44 2003 +@@ -1,4 +1,3 @@ +-wordsize-64 + # MIPS uses IEEE 754 floating point. + ieee754/flt-32 + ieee754/dbl-64 +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/__longjmp.c glibc-2.3.2-200304020432/sysdeps/mips/mips64/__longjmp.c +--- glibc-2.3.2/sysdeps/mips/mips64/__longjmp.c Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/__longjmp.c Thu Mar 20 23:29:44 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1992, 1995, 1997, 2000 Free Software Foundation, Inc. ++/* Copyright (C) 1992, 1995, 1997, 2000, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + +@@ -38,6 +38,7 @@ + register int val asm ("a1"); + + /* Pull back the floating point callee-saved registers. */ ++#if defined _ABI64 && _MIPS_SIM == _ABI64 + asm volatile ("l.d $f24, %0" : : "m" (env[0].__fpregs[0])); + asm volatile ("l.d $f25, %0" : : "m" (env[0].__fpregs[1])); + asm volatile ("l.d $f26, %0" : : "m" (env[0].__fpregs[2])); +@@ -46,6 +47,14 @@ + asm volatile ("l.d $f29, %0" : : "m" (env[0].__fpregs[5])); + asm volatile ("l.d $f30, %0" : : "m" (env[0].__fpregs[6])); + asm volatile ("l.d $f31, %0" : : "m" (env[0].__fpregs[7])); ++#else ++ asm volatile ("l.d $f20, %0" : : "m" (env[0].__fpregs[0])); ++ asm volatile ("l.d $f22, %0" : : "m" (env[0].__fpregs[1])); ++ asm volatile ("l.d $f24, %0" : : "m" (env[0].__fpregs[2])); ++ asm volatile ("l.d $f26, %0" : : "m" (env[0].__fpregs[3])); ++ asm volatile ("l.d $f28, %0" : : "m" (env[0].__fpregs[4])); ++ asm volatile ("l.d $f30, %0" : : "m" (env[0].__fpregs[5])); ++#endif + + /* Get and reconstruct the floating point csr. */ + asm volatile ("lw $2, %0" : : "m" (env[0].__fpc_csr)); +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/add_n.S glibc-2.3.2-200304020432/sysdeps/mips/mips64/add_n.S +--- glibc-2.3.2/sysdeps/mips/mips64/add_n.S Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/add_n.S Fri Mar 14 04:59:37 2003 +@@ -1,7 +1,7 @@ + /* MIPS3 __mpn_add_n -- Add two limb vectors of the same length > 0 and + * store sum in a third limb vector. + * +- * Copyright (C) 1995, 2000 Free Software Foundation, Inc. ++ * Copyright (C) 1995, 2000, 2002, 2003 Free Software Foundation, Inc. + * + * This file is part of the GNU MP Library. + * +@@ -22,6 +22,7 @@ + */ + + #include ++#include + + /* + * INPUT PARAMETERS +@@ -38,10 +39,10 @@ + .globl __mpn_add_n + .ent __mpn_add_n + __mpn_add_n: +- .set noreorder + #ifdef __PIC__ +- .cpload t9 ++ SETUP_GP /* ??? unused */ + #endif ++ .set noreorder + .set nomacro + + ld $10,0($5) +@@ -49,12 +50,12 @@ + + daddiu $7,$7,-1 + and $9,$7,4-1 # number of limbs in first loop +- beq $9,$0,.L0 # if multiple of 4 limbs, skip first loop ++ beq $9,$0,L(L0) # if multiple of 4 limbs, skip first loop + move $2,$0 + + dsubu $7,$7,$9 + +-.Loop0: daddiu $9,$9,-1 ++L(Loop0): daddiu $9,$9,-1 + ld $12,8($5) + daddu $11,$11,$2 + ld $13,8($6) +@@ -68,13 +69,13 @@ + daddiu $6,$6,8 + move $10,$12 + move $11,$13 +- bne $9,$0,.Loop0 ++ bne $9,$0,L(Loop0) + daddiu $4,$4,8 + +-.L0: beq $7,$0,.Lend ++L(L0): beq $7,$0,L(Lend) + nop + +-.Loop: daddiu $7,$7,-4 ++L(Loop): daddiu $7,$7,-4 + + ld $12,8($5) + daddu $11,$11,$2 +@@ -115,10 +116,10 @@ + daddiu $5,$5,32 + daddiu $6,$6,32 + +- bne $7,$0,.Loop ++ bne $7,$0,L(Loop) + daddiu $4,$4,32 + +-.Lend: daddu $11,$11,$2 ++L(Lend): daddu $11,$11,$2 + sltu $8,$11,$2 + daddu $11,$10,$11 + sltu $2,$11,$10 +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/addmul_1.S glibc-2.3.2-200304020432/sysdeps/mips/mips64/addmul_1.S +--- glibc-2.3.2/sysdeps/mips/mips64/addmul_1.S Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/addmul_1.S Fri Mar 14 04:59:37 2003 +@@ -1,7 +1,7 @@ + /* MIPS3 __mpn_addmul_1 -- Multiply a limb vector with a single limb and + * add the product to a second limb vector. + * +- * Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc. ++ * Copyright (C) 1992, 1994, 1995, 2002, 2003 Free Software Foundation, Inc. + * + * This file is part of the GNU MP Library. + * +@@ -22,6 +22,7 @@ + */ + + #include ++#include + + /* INPUT PARAMETERS + * res_ptr $4 +@@ -38,10 +39,10 @@ + .globl __mpn_addmul_1 + .ent __mpn_addmul_1 + __mpn_addmul_1: +- .set noreorder + #ifdef PIC +- .cpload t9 ++ SETUP_GP /* ??? unused */ + #endif ++ .set noreorder + .set nomacro + + # warm up phase 0 +@@ -52,14 +53,14 @@ + dmultu $8,$7 + + daddiu $6,$6,-1 +- beq $6,$0,$LC0 ++ beq $6,$0,L(LC0) + move $2,$0 # zero cy2 + + daddiu $6,$6,-1 +- beq $6,$0,$LC1 ++ beq $6,$0,L(LC1) + ld $8,0($5) # load new s1 limb as early as possible + +-Loop: ld $10,0($4) ++L(Loop): ld $10,0($4) + mflo $3 + mfhi $9 + daddiu $5,$5,8 +@@ -73,11 +74,11 @@ + daddu $2,$2,$10 + sd $3,0($4) + daddiu $4,$4,8 +- bne $6,$0,Loop ++ bne $6,$0,L(Loop) + daddu $2,$9,$2 # add high product limb and carry from addition + + # cool down phase 1 +-$LC1: ld $10,0($4) ++L(LC1): ld $10,0($4) + mflo $3 + mfhi $9 + daddu $3,$3,$2 +@@ -91,7 +92,7 @@ + daddu $2,$9,$2 # add high product limb and carry from addition + + # cool down phase 0 +-$LC0: ld $10,0($4) ++L(LC0): ld $10,0($4) + mflo $3 + mfhi $9 + daddu $3,$3,$2 +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/bits/setjmp.h glibc-2.3.2-200304020432/sysdeps/mips/mips64/bits/setjmp.h +--- glibc-2.3.2/sysdeps/mips/mips64/bits/setjmp.h Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/bits/setjmp.h Thu Jan 1 01:00:00 1970 +@@ -1,57 +0,0 @@ +-/* Define the machine-dependent type `jmp_buf'. MIPS version. +- Copyright (C) 1996, 1997 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 _SETJMP_H +-# error "Never include directly; use instead." +-#endif +- +-typedef struct +- { +- /* Program counter. */ +- __ptr_t __pc; +- +- /* Stack pointer. */ +- __ptr_t __sp; +- +- /* Callee-saved registers s0 through s7. */ +- int __regs[8]; +- +- /* The frame pointer. */ +- __ptr_t __fp; +- +- /* The global pointer. */ +- __ptr_t __gp; +- +- /* Floating point status register. */ +- int __fpc_csr; +- +- /* Callee-saved floating point registers. */ +- double __fpregs[8]; +- } __jmp_buf[1]; +- +-#ifdef __USE_MISC +-/* Offset to the program counter in `jmp_buf'. */ +-# define JB_PC 0 +-#endif +- +- +-/* Test if longjmp to JMPBUF would unwind the frame +- containing a local variable at ADDRESS. */ +-#define _JMPBUF_UNWINDS(jmpbuf, address) \ +- ((__ptr_t) (address) < (jmpbuf)[0].__sp) +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/bsd-_setjmp.S glibc-2.3.2-200304020432/sysdeps/mips/mips64/bsd-_setjmp.S +--- glibc-2.3.2/sysdeps/mips/mips64/bsd-_setjmp.S Tue Dec 31 20:13:27 2002 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/bsd-_setjmp.S Mon Mar 17 16:47:12 2003 +@@ -1,5 +1,5 @@ + /* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. MIPS64 version. +- Copyright (C) 1996, 1997, 2000, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1996, 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 +@@ -28,10 +28,19 @@ + #endif + ENTRY (_setjmp) + #ifdef __PIC__ +- .cpload t9 ++ SETUP_GP + #endif +- dla t9, C_SYMBOL_NAME (__sigsetjmp) ++ SETUP_GP64 (v0, C_SYMBOL_NAME (_setjmp)) ++ PTR_LA t9, C_SYMBOL_NAME (__sigsetjmp) ++#if _MIPS_SIM == _MIPS_SIM_ABI32 + nop ++#endif ++ RESTORE_GP64 ++ move a1, zero /* Pass a second argument of zero. */ ++#ifdef __PIC__ + jr t9 +- dli a1, 0 /* Pass a second argument of zero. */ ++#else ++ j C_SYMBOL_NAME (__sigsetjmp) ++#endif ++ .end _setjmp + libc_hidden_def (_setjmp) +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/bsd-setjmp.S glibc-2.3.2-200304020432/sysdeps/mips/mips64/bsd-setjmp.S +--- glibc-2.3.2/sysdeps/mips/mips64/bsd-setjmp.S Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/bsd-setjmp.S Mon Mar 17 16:47:12 2003 +@@ -1,5 +1,5 @@ + /* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. MIPS64 version. +- Copyright (C) 1996, 1997 Free Software Foundation, Inc. ++ Copyright (C) 1996, 1997, 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 +@@ -22,15 +22,25 @@ + in setjmp doesn't clobber the state restored by longjmp. */ + + #include ++#include + + #ifdef PIC + .option pic2 + #endif + ENTRY (setjmp) +-#ifdef PIC +- .cpload t9 ++#ifdef __PIC__ ++ SETUP_GP + #endif +- dla t9, C_SYMBOL_NAME (__sigsetjmp) ++ SETUP_GP64 (v0, C_SYMBOL_NAME (setjmp)) ++ PTR_LA t9, C_SYMBOL_NAME (__sigsetjmp) ++#if _MIPS_SIM == _MIPS_SIM_ABI32 + nop +- jr t9 ++#endif ++ RESTORE_GP64 + dli a1, 1 /* Pass a second argument of one. */ ++#ifdef __PIC__ ++ jr t9 ++#else ++ j C_SYMBOL_NAME (__sigsetjmp) ++#endif ++ .end setjmp +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/dl-machine.h glibc-2.3.2-200304020432/sysdeps/mips/mips64/dl-machine.h +--- glibc-2.3.2/sysdeps/mips/mips64/dl-machine.h Thu Feb 28 22:35:57 2002 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/dl-machine.h Thu Jan 1 01:00:00 1970 +@@ -1,594 +0,0 @@ +-/* Machine-dependent ELF dynamic relocation inline functions. MIPS64 version. +- Copyright (C) 1996,1997,1999,2000,2001,2002 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- Contributed by Kazumoto Kojima . +- +- 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 dl_machine_h +-#define dl_machine_h +- +-#define ELF_MACHINE_NAME "MIPS" +- +-#define ELF_MACHINE_NO_PLT +- +-#include +- +-#ifndef ENTRY_POINT +-#error ENTRY_POINT needs to be defined for MIPS. +-#endif +- +-#ifndef _RTLD_PROLOGUE +-# define _RTLD_PROLOGUE(entry) "\n\t.globl " __STRING(entry) \ +- "\n\t.ent " __STRING(entry) \ +- "\n\t" __STRING(entry) ":\n\t" +-#endif +- +-#ifndef _RTLD_EPILOGUE +-# define _RTLD_EPILOGUE(entry) "\t.end " __STRING(entry) "\n" +-#endif +- +-/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. +- This makes no sense on MIPS but we have to define this to R_MIPS_REL32 +- to avoid the asserts in dl-lookup.c from blowing. */ +-#define ELF_MACHINE_JMP_SLOT R_MIPS_REL32 +-#define elf_machine_type_class(type) ELF_RTYPE_CLASS_PLT +- +-/* Translate a processor specific dynamic tag to the index +- in l_info array. */ +-#define DT_MIPS(x) (DT_MIPS_##x - DT_LOPROC + DT_NUM) +- +-#if 0 +-/* We may need 64k alignment. */ +-#define ELF_MACHINE_ALIGN_MASK 0xffff +-#endif +- +-/* +- * MIPS libraries are usually linked to a non-zero base address. We +- * subtrace the base address from the address where we map the object +- * to. This results in more efficient address space usage. +- */ +-#if 0 +-#define MAP_BASE_ADDR(l) ((l)->l_info[DT_MIPS(BASE_ADDRESS)] ? \ +- (l)->l_info[DT_MIPS(BASE_ADDRESS)]->d_un.d_ptr : 0) +-#else +-#define MAP_BASE_ADDR(l) 0x5ffe0000 +-#endif +- +-/* If there is a DT_MIPS_RLD_MAP entry in the dynamic section, fill it in +- with the run-time address of the r_debug structure */ +-#define ELF_MACHINE_DEBUG_SETUP(l,r) \ +-do { if ((l)->l_info[DT_MIPS (RLD_MAP)]) \ +- *(ElfW(Addr) *)((l)->l_info[DT_MIPS (RLD_MAP)]->d_un.d_ptr) = \ +- (ElfW(Addr)) (r); \ +- } while (0) +- +-/* Return nonzero iff ELF header is compatible with the running host. */ +-static inline int __attribute__ ((unused)) +-elf_machine_matches_host (const ElfW(Ehdr) *ehdr) +-{ +- switch (ehdr->e_machine) +- { +- case EM_MIPS: +- case EM_MIPS_RS3_LE: +- return 1; +- default: +- return 0; +- } +-} +- +-static inline ElfW(Addr) * +-elf_mips_got_from_gpreg (ElfW(Addr) gpreg) +-{ +- /* FIXME: the offset of gp from GOT may be system-dependent. */ +- return (ElfW(Addr) *) (gpreg - 0x7ff0); +-} +- +-/* Return the link-time address of _DYNAMIC. Conveniently, this is the +- first element of the GOT. This must be inlined in a function which +- uses global data. */ +-static inline ElfW(Addr) +-elf_machine_dynamic (void) +-{ +- register ElfW(Addr) gp __asm__ ("$28"); +- +- return *elf_mips_got_from_gpreg (gp); +-} +- +- +-/* Return the run-time load address of the shared object. */ +-static inline ElfW(Addr) +-elf_machine_load_address (void) +-{ +- ElfW(Addr) addr; +- asm (" .set noreorder\n" +- " dla %0, here\n" +- " bltzal $0, here\n" +- " nop\n" +- "here: dsubu %0, $31, %0\n" +- " .set reorder\n" +- : "=r" (addr) +- : /* No inputs */ +- : "$31"); +- return addr; +-} +- +-/* The MSB of got[1] of a gnu object is set to identify gnu objects. */ +-#define ELF_MIPS_GNU_GOT1_MASK 0x80000000 +- +-/* Relocate GOT. */ +-static inline void +-elf_machine_got_rel (struct link_map *map, int lazy) +-{ +- ElfW(Addr) *got; +- ElfW(Sym) *sym; +- int i, n; +- const char *strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]); +- +-#define RESOLVE_GOTSYM(sym) \ +- ({ \ +- const ElfW(Sym) *ref = sym; \ +- ElfW(Addr) sym_loadaddr; \ +- sym_loadaddr = _dl_lookup_symbol (strtab + sym->st_name, &ref, \ +- map->l_scope, \ +- map->l_name, R_MIPS_REL32);\ +- (ref)? sym_loadaddr + ref->st_value: 0; \ +- }) +- +- got = (ElfW(Addr) *) D_PTR (map, l_info[DT_PLTGOT]); +- +- /* got[0] is reserved. got[1] is also reserved for the dynamic object +- generated by gnu ld. Skip these reserved entries from relocation. */ +- i = (got[1] & ELF_MIPS_GNU_GOT1_MASK)? 2: 1; +- n = map->l_info[DT_MIPS (LOCAL_GOTNO)]->d_un.d_val; +- /* Add the run-time display to all local got entries. */ +- while (i < n) +- got[i++] += map->l_addr; +- +- /* Handle global got entries. */ +- got += n; +- sym = (ElfW(Sym) *) D_PTR (map, l_info[DT_SYMTAB]); +- sym += map->l_info[DT_MIPS (GOTSYM)]->d_un.d_val; +- i = (map->l_info[DT_MIPS (SYMTABNO)]->d_un.d_val +- - map->l_info[DT_MIPS (GOTSYM)]->d_un.d_val); +- +- while (i--) +- { +- if (sym->st_shndx == SHN_UNDEF) +- { +- if (ELFW(ST_TYPE) (sym->st_info) == STT_FUNC) +- { +- if (sym->st_value && lazy) +- *got = sym->st_value + map->l_addr; +- else +- *got = RESOLVE_GOTSYM (sym); +- } +- else /* if (*got == 0 || *got == QS) */ +- *got = RESOLVE_GOTSYM (sym); +- } +- else if (sym->st_shndx == SHN_COMMON) +- *got = RESOLVE_GOTSYM (sym); +- else if (ELFW(ST_TYPE) (sym->st_info) == STT_FUNC +- && *got != sym->st_value +- && lazy) +- *got += map->l_addr; +- else if (ELFW(ST_TYPE) (sym->st_info) == STT_SECTION) +- { +- if (sym->st_other == 0) +- *got += map->l_addr; +- } +- else +- *got = RESOLVE_GOTSYM (sym); +- +- got++; +- sym++; +- } +- +-#undef RESOLVE_GOTSYM +- +- return; +-} +- +-/* Set up the loaded object described by L so its stub function +- will jump to the on-demand fixup code in dl-runtime.c. */ +- +-static inline int +-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) +-{ +- ElfW(Addr) *got; +- extern void _dl_runtime_resolve (ElfW(Word)); +- extern int _dl_mips_gnu_objects; +- +-#ifdef RTLD_BOOTSTRAP +- { +- return lazy; +- } +-#endif +- if (lazy) +- { +- /* The GOT entries for functions have not yet been filled in. +- Their initial contents will arrange when called to put an +- offset into the .dynsym section in t8, the return address +- in t7 and then jump to _GLOBAL_OFFSET_TABLE[0]. */ +- got = (ElfW(Addr) *) D_PTR (l, l_info[DT_PLTGOT]); +- +- /* This function will get called to fix up the GOT entry indicated by +- the register t8, and then jump to the resolved address. */ +- got[0] = (ElfW(Addr)) &_dl_runtime_resolve; +- +- /* Store l to _GLOBAL_OFFSET_TABLE[1] for gnu object. The MSB +- of got[1] of a gnu object is set to identify gnu objects. +- Where we can store l for non gnu objects? XXX */ +- if ((got[1] & ELF_MIPS_GNU_GOT1_MASK) != 0) +- got[1] = (ElfW(Addr)) ((unsigned) l | ELF_MIPS_GNU_GOT1_MASK); +- else +- _dl_mips_gnu_objects = 0; +- } +- +- /* Relocate global offset table. */ +- elf_machine_got_rel (l, lazy); +- +- return lazy; +-} +- +-/* Get link_map for this object. */ +-static inline struct link_map * +-elf_machine_runtime_link_map (ElfW(Addr) gpreg, ElfW(Addr) stub_pc) +-{ +- extern int _dl_mips_gnu_objects; +- +- /* got[1] is reserved to keep its link map address for the shared +- object generated by the gnu linker. If all are such objects, we +- can find the link map from current GPREG simply. If not so, get +- the link map for caller's object containing STUB_PC. */ +- +- if (_dl_mips_gnu_objects) +- { +- ElfW(Addr) *got = elf_mips_got_from_gpreg (gpreg); +- ElfW(Word) g1; +- +- g1 = ((ElfW(Word) *) got)[1]; +- +- if ((g1 & ELF_MIPS_GNU_GOT1_MASK) != 0) +- { +- struct link_map *l = +- (struct link_map *) (g1 & ~ELF_MIPS_GNU_GOT1_MASK); +- ElfW(Addr) base, limit; +- const ElfW(Phdr) *p = l->l_phdr; +- ElfW(Half) this, nent = l->l_phnum; +- +- /* For the common case of a stub being called from the containing +- object, STUB_PC will point to somewhere within the object that +- is described by the link map fetched via got[1]. Otherwise we +- have to scan all maps. */ +- for (this = 0; this < nent; this++) +- { +- if (p[this].p_type == PT_LOAD) +- { +- base = p[this].p_vaddr + l->l_addr; +- limit = base + p[this].p_memsz; +- if (stub_pc >= base && stub_pc < limit) +- return l; +- } +- this++; +- } +- } +- } +- +- { +- struct link_map *l = GL(dl_loaded); +- +- while (l) +- { +- ElfW(Addr) base, limit; +- const ElfW(Phdr) *p = l->l_phdr; +- ElfW(Half) this, nent = l->l_phnum; +- +- for (this = 0; this < nent; this++) +- { +- if (p[this].p_type == PT_LOAD) +- { +- base = p[this].p_vaddr + l->l_addr; +- limit = base + p[this].p_memsz; +- if (stub_pc >= base && stub_pc < limit) +- return l; +- } +- } +- l = l->l_next; +- } +- } +- +- _dl_signal_error (0, NULL, NULL, "cannot find runtime link map"); +- return NULL; +-} +- +-/* Mips has no PLT but define elf_machine_relplt to be elf_machine_rel. */ +-#define elf_machine_relplt elf_machine_rel +- +-/* Define mips specific runtime resolver. The function __dl_runtime_resolve +- is called from assembler function _dl_runtime_resolve which converts +- special argument registers t7 ($15) and t8 ($24): +- t7 address to return to the caller of the function +- t8 index for this function symbol in .dynsym +- to usual c arguments. */ +- +-#define ELF_MACHINE_RUNTIME_TRAMPOLINE \ +-/* The flag _dl_mips_gnu_objects is set if all dynamic objects are \ +- generated by the gnu linker. */ \ +-int _dl_mips_gnu_objects = 1; \ +- \ +-/* This is called from assembly stubs below which the compiler can't see. */ \ +-static ElfW(Addr) \ +-__dl_runtime_resolve (ElfW(Word), ElfW(Word), ElfW(Addr), ElfW(Addr)) \ +- __attribute__ ((unused)); \ +- \ +-static ElfW(Addr) \ +-__dl_runtime_resolve (ElfW(Word) sym_index, \ +- ElfW(Word) return_address, \ +- ElfW(Addr) old_gpreg, \ +- ElfW(Addr) stub_pc) \ +-{ \ +- struct link_map *l = elf_machine_runtime_link_map (old_gpreg, stub_pc); \ +- const ElfW(Sym) *const symtab \ +- = (const ElfW(Sym) *) D_PTR (l, l_info[DT_SYMTAB]); \ +- const char *strtab = (const void *) D_PTR (l, l_info[DT_STRTAB]); \ +- const ElfW(Addr) *got \ +- = (const ElfW(Addr) *) D_PTR (l, l_info[DT_PLTGOT]); \ +- const ElfW(Word) local_gotno \ +- = (const ElfW(Word)) l->l_info[DT_MIPS (LOCAL_GOTNO)]->d_un.d_val; \ +- const ElfW(Word) gotsym \ +- = (const ElfW(Word)) l->l_info[DT_MIPS (GOTSYM)]->d_un.d_val; \ +- const ElfW(Sym) *definer; \ +- ElfW(Addr) loadbase; \ +- ElfW(Addr) funcaddr; \ +- \ +- /* Look up the symbol's run-time value. */ \ +- definer = &symtab[sym_index]; \ +- \ +- loadbase = _dl_lookup_symbol (strtab + definer->st_name, &definer, \ +- l->l_scope, l->l_name, \ +- R_MIPS_REL32); \ +- \ +- /* Apply the relocation with that value. */ \ +- funcaddr = loadbase + definer->st_value; \ +- *(got + local_gotno + sym_index - gotsym) = funcaddr; \ +- \ +- return funcaddr; \ +-} \ +- \ +-asm ("\n \ +- .text\n \ +- .align 3\n \ +- .globl _dl_runtime_resolve\n \ +- .type _dl_runtime_resolve,@function\n \ +- .ent _dl_runtime_resolve\n \ +-_dl_runtime_resolve:\n \ +- .set noreorder\n \ +- # Save old GP to $3.\n \ +- move $3,$28\n \ +- # Modify t9 ($25) so as to point .cpload instruction.\n \ +- daddu $25,2*8\n \ +- # Compute GP.\n \ +- .cpload $25\n \ +- .set reorder\n \ +- # Save slot call pc.\n \ +- move $2, $31\n \ +- # Save arguments and sp value in stack.\n \ +- dsubu $29, 10*8\n \ +- .cprestore 8*8\n \ +- sd $15, 9*8($29)\n \ +- sd $4, 3*8($29)\n \ +- sd $5, 4*8($29)\n \ +- sd $6, 5*8($29)\n \ +- sd $7, 6*8($29)\n \ +- sd $16, 7*8($29)\n \ +- move $16, $29\n \ +- move $4, $24\n \ +- move $5, $15\n \ +- move $6, $3\n \ +- move $7, $2\n \ +- jal __dl_runtime_resolve\n \ +- move $29, $16\n \ +- ld $31, 9*8($29)\n \ +- ld $4, 3*8($29)\n \ +- ld $5, 4*8($29)\n \ +- ld $6, 5*8($29)\n \ +- ld $7, 6*8($29)\n \ +- ld $16, 7*8($29)\n \ +- daddu $29, 10*8\n \ +- move $25, $2\n \ +- jr $25\n \ +- .end _dl_runtime_resolve\n \ +- .previous\n \ +-"); +- +-/* Mask identifying addresses reserved for the user program, +- where the dynamic linker should not map anything. */ +-#define ELF_MACHINE_USER_ADDRESS_MASK 0x80000000UL +- +- +- +-/* Initial entry point code for the dynamic linker. +- The C function `_dl_start' is the real entry point; +- its return value is the user program's entry point. +- Note how we have to be careful about two things: +- +- 1) That we allocate a minimal stack of 24 bytes for +- every function call, the MIPS ABI states that even +- if all arguments are passed in registers the procedure +- called can use the 16 byte area pointed to by $sp +- when it is called to store away the arguments passed +- to it. +- +- 2) That under Linux the entry is named __start +- and not just plain _start. */ +- +-#define RTLD_START asm ("\ +- .text\n\ +- .align 3\n"\ +-_RTLD_PROLOGUE (ENTRY_POINT)\ +-" .globl _dl_start_user\n\ +- .set noreorder\n\ +- bltzal $0, 0f\n\ +- nop\n\ +-0: .cpload $31\n\ +- .set reorder\n\ +- # i386 ABI book says that the first entry of GOT holds\n\ +- # the address of the dynamic structure. Though MIPS ABI\n\ +- # doesn't say nothing about this, I emulate this here.\n\ +- dla $4, _DYNAMIC\n\ +- sd $4, -0x7ff0($28)\n\ +- dsubu $29, 16\n\ +- move $4, $29\n\ +- jal _dl_start\n\ +- daddiu $29, 16\n\ +- # Get the value of label '_dl_start_user' in t9 ($25).\n\ +- dla $25, _dl_start_user\n\ +-_dl_start_user:\n\ +- .set noreorder\n\ +- .cpload $25\n\ +- .set reorder\n\ +- move $16, $28\n\ +- # Save the user entry point address in saved register.\n\ +- move $17, $2\n\ +- # Store the highest stack address\n\ +- sd $29, __libc_stack_end\n\ +- # See if we were run as a command with the executable file\n\ +- # name as an extra leading argument.\n\ +- ld $2, _dl_skip_args\n\ +- beq $2, $0, 1f\n\ +- # Load the original argument count.\n\ +- ld $4, 0($29)\n\ +- # Subtract _dl_skip_args from it.\n\ +- dsubu $4, $2\n\ +- # Adjust the stack pointer to skip _dl_skip_args words.\n\ +- dsll $2,2\n\ +- daddu $29, $2\n\ +- # Save back the modified argument count.\n\ +- sd $4, 0($29)\n\ +-1: # Call _dl_init (struct link_map *main_map, int argc, char **argv, char **env) \n\ +- ld $4, _rtld_local\n\ +- ld $5, 0($29)\n\ +- dla $6, 4($29)\n\ +- dla $7, 8($29)\n\ +- dsubu $29, 16\n\ +- # Call the function to run the initializers.\n\ +- jal _dl_init_internal\n\ +- daddiu $29, 16\n\ +- # Pass our finalizer function to the user in ra.\n\ +- dla $31, _dl_fini\n\ +- # Jump to the user entry point.\n\ +-1: # Call _dl_init (struct link_map *main_map, int argc, char **argv, char **env) \n\ +- lw $4, _rtld_local\n\ +- lw $5, 0($29)\n\ +- la $6, 4($29)\n\ +- la $7, 8($29)\n\ +- subu $29, 16\n\ +- # Call the function to run the initializers.\n\ +- jal _dl_init_internal\n\ +- addiu $29, 16\n\ +- # Pass our finalizer function to the user in ra.\n\ +- dla $31, _dl_fini\n\ +- # Jump to the user entry point.\n\ +- move $25, $17\n\ +- ld $4, 0($29)\n\ +- ld $5, 1*8($29)\n\ +- ld $6, 2*8$29)\n\ +- ld $7, 3*8($29)\n\ +- jr $25\n"\ +-_RTLD_EPILOGUE(ENTRY_POINT) \ +- "\n.previous"\ +-); +- +- +-/* The MIPS never uses Elfxx_Rela relocations. */ +-#define ELF_MACHINE_NO_RELA 1 +- +-#endif /* !dl_machine_h */ +- +-#ifdef RESOLVE +- +-/* Perform the relocation specified by RELOC and SYM (which is fully resolved). +- MAP is the object containing the reloc. */ +- +-static inline void +-elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc, +- const ElfW(Sym) *sym, const struct r_found_version *version, +- ElfW(Addr) *const reloc_addr) +-{ +- const unsigned long int r_type = ELFW(R_TYPE) (reloc->r_info); +- ElfW(Addr) loadbase; +- ElfW(Addr) undo __attribute__ ((unused)); +- +- switch (r_type) +- { +- case R_MIPS_REL32: +- { +- ElfW(Addr) undo = 0; +- +- if (ELFW(ST_BIND) (sym->st_info) == STB_LOCAL +- && (ELFW(ST_TYPE) (sym->st_info) == STT_SECTION +- || ELFW(ST_TYPE) (sym->st_info) == STT_NOTYPE)) +- { +- *reloc_addr += map->l_addr; +- break; +- } +-#ifndef RTLD_BOOTSTRAP +- /* This is defined in rtld.c, but nowhere in the static libc.a; +- make the reference weak so static programs can still link. This +- declaration cannot be done when compiling rtld.c (i.e. #ifdef +- RTLD_BOOTSTRAP) because rtld.c contains the common defn for +- _dl_rtld_map, which is incompatible with a weak decl in the same +- file. */ +-# ifndef SHARED +- weak_extern (GL(dl_rtld_map)); +-# endif +- if (map == &GL(dl_rtld_map)) +- /* Undo the relocation done here during bootstrapping. Now we will +- relocate it anew, possibly using a binding found in the user +- program or a loaded library rather than the dynamic linker's +- built-in definitions used while loading those libraries. */ +- undo = map->l_addr + sym->st_value; +-#endif +- loadbase = RESOLVE (&sym, version, 0); +- *reloc_addr += (sym ? (loadbase + sym->st_value) : 0) - undo; +- } +- break; +-#ifndef RTLD_BOOTSTRAP +- case R_MIPS_NONE: /* Alright, Wilbur. */ +- break; +-#endif +- default: +- _dl_reloc_bad_type (map, r_type, 0); +- break; +- } +-} +- +-static inline void +-elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc, +- ElfW(Addr) *const reloc_addr) +-{ +- /* XXX Nothing to do. There is no relative relocation, right? */ +-} +- +-static inline void +-elf_machine_lazy_rel (struct link_map *map, ElfW(Addr) l_addr, +- const ElfW(Rel) *reloc) +-{ +- /* Do nothing. */ +-} +- +-#endif /* RESOLVE */ +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/gmp-mparam.h glibc-2.3.2-200304020432/sysdeps/mips/mips64/gmp-mparam.h +--- glibc-2.3.2/sysdeps/mips/mips64/gmp-mparam.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/gmp-mparam.h Mon Mar 17 16:47:12 2003 +@@ -0,0 +1,31 @@ ++/* gmp-mparam.h -- Compiler/machine parameter header file. ++ ++Copyright (C) 1991, 1993, 1994, 2002, 2003 Free Software Foundation, Inc. ++ ++This file is part of the GNU MP Library. ++ ++The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to ++the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++#if defined __GMP_H__ && ! defined _LONG_LONG_LIMB ++#error "Included too late for _LONG_LONG_LIMB to take effect" ++#endif ++ ++#define _LONG_LONG_LIMB ++#define BITS_PER_MP_LIMB 64 ++#define BYTES_PER_MP_LIMB 8 ++#define BITS_PER_LONGINT __WORDSIZE ++#define BITS_PER_INT 32 ++#define BITS_PER_SHORTINT 16 ++#define BITS_PER_CHAR 8 +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/lshift.S glibc-2.3.2-200304020432/sysdeps/mips/mips64/lshift.S +--- glibc-2.3.2/sysdeps/mips/mips64/lshift.S Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/lshift.S Fri Mar 14 04:59:37 2003 +@@ -1,6 +1,6 @@ + /* MIPS3 __mpn_lshift -- + * +- * Copyright (C) 1995, 2000 Free Software Foundation, Inc. ++ * Copyright (C) 1995, 2000, 2002, 2003 Free Software Foundation, Inc. + * + * This file is part of the GNU MP Library. + * +@@ -21,6 +21,7 @@ + */ + + #include ++#include + + /* INPUT PARAMETERS + * res_ptr $4 +@@ -37,10 +38,10 @@ + .globl __mpn_lshift + .ent __mpn_lshift + __mpn_lshift: +- .set noreorder + #ifdef __PIC__ +- .cpload t9 ++ SETUP_GP /* ??? unused */ + #endif ++ .set noreorder + .set nomacro + + dsll $2,$6,3 +@@ -50,12 +51,12 @@ + daddu $4,$4,$2 # make r4 point at end of res + daddiu $6,$6,-1 + and $9,$6,4-1 # number of limbs in first loop +- beq $9,$0,.L0 # if multiple of 4 limbs, skip first loop ++ beq $9,$0,L(L0) # if multiple of 4 limbs, skip first loop + dsrl $2,$10,$13 # compute function result + + dsubu $6,$6,$9 + +-.Loop0: ld $3,-16($5) ++L(Loop0): ld $3,-16($5) + daddiu $4,$4,-8 + daddiu $5,$5,-8 + daddiu $9,$9,-1 +@@ -63,13 +64,13 @@ + dsrl $12,$3,$13 + move $10,$3 + or $8,$11,$12 +- bne $9,$0,.Loop0 ++ bne $9,$0,L(Loop0) + sd $8,0($4) + +-.L0: beq $6,$0,.Lend ++L(L0): beq $6,$0,L(Lend) + nop + +-.Loop: ld $3,-16($5) ++L(Loop): ld $3,-16($5) + daddiu $4,$4,-32 + daddiu $6,$6,-4 + dsll $11,$10,$7 +@@ -95,10 +96,10 @@ + + daddiu $5,$5,-32 + or $8,$14,$9 +- bgtz $6,.Loop ++ bgtz $6,L(Loop) + sd $8,0($4) + +-.Lend: dsll $8,$10,$7 ++L(Lend): dsll $8,$10,$7 + j $31 + sd $8,-8($4) + .end __mpn_lshift +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/memcpy.S glibc-2.3.2-200304020432/sysdeps/mips/mips64/memcpy.S +--- glibc-2.3.2/sysdeps/mips/mips64/memcpy.S Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/memcpy.S Fri Mar 21 22:39:39 2003 +@@ -0,0 +1,139 @@ ++/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Hartvig Ekner , 2002. ++ Ported to mips3 n32/n64 by Alexandre Oliva ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++#include ++#include ++ ++ ++/* void *memcpy(void *s1, const void *s2, size_t n); ++ ++ This could probably be optimized further. */ ++ ++#if __BYTE_ORDER == __BIG_ENDIAN ++# define LDHI ldl /* high part is left in big-endian */ ++# define SDHI sdl /* high part is left in big-endian */ ++# define LDLO ldr /* low part is right in big-endian */ ++# define SDLO sdr /* low part is right in big-endian */ ++#else ++# define LDHI ldr /* high part is right in little-endian */ ++# define SDHI sdr /* high part is right in little-endian */ ++# define LDLO ldl /* low part is left in little-endian */ ++# define SDLO sdl /* low part is left in little-endian */ ++#endif ++ ++ENTRY (memcpy) ++ .set noreorder ++ ++ slti a4, a2, 16 # Less than 16? ++ bne a4, zero, L(last16) ++ move v0, a0 # Setup exit value before too late ++ ++ xor a4, a1, a0 # Find a0/a1 displacement ++ andi a4, 0x7 ++ bne a4, zero, L(shift) # Go handle the unaligned case ++ PTR_SUBU a5, zero, a1 ++ andi a5, 0x7 # a0/a1 are aligned, but are we ++ beq a5, zero, L(chk8w) # starting in the middle of a word? ++ PTR_SUBU a2, a5 ++ LDHI a4, 0(a1) # Yes we are... take care of that ++ PTR_ADDU a1, a5 ++ SDHI a4, 0(a0) ++ PTR_ADDU a0, a5 ++ ++L(chk8w): ++ andi a4, a2, 0x3f # 64 or more bytes left? ++ beq a4, a2, L(chk1w) ++ PTR_SUBU a3, a2, a4 # Yes ++ PTR_ADDU a3, a1 # a3 = end address of loop ++ move a2, a4 # a2 = what will be left after loop ++L(lop8w): ++ ld a4, 0(a1) # Loop taking 8 words at a time ++ ld a5, 8(a1) ++ ld a6, 16(a1) ++ ld a7, 24(a1) ++ ld t4, 32(a1) ++ ld t5, 40(a1) ++ ld t6, 48(a1) ++ ld t7, 56(a1) ++ PTR_ADDIU a0, 64 ++ PTR_ADDIU a1, 64 ++ sd a4, -64(a0) ++ sd a5, -56(a0) ++ sd a6, -48(a0) ++ sd a7, -40(a0) ++ sd t4, -32(a0) ++ sd t5, -24(a0) ++ sd t6, -16(a0) ++ bne a1, a3, L(lop8w) ++ sd t7, -8(a0) ++ ++L(chk1w): ++ andi a4, a2, 0x7 # 8 or more bytes left? ++ beq a4, a2, L(last16) ++ PTR_SUBU a3, a2, a4 # Yes, handle them one dword at a time ++ PTR_ADDU a3, a1 # a3 again end address ++ move a2, a4 ++L(lop1w): ++ ld a4, 0(a1) ++ PTR_ADDIU a0, 8 ++ PTR_ADDIU a1, 8 ++ bne a1, a3, L(lop1w) ++ sd a4, -8(a0) ++ ++L(last16): ++ blez a2, L(lst16e) # Handle last 16 bytes, one at a time ++ PTR_ADDU a3, a2, a1 ++L(lst16l): ++ lb a4, 0(a1) ++ PTR_ADDIU a0, 1 ++ PTR_ADDIU a1, 1 ++ bne a1, a3, L(lst16l) ++ sb a4, -1(a0) ++L(lst16e): ++ jr ra # Bye, bye ++ nop ++ ++L(shift): ++ PTR_SUBU a3, zero, a0 # Src and Dest unaligned ++ andi a3, 0x7 # (unoptimized case...) ++ beq a3, zero, L(shft1) ++ PTR_SUBU a2, a3 # a2 = bytes left ++ LDHI a4, 0(a1) # Take care of first odd part ++ LDLO a4, 7(a1) ++ PTR_ADDU a1, a3 ++ SDHI a4, 0(a0) ++ PTR_ADDU a0, a3 ++L(shft1): ++ andi a4, a2, 0x7 ++ PTR_SUBU a3, a2, a4 ++ PTR_ADDU a3, a1 ++L(shfth): ++ LDHI a5, 0(a1) # Limp through, dword by dword ++ LDLO a5, 7(a1) ++ PTR_ADDIU a0, 8 ++ PTR_ADDIU a1, 8 ++ bne a1, a3, L(shfth) ++ sd a5, -8(a0) ++ b L(last16) # Handle anything which may be left ++ move a2, a4 ++ ++ .set reorder ++END (memcpy) +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/memset.S glibc-2.3.2-200304020432/sysdeps/mips/mips64/memset.S +--- glibc-2.3.2/sysdeps/mips/mips64/memset.S Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/memset.S Fri Mar 21 22:39:39 2003 +@@ -0,0 +1,91 @@ ++/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Hartvig Ekner , 2002. ++ Ported to mips3 n32/n64 by Alexandre Oliva ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++#include ++#include ++ ++ ++/* void *memset(void *s, int c, size_t n); ++ ++ This could probably be optimized further. */ ++ ++#if __BYTE_ORDER == __BIG_ENDIAN ++# define SDHI sdl /* high part is left in big-endian */ ++#else ++# define SDHI sdr /* high part is right in little-endian */ ++#endif ++ ++ENTRY (memset) ++ .set noreorder ++ ++ slti t5, a2, 16 # Less than 16? ++ bne t5, zero, L(last16) ++ move v0, a0 # Setup exit value before too late ++ ++ beq a1, zero, L(ueven) # If zero pattern, no need to extend ++ andi a1, 0xff # Avoid problems with bogus arguments ++ dsll t4, a1, 8 ++ or a1, t4 ++ dsll t4, a1, 16 ++ or a1, t4 # a1 is now pattern in full word ++ dsll t4, a1, 32 ++ or a1, t4 # a1 is now pattern in double word ++ ++L(ueven): ++ PTR_SUBU t4, zero, a0 # Unaligned address? ++ andi t4, 0x7 ++ beq t4, zero, L(chkw) ++ PTR_SUBU a2, t4 ++ SDHI a1, 0(a0) # Yes, handle first unaligned part ++ PTR_ADDU a0, t4 # Now both a0 and a2 are updated ++ ++L(chkw): ++ andi t4, a2, 0xf # Enough left for one loop iteration? ++ beq t4, a2, L(chkl) ++ PTR_SUBU a3, a2, t4 ++ PTR_ADDU a3, a0 # a3 is last loop address +1 ++ move a2, t4 # a2 is now # of bytes left after loop ++L(loopw): ++ PTR_ADDIU a0, 16 # Handle 2 dwords pr. iteration ++ sd a1, -16(a0) ++ bne a0, a3, L(loopw) ++ sd a1, -8(a0) ++ ++L(chkl): ++ andi t4, a2, 0x8 # Check if there is at least a double ++ beq t4, zero, L(last16) # word remaining after the loop ++ PTR_SUBU a2, t4 ++ sd a1, 0(a0) # Yes... ++ PTR_ADDIU a0, 8 ++ ++L(last16): ++ blez a2, L(exit) # Handle last 16 bytes (if cnt>0) ++ PTR_ADDU a3, a2, a0 # a3 is last address +1 ++L(lst16l): ++ PTR_ADDIU a0, 1 ++ bne a0, a3, L(lst16l) ++ sb a1, -1(a0) ++L(exit): ++ j ra # Bye, bye ++ nop ++ ++ .set reorder ++END (memset) +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/mul_1.S glibc-2.3.2-200304020432/sysdeps/mips/mips64/mul_1.S +--- glibc-2.3.2/sysdeps/mips/mips64/mul_1.S Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/mul_1.S Fri Mar 14 04:59:37 2003 +@@ -1,7 +1,8 @@ + /* MIPS3 __mpn_mul_1 -- Multiply a limb vector with a single limb and + * store the product in a second limb vector. + * +- * Copyright (C) 1992, 1994, 1995, 2000 Free Software Foundation, Inc. ++ * Copyright (C) 1992, 1994, 1995, 2000, 2002, 2003 ++ * Free Software Foundation, Inc. + * + * This file is part of the GNU MP Library. + * +@@ -22,6 +23,7 @@ + */ + + #include ++#include + + /* INPUT PARAMETERS + * res_ptr $4 +@@ -38,10 +40,10 @@ + .globl __mpn_mul_1 + .ent __mpn_mul_1 + __mpn_mul_1: +- .set noreorder + #ifdef __PIC__ +- .cpload t9 ++ SETUP_GP /* ??? unused */ + #endif ++ .set noreorder + .set nomacro + + # warm up phase 0 +@@ -52,14 +54,14 @@ + dmultu $8,$7 + + daddiu $6,$6,-1 +- beq $6,$0,$LC0 ++ beq $6,$0,L(LC0) + move $2,$0 # zero cy2 + + daddiu $6,$6,-1 +- beq $6,$0,$LC1 ++ beq $6,$0,L(LC1) + ld $8,0($5) # load new s1 limb as early as possible + +-Loop: mflo $10 ++L(Loop): mflo $10 + mfhi $9 + daddiu $5,$5,8 + daddu $10,$10,$2 # add old carry limb to low product limb +@@ -69,11 +71,11 @@ + sltu $2,$10,$2 # carry from previous addition -> $2 + sd $10,0($4) + daddiu $4,$4,8 +- bne $6,$0,Loop ++ bne $6,$0,L(Loop) + daddu $2,$9,$2 # add high product limb and carry from addition + + # cool down phase 1 +-$LC1: mflo $10 ++L(LC1): mflo $10 + mfhi $9 + daddu $10,$10,$2 + sltu $2,$10,$2 +@@ -83,7 +85,7 @@ + daddu $2,$9,$2 # add high product limb and carry from addition + + # cool down phase 0 +-$LC0: mflo $10 ++L(LC0): mflo $10 + mfhi $9 + daddu $10,$10,$2 + sltu $2,$10,$2 +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/n32/Implies glibc-2.3.2-200304020432/sysdeps/mips/mips64/n32/Implies +--- glibc-2.3.2/sysdeps/mips/mips64/n32/Implies Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/n32/Implies Mon Mar 17 17:20:44 2003 +@@ -0,0 +1,4 @@ ++mips/mips64 ++mips ++wordsize-32 ++ieee754/ldbl-128 +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/n32/Makefile glibc-2.3.2-200304020432/sysdeps/mips/mips64/n32/Makefile +--- glibc-2.3.2/sysdeps/mips/mips64/n32/Makefile Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/n32/Makefile Sat Mar 29 09:15:28 2003 +@@ -0,0 +1,6 @@ ++# `long double' is a distinct type we support. ++long-double-fcts = yes ++ ++ifeq ($(filter -mabi=n32,$(CC)),) ++CC += -mabi=n32 ++endif +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/n64/Implies glibc-2.3.2-200304020432/sysdeps/mips/mips64/n64/Implies +--- glibc-2.3.2/sysdeps/mips/mips64/n64/Implies Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/n64/Implies Mon Mar 17 17:20:44 2003 +@@ -0,0 +1,4 @@ ++mips/mips64 ++mips ++wordsize-64 ++ieee754/ldbl-128 +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/n64/Makefile glibc-2.3.2-200304020432/sysdeps/mips/mips64/n64/Makefile +--- glibc-2.3.2/sysdeps/mips/mips64/n64/Makefile Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/n64/Makefile Sat Mar 29 09:15:28 2003 +@@ -0,0 +1,6 @@ ++# `long double' is a distinct type we support. ++long-double-fcts = yes ++ ++ifeq ($(filter -mabi=64,$(CC)),) ++CC += -mabi=64 ++endif +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/rshift.S glibc-2.3.2-200304020432/sysdeps/mips/mips64/rshift.S +--- glibc-2.3.2/sysdeps/mips/mips64/rshift.S Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/rshift.S Fri Mar 14 04:59:37 2003 +@@ -1,6 +1,6 @@ + /* MIPS3 __mpn_rshift -- + * +- * Copyright (C) 1995, 2000 Free Software Foundation, Inc. ++ * Copyright (C) 1995, 2000, 2002, 2003 Free Software Foundation, Inc. + * + * This file is part of the GNU MP Library. + * +@@ -21,6 +21,7 @@ + */ + + #include ++#include + + /* INPUT PARAMETERS + * res_ptr $4 +@@ -37,22 +38,22 @@ + .globl __mpn_rshift + .ent __mpn_rshift + __mpn_rshift: +- .set noreorder + #ifdef __PIC__ +- .cpload t9 ++ SETUP_GP /* ??? unused */ + #endif ++ .set noreorder + .set nomacro + + ld $10,0($5) # load first limb + dsubu $13,$0,$7 + daddiu $6,$6,-1 + and $9,$6,4-1 # number of limbs in first loop +- beq $9,$0,.L0 # if multiple of 4 limbs, skip first loop ++ beq $9,$0,L(L0) # if multiple of 4 limbs, skip first loop + dsll $2,$10,$13 # compute function result + + dsubu $6,$6,$9 + +-.Loop0: ld $3,8($5) ++L(Loop0): ld $3,8($5) + daddiu $4,$4,8 + daddiu $5,$5,8 + daddiu $9,$9,-1 +@@ -60,13 +61,13 @@ + dsll $12,$3,$13 + move $10,$3 + or $8,$11,$12 +- bne $9,$0,.Loop0 ++ bne $9,$0,L(Loop0) + sd $8,-8($4) + +-.L0: beq $6,$0,.Lend ++L(L0): beq $6,$0,L(Lend) + nop + +-.Loop: ld $3,8($5) ++L(Loop): ld $3,8($5) + daddiu $4,$4,32 + daddiu $6,$6,-4 + dsrl $11,$10,$7 +@@ -92,10 +93,10 @@ + + daddiu $5,$5,32 + or $8,$14,$9 +- bgtz $6,.Loop ++ bgtz $6,L(Loop) + sd $8,-8($4) + +-.Lend: dsrl $8,$10,$7 ++L(Lend): dsrl $8,$10,$7 + j $31 + sd $8,0($4) + .end __mpn_rshift +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/setjmp.S glibc-2.3.2-200304020432/sysdeps/mips/mips64/setjmp.S +--- glibc-2.3.2/sysdeps/mips/mips64/setjmp.S Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/setjmp.S Thu Mar 20 11:27:55 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1996, 1997, 2000 Free Software Foundation, Inc. ++/* Copyright (C) 1996, 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 +@@ -17,6 +17,7 @@ + 02111-1307 USA. */ + + #include ++#include + + /* The function __sigsetjmp_aux saves all the registers, but it can't + reliably access the stack or frame pointers, so we pass them in as +@@ -26,10 +27,18 @@ + #endif + ENTRY (__sigsetjmp) + #ifdef __PIC__ +- .cpload t9 ++ SETUP_GP + #endif ++ SETUP_GP64 (v0, C_SYMBOL_NAME (__sigsetjmp)) + move a2, sp + move a3, fp +- dla t9, __sigsetjmp_aux ++ PTR_LA t9, __sigsetjmp_aux ++#if _MIPS_SIM == _MIPS_SIM_ABI32 + nop ++#endif ++ RESTORE_GP64 ++#if _MIPS_SIM != _MIPS_SIM_ABI32 ++ move a4, gp ++#endif + jr t9 ++ .end __sigsetjmp +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/setjmp_aux.c glibc-2.3.2-200304020432/sysdeps/mips/mips64/setjmp_aux.c +--- glibc-2.3.2/sysdeps/mips/mips64/setjmp_aux.c Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/setjmp_aux.c Thu Mar 20 23:29:44 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. ++/* Copyright (C) 1996, 1997, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + +@@ -25,9 +25,11 @@ + access them in C. */ + + int +-__sigsetjmp_aux (jmp_buf env, int savemask, int sp, int fp) ++__sigsetjmp_aux (jmp_buf env, int savemask, long long sp, long long fp, ++ long long gp) + { + /* Store the floating point callee-saved registers... */ ++#if defined _ABI64 && _MIPS_SIM == _ABI64 + asm volatile ("s.d $f24, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[0])); + asm volatile ("s.d $f25, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[1])); + asm volatile ("s.d $f26, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[2])); +@@ -36,6 +38,14 @@ + asm volatile ("s.d $f29, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[5])); + asm volatile ("s.d $f30, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[6])); + asm volatile ("s.d $f31, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[7])); ++#else ++ asm volatile ("s.d $f20, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[0])); ++ asm volatile ("s.d $f22, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[1])); ++ asm volatile ("s.d $f24, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[2])); ++ asm volatile ("s.d $f26, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[3])); ++ asm volatile ("s.d $f28, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[4])); ++ asm volatile ("s.d $f30, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[5])); ++#endif + + /* .. and the PC; */ + asm volatile ("sd $31, %0" : : "m" (env[0].__jmpbuf[0].__pc)); +@@ -47,7 +57,7 @@ + env[0].__jmpbuf[0].__fp = fp; + + /* .. and the GP; */ +- asm volatile ("sd $gp, %0" : : "m" (env[0].__jmpbuf[0].__gp)); ++ env[0].__jmpbuf[0].__gp = gp; + + /* .. and the callee-saved registers; */ + asm volatile ("sd $16, %0" : : "m" (env[0].__jmpbuf[0].__regs[0])); +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/soft-fp/sfp-machine.h glibc-2.3.2-200304020432/sysdeps/mips/mips64/soft-fp/sfp-machine.h +--- glibc-2.3.2/sysdeps/mips/mips64/soft-fp/sfp-machine.h Tue Sep 5 10:37:09 2000 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/soft-fp/sfp-machine.h Mon Mar 17 16:47:12 2003 +@@ -1,7 +1,7 @@ + #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_W_TYPE unsigned long long ++#define _FP_WS_TYPE signed long long ++#define _FP_I_TYPE long long + + #define _FP_MUL_MEAT_S(R,X,Y) \ + _FP_MUL_MEAT_1_imm(_FP_WFRACBITS_S,R,X,Y) +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/sub_n.S glibc-2.3.2-200304020432/sysdeps/mips/mips64/sub_n.S +--- glibc-2.3.2/sysdeps/mips/mips64/sub_n.S Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/sub_n.S Fri Mar 14 04:59:37 2003 +@@ -1,7 +1,7 @@ + /* MIPS3 __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and + * store difference in a third limb vector. + * +- * Copyright (C) 1995, 2000 Free Software Foundation, Inc. ++ * Copyright (C) 1995, 2000, 2002, 2003 Free Software Foundation, Inc. + * + * This file is part of the GNU MP Library. + * +@@ -22,6 +22,7 @@ + */ + + #include ++#include + + /* INPUT PARAMETERS + * res_ptr $4 +@@ -38,10 +39,10 @@ + .globl __mpn_sub_n + .ent __mpn_sub_n + __mpn_sub_n: +- .set noreorder + #ifdef __PIC__ +- .cpload t9 ++ SETUP_GP /* ??? unused */ + #endif ++ .set noreorder + .set nomacro + + ld $10,0($5) +@@ -49,12 +50,12 @@ + + daddiu $7,$7,-1 + and $9,$7,4-1 # number of limbs in first loop +- beq $9,$0,.L0 # if multiple of 4 limbs, skip first loop ++ beq $9,$0,L(L0) # if multiple of 4 limbs, skip first loop + move $2,$0 + + dsubu $7,$7,$9 + +-.Loop0: daddiu $9,$9,-1 ++L(Loop0): daddiu $9,$9,-1 + ld $12,8($5) + daddu $11,$11,$2 + ld $13,8($6) +@@ -68,13 +69,13 @@ + daddiu $6,$6,8 + move $10,$12 + move $11,$13 +- bne $9,$0,.Loop0 ++ bne $9,$0,L(Loop0) + daddiu $4,$4,8 + +-.L0: beq $7,$0,.Lend ++L(L0): beq $7,$0,L(Lend) + nop + +-.Loop: daddiu $7,$7,-4 ++L(Loop): daddiu $7,$7,-4 + + ld $12,8($5) + daddu $11,$11,$2 +@@ -115,10 +116,10 @@ + daddiu $5,$5,32 + daddiu $6,$6,32 + +- bne $7,$0,.Loop ++ bne $7,$0,L(Loop) + daddiu $4,$4,32 + +-.Lend: daddu $11,$11,$2 ++L(Lend): daddu $11,$11,$2 + sltu $8,$11,$2 + dsubu $11,$10,$11 + sltu $2,$10,$11 +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mips64/submul_1.S glibc-2.3.2-200304020432/sysdeps/mips/mips64/submul_1.S +--- glibc-2.3.2/sysdeps/mips/mips64/submul_1.S Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mips64/submul_1.S Fri Mar 14 04:59:37 2003 +@@ -1,7 +1,8 @@ + /* MIPS3 __mpn_submul_1 -- Multiply a limb vector with a single limb and + * subtract the product from a second limb vector. + * +- * Copyright (C) 1992, 1994, 1995, 2000 Free Software Foundation, Inc. ++ * Copyright (C) 1992, 1994, 1995, 2000, 2002, 2003 ++ * Free Software Foundation, Inc. + * + * This file is part of the GNU MP Library. + * +@@ -22,6 +23,7 @@ + */ + + #include ++#include + + /* INPUT PARAMETERS + * res_ptr $4 +@@ -38,10 +40,10 @@ + .globl __mpn_submul_1 + .ent __mpn_submul_1 + __mpn_submul_1: +- .set noreorder + #ifdef __PIC__ +- .cpload t9 ++ SETUP_GP /* ??? unused */ + #endif ++ .set noreorder + .set nomacro + + # warm up phase 0 +@@ -52,14 +54,14 @@ + dmultu $8,$7 + + daddiu $6,$6,-1 +- beq $6,$0,$LC0 ++ beq $6,$0,L(LC0) + move $2,$0 # zero cy2 + + daddiu $6,$6,-1 +- beq $6,$0,$LC1 ++ beq $6,$0,L(LC1) + ld $8,0($5) # load new s1 limb as early as possible + +-Loop: ld $10,0($4) ++L(Loop): ld $10,0($4) + mflo $3 + mfhi $9 + daddiu $5,$5,8 +@@ -73,11 +75,11 @@ + daddu $2,$2,$10 + sd $3,0($4) + daddiu $4,$4,8 +- bne $6,$0,Loop ++ bne $6,$0,L(Loop) + daddu $2,$9,$2 # add high product limb and carry from addition + + # cool down phase 1 +-$LC1: ld $10,0($4) ++L(LC1): ld $10,0($4) + mflo $3 + mfhi $9 + daddu $3,$3,$2 +@@ -91,7 +93,7 @@ + daddu $2,$9,$2 # add high product limb and carry from addition + + # cool down phase 0 +-$LC0: ld $10,0($4) ++L(LC0): ld $10,0($4) + mflo $3 + mfhi $9 + daddu $3,$3,$2 +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mipsel/bits/endian.h glibc-2.3.2-200304020432/sysdeps/mips/mipsel/bits/endian.h +--- glibc-2.3.2/sysdeps/mips/mipsel/bits/endian.h Wed Nov 26 04:53:00 1997 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mipsel/bits/endian.h Thu Jan 1 01:00:00 1970 +@@ -1,8 +0,0 @@ +-/* The MIPS architecture has selectable endianness. +- This file is for a machine using little-endian mode. */ +- +-#ifndef _ENDIAN_H +-# error "Never use directly; include instead." +-#endif +- +-#define __BYTE_ORDER __LITTLE_ENDIAN +diff -u -udbrN glibc-2.3.2/sysdeps/mips/mul_1.S glibc-2.3.2-200304020432/sysdeps/mips/mul_1.S +--- glibc-2.3.2/sysdeps/mips/mul_1.S Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/mul_1.S Fri Mar 14 04:59:37 2003 +@@ -1,7 +1,7 @@ + /* MIPS __mpn_mul_1 -- Multiply a limb vector with a single limb and + store the product in a second limb vector. + +-Copyright (C) 1995, 1998, 2000 Free Software Foundation, Inc. ++Copyright (C) 1995, 1998, 2000, 2002, 2003 Free Software Foundation, Inc. + + This file is part of the GNU MP Library. + +@@ -46,14 +46,14 @@ + multu $8,$7 + + addiu $6,$6,-1 +- beq $6,$0,$LC0 ++ beq $6,$0,L(LC0) + move $2,$0 /* zero cy2 */ + + addiu $6,$6,-1 +- beq $6,$0,$LC1 ++ beq $6,$0,L(LC1) + lw $8,0($5) /* load new s1 limb as early as possible */ + +-Loop: mflo $10 ++L(Loop): mflo $10 + mfhi $9 + addiu $5,$5,4 + addu $10,$10,$2 /* add old carry limb to low product limb */ +@@ -63,11 +63,11 @@ + sltu $2,$10,$2 /* carry from previous addition -> $2 */ + sw $10,0($4) + addiu $4,$4,4 +- bne $6,$0,Loop /* should be "bnel" */ ++ bne $6,$0,L(Loop) /* should be "bnel" */ + addu $2,$9,$2 /* add high product limb and carry from addition */ + + /* cool down phase 1 */ +-$LC1: mflo $10 ++L(LC1): mflo $10 + mfhi $9 + addu $10,$10,$2 + sltu $2,$10,$2 +@@ -77,7 +77,7 @@ + addu $2,$9,$2 /* add high product limb and carry from addition */ + + /* cool down phase 0 */ +-$LC0: mflo $10 ++L(LC0): mflo $10 + mfhi $9 + addu $10,$10,$2 + sltu $2,$10,$2 +diff -u -udbrN glibc-2.3.2/sysdeps/mips/rshift.S glibc-2.3.2-200304020432/sysdeps/mips/rshift.S +--- glibc-2.3.2/sysdeps/mips/rshift.S Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/rshift.S Fri Mar 14 04:59:37 2003 +@@ -1,6 +1,6 @@ + /* MIPS2 __mpn_rshift -- + +-Copyright (C) 1995, 2000 Free Software Foundation, Inc. ++Copyright (C) 1995, 2000, 2002, 2003 Free Software Foundation, Inc. + + This file is part of the GNU MP Library. + +@@ -41,12 +41,12 @@ + subu $13,$0,$7 + addiu $6,$6,-1 + and $9,$6,4-1 /* number of limbs in first loop */ +- beq $9,$0,.L0 /* if multiple of 4 limbs, skip first loop*/ ++ beq $9,$0,L(L0) /* if multiple of 4 limbs, skip first loop*/ + sll $2,$10,$13 /* compute function result */ + + subu $6,$6,$9 + +-.Loop0: lw $3,4($5) ++L(Loop0): lw $3,4($5) + addiu $4,$4,4 + addiu $5,$5,4 + addiu $9,$9,-1 +@@ -54,13 +54,13 @@ + sll $12,$3,$13 + move $10,$3 + or $8,$11,$12 +- bne $9,$0,.Loop0 ++ bne $9,$0,L(Loop0) + sw $8,-4($4) + +-.L0: beq $6,$0,.Lend ++L(L0): beq $6,$0,L(Lend) + nop + +-.Loop: lw $3,4($5) ++L(Loop): lw $3,4($5) + addiu $4,$4,16 + addiu $6,$6,-4 + srl $11,$10,$7 +@@ -86,10 +86,10 @@ + + addiu $5,$5,16 + or $8,$14,$9 +- bgtz $6,.Loop ++ bgtz $6,L(Loop) + sw $8,-4($4) + +-.Lend: srl $8,$10,$7 ++L(Lend): srl $8,$10,$7 + j $31 + sw $8,0($4) + END (__mpn_rshift) +diff -u -udbrN glibc-2.3.2/sysdeps/mips/setjmp_aux.c glibc-2.3.2-200304020432/sysdeps/mips/setjmp_aux.c +--- glibc-2.3.2/sysdeps/mips/setjmp_aux.c Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/setjmp_aux.c Thu Mar 20 11:27:55 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1996, 1997, 2000 Free Software Foundation, Inc. ++/* Copyright (C) 1996, 1997, 2000, 2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + +diff -u -udbrN glibc-2.3.2/sysdeps/mips/sgidefs.h glibc-2.3.2-200304020432/sysdeps/mips/sgidefs.h +--- glibc-2.3.2/sysdeps/mips/sgidefs.h Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/sgidefs.h Tue Mar 25 22:51:52 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++/* Copyright (C) 1996, 1997, 1998, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ralf Baechle . + +@@ -28,6 +28,8 @@ + #define _MIPS_ISA_MIPS3 3 + #define _MIPS_ISA_MIPS4 4 + #define _MIPS_ISA_MIPS5 5 ++#define _MIPS_ISA_MIPS32 6 ++#define _MIPS_ISA_MIPS64 7 + + /* + * Subprogram calling convention +diff -u -udbrN glibc-2.3.2/sysdeps/mips/sub_n.S glibc-2.3.2-200304020432/sysdeps/mips/sub_n.S +--- glibc-2.3.2/sysdeps/mips/sub_n.S Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/sub_n.S Fri Mar 14 04:59:37 2003 +@@ -1,7 +1,7 @@ + /* MIPS2 __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and + store difference in a third limb vector. + +-Copyright (C) 1995, 2000 Free Software Foundation, Inc. ++Copyright (C) 1995, 2000, 2002, 2003 Free Software Foundation, Inc. + + This file is part of the GNU MP Library. + +@@ -43,12 +43,12 @@ + + addiu $7,$7,-1 + and $9,$7,4-1 /* number of limbs in first loop */ +- beq $9,$0,.L0 /* if multiple of 4 limbs, skip first loop */ ++ beq $9,$0,L(L0) /* if multiple of 4 limbs, skip first loop */ + move $2,$0 + + subu $7,$7,$9 + +-.Loop0: addiu $9,$9,-1 ++L(Loop0): addiu $9,$9,-1 + lw $12,4($5) + addu $11,$11,$2 + lw $13,4($6) +@@ -62,13 +62,13 @@ + addiu $6,$6,4 + move $10,$12 + move $11,$13 +- bne $9,$0,.Loop0 ++ bne $9,$0,L(Loop0) + addiu $4,$4,4 + +-.L0: beq $7,$0,.Lend ++L(L0): beq $7,$0,L(Lend) + nop + +-.Loop: addiu $7,$7,-4 ++L(Loop): addiu $7,$7,-4 + + lw $12,4($5) + addu $11,$11,$2 +@@ -109,10 +109,10 @@ + addiu $5,$5,16 + addiu $6,$6,16 + +- bne $7,$0,.Loop ++ bne $7,$0,L(Loop) + addiu $4,$4,16 + +-.Lend: addu $11,$11,$2 ++L(Lend): addu $11,$11,$2 + sltu $8,$11,$2 + subu $11,$10,$11 + sltu $2,$10,$11 +diff -u -udbrN glibc-2.3.2/sysdeps/mips/submul_1.S glibc-2.3.2-200304020432/sysdeps/mips/submul_1.S +--- glibc-2.3.2/sysdeps/mips/submul_1.S Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/submul_1.S Fri Mar 14 04:59:37 2003 +@@ -1,7 +1,7 @@ + /* MIPS __mpn_submul_1 -- Multiply a limb vector with a single limb and + subtract the product from a second limb vector. + +-Copyright (C) 1995, 2000 Free Software Foundation, Inc. ++Copyright (C) 1995, 2000, 2002, 2003 Free Software Foundation, Inc. + + This file is part of the GNU MP Library. + +@@ -46,14 +46,14 @@ + multu $8,$7 + + addiu $6,$6,-1 +- beq $6,$0,$LC0 ++ beq $6,$0,L(LC0) + move $2,$0 /* zero cy2 */ + + addiu $6,$6,-1 +- beq $6,$0,$LC1 ++ beq $6,$0,L(LC1) + lw $8,0($5) /* load new s1 limb as early as possible */ + +-Loop: lw $10,0($4) ++L(Loop): lw $10,0($4) + mflo $3 + mfhi $9 + addiu $5,$5,4 +@@ -67,11 +67,11 @@ + addu $2,$2,$10 + sw $3,0($4) + addiu $4,$4,4 +- bne $6,$0,Loop /* should be "bnel" */ ++ bne $6,$0,L(Loop) /* should be "bnel" */ + addu $2,$9,$2 /* add high product limb and carry from addition */ + + /* cool down phase 1 */ +-$LC1: lw $10,0($4) ++L(LC1): lw $10,0($4) + mflo $3 + mfhi $9 + addu $3,$3,$2 +@@ -85,7 +85,7 @@ + addu $2,$9,$2 /* add high product limb and carry from addition */ + + /* cool down phase 0 */ +-$LC0: lw $10,0($4) ++L(LC0): lw $10,0($4) + mflo $3 + mfhi $9 + addu $3,$3,$2 +diff -u -udbrN glibc-2.3.2/sysdeps/mips/sys/asm.h glibc-2.3.2-200304020432/sysdeps/mips/sys/asm.h +--- glibc-2.3.2/sysdeps/mips/sys/asm.h Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/sys/asm.h Tue Mar 25 22:51:52 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1997, 1998 Free Software Foundation, Inc. ++/* Copyright (C) 1997, 1998, 2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ralf Baechle . + +@@ -23,12 +23,12 @@ + #include + + #ifndef CAT +-#ifdef __STDC__ +-#define __CAT(str1,str2) str1##str2 +-#else +-#define __CAT(str1,str2) str1/**/str2 +-#endif +-#define CAT(str1,str2) __CAT(str1,str2) ++# ifdef __STDC__ ++# define __CAT(str1,str2) str1##str2 ++# else ++# define __CAT(str1,str2) str1/**/str2 ++# endif ++# define CAT(str1,str2) __CAT(str1,str2) + #endif + + /* +@@ -37,25 +37,112 @@ + * 64 bit address space isn't used yet, so we may use the R3000 32 bit + * defines for now. + */ +-#define PTR .word +-#define PTRSIZE 4 +-#define PTRLOG 2 ++#if (_MIPS_SIM == _MIPS_SIM_ABI32) || (_MIPS_SIM == _MIPS_SIM_NABI32) ++# define PTR .word ++# define PTRSIZE 4 ++# define PTRLOG 2 ++#elif (_MIPS_SIM == _MIPS_SIM_ABI64) ++# define PTR .dword ++# define PTRSIZE 8 ++# define PTRLOG 3 ++#endif + + /* + * PIC specific declarations + */ +-#ifdef __PIC__ +-#define CPRESTORE(register) \ ++#if (_MIPS_SIM == _MIPS_SIM_ABI32) ++# ifdef __PIC__ ++# define CPRESTORE(register) \ + .cprestore register +-#define CPADD(register) \ +- .cpadd register +-#define CPLOAD(register) \ ++# define CPLOAD(register) \ + .cpload register +-#else +-#define CPRESTORE(register) +-#define CPADD(register) +-#define CPLOAD(register) ++# else ++# define CPRESTORE(register) ++# define CPLOAD(register) ++# endif ++ ++# define CPADD(register) \ ++ .cpadd register ++ ++/* ++ * Set gp when at 1st instruction ++ */ ++# define SETUP_GP \ ++ .set noreorder; \ ++ .cpload $25; \ ++ .set reorder ++/* Set gp when not at 1st instruction */ ++# define SETUP_GPX(r) \ ++ .set noreorder; \ ++ move r, $31; /* Save old ra. */ \ ++ bal 10f; /* Find addr of cpload. */ \ ++ nop; \ ++10: \ ++ .cpload $31; \ ++ move $31, r; \ ++ .set reorder ++# define SETUP_GPX_L(r, l) \ ++ .set noreorder; \ ++ move r, $31; /* Save old ra. */ \ ++ bal l; /* Find addr of cpload. */ \ ++ nop; \ ++l: \ ++ .cpload $31; \ ++ move $31, r; \ ++ .set reorder ++# define SAVE_GP(x) \ ++ .cprestore x /* Save gp trigger t9/jalr conversion. */ ++# define SETUP_GP64(a, b) ++# define SETUP_GPX64(a, b) ++# define SETUP_GPX64_L(cp_reg, ra_save, l) ++# define RESTORE_GP64 ++# define USE_ALT_CP(a) ++#else /* (_MIPS_SIM == _MIPS_SIM_ABI64) || (_MIPS_SIM == _MIPS_SIM_NABI32) */ ++/* ++ * For callee-saved gp calling convention: ++ */ ++# define SETUP_GP ++# define SETUP_GPX(r) ++# define SETUP_GPX_L(r, l) ++# define SAVE_GP(x) ++ ++# define SETUP_GP64(gpoffset, proc) \ ++ .cpsetup $25, gpoffset, proc ++# define SETUP_GPX64(cp_reg, ra_save) \ ++ move ra_save, $31; /* Save old ra. */ \ ++ .set noreorder; \ ++ bal 10f; /* Find addr of .cpsetup. */ \ ++ nop; \ ++10: \ ++ .set reorder; \ ++ .cpsetup $31, cp_reg, 10b; \ ++ move $31, ra_save ++# define SETUP_GPX64_L(cp_reg, ra_save, l) \ ++ move ra_save, $31; /* Save old ra. */ \ ++ .set noreorder; \ ++ bal l; /* Find addr of .cpsetup. */ \ ++ nop; \ ++l: \ ++ .set reorder; \ ++ .cpsetup $31, cp_reg, l; \ ++ move $31, ra_save ++# define RESTORE_GP64 \ ++ .cpreturn ++/* Use alternate register for context pointer. */ ++# define USE_ALT_CP(reg) \ ++ .cplocal reg ++#endif /* _MIPS_SIM != _MIPS_SIM_ABI32 */ ++ ++/* ++ * Stack Frame Definitions ++ */ ++#if (_MIPS_SIM == _MIPS_SIM_ABI32) ++# define NARGSAVE 4 /* Space for 4 argument registers must be allocated. */ + #endif ++#if (_MIPS_SIM == _MIPS_SIM_ABI64 || _MIPS_SIM == _MIPS_SIM_NABI32) ++# define NARGSAVE 0 /* No caller responsibilities. */ ++#endif ++ + + /* + * LEAF - declare leaf routine +@@ -80,9 +167,11 @@ + /* + * END - mark end of function + */ +-#define END(function) \ ++#ifndef END ++# define END(function) \ + .end function; \ + .size function,.-function ++#endif + + /* + * EXPORT - export definition of symbol +@@ -141,28 +230,29 @@ + * MIPS IV implementations are free to treat this as a nop. The R5000 + * is one of them. So we should have an option not to use this instruction. + */ +-#if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) +-#define PREF(hint,addr) \ ++#if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) || \ ++ (_MIPS_ISA == _MIPS_ISA_MIPS32) || (_MIPS_ISA == _MIPS_ISA_MIPS64) ++# define PREF(hint,addr) \ + pref hint,addr +-#define PREFX(hint,addr) \ ++# define PREFX(hint,addr) \ + prefx hint,addr + #else +-#define PREF +-#define PREFX ++# define PREF ++# define PREFX + #endif + + /* + * MIPS ISA IV/V movn/movz instructions and equivalents for older CPUs. + */ + #if _MIPS_ISA == _MIPS_ISA_MIPS1 +-#define MOVN(rd,rs,rt) \ ++# define MOVN(rd,rs,rt) \ + .set push; \ + .set reorder; \ + beqz rt,9f; \ + move rd,rs; \ + .set pop; \ + 9: +-#define MOVZ(rd,rs,rt) \ ++# define MOVZ(rd,rs,rt) \ + .set push; \ + .set reorder; \ + bnez rt,9f; \ +@@ -171,14 +261,14 @@ + 9: + #endif /* _MIPS_ISA == _MIPS_ISA_MIPS1 */ + #if (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3) +-#define MOVN(rd,rs,rt) \ ++# define MOVN(rd,rs,rt) \ + .set push; \ + .set noreorder; \ + bnezl rt,9f; \ + move rd,rs; \ + .set pop; \ + 9: +-#define MOVZ(rd,rs,rt) \ ++# define MOVZ(rd,rs,rt) \ + .set push; \ + .set noreorder; \ + beqzl rt,9f; \ +@@ -186,192 +276,198 @@ + .set pop; \ + 9: + #endif /* (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3) */ +-#if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) +-#define MOVN(rd,rs,rt) \ ++#if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) || \ ++ (_MIPS_ISA == _MIPS_ISA_MIPS32) || (_MIPS_ISA == _MIPS_ISA_MIPS64) ++# define MOVN(rd,rs,rt) \ + movn rd,rs,rt +-#define MOVZ(rd,rs,rt) \ ++# define MOVZ(rd,rs,rt) \ + movz rd,rs,rt + #endif /* (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) */ + + /* + * Stack alignment + */ +-#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2) +-#define ALSZ 7 +-#define ALMASK ~7 +-#endif +-#if (_MIPS_ISA == _MIPS_ISA_MIPS3) || (_MIPS_ISA == _MIPS_ISA_MIPS4) || \ +- (_MIPS_ISA == _MIPS_ISA_MIPS5) +-#define ALSZ 15 +-#define ALMASK ~15 ++#if (_MIPS_SIM == _MIPS_SIM_ABI64) || (_MIPS_SIM == _MIPS_SIM_NABI32) ++# define ALSZ 15 ++# define ALMASK ~15 ++#else ++# define ALSZ 7 ++# define ALMASK ~7 + #endif + + /* + * Size of a register + */ +-#ifdef __mips64 +-#define SZREG 8 ++#if (_MIPS_SIM == _MIPS_SIM_ABI64) || (_MIPS_SIM == _MIPS_SIM_NABI32) ++# define SZREG 8 + #else +-#define SZREG 4 ++# define SZREG 4 + #endif + + /* + * Use the following macros in assemblercode to load/store registers, + * pointers etc. + */ +-#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2) +-#define REG_S sw +-#define REG_L lw +-#define PTR_SUBU subu +-#define PTR_ADDU addu +-#endif +-#if (_MIPS_ISA == _MIPS_ISA_MIPS3) || (_MIPS_ISA == _MIPS_ISA_MIPS4) || \ +- (_MIPS_ISA == _MIPS_ISA_MIPS5) +-#define REG_S sd +-#define REG_L ld +-/* We still live in a 32 bit address space ... */ +-#define PTR_SUBU subu +-#define PTR_ADDU addu ++#if (SZREG == 4) ++# define REG_S sw ++# define REG_L lw ++#else ++# define REG_S sd ++# define REG_L ld + #endif + + /* + * How to add/sub/load/store/shift C int variables. + */ + #if (_MIPS_SZINT == 32) +-#define INT_ADD add +-#define INT_ADDI addi +-#define INT_ADDU addu +-#define INT_ADDIU addiu +-#define INT_SUB add +-#define INT_SUBI subi +-#define INT_SUBU subu +-#define INT_SUBIU subu +-#define INT_L lw +-#define INT_S sw +-#define LONG_SLL sll +-#define LONG_SLLV sllv +-#define LONG_SRL srl +-#define LONG_SRLV srlv +-#define LONG_SRA sra +-#define LONG_SRAV srav ++# define INT_ADD add ++# define INT_ADDI addi ++# define INT_ADDU addu ++# define INT_ADDIU addiu ++# define INT_SUB add ++# define INT_SUBI subi ++# define INT_SUBU subu ++# define INT_SUBIU subu ++# define INT_L lw ++# define INT_S sw + #endif + + #if (_MIPS_SZINT == 64) +-#define INT_ADD dadd +-#define INT_ADDI daddi +-#define INT_ADDU daddu +-#define INT_ADDIU daddiu +-#define INT_SUB dadd +-#define INT_SUBI dsubi +-#define INT_SUBU dsubu +-#define INT_SUBIU dsubu +-#define INT_L ld +-#define INT_S sd +-#define LONG_SLL dsll +-#define LONG_SLLV dsllv +-#define LONG_SRL dsrl +-#define LONG_SRLV dsrlv +-#define LONG_SRA dsra +-#define LONG_SRAV dsrav ++# define INT_ADD dadd ++# define INT_ADDI daddi ++# define INT_ADDU daddu ++# define INT_ADDIU daddiu ++# define INT_SUB dadd ++# define INT_SUBI dsubi ++# define INT_SUBU dsubu ++# define INT_SUBIU dsubu ++# define INT_L ld ++# define INT_S sd + #endif + + /* + * How to add/sub/load/store/shift C long variables. + */ + #if (_MIPS_SZLONG == 32) +-#define LONG_ADD add +-#define LONG_ADDI addi +-#define LONG_ADDU addu +-#define LONG_ADDIU addiu +-#define LONG_SUB add +-#define LONG_SUBI subi +-#define LONG_SUBU subu +-#define LONG_SUBIU subu +-#define LONG_L lw +-#define LONG_S sw +-#define LONG_SLL sll +-#define LONG_SLLV sllv +-#define LONG_SRL srl +-#define LONG_SRLV srlv +-#define LONG_SRA sra +-#define LONG_SRAV srav ++# define LONG_ADD add ++# define LONG_ADDI addi ++# define LONG_ADDU addu ++# define LONG_ADDIU addiu ++# define LONG_SUB add ++# define LONG_SUBI subi ++# define LONG_SUBU subu ++# define LONG_SUBIU subu ++# define LONG_L lw ++# define LONG_S sw ++# define LONG_SLL sll ++# define LONG_SLLV sllv ++# define LONG_SRL srl ++# define LONG_SRLV srlv ++# define LONG_SRA sra ++# define LONG_SRAV srav + #endif + + #if (_MIPS_SZLONG == 64) +-#define LONG_ADD dadd +-#define LONG_ADDI daddi +-#define LONG_ADDU daddu +-#define LONG_ADDIU daddiu +-#define LONG_SUB dadd +-#define LONG_SUBI dsubi +-#define LONG_SUBU dsubu +-#define LONG_SUBIU dsubu +-#define LONG_L ld +-#define LONG_S sd +-#define LONG_SLL dsll +-#define LONG_SLLV dsllv +-#define LONG_SRL dsrl +-#define LONG_SRLV dsrlv +-#define LONG_SRA dsra +-#define LONG_SRAV dsrav ++# define LONG_ADD dadd ++# define LONG_ADDI daddi ++# define LONG_ADDU daddu ++# define LONG_ADDIU daddiu ++# define LONG_SUB dadd ++# define LONG_SUBI dsubi ++# define LONG_SUBU dsubu ++# define LONG_SUBIU dsubu ++# define LONG_L ld ++# define LONG_S sd ++# define LONG_SLL dsll ++# define LONG_SLLV dsllv ++# define LONG_SRL dsrl ++# define LONG_SRLV dsrlv ++# define LONG_SRA dsra ++# define LONG_SRAV dsrav + #endif + + /* + * How to add/sub/load/store/shift pointers. + */ +-#if (_MIPS_SZLONG == 32) +-#define PTR_ADD add +-#define PTR_ADDI addi +-#define PTR_ADDU addu +-#define PTR_ADDIU addiu +-#define PTR_SUB add +-#define PTR_SUBI subi +-#define PTR_SUBU subu +-#define PTR_SUBIU subu +-#define PTR_L lw +-#define PTR_S sw +-#define PTR_SLL sll +-#define PTR_SLLV sllv +-#define PTR_SRL srl +-#define PTR_SRLV srlv +-#define PTR_SRA sra +-#define PTR_SRAV srav ++#if (_MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32) ++# define PTR_ADD add ++# define PTR_ADDI addi ++# define PTR_ADDU addu ++# define PTR_ADDIU addiu ++# define PTR_SUB add ++# define PTR_SUBI subi ++# define PTR_SUBU subu ++# define PTR_SUBIU subu ++# define PTR_L lw ++# define PTR_LA la ++# define PTR_S sw ++# define PTR_SLL sll ++# define PTR_SLLV sllv ++# define PTR_SRL srl ++# define PTR_SRLV srlv ++# define PTR_SRA sra ++# define PTR_SRAV srav + +-#define PTR_SCALESHIFT 2 ++# define PTR_SCALESHIFT 2 + #endif + +-#if (_MIPS_SZLONG == 64) +-#define PTR_ADD dadd +-#define PTR_ADDI daddi +-#define PTR_ADDU daddu +-#define PTR_ADDIU daddiu +-#define PTR_SUB dadd +-#define PTR_SUBI dsubi +-#define PTR_SUBU dsubu +-#define PTR_SUBIU dsubu +-#define PTR_L ld +-#define PTR_S sd +-#define PTR_SLL dsll +-#define PTR_SLLV dsllv +-#define PTR_SRL dsrl +-#define PTR_SRLV dsrlv +-#define PTR_SRA dsra +-#define PTR_SRAV dsrav ++#if _MIPS_SIM == _MIPS_SIM_NABI32 ++# define PTR_ADD add ++# define PTR_ADDI addi ++# define PTR_ADDU add /* no u */ ++# define PTR_ADDIU addi /* no u */ ++# define PTR_SUB add ++# define PTR_SUBI subi ++# define PTR_SUBU sub /* no u */ ++# define PTR_SUBIU sub /* no u */ ++# define PTR_L lw ++# define PTR_LA la ++# define PTR_S sw ++# define PTR_SLL sll ++# define PTR_SLLV sllv ++# define PTR_SRL srl ++# define PTR_SRLV srlv ++# define PTR_SRA sra ++# define PTR_SRAV srav + +-#define PTR_SCALESHIFT 3 ++# define PTR_SCALESHIFT 2 ++#endif ++ ++#if (_MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 64 /* o64??? */) \ ++ || _MIPS_SIM == _MIPS_SIM_ABI64 ++# define PTR_ADD dadd ++# define PTR_ADDI daddi ++# define PTR_ADDU daddu ++# define PTR_ADDIU daddiu ++# define PTR_SUB dadd ++# define PTR_SUBI dsubi ++# define PTR_SUBU dsubu ++# define PTR_SUBIU dsubu ++# define PTR_L ld ++# define PTR_LA dla ++# define PTR_S sd ++# define PTR_SLL dsll ++# define PTR_SLLV dsllv ++# define PTR_SRL dsrl ++# define PTR_SRLV dsrlv ++# define PTR_SRA dsra ++# define PTR_SRAV dsrav ++ ++# define PTR_SCALESHIFT 3 + #endif + + /* + * Some cp0 registers were extended to 64bit for MIPS III. + */ +-#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2) +-#define MFC0 mfc0 +-#define MTC0 mtc0 ++#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2) || \ ++ (_MIPS_ISA == _MIPS_ISA_MIPS32) ++# define MFC0 mfc0 ++# define MTC0 mtc0 + #endif + #if (_MIPS_ISA == _MIPS_ISA_MIPS3) || (_MIPS_ISA == _MIPS_ISA_MIPS4) || \ +- (_MIPS_ISA == _MIPS_ISA_MIPS5) +-#define MFC0 dmfc0 +-#define MTC0 dmtc0 ++ (_MIPS_ISA == _MIPS_ISA_MIPS5) || (_MIPS_ISA == _MIPS_ISA_MIPS64) ++# define MFC0 dmfc0 ++# define MTC0 dmtc0 + #endif + + #endif /* sys/asm.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/mips/sys/regdef.h glibc-2.3.2-200304020432/sysdeps/mips/sys/regdef.h +--- glibc-2.3.2/sysdeps/mips/sys/regdef.h Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/sys/regdef.h Fri Mar 14 06:31:28 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1997, 1998 Free Software Foundation, Inc. ++/* Copyright (C) 1997, 1998, 2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ralf Baechle . + +@@ -31,10 +31,17 @@ + #define a1 $5 + #define a2 $6 + #define a3 $7 ++#if _MIPS_SIM != _MIPS_SIM_ABI32 ++#define a4 $8 ++#define a5 $9 ++#define a6 $10 ++#define a7 $11 ++#else /* if _MIPS_SIM == _MIPS_SIM_ABI32 */ + #define t0 $8 /* caller saved */ + #define t1 $9 + #define t2 $10 + #define t3 $11 ++#endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */ + #define t4 $12 + #define t5 $13 + #define t6 $14 +diff -u -udbrN glibc-2.3.2/sysdeps/mips/sys/ucontext.h glibc-2.3.2-200304020432/sysdeps/mips/sys/ucontext.h +--- glibc-2.3.2/sysdeps/mips/sys/ucontext.h Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/mips/sys/ucontext.h Mon Mar 17 16:47:12 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1998, 1999 Free Software Foundation, Inc. ++/* Copyright (C) 1998, 1999, 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 +@@ -25,7 +25,11 @@ + #include + + /* Type for general register. */ +-typedef unsigned int greg_t; ++#if _MIPS_SIM == _MIPS_SIM_ABI32 ++typedef __uint32_t greg_t; ++#else ++typedef __uint64_t greg_t; ++#endif + + /* Number of general registers. */ + #define NGREG 36 +@@ -115,9 +119,15 @@ + { + union + { ++#if _MIPS_SIM == _MIPS_SIM_ABI32 + double fp_dregs[16]; + float fp_fregs[32]; + unsigned int fp_regs[32]; ++#else ++ double fp_dregs[32]; ++ /* float fp_fregs[32]; */ ++ __uint64_t fp_regs[32]; ++#endif + } fp_r; + unsigned int fp_csr; + unsigned int fp_pad; +@@ -133,12 +143,16 @@ + /* Userlevel context. */ + typedef struct ucontext + { ++#if _MIPS_SIM == _MIPS_SIM_ABI32 + unsigned long int uc_flags; ++#else ++ __uint64_t uc_flags; ++#endif + struct ucontext *uc_link; + __sigset_t uc_sigmask; + stack_t uc_stack; + mcontext_t uc_mcontext; +- long int uc_filler[48]; ++ int uc_filler[48]; + } ucontext_t; + + #endif /* sys/ucontext.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/posix/clock_getres.c glibc-2.3.2-200304020432/sysdeps/posix/clock_getres.c +--- glibc-2.3.2/sysdeps/posix/clock_getres.c Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/posix/clock_getres.c Mon Mar 3 05:43:57 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. ++/* Copyright (C) 1999, 2000, 2001, 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 +@@ -24,7 +24,7 @@ + #include + + +-#if HP_TIMING_AVAIL ++#if HP_TIMING_AVAIL && !defined HANDLED_CPUTIME + /* Clock frequency of the processor. */ + static long int nsec; + #endif +@@ -38,24 +38,33 @@ + + switch (clock_id) + { +- case CLOCK_REALTIME: +- { +- long int clk_tck = sysconf (_SC_CLK_TCK); ++#define HANDLE_REALTIME \ ++ do { \ ++ long int clk_tck = sysconf (_SC_CLK_TCK); \ ++ \ ++ if (__builtin_expect (clk_tck != -1, 1)) \ ++ { \ ++ /* This implementation assumes that the realtime clock has a \ ++ resolution higher than 1 second. This is the case for any \ ++ reasonable implementation. */ \ ++ res->tv_sec = 0; \ ++ res->tv_nsec = 1000000000 / clk_tck; \ ++ \ ++ retval = 0; \ ++ } \ ++ } while (0) + +- if (__builtin_expect (clk_tck != -1, 1)) +- { +- /* This implementation assumes that the realtime clock has a +- resolution higher than 1 second. This is the case for any +- reasonable implementation. */ +- res->tv_sec = 0; +- res->tv_nsec = 1000000000 / clk_tck; ++#ifdef SYSDEP_GETRES ++ SYSDEP_GETRES; ++#endif + +- retval = 0; +- } +- } ++#ifndef HANDLED_REALTIME ++ case CLOCK_REALTIME: ++ HANDLE_REALTIME; + break; ++#endif /* handled REALTIME */ + +-#if HP_TIMING_AVAIL ++#if HP_TIMING_AVAIL && !defined HANDLED_CPUTIME + case CLOCK_PROCESS_CPUTIME_ID: + case CLOCK_THREAD_CPUTIME_ID: + { +diff -u -udbrN glibc-2.3.2/sysdeps/posix/fpathconf.c glibc-2.3.2-200304020432/sysdeps/posix/fpathconf.c +--- glibc-2.3.2/sysdeps/posix/fpathconf.c Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/posix/fpathconf.c Fri Mar 14 07:22:16 2003 +@@ -1,4 +1,5 @@ +-/* Copyright (C) 1991,1995,1996,1998,2000,2001 Free Software Foundation, Inc. ++/* Copyright (C) 1991,1995,1996,1998,2000,2001,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 +@@ -229,6 +230,10 @@ + /* In general there are no limits. If a system has one it should + overwrite this case. */ + return -1; ++ ++ case _PC_2_SYMLINKS: ++ /* Unix systems generally have symlinks. */ ++ return 1; + } + } + +diff -u -udbrN glibc-2.3.2/sysdeps/posix/pathconf.c glibc-2.3.2-200304020432/sysdeps/posix/pathconf.c +--- glibc-2.3.2/sysdeps/posix/pathconf.c Sat Jul 7 21:21:27 2001 ++++ glibc-2.3.2-200304020432/sysdeps/posix/pathconf.c Fri Mar 14 07:22:16 2003 +@@ -1,4 +1,5 @@ +-/* Copyright (C) 1991,1995,1996,1998,2000,2001 Free Software Foundation, Inc. ++/* Copyright (C) 1991,1995,1996,1998,2000,2001,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 +@@ -225,6 +226,10 @@ + /* In general there are no limits. If a system has one it should + overwrite this case. */ + return -1; ++ ++ case _PC_2_SYMLINKS: ++ /* Unix systems generally have symlinks. */ ++ return 1; + } + } + +diff -u -udbrN glibc-2.3.2/sysdeps/posix/sysconf.c glibc-2.3.2-200304020432/sysdeps/posix/sysconf.c +--- glibc-2.3.2/sysdeps/posix/sysconf.c Mon Feb 17 23:45:41 2003 ++++ glibc-2.3.2-200304020432/sysdeps/posix/sysconf.c Wed Mar 19 00:49:45 2003 +@@ -938,7 +938,7 @@ + #endif + + case _SC_MONOTONIC_CLOCK: +-#ifdef _POSIX_MONOTONIC_CLOCK ++#if _POSIX_MONOTONIC_CLOCK + return _POSIX_MONOTONIC_CLOCK; + #else + return -1; +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/bits/atomic.h glibc-2.3.2-200304020432/sysdeps/powerpc/bits/atomic.h +--- glibc-2.3.2/sysdeps/powerpc/bits/atomic.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/bits/atomic.h Fri Mar 28 08:17:02 2003 +@@ -0,0 +1,267 @@ ++/* Atomic operations. PowerPC version. ++ Copyright (C) 2003 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Paul Mackerras , 2003. ++ ++ 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 ++ ++typedef int8_t atomic8_t; ++typedef uint8_t uatomic8_t; ++typedef int_fast8_t atomic_fast8_t; ++typedef uint_fast8_t uatomic_fast8_t; ++ ++typedef int16_t atomic16_t; ++typedef uint16_t uatomic16_t; ++typedef int_fast16_t atomic_fast16_t; ++typedef uint_fast16_t uatomic_fast16_t; ++ ++typedef int32_t atomic32_t; ++typedef uint32_t uatomic32_t; ++typedef int_fast32_t atomic_fast32_t; ++typedef uint_fast32_t uatomic_fast32_t; ++ ++typedef int64_t atomic64_t; ++typedef uint64_t uatomic64_t; ++typedef int_fast64_t atomic_fast64_t; ++typedef uint_fast64_t uatomic_fast64_t; ++ ++typedef intptr_t atomicptr_t; ++typedef uintptr_t uatomicptr_t; ++typedef intmax_t atomic_max_t; ++typedef uintmax_t uatomic_max_t; ++ ++ ++#define __arch_compare_and_exchange_bool_8_acq(mem, newval, oldval) \ ++ (abort (), 0) ++ ++#define __arch_compare_and_exchange_bool_16_acq(mem, newval, oldval) \ ++ (abort (), 0) ++ ++#ifdef UP ++# define __ARCH_ACQ_INSTR "" ++# define __ARCH_REL_INSTR "" ++#else ++# define __ARCH_ACQ_INSTR "isync" ++# define __ARCH_REL_INSTR "sync" ++#endif ++ ++/* ++ * XXX At present these have both acquire and release semantics. ++ * Ultimately we should do separate _acq and _rel versions. ++ */ ++ ++#ifdef __powerpc64__ ++ ++/* ++ * The 32-bit exchange_bool is different on powerpc64 because the subf ++ * does signed 64-bit arthmatic while the lwarx is 32-bit unsigned ++ * (a load word and zero (high 32) form). ++ * In powerpc64 register values are 64-bit by default, including oldval. ++ * Net we need to extend sign word the result of lwarx to 64-bit so the ++ * 64-bit subtract from gives the expected result and sets the condition ++ * correctly. ++ */ ++# define __arch_compare_and_exchange_bool_32_acq(mem, newval, oldval) \ ++({ \ ++ unsigned int __tmp; \ ++ __asm __volatile (__ARCH_REL_INSTR "\n" \ ++ "1: lwarx %0,0,%1\n" \ ++ " extsw %0,%0\n" \ ++ " subf. %0,%2,%0\n" \ ++ " bne 2f\n" \ ++ " stwcx. %3,0,%1\n" \ ++ " bne- 1b\n" \ ++ "2: " __ARCH_ACQ_INSTR \ ++ : "=&r" (__tmp) \ ++ : "b" (mem), "r" (oldval), "r" (newval) \ ++ : "cr0", "memory"); \ ++ __tmp != 0; \ ++}) ++ ++# define __arch_compare_and_exchange_bool_64_acq(mem, newval, oldval) \ ++({ \ ++ unsigned long __tmp; \ ++ __asm __volatile (__ARCH_REL_INSTR "\n" \ ++ "1: ldarx %0,0,%1\n" \ ++ " subf. %0,%2,%0\n" \ ++ " bne 2f\n" \ ++ " stdcx. %3,0,%1\n" \ ++ " bne- 1b\n" \ ++ "2: " __ARCH_ACQ_INSTR \ ++ : "=&r" (__tmp) \ ++ : "b" (mem), "r" (oldval), "r" (newval) \ ++ : "cr0", "memory"); \ ++ __tmp != 0; \ ++}) ++ ++# define __arch_atomic_exchange_64(mem, value) \ ++ ({ \ ++ __typeof (*mem) __val; \ ++ __asm __volatile (__ARCH_REL_INSTR "\n" \ ++ "1: ldarx %0,0,%2\n" \ ++ " stdcx. %3,0,%2\n" \ ++ " bne- 1b" \ ++ : "=&r" (__val), "=m" (*mem) \ ++ : "b" (mem), "r" (value), "1" (*mem) \ ++ : "cr0"); \ ++ __val; \ ++ }) ++ ++# define __arch_atomic_exchange_and_add_64(mem, value) \ ++ ({ \ ++ __typeof (*mem) __val, __tmp; \ ++ __asm __volatile ("1: ldarx %0,0,%3\n" \ ++ " add %1,%0,%4\n" \ ++ " stdcx. %1,0,%3\n" \ ++ " bne- 1b" \ ++ : "=&b" (__val), "=&r" (__tmp), "=m" (*mem) \ ++ : "b" (mem), "r" (value), "2" (*mem) \ ++ : "cr0"); \ ++ __val; \ ++ }) ++ ++# define __arch_atomic_decrement_if_positive_64(mem) \ ++ ({ int __val, __tmp; \ ++ __asm __volatile ("1: ldarx %0,0,%3\n" \ ++ " cmpdi 0,%0,0\n" \ ++ " addi %1,%0,-1\n" \ ++ " ble 2f\n" \ ++ " stdcx. %1,0,%3\n" \ ++ " bne- 1b\n" \ ++ "2: " __ARCH_ACQ_INSTR \ ++ : "=&b" (__val), "=&r" (__tmp), "=m" (*mem) \ ++ : "b" (mem), "2" (*mem) \ ++ : "cr0"); \ ++ __val; \ ++ }) ++ ++#else /* powerpc32 */ ++# define __arch_compare_and_exchange_bool_32_acq(mem, newval, oldval) \ ++({ \ ++ unsigned int __tmp; \ ++ __asm __volatile (__ARCH_REL_INSTR "\n" \ ++ "1: lwarx %0,0,%1\n" \ ++ " subf. %0,%2,%0\n" \ ++ " bne 2f\n" \ ++ " stwcx. %3,0,%1\n" \ ++ " bne- 1b\n" \ ++ "2: " __ARCH_ACQ_INSTR \ ++ : "=&r" (__tmp) \ ++ : "b" (mem), "r" (oldval), "r" (newval) \ ++ : "cr0", "memory"); \ ++ __tmp != 0; \ ++}) ++ ++# define __arch_compare_and_exchange_bool_64_acq(mem, newval, oldval) \ ++ (abort (), 0) ++ ++# define __arch_atomic_exchange_64(mem, value) \ ++ ({ abort (); (*mem) = (value); }) ++# define __arch_atomic_exchange_and_add_64(mem, value) \ ++ ({ abort (); (*mem) = (value); }) ++# define __arch_atomic_decrement_if_positive_64(mem) \ ++ ({ abort (); (*mem)--; }) ++#endif ++ ++#define __arch_atomic_exchange_32(mem, value) \ ++ ({ \ ++ __typeof (*mem) __val; \ ++ __asm __volatile (__ARCH_REL_INSTR "\n" \ ++ "1: lwarx %0,0,%2\n" \ ++ " stwcx. %3,0,%2\n" \ ++ " bne- 1b" \ ++ : "=&r" (__val), "=m" (*mem) \ ++ : "b" (mem), "r" (value), "1" (*mem) \ ++ : "cr0"); \ ++ __val; \ ++ }) ++ ++#define __arch_atomic_exchange_and_add_32(mem, value) \ ++ ({ \ ++ __typeof (*mem) __val, __tmp; \ ++ __asm __volatile ("1: lwarx %0,0,%3\n" \ ++ " add %1,%0,%4\n" \ ++ " stwcx. %1,0,%3\n" \ ++ " bne- 1b" \ ++ : "=&b" (__val), "=&r" (__tmp), "=m" (*mem) \ ++ : "b" (mem), "r" (value), "2" (*mem) \ ++ : "cr0"); \ ++ __val; \ ++ }) ++ ++#define __arch_atomic_decrement_if_positive_32(mem) \ ++ ({ int __val, __tmp; \ ++ __asm __volatile ("1: lwarx %0,0,%3\n" \ ++ " cmpwi 0,%0,0\n" \ ++ " addi %1,%0,-1\n" \ ++ " ble 2f\n" \ ++ " stwcx. %1,0,%3\n" \ ++ " bne- 1b\n" \ ++ "2: " __ARCH_ACQ_INSTR \ ++ : "=&b" (__val), "=&r" (__tmp), "=m" (*mem) \ ++ : "b" (mem), "2" (*mem) \ ++ : "cr0"); \ ++ __val; \ ++ }) ++ ++ ++#define atomic_exchange(mem, value) \ ++ ({ \ ++ __typeof (*(mem)) __result; \ ++ if (sizeof (*mem) == 4) \ ++ __result = __arch_atomic_exchange_32 ((mem), (value)); \ ++ else if (sizeof (*mem) == 8) \ ++ __result = __arch_atomic_exchange_64 ((mem), (value)); \ ++ else \ ++ abort (); \ ++ __result; \ ++ }) ++ ++#define atomic_exchange_and_add(mem, value) \ ++ ({ \ ++ __typeof (*(mem)) __result; \ ++ if (sizeof (*mem) == 4) \ ++ __result = __arch_atomic_exchange_and_add_32 ((mem), (value)); \ ++ else if (sizeof (*mem) == 8) \ ++ __result = __arch_atomic_exchange_and_add_64 ((mem), (value)); \ ++ else \ ++ abort (); \ ++ __result; \ ++ }) ++ ++ ++/* Decrement *MEM if it is > 0, and return the old value. */ ++#define atomic_decrement_if_positive(mem) \ ++ ({ __typeof (*(mem)) __result; \ ++ if (sizeof (*mem) == 4) \ ++ __result = __arch_atomic_decrement_if_positive_32 (mem); \ ++ else if (sizeof (*mem) == 8) \ ++ __result = __arch_atomic_decrement_if_positive_64 (mem); \ ++ else \ ++ abort (); \ ++ __result; \ ++ }) ++ ++ ++#define atomic_full_barrier() __asm ("sync" ::: "memory") ++#ifdef __powerpc64__ ++# define atomic_read_barrier() __asm ("lwsync" ::: "memory") ++#else ++# define atomic_read_barrier() __asm ("sync" ::: "memory") ++#endif ++#define atomic_write_barrier() __asm ("eieio" ::: "memory") +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/dl-tls.h glibc-2.3.2-200304020432/sysdeps/powerpc/dl-tls.h +--- glibc-2.3.2/sysdeps/powerpc/dl-tls.h Fri Feb 28 05:54:53 2003 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/dl-tls.h Sun Mar 2 12:41:46 2003 +@@ -25,19 +25,25 @@ + unsigned long int ti_offset; + } tls_index; + +- +-#ifdef SHARED +- +-extern void *__tls_get_addr (tls_index *ti); +- + /* The thread pointer points 0x7000 past the first static TLS block. */ +-# define TLS_TP_OFFSET 0x7000 ++#define TLS_TP_OFFSET 0x7000 + + /* Dynamic thread vector pointers point 0x8000 past the start of each + TLS block. */ +-# define TLS_DTV_OFFSET 0x8000 ++#define TLS_DTV_OFFSET 0x8000 ++ ++/* Compute the value for a @tprel reloc. */ ++#define TLS_TPREL_VALUE(sym_map, sym, reloc) \ ++ ((sym_map)->l_tls_offset + (sym)->st_value + (reloc)->r_addend \ ++ - TLS_TCB_SIZE - TLS_TP_OFFSET) ++ ++/* Compute the value for a @dtprel reloc. */ ++#define TLS_DTPREL_VALUE(sym, reloc) \ ++ ((sym)->st_value + (reloc)->r_addend - TLS_DTV_OFFSET) ++ ++#ifdef SHARED ++extern void *__tls_get_addr (tls_index *ti); + + # define GET_ADDR_OFFSET (ti->ti_offset + TLS_DTV_OFFSET) + # define __TLS_GET_ADDR(__ti) (__tls_get_addr (__ti) - TLS_DTV_OFFSET) +- + #endif +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/elf/libc-start.c glibc-2.3.2-200304020432/sysdeps/powerpc/elf/libc-start.c +--- glibc-2.3.2/sysdeps/powerpc/elf/libc-start.c Wed Feb 26 00:40:09 2003 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/elf/libc-start.c Sun Mar 16 00:09:18 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1998,2000,2001,2002 Free Software Foundation, Inc. ++/* Copyright (C) 1998,2000,2001,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 +@@ -22,31 +22,9 @@ + #include + #include + +-extern void __libc_init_first (int argc, char **argv, char **envp); +- + extern int __cache_line_size; + weak_extern (__cache_line_size) + +-extern int __libc_multiple_libcs; +-extern void *__libc_stack_end; +- +-#ifndef SHARED +-# include +-extern void __pthread_initialize_minimal (void) +-# if !(USE_TLS - 0) && !defined NONTLS_INIT_TP +- __attribute__ ((weak)) +-# endif +- ; +-#endif +- +-struct startup_info +-{ +- void *__unbounded sda_base; +- int (*main) (int, char **, char **, void *); +- int (*init) (int, char **, char **, void *); +- void (*fini) (void); +-}; +- + /* Scan the Aux Vector for the "Data Cache Block Size" entry. If found + verify that the static extern __cache_line_size is defined by checking + for not NULL. If it is defined then assign the cache block size +@@ -66,6 +44,24 @@ + break; + } + } ++/* This is used in sysdeps/generic/libc-start.c. */ ++#define AUX_VECTOR_INIT __aux_init_cache ++ ++/* The main work is done in the generic function. */ ++#define LIBC_START_MAIN generic_start_main ++#define LIBC_START_MAIN_AUXVEC_ARG ++#define MAIN_AUXVEC_ARG ++#define INIT_MAIN_ARGS ++#include ++ ++ ++struct startup_info ++{ ++ void *__unbounded sda_base; ++ int (*main) (int, char **, char **, void *); ++ int (*init) (int, char **, char **, void *); ++ void (*fini) (void); ++}; + + + int +@@ -73,7 +69,8 @@ + BPs in the arglist of startup_info.main and startup_info.init. */ + BP_SYM (__libc_start_main) (int argc, char *__unbounded *__unbounded ubp_av, + char *__unbounded *__unbounded ubp_ev, +- ElfW(auxv_t) *__unbounded auxvec, void (*rtld_fini) (void), ++ ElfW(auxv_t) *__unbounded auxvec, ++ void (*rtld_fini) (void), + struct startup_info *__unbounded stinfo, + char *__unbounded *__unbounded stack_on_entry) + { +@@ -83,15 +80,6 @@ + # define argv ubp_av + #endif + +-#ifndef SHARED +- /* The next variable is only here to work around a bug in gcc <= 2.7.2.2. +- If the address would be taken inside the expression the optimizer +- would try to be too smart and throws it away. Grrr. */ +- int *dummy_addr = &_dl_starting_up; +- +- __libc_multiple_libcs = dummy_addr && !_dl_starting_up; +-#endif +- + /* the PPC SVR4 ABI says that the top thing on the stack will + be a NULL pointer, so if not we assume that we're being called + as a statically-linked program by Linux... */ +@@ -110,78 +98,14 @@ + while (*temp != NULL) + ++temp; + auxvec = (ElfW(auxv_t) *)++temp; +- +-# ifndef SHARED +- _dl_aux_init (auxvec); +-# endif + #endif + rtld_fini = NULL; + } + +- INIT_ARGV_and_ENVIRON; +- + /* Initialize the __cache_line_size variable from the aux vector. */ +- __aux_init_cache(auxvec); +- +- /* Store something that has some relationship to the end of the +- stack, for backtraces. This variable should be thread-specific. +- Use +8 so it works for both 32- and 64-bit. */ +- __libc_stack_end = stack_on_entry + 8; +- +-#ifndef SHARED +-# ifdef DL_SYSDEP_OSCHECK +- if (!__libc_multiple_libcs) +- { +- /* This needs to run to initiliaze _dl_osversion before TLS +- setup might check it. */ +- DL_SYSDEP_OSCHECK (__libc_fatal); +- } +-# endif +- /* 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. 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 (); +- +- /* Some security at this point. Prevent starting a SUID binary where +- the standard file descriptors are not opened. We have to do this +- only for statically linked applications since otherwise the dynamic +- loader did the work already. */ +- if (__builtin_expect (__libc_enable_secure, 0)) +- __libc_check_standard_fds (); +-#endif +- +- /* Register the destructor of the dynamic linker if there is any. */ +- if (rtld_fini != NULL) +- __cxa_atexit ((void (*) (void *)) rtld_fini, NULL, NULL); +- +- /* Call the initializer of the libc. */ +-#ifdef SHARED +- if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) +- _dl_debug_printf ("\ninitialize libc\n\n"); +-#endif +- __libc_init_first (argc, argv, __environ); +- +- /* Register the destructor of the program, if any. */ +- if (stinfo->fini) +- __cxa_atexit ((void (*) (void *)) stinfo->fini, NULL, NULL); +- +- /* Call the initializer of the program, if any. */ +-#ifdef SHARED +- if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) +- _dl_debug_printf ("\ninitialize program: %s\n\n", argv[0]); +-#endif +- if (stinfo->init) +- stinfo->init (argc, argv, __environ, auxvec); +- +-#ifdef SHARED +- if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) +- _dl_debug_printf ("\ntransferring control: %s\n\n", argv[0]); +-#endif ++ __aux_init_cache (auxvec); + +- exit (stinfo->main (argc, argv, __environ, auxvec)); ++ return generic_start_main (stinfo->main, argc, ubp_av, auxvec, ++ stinfo->init, stinfo->fini, rtld_fini, ++ stack_on_entry); + } +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/fpu/libm-test-ulps glibc-2.3.2-200304020432/sysdeps/powerpc/fpu/libm-test-ulps +--- glibc-2.3.2/sysdeps/powerpc/fpu/libm-test-ulps Tue Sep 3 00:15:28 2002 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/fpu/libm-test-ulps Sun Mar 23 01:52:10 2003 +@@ -91,7 +91,7 @@ + idouble: 1 + + # ccos +-Test "Imaginary part of: ccos (-2 - 3 i) == -4.1896256909688072301 - 9.1092278937553365979 i": ++Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": + float: 1 + ifloat: 1 + Test "Real part of: ccos (0.75 + 1.25 i) == 1.38173873063425888530729933139078645 - 1.09193013555397466170919531722024128 i": +@@ -104,10 +104,10 @@ + ifloat: 1 + + # ccosh +-Test "Real part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Real part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Imaginary part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 + Test "Real part of: ccosh (0.75 + 1.25 i) == 0.408242591877968807788852146397499084 + 0.780365930845853240391326216300863152 i": +@@ -142,7 +142,7 @@ + Test "Imaginary part of: clog10 (-0 - inf i) == inf - pi/2*log10(e) i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: clog10 (-2 - 3 i) == 0.5569716761534183846 - 0.9375544629863747085 i": ++Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": + double: 1 + float: 5 + idouble: 1 +@@ -236,7 +236,7 @@ + ifloat: 2 + + # csinh +-Test "Imaginary part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i": ++Test "Imaginary part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": + double: 1 + idouble: 1 + Test "Real part of: csinh (0.75 + 1.25 i) == 0.259294854551162779153349830618433028 + 1.22863452409509552219214606515777594 i": +@@ -255,7 +255,7 @@ + ifloat: 1 + + # ctan +-Test "Real part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i": ++Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": + double: 1 + idouble: 1 + Test "Imaginary part of: ctan (0.75 + 1.25 i) == 0.160807785916206426725166058173438663 + 0.975363285031235646193581759755216379 i": +@@ -263,7 +263,7 @@ + idouble: 1 + + # ctanh +-Test "Real part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i": ++Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": + double: 1 + float: 2 + idouble: 1 +@@ -437,12 +437,12 @@ + ifloat: 1 + + # lgamma +-Test "lgamma (0.7) == 0.26086724653166651439": ++Test "lgamma (0.7) == 0.260867246531666514385732417016759578": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +-Test "lgamma (1.2) == -0.853740900033158497197e-1": ++Test "lgamma (1.2) == -0.853740900033158497197028392998854470e-1": + double: 1 + float: 2 + idouble: 1 +@@ -497,7 +497,7 @@ + Test "tgamma (0.5) == sqrt (pi)": + float: 1 + ifloat: 1 +-Test "tgamma (0.7) == 1.29805533264755778568": ++Test "tgamma (0.7) == 1.29805533264755778568117117915281162": + double: 1 + float: 1 + idouble: 1 +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/fpu/w_sqrt.c glibc-2.3.2-200304020432/sysdeps/powerpc/fpu/w_sqrt.c +--- glibc-2.3.2/sysdeps/powerpc/fpu/w_sqrt.c Tue May 14 22:46:17 2002 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/fpu/w_sqrt.c Fri Mar 7 22:18:23 2003 +@@ -1,5 +1,5 @@ +-/* Single-precision floating point square root. +- Copyright (C) 1997, 2002 Free Software Foundation, Inc. ++/* Double-precision floating point square root. ++ Copyright (C) 1997, 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 +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/nofpu/libm-test-ulps glibc-2.3.2-200304020432/sysdeps/powerpc/nofpu/libm-test-ulps +--- glibc-2.3.2/sysdeps/powerpc/nofpu/libm-test-ulps Sat Oct 19 22:06:29 2002 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/nofpu/libm-test-ulps Sun Mar 23 01:52:10 2003 +@@ -94,7 +94,7 @@ + idouble: 1 + + # ccos +-Test "Imaginary part of: ccos (-2 - 3 i) == -4.1896256909688072301 - 9.1092278937553365979 i": ++Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": + float: 1 + ifloat: 1 + Test "Real part of: ccos (0.75 + 1.25 i) == 1.38173873063425888530729933139078645 - 1.09193013555397466170919531722024128 i": +@@ -107,10 +107,10 @@ + ifloat: 1 + + # ccosh +-Test "Real part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Real part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Imaginary part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 + Test "Real part of: ccosh (0.75 + 1.25 i) == 0.408242591877968807788852146397499084 + 0.780365930845853240391326216300863152 i": +@@ -145,7 +145,7 @@ + Test "Imaginary part of: clog10 (-0 - inf i) == inf - pi/2*log10(e) i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: clog10 (-2 - 3 i) == 0.5569716761534183846 - 0.9375544629863747085 i": ++Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": + double: 1 + float: 5 + idouble: 1 +@@ -239,7 +239,7 @@ + ifloat: 2 + + # csinh +-Test "Imaginary part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i": ++Test "Imaginary part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": + double: 1 + idouble: 1 + Test "Real part of: csinh (0.75 + 1.25 i) == 0.259294854551162779153349830618433028 + 1.22863452409509552219214606515777594 i": +@@ -258,7 +258,7 @@ + ifloat: 1 + + # ctan +-Test "Real part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i": ++Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": + double: 1 + idouble: 1 + Test "Imaginary part of: ctan (0.75 + 1.25 i) == 0.160807785916206426725166058173438663 + 0.975363285031235646193581759755216379 i": +@@ -266,7 +266,7 @@ + idouble: 1 + + # ctanh +-Test "Real part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i": ++Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": + double: 1 + float: 2 + idouble: 1 +@@ -453,12 +453,12 @@ + ifloat: 2 + + # lgamma +-Test "lgamma (0.7) == 0.26086724653166651439": ++Test "lgamma (0.7) == 0.260867246531666514385732417016759578": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +-Test "lgamma (1.2) == -0.853740900033158497197e-1": ++Test "lgamma (1.2) == -0.853740900033158497197028392998854470e-1": + double: 1 + float: 2 + idouble: 1 +@@ -513,7 +513,7 @@ + Test "tgamma (0.5) == sqrt (pi)": + float: 1 + ifloat: 1 +-Test "tgamma (0.7) == 1.29805533264755778568": ++Test "tgamma (0.7) == 1.29805533264755778568117117915281162": + double: 1 + float: 1 + idouble: 1 +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/powerpc32/atomicity.h glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc32/atomicity.h +--- glibc-2.3.2/sysdeps/powerpc/powerpc32/atomicity.h Thu Feb 20 23:11:52 2003 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc32/atomicity.h Thu Jan 1 01:00:00 1970 +@@ -1,98 +0,0 @@ +-/* Low-level functions for atomic operations. PowerPC version. +- Copyright (C) 1997, 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 _ATOMICITY_H +-#define _ATOMICITY_H 1 +- +-#include +- +-static inline int +-__attribute__ ((unused)) +-exchange_and_add (volatile uint32_t *mem, int val) +-{ +- int tmp, result; +- __asm__ ("\n\ +-0: lwarx %0,0,%2 \n\ +- add%I3 %1,%0,%3 \n\ +- stwcx. %1,0,%2 \n\ +- bne- 0b \n\ +-" : "=&b"(result), "=&r"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory"); +- return result; +-} +- +-static inline void +-__attribute__ ((unused)) +-atomic_add (volatile uint32_t *mem, int val) +-{ +- int tmp; +- __asm__ ("\n\ +-0: lwarx %0,0,%1 \n\ +- add%I2 %0,%0,%2 \n\ +- stwcx. %0,0,%1 \n\ +- bne- 0b \n\ +-" : "=&b"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory"); +-} +- +-static inline int +-__attribute__ ((unused)) +-compare_and_swap (volatile long int *p, long int oldval, long int newval) +-{ +- int result; +- __asm__ ("\n\ +-0: lwarx %0,0,%1 \n\ +- sub%I2c. %0,%0,%2 \n\ +- cntlzw %0,%0 \n\ +- bne- 1f \n\ +- stwcx. %3,0,%1 \n\ +- bne- 0b \n\ +-1: \n\ +-" : "=&b"(result) : "r"(p), "Ir"(oldval), "r"(newval) : "cr0", "memory"); +- return result >> 5; +-} +- +-static inline long int +-__attribute__ ((unused)) +-always_swap (volatile long int *p, long int newval) +-{ +- long int result; +- __asm__ ("\n\ +-0: lwarx %0,0,%1 \n\ +- stwcx. %2,0,%1 \n\ +- bne- 0b \n\ +-" : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory"); +- return result; +-} +- +-static inline int +-__attribute__ ((unused)) +-test_and_set (volatile long int *p, long int newval) +-{ +- int result; +- __asm__ ("\n\ +-0: lwarx %0,0,%1 \n\ +- cmpwi %0,0 \n\ +- bne- 1f \n\ +- stwcx. %2,0,%1 \n\ +- bne- 0b \n\ +-1: \n\ +-" : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory"); +- return result; +-} +- +-#endif /* atomicity.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/powerpc32/dl-machine.c glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc32/dl-machine.c +--- glibc-2.3.2/sysdeps/powerpc/powerpc32/dl-machine.c Thu Nov 21 20:09:30 2002 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc32/dl-machine.c Mon Mar 3 02:04:53 2003 +@@ -1,5 +1,5 @@ + /* Machine-dependent ELF dynamic relocation functions. PowerPC version. +- Copyright (C) 1995-2001, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1995-2001,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 +@@ -368,8 +368,8 @@ + return finaladdr; + } + +-static void +-dl_reloc_overflow (struct link_map *map, ++void ++_dl_reloc_overflow (struct link_map *map, + const char *name, + Elf32_Addr *const reloc_addr, + const Elf32_Sym *sym, +@@ -423,19 +423,19 @@ + + case R_PPC_ADDR24: + if (__builtin_expect (finaladdr > 0x01fffffc && finaladdr < 0xfe000000, 0)) +- dl_reloc_overflow (map, "R_PPC_ADDR24", reloc_addr, sym, refsym); ++ _dl_reloc_overflow (map, "R_PPC_ADDR24", reloc_addr, sym, refsym); + *reloc_addr = (*reloc_addr & 0xfc000003) | (finaladdr & 0x3fffffc); + break; + + case R_PPC_ADDR16: + if (__builtin_expect (finaladdr > 0x7fff && finaladdr < 0xffff8000, 0)) +- dl_reloc_overflow (map, "R_PPC_ADDR16", reloc_addr, sym, refsym); ++ _dl_reloc_overflow (map, "R_PPC_ADDR16", reloc_addr, sym, refsym); + *(Elf32_Half*) reloc_addr = finaladdr; + break; + + case R_PPC_UADDR16: + if (__builtin_expect (finaladdr > 0x7fff && finaladdr < 0xffff8000, 0)) +- dl_reloc_overflow (map, "R_PPC_UADDR16", reloc_addr, sym, refsym); ++ _dl_reloc_overflow (map, "R_PPC_UADDR16", reloc_addr, sym, refsym); + ((char *) reloc_addr)[0] = finaladdr >> 8; + ((char *) reloc_addr)[1] = finaladdr; + break; +@@ -456,7 +456,7 @@ + case R_PPC_ADDR14_BRTAKEN: + case R_PPC_ADDR14_BRNTAKEN: + if (__builtin_expect (finaladdr > 0x7fff && finaladdr < 0xffff8000, 0)) +- dl_reloc_overflow (map, "R_PPC_ADDR14", reloc_addr, sym, refsym); ++ _dl_reloc_overflow (map, "R_PPC_ADDR14", reloc_addr, sym, refsym); + *reloc_addr = (*reloc_addr & 0xffff0003) | (finaladdr & 0xfffc); + if (rinfo != R_PPC_ADDR14) + *reloc_addr = ((*reloc_addr & 0xffdfffff) +@@ -468,7 +468,7 @@ + { + Elf32_Sword delta = finaladdr - (Elf32_Word) reloc_addr; + if (delta << 6 >> 6 != delta) +- dl_reloc_overflow (map, "R_PPC_REL24", reloc_addr, sym, refsym); ++ _dl_reloc_overflow (map, "R_PPC_REL24", reloc_addr, sym, refsym); + *reloc_addr = (*reloc_addr & 0xfc000003) | (delta & 0x3fffffc); + } + break; +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/powerpc32/dl-machine.h glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc32/dl-machine.h +--- glibc-2.3.2/sysdeps/powerpc/powerpc32/dl-machine.h Thu Jan 30 21:25:20 2003 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc32/dl-machine.h Fri Mar 28 01:31:50 2003 +@@ -23,6 +23,7 @@ + #define ELF_MACHINE_NAME "powerpc" + + #include ++#include + + /* Return nonzero iff ELF header is compatible with the running host. */ + static inline int +@@ -275,11 +276,21 @@ + /* 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 USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) + #define elf_machine_type_class(type) \ + ((((type) == R_PPC_JMP_SLOT \ + || (type) == R_PPC_REL24 \ ++ || ((type) >= R_PPC_DTPMOD32 /* contiguous TLS */ \ ++ && (type) <= R_PPC_DTPREL32) \ + || (type) == R_PPC_ADDR24) * ELF_RTYPE_CLASS_PLT) \ + | (((type) == R_PPC_COPY) * ELF_RTYPE_CLASS_COPY)) ++#else ++#define elf_machine_type_class(type) \ ++ ((((type) == R_PPC_JMP_SLOT \ ++ || (type) == R_PPC_REL24 \ ++ || (type) == R_PPC_ADDR24) * ELF_RTYPE_CLASS_PLT) \ ++ | (((type) == R_PPC_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_PPC_JMP_SLOT +@@ -329,7 +340,14 @@ + const Elf32_Sym *refsym, + Elf32_Addr *const reloc_addr, + Elf32_Addr finaladdr, +- int rinfo); ++ int rinfo) attribute_hidden; ++ ++/* Call _dl_signal_error when a resolved value overflows a relocated area. */ ++extern void _dl_reloc_overflow (struct link_map *map, ++ const char *name, ++ Elf32_Addr *const reloc_addr, ++ const Elf32_Sym *sym, ++ const Elf32_Sym *refsym) attribute_hidden; + + /* Perform the relocation specified by RELOC and SYM (which is fully resolved). + LOADADDR is the load address of the object; INFO is an array indexed +@@ -341,44 +359,40 @@ + Elf32_Addr *const reloc_addr) + { + const Elf32_Sym *const refsym = sym; +- Elf32_Word finaladdr; +- const int rinfo = ELF32_R_TYPE (reloc->r_info); +- +-#ifndef RESOLVE_CONFLICT_FIND_MAP +- if (__builtin_expect (rinfo == R_PPC_NONE, 0)) +- return; ++ Elf32_Addr value; ++ const int r_type = ELF32_R_TYPE (reloc->r_info); ++#if defined USE_TLS && !defined RTLD_BOOTSTRAP ++ struct link_map *sym_map; ++#endif + +- /* The condition on the next two lines is a hack around a bug in Solaris +- tools on Sparc. It's not clear whether it should really be here at all, +- but if not the binutils need to be changed. */ +- if (rinfo == R_PPC_RELATIVE +- || (sym->st_shndx != SHN_UNDEF +- && ELF32_ST_BIND (sym->st_info) == STB_LOCAL)) ++ if (r_type == R_PPC_RELATIVE) + { +- /* Has already been relocated. */ +- Elf32_Word loadbase = map->l_addr; +- finaladdr = loadbase + reloc->r_addend; ++ *reloc_addr = map->l_addr + reloc->r_addend; ++ return; + } ++ ++ if (__builtin_expect (r_type == R_PPC_NONE, 0)) ++ return; ++ ++ /* binutils on ppc32 includes st_value in r_addend for relocations ++ against local symbols. */ ++ if (__builtin_expect (ELF32_ST_BIND (sym->st_info) == STB_LOCAL, 0) ++ && sym->st_shndx != SHN_UNDEF) ++ value = map->l_addr; + else + { +- Elf32_Word loadbase +- = (Elf32_Word) (char *) (RESOLVE (&sym, version, +- ELF32_R_TYPE(reloc->r_info))); +- if (sym == NULL) +- { +- /* Weak symbol that wasn't actually defined anywhere. */ +- assert (loadbase == 0); +- finaladdr = reloc->r_addend; +- } +- else +- finaladdr = (loadbase + (Elf32_Word) (char *) sym->st_value +- + reloc->r_addend); +- } ++#if defined USE_TLS && !defined RTLD_BOOTSTRAP ++ sym_map = RESOLVE_MAP (&sym, version, r_type); ++ value = sym == NULL ? 0 : sym_map->l_addr + sym->st_value; + #else +- finaladdr = reloc->r_addend; +- if (rinfo == R_PPC_JMP_SLOT) +- RESOLVE_CONFLICT_FIND_MAP (map, reloc_addr); ++ value = RESOLVE (&sym, version, r_type); ++# ifndef RTLD_BOOTSTRAP ++ if (sym != NULL) ++# endif ++ value += sym->st_value; + #endif ++ } ++ value += reloc->r_addend; + + /* A small amount of code is duplicated here for speed. In libc, + more than 90% of the relocs are R_PPC_RELATIVE; in the X11 shared +@@ -386,15 +400,90 @@ + R_PPC_ADDR32, and 16% are R_PPC_JMP_SLOT (which this routine + wouldn't usually handle). As an bonus, doing this here allows + the switch statement in __process_machine_rela to work. */ +- if (rinfo == R_PPC_RELATIVE +- || rinfo == R_PPC_GLOB_DAT +- || rinfo == R_PPC_ADDR32) ++ switch (r_type) + { +- *reloc_addr = finaladdr; ++ case R_PPC_GLOB_DAT: ++ case R_PPC_ADDR32: ++ *reloc_addr = value; ++ break; ++ ++#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) ++ case R_PPC_DTPMOD32: ++# ifdef RTLD_BOOTSTRAP ++ /* During startup the dynamic linker is always index 1. */ ++ *reloc_addr = 1; ++# else ++ /* Get the information from the link map returned by the ++ RESOLVE_MAP function. */ ++ if (sym_map != NULL) ++ *reloc_addr = sym_map->l_tls_modid; ++# endif ++ break; ++ ++# ifdef RTLD_BOOTSTRAP ++# define NOT_BOOTSTRAP 0 ++# else ++# define NOT_BOOTSTRAP 1 ++# endif ++# 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. */ \ ++ if (NOT_BOOTSTRAP) \ ++ do_reloc##suffix ("R_PPC_DTPREL"#suffix, \ ++ TLS_DTPREL_VALUE (sym, reloc)); \ ++ break; \ ++ case R_PPC_TPREL##suffix: \ ++ if (!NOT_BOOTSTRAP || sym_map) \ ++ { \ ++ if (NOT_BOOTSTRAP) \ ++ CHECK_STATIC_TLS (map, sym_map); \ ++ do_reloc##suffix ("R_PPC_TPREL"#suffix, \ ++ TLS_TPREL_VALUE (sym_map, sym, reloc)); \ ++ } \ ++ break; ++ ++ inline void do_reloc32 (const char *r_name, Elf32_Addr value) ++ { ++ *reloc_addr = value; + } +- else ++ DO_TLS_RELOC (32) ++# ifndef RTLD_BOOTSTRAP /* PIC code like ld.so doesn't use these. */ ++ inline void do_reloc16 (const char *r_name, Elf32_Addr value) ++ { ++ if (__builtin_expect (value > 0x7fff && value < 0xffff8000, 0)) ++ _dl_reloc_overflow (map, "R_PPC_ADDR16", reloc_addr, sym, refsym); ++ *(Elf32_Half *) reloc_addr = value; ++ } ++ inline void do_reloc16_LO (const char *r_name, Elf32_Addr value) ++ { ++ *(Elf32_Half *) reloc_addr = value; ++ } ++ inline void do_reloc16_HI (const char *r_name, Elf32_Addr value) ++ { ++ *(Elf32_Half *) reloc_addr = value >> 16; ++ } ++ inline void do_reloc16_HA (const char *r_name, Elf32_Addr value) ++ { ++ *(Elf32_Half *) reloc_addr = (value + 0x8000) >> 16; ++ } ++ DO_TLS_RELOC (16) ++ DO_TLS_RELOC (16_LO) ++ DO_TLS_RELOC (16_HI) ++ DO_TLS_RELOC (16_HA) ++# endif ++#endif /* USE_TLS etc. */ ++ ++#ifdef RESOLVE_CONFLICT_FIND_MAP ++ case R_PPC_JMP_SLOT: ++ RESOLVE_CONFLICT_FIND_MAP (map, reloc_addr); ++ /* FALLTHROUGH */ ++#endif ++ ++ default: + __process_machine_rela (map, reloc, sym, refsym, +- reloc_addr, finaladdr, rinfo); ++ reloc_addr, value, r_type); ++ } + } + + static inline void +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/powerpc32/elf/configure glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc32/elf/configure +--- glibc-2.3.2/sysdeps/powerpc/powerpc32/elf/configure Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc32/elf/configure Mon Mar 3 22:20:51 2003 +@@ -0,0 +1,52 @@ ++# This file is generated from configure.in by Autoconf. DO NOT EDIT! ++ # Local configure fragment for sysdeps/powerpc32/elf. ++ ++if test "$usetls" != no; then ++# Check for support of thread-local storage handling in assembler and ++# linker. ++echo "$as_me:$LINENO: checking for powerpc32 TLS support" >&5 ++echo $ECHO_N "checking for powerpc32 TLS support... $ECHO_C" >&6 ++if test "${libc_cv_powerpc32_tls+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat > conftest.s <<\EOF ++ .section ".tdata","awT",@progbits ++x: .long 1 ++x1: .long 1 ++x2: .long 1 ++ .text ++ addi 3,31,x@got@tlsgd ++ addi 3,31,x1@got@tlsld ++ addi 9,3,x1@dtprel ++ addis 9,3,x2@dtprel@ha ++ addi 9,9,x2@dtprel@l ++ lwz 0,x1@dtprel(3) ++ addis 9,3,x2@dtprel@ha ++ lwz 0,x2@dtprel@l(9) ++ lwz 9,x3@got@tprel(31) ++ add 9,9,x@tls ++ addi 9,2,x1@tprel ++ addis 9,2,x2@tprel@ha ++ addi 9,9,x2@tprel@l ++EOF ++if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ libc_cv_powerpc32_tls=yes ++else ++ libc_cv_powerpc32_tls=no ++fi ++rm -f conftest* ++fi ++echo "$as_me:$LINENO: result: $libc_cv_powerpc32_tls" >&5 ++echo "${ECHO_T}$libc_cv_powerpc32_tls" >&6 ++if test $libc_cv_powerpc32_tls = yes; then ++ cat >>confdefs.h <<\_ACEOF ++#define HAVE_TLS_SUPPORT 1 ++_ACEOF ++ ++fi ++fi +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/powerpc32/elf/configure.in glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc32/elf/configure.in +--- glibc-2.3.2/sysdeps/powerpc/powerpc32/elf/configure.in Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc32/elf/configure.in Mon Mar 3 22:20:51 2003 +@@ -0,0 +1,38 @@ ++GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. ++# Local configure fragment for sysdeps/powerpc32/elf. ++ ++if test "$usetls" != no; then ++# Check for support of thread-local storage handling in assembler and ++# linker. ++AC_CACHE_CHECK(for powerpc32 TLS support, libc_cv_powerpc32_tls, [dnl ++cat > conftest.s <<\EOF ++ .section ".tdata","awT",@progbits ++x: .long 1 ++x1: .long 1 ++x2: .long 1 ++ .text ++ addi 3,31,x@got@tlsgd ++ addi 3,31,x1@got@tlsld ++ addi 9,3,x1@dtprel ++ addis 9,3,x2@dtprel@ha ++ addi 9,9,x2@dtprel@l ++ lwz 0,x1@dtprel(3) ++ addis 9,3,x2@dtprel@ha ++ lwz 0,x2@dtprel@l(9) ++ lwz 9,x3@got@tprel(31) ++ add 9,9,x@tls ++ addi 9,2,x1@tprel ++ addis 9,2,x2@tprel@ha ++ addi 9,9,x2@tprel@l ++EOF ++dnl ++if AC_TRY_COMMAND(${CC-cc} -c $CFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD); then ++ libc_cv_powerpc32_tls=yes ++else ++ libc_cv_powerpc32_tls=no ++fi ++rm -f conftest*]) ++if test $libc_cv_powerpc32_tls = yes; then ++ AC_DEFINE(HAVE_TLS_SUPPORT) ++fi ++fi +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/powerpc32/memset.S glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc32/memset.S +--- glibc-2.3.2/sysdeps/powerpc/powerpc32/memset.S Fri Aug 23 21:46:49 2002 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc32/memset.S Sun Mar 16 00:09:14 2003 +@@ -1,5 +1,5 @@ + /* Optimized memset implementation for PowerPC. +- Copyright (C) 1997, 1999, 2000 Free Software Foundation, Inc. ++ Copyright (C) 1997, 1999, 2000, 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 +@@ -27,13 +27,8 @@ + variable. */ + + .globl __cache_line_size +- .section ".data","aw" +- .align 2 +- .type __cache_line_size,@object +- .size __cache_line_size,4 +-__cache_line_size: +- .long 0 +- .section ".text" ++ .lcomm __cache_line_size,4,4 ++ + /* __ptr_t [r3] memset (__ptr_t s [r3], int c [r4], size_t n [r5])); + Returns 's'. + +@@ -42,6 +37,7 @@ + There is a special case for setting whole cache lines to 0, which + takes advantage of the dcbz instruction. */ + ++ .section ".text" + EALIGN (BP_SYM (memset), 5, 1) + + #define rTMP r0 +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/powerpc32/sysdep.h glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc32/sysdep.h +--- glibc-2.3.2/sysdeps/powerpc/powerpc32/sysdep.h Thu Feb 20 21:26:54 2003 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc32/sysdep.h Sun Mar 23 20:42:22 2003 +@@ -131,6 +131,19 @@ + #define PSEUDO_END(name) \ + END (name) + ++#define PSEUDO_NOERRNO(name, syscall_name, args) \ ++ .section ".text"; \ ++ ENTRY (name) \ ++ DO_CALL (SYS_ify (syscall_name)); ++ ++#define PSEUDO_RET_NOERRNO \ ++ blr ++#define ret_NOERRNO PSEUDO_RET_NOERRNO ++ ++#undef PSEUDO_END_NOERRNO ++#define PSEUDO_END_NOERRNO(name) \ ++ END (name) ++ + /* Local labels stripped out by the linker. */ + #undef L + #define L(x) .L##x +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/powerpc64/atomicity.h glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc64/atomicity.h +--- glibc-2.3.2/sysdeps/powerpc/powerpc64/atomicity.h Wed Sep 18 01:50:02 2002 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc64/atomicity.h Thu Jan 1 01:00:00 1970 +@@ -1,132 +0,0 @@ +-/* Low-level functions for atomic operations. PowerPC64 version. +- Copyright (C) 1997, 1998, 1999, 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 +- modify it under the terms of the GNU Library General Public License as +- published by the Free Software Foundation; either version 2 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 +- Library General Public License for more details. +- +- You should have received a copy of the GNU Library 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. */ +- +-#ifndef _ATOMICITY_H +-#define _ATOMICITY_H 1 +- +-#include +- +-#if BROKEN_PPC_ASM_CR0 +-# define __ATOMICITY_INLINE /* nothing */ +-#else +-# define __ATOMICITY_INLINE inline +-#endif +- +-static __ATOMICITY_INLINE int +-__attribute__ ((unused)) +-exchange_and_add (volatile uint32_t *mem, int val) +-{ +- int tmp, result; +- __asm__ ("\n\ +-0: lwarx %0,0,%2 \n\ +- add%I3 %1,%0,%3 \n\ +- stwcx. %1,0,%2 \n\ +- bne- 0b \n\ +-" : "=&b"(result), "=&r"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory"); +- return result; +-} +- +-static __ATOMICITY_INLINE void +-__attribute__ ((unused)) +-atomic_add_long (volatile long *mem, int val) +-{ +- int tmp; +- __asm__ ("\n\ +-0: ldarx %0,0,%1 \n\ +- add%I2 %0,%0,%2 \n\ +- stdcx. %0,0,%1 \n\ +- bne- 0b \n\ +-" : "=&b"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory"); +-} +- +- +-static __ATOMICITY_INLINE int +-__attribute__ ((unused)) +-exchange_and_add_long (volatile long *mem, int val) +-{ +- int tmp, result; +- __asm__ ("\n\ +-0: ldarx %0,0,%2 \n\ +- add%I3 %1,%0,%3 \n\ +- stdcx. %1,0,%2 \n\ +- bne- 0b \n\ +-" : "=&b"(result), "=&r"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory"); +- return result; +-} +- +-static __ATOMICITY_INLINE void +-__attribute__ ((unused)) +-atomic_add (volatile uint32_t *mem, int val) +-{ +- int tmp; +- __asm__ ("\n\ +-0: lwarx %0,0,%1 \n\ +- add%I2 %0,%0,%2 \n\ +- stwcx. %0,0,%1 \n\ +- bne- 0b \n\ +-" : "=&b"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory"); +-} +- +-static __ATOMICITY_INLINE int +-__attribute__ ((unused)) +-compare_and_swap (volatile long int *p, long int oldval, long int newval) +-{ +- int result; +- __asm__ ("\n\ +-0: ldarx %0,0,%1 \n\ +- sub%I2c. %0,%0,%2 \n\ +- cntlzw %0,%0 \n\ +- bne- 1f \n\ +- stdcx. %3,0,%1 \n\ +- bne- 0b \n\ +-1: \n\ +-" : "=&b"(result) : "r"(p), "Ir"(oldval), "r"(newval) : "cr0", "memory"); +- return result >> 5; +-} +- +-static __ATOMICITY_INLINE long int +-__attribute__ ((unused)) +-always_swap (volatile long int *p, long int newval) +-{ +- long int result; +- __asm__ ("\n\ +-0: ldarx %0,0,%1 \n\ +- stdcx. %2,0,%1 \n\ +- bne- 0b \n\ +-" : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory"); +- return result; +-} +- +-static __ATOMICITY_INLINE int +-__attribute__ ((unused)) +-test_and_set (volatile long int *p, long int newval) +-{ +- int result; +- __asm__ ("\n\ +-0: ldarx %0,0,%1 \n\ +- cmpdi %0,0 \n\ +- bne- 1f \n\ +- stdcx. %2,0,%1 \n\ +- bne- 0b \n\ +-1: \n\ +-" : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory"); +- return result; +-} +- +-#endif /* atomicity.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/powerpc64/dl-machine.h glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc64/dl-machine.h +--- glibc-2.3.2/sysdeps/powerpc/powerpc64/dl-machine.h Sat Mar 1 01:06:31 2003 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc64/dl-machine.h Wed Mar 12 08:45:07 2003 +@@ -26,6 +26,7 @@ + + #include + #include ++#include + + /* Translate a processor specific dynamic tag to the index + in l_info array. */ +@@ -331,9 +332,8 @@ + + #if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) + #define elf_machine_type_class(type) \ +- ( (((type) == R_PPC64_DTPMOD64 \ +- || (type) == R_PPC64_DTPREL64 \ +- || (type) == R_PPC64_TPREL64 \ ++ /* This covers all the TLS relocs, though most won't appear. */ \ ++ (((((type) >= R_PPC64_DTPMOD64 && (type) <= R_PPC64_TPREL16_HIGHESTA) \ + || (type) == R_PPC64_ADDR24) * ELF_RTYPE_CLASS_PLT) \ + | (((type) == R_PPC64_COPY) * ELF_RTYPE_CLASS_COPY)) + #else +@@ -472,9 +472,6 @@ + Elf64_FuncDesc *plt = (Elf64_FuncDesc *) reloc_addr; + Elf64_FuncDesc *rel = (Elf64_FuncDesc *) finaladdr; + Elf64_Addr offset = 0; +-#ifndef RTLD_BOOTSTRAP +- weak_extern (GL(dl_rtld_map)); +-#endif + + /* If sym_map is NULL, it's a weak undefined sym; Leave the plt zero. */ + if (sym_map == NULL) +@@ -483,7 +480,7 @@ + /* If the opd entry is not yet relocated (because it's from a shared + object that hasn't been processed yet), then manually reloc it. */ + if (map != sym_map && !sym_map->l_relocated +-#ifndef RTLD_BOOTSTRAP ++#if !defined RTLD_BOOTSTRAP && defined SHARED + /* Bootstrap map doesn't have l_relocated set for it. */ + && sym_map != &GL(dl_rtld_map) + #endif +@@ -528,7 +525,8 @@ + #define PPC_HIGHERA(v) PPC_HIGHER ((v) + 0x8000) + #define PPC_HIGHEST(v) (((v) >> 48) & 0xffff) + #define PPC_HIGHESTA(v) PPC_HIGHEST ((v) + 0x8000) +-#define BIT_INSERT(old, val, mask) ((old & ~(Elf64_Addr) mask) | (val & mask)) ++#define BIT_INSERT(var, val, mask) \ ++ ((var) = ((var) & ~(Elf64_Addr) (mask)) | ((val) & (mask))) + + #define dont_expect(X) __builtin_expect ((X), 0) + +@@ -546,6 +544,27 @@ + *reloc_addr = l_addr + reloc->r_addend; + } + ++#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) ++/* This computes the value used by TPREL* relocs. */ ++static Elf64_Addr __attribute__ ((const)) ++elf_machine_tprel (struct link_map *map, ++ struct link_map *sym_map, ++ const Elf64_Sym *sym, ++ const Elf64_Rela *reloc) ++{ ++# ifndef RTLD_BOOTSTRAP ++ if (sym_map) ++ { ++ CHECK_STATIC_TLS (map, sym_map); ++# endif ++ return TLS_TPREL_VALUE (sym_map, sym, reloc); ++# ifndef RTLD_BOOTSTRAP ++ } ++# endif ++ return 0; ++} ++#endif ++ + /* Perform the relocation specified by RELOC and SYM (which is fully + resolved). MAP is the object containing the reloc. */ + static inline void +@@ -555,9 +574,7 @@ + const struct r_found_version *version, + Elf64_Addr *const reloc_addr) + { +- int r_type = ELF64_R_TYPE (reloc->r_info); +- struct link_map *sym_map; +- Elf64_Addr value, raw_value; ++ const int r_type = ELF64_R_TYPE (reloc->r_info); + #ifndef RTLD_BOOTSTRAP + const Elf64_Sym *const refsym = sym; + #endif +@@ -568,17 +585,16 @@ + return; + } + +- if (r_type == R_PPC64_NONE) ++ if (__builtin_expect (r_type == R_PPC64_NONE, 0)) + return; + +- sym_map = RESOLVE_MAP (&sym, version, r_type); +- value = raw_value = reloc->r_addend; +- if (sym_map) +- { +- raw_value += sym->st_value; +- value = raw_value + sym_map->l_addr; +- } ++ /* We need SYM_MAP even in the absence of TLS, for elf_machine_fixup_plt. */ ++ struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type); ++ Elf64_Addr value = ((sym_map == NULL ? 0 : sym_map->l_addr + sym->st_value) ++ + reloc->r_addend); + ++ /* For relocs that don't edit code, return. ++ For relocs that might edit instructions, break from the switch. */ + switch (r_type) + { + case R_PPC64_ADDR64: +@@ -586,58 +602,40 @@ + *reloc_addr = value; + return; + +-#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) ++ case R_PPC64_JMP_SLOT: ++#ifdef RESOLVE_CONFLICT_FIND_MAP ++ RESOLVE_CONFLICT_FIND_MAP (map, reloc_addr); ++#endif ++ elf_machine_fixup_plt (map, sym_map, reloc, reloc_addr, value); ++ return; + ++#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) + case R_PPC64_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 + resolve function. */ + if (sym_map != NULL) + *reloc_addr = sym_map->l_tls_modid; +-#endif +- return; +- +- case R_PPC64_TPREL64: +-#ifdef RTLD_BOOTSTRAP +- *reloc_addr = (sym_map->l_tls_offset - TLS_TCB_SIZE +- + raw_value - TLS_TP_OFFSET); +-#else +- if (sym_map) +- { +- CHECK_STATIC_TLS (map, sym_map); +- *reloc_addr = (sym_map->l_tls_offset - TLS_TCB_SIZE +- + raw_value - TLS_TP_OFFSET); +- } +-#endif ++# endif + return; + + case R_PPC64_DTPREL64: +-#ifndef RTLD_BOOTSTRAP + /* During relocation all TLS symbols are defined and used. + Therefore the offset is already correct. */ +- *reloc_addr = raw_value - TLS_DTV_OFFSET; +-#endif ++# ifndef RTLD_BOOTSTRAP ++ *reloc_addr = TLS_DTPREL_VALUE (sym, reloc); ++# endif + return; +-#endif +- +- case R_PPC64_JMP_SLOT: + +- elf_machine_fixup_plt (map, sym_map, reloc, reloc_addr, value); ++ case R_PPC64_TPREL64: ++ *reloc_addr = elf_machine_tprel (map, sym_map, sym, reloc); + return; + +-#ifndef RTLD_BOOTSTRAP /* None of the following appear in ld.so */ +- case R_PPC64_ADDR16_LO_DS: +- if (dont_expect ((value & 3) != 0)) +- _dl_reloc_overflow (map, "R_PPC64_ADDR16_LO_DS", +- reloc_addr, sym, refsym); +- *(Elf64_Half *) reloc_addr = BIT_INSERT (*(Elf64_Half *) reloc_addr, +- value, 0xfffc); +- break; +- + case R_PPC64_TPREL16_LO_DS: ++ value = elf_machine_tprel (map, sym_map, sym, reloc); + if (dont_expect ((value & 3) != 0)) + _dl_reloc_overflow (map, "R_PPC64_TPREL16_LO_DS", + reloc_addr, sym, refsym); +@@ -645,63 +643,86 @@ + value, 0xfffc); + break; + +- case R_PPC64_DTPREL16_LO_DS: +- if (dont_expect ((value & 3) != 0)) +- _dl_reloc_overflow (map, "R_PPC64_DTPREL16_LO_DS", +- reloc_addr, sym, refsym); ++ case R_PPC64_TPREL16_DS: ++ value = elf_machine_tprel (map, sym_map, sym, reloc); ++ if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0)) ++ _dl_reloc_overflow (map, "R_PPC64_TPREL16_DS", reloc_addr, ++ sym, refsym); + *(Elf64_Half *) reloc_addr = BIT_INSERT (*(Elf64_Half *) reloc_addr, + value, 0xfffc); + break; + +- case R_PPC64_GOT_TPREL16_LO_DS: +- if (dont_expect ((value & 3) != 0)) +- _dl_reloc_overflow (map, "R_PPC64_GOT_TPREL16_LO_DS", +- reloc_addr, sym, refsym); +- *(Elf64_Half *) reloc_addr = BIT_INSERT (*(Elf64_Half *) reloc_addr, +- value, 0xfffc); ++ case R_PPC64_TPREL16: ++ value = elf_machine_tprel (map, sym_map, sym, reloc); ++ if (dont_expect ((value + 0x8000) >= 0x10000)) ++ _dl_reloc_overflow (map, "R_PPC64_TPREL16", reloc_addr, ++ sym, refsym); ++ *(Elf64_Half *) reloc_addr = PPC_LO (value); + break; + +- case R_PPC64_GOT_DTPREL16_LO_DS: ++ case R_PPC64_TPREL16_LO: ++ value = elf_machine_tprel (map, sym_map, sym, reloc); ++ *(Elf64_Half *) reloc_addr = PPC_LO (value); ++ break; ++ ++ case R_PPC64_TPREL16_HI: ++ value = elf_machine_tprel (map, sym_map, sym, reloc); ++ *(Elf64_Half *) reloc_addr = PPC_HI (value); ++ break; ++ ++ case R_PPC64_TPREL16_HA: ++ value = elf_machine_tprel (map, sym_map, sym, reloc); ++ *(Elf64_Half *) reloc_addr = PPC_HA (value); ++ break; ++ ++ case R_PPC64_TPREL16_HIGHER: ++ value = elf_machine_tprel (map, sym_map, sym, reloc); ++ *(Elf64_Half *) reloc_addr = PPC_HIGHER (value); ++ break; ++ ++ case R_PPC64_TPREL16_HIGHEST: ++ value = elf_machine_tprel (map, sym_map, sym, reloc); ++ *(Elf64_Half *) reloc_addr = PPC_HIGHEST (value); ++ break; ++ ++ case R_PPC64_TPREL16_HIGHERA: ++ value = elf_machine_tprel (map, sym_map, sym, reloc); ++ *(Elf64_Half *) reloc_addr = PPC_HIGHERA (value); ++ break; ++ ++ case R_PPC64_TPREL16_HIGHESTA: ++ value = elf_machine_tprel (map, sym_map, sym, reloc); ++ *(Elf64_Half *) reloc_addr = PPC_HIGHESTA (value); ++ break; ++#endif /* USE_TLS etc. */ ++ ++#ifndef RTLD_BOOTSTRAP /* None of the following appear in ld.so */ ++ case R_PPC64_ADDR16_LO_DS: + if (dont_expect ((value & 3) != 0)) +- _dl_reloc_overflow (map, "R_PPC64_GOT_DTPREL16_LO_DS", ++ _dl_reloc_overflow (map, "R_PPC64_ADDR16_LO_DS", + reloc_addr, sym, refsym); +- *(Elf64_Half *) reloc_addr = BIT_INSERT (*(Elf64_Half *) reloc_addr, +- value, 0xfffc); ++ BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc); + break; + + case R_PPC64_ADDR16_LO: +- case R_PPC64_TPREL16_LO: +- case R_PPC64_DTPREL16_LO: +- case R_PPC64_GOT_TLSGD16_LO: +- case R_PPC64_GOT_TLSLD16_LO: + *(Elf64_Half *) reloc_addr = PPC_LO (value); + break; + + case R_PPC64_ADDR16_HI: +- case R_PPC64_TPREL16_HI: +- case R_PPC64_DTPREL16_HI: +- case R_PPC64_GOT_TPREL16_HI: +- case R_PPC64_GOT_DTPREL16_HI: +- case R_PPC64_GOT_TLSGD16_HI: +- case R_PPC64_GOT_TLSLD16_HI: + *(Elf64_Half *) reloc_addr = PPC_HI (value); + break; + + case R_PPC64_ADDR16_HA: +- case R_PPC64_TPREL16_HA: +- case R_PPC64_DTPREL16_HA: +- case R_PPC64_GOT_TLSGD16_HA: +- case R_PPC64_GOT_TLSLD16_HA: + *(Elf64_Half *) reloc_addr = PPC_HA (value); + break; + +- case R_PPC64_REL24: ++ case R_PPC64_ADDR30: + { + Elf64_Addr delta = value - (Elf64_Xword) reloc_addr; +- if (dont_expect ((delta + 0x2000000) >= 0x4000000 || (delta & 3) != 0)) +- _dl_reloc_overflow (map, "R_PPC64_REL24", reloc_addr, sym, refsym); +- *(Elf64_Word *) reloc_addr = BIT_INSERT (*(Elf64_Word *) reloc_addr, +- delta, 0x3fffffc); ++ if (dont_expect ((delta + 0x80000000) >= 0x10000000 ++ || (delta & 3) != 0)) ++ _dl_reloc_overflow (map, "R_PPC64_ADDR30", reloc_addr, sym, refsym); ++ BIT_INSERT (*(Elf64_Word *) reloc_addr, delta, 0xfffffffc); + } + break; + +@@ -744,11 +765,16 @@ + ((char *) reloc_addr)[3] = (value >> 0) & 0xff; + return; + ++ case R_PPC64_ADDR32: ++ if (dont_expect ((value + 0x80000000) >= 0x10000000)) ++ _dl_reloc_overflow (map, "R_PPC64_ADDR32", reloc_addr, sym, refsym); ++ *(Elf64_Word *) reloc_addr = value; ++ return; ++ + case R_PPC64_ADDR24: + if (dont_expect ((value + 0x2000000) >= 0x4000000 || (value & 3) != 0)) + _dl_reloc_overflow (map, "R_PPC64_ADDR24", reloc_addr, sym, refsym); +- *(Elf64_Word *) reloc_addr = BIT_INSERT (*(Elf64_Word *) reloc_addr, +- value, 0x3fffffc); ++ BIT_INSERT (*(Elf64_Word *) reloc_addr, value, 0x3fffffc); + break; + + case R_PPC64_ADDR16: +@@ -768,63 +794,22 @@ + case R_PPC64_ADDR16_DS: + if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0)) + _dl_reloc_overflow (map, "R_PPC64_ADDR16_DS", reloc_addr, sym, refsym); +- *(Elf64_Half *) reloc_addr = BIT_INSERT (*(Elf64_Half *) reloc_addr, +- value, 0xfffc); +- break; +- +- case R_PPC64_TPREL16_DS: +- if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0)) +- _dl_reloc_overflow (map, "R_PPC64_TPREL16_DS", reloc_addr, +- sym, refsym); +- *(Elf64_Half *) reloc_addr = BIT_INSERT (*(Elf64_Half *) reloc_addr, +- value, 0xfffc); +- break; +- +- case R_PPC64_DTPREL16_DS: +- if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0)) +- _dl_reloc_overflow (map, "R_PPC64_DTPREL16_DS", reloc_addr, +- sym, refsym); +- *(Elf64_Half *) reloc_addr = BIT_INSERT (*(Elf64_Half *) reloc_addr, +- value, 0xfffc); +- break; +- +- case R_PPC64_GOT_TPREL16_DS: +- if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0)) +- _dl_reloc_overflow (map, "R_PPC64_GOT_TPREL16_DS", reloc_addr, +- sym, refsym); +- *(Elf64_Half *) reloc_addr = BIT_INSERT (*(Elf64_Half *) reloc_addr, +- value, 0xfffc); +- break; +- +- case R_PPC64_GOT_DTPREL16_DS: +- if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0)) +- _dl_reloc_overflow (map, "R_PPC64_GOT_DTPREL16_DS", +- reloc_addr, sym, refsym); +- *(Elf64_Half *) reloc_addr = BIT_INSERT (*(Elf64_Half *) reloc_addr, +- value, 0xfffc); ++ BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc); + break; + + case R_PPC64_ADDR16_HIGHER: +- case R_PPC64_TPREL16_HIGHER: +- case R_PPC64_DTPREL16_HIGHER: + *(Elf64_Half *) reloc_addr = PPC_HIGHER (value); + break; + + case R_PPC64_ADDR16_HIGHEST: +- case R_PPC64_TPREL16_HIGHEST: +- case R_PPC64_DTPREL16_HIGHEST: + *(Elf64_Half *) reloc_addr = PPC_HIGHEST (value); + break; + + case R_PPC64_ADDR16_HIGHERA: +- case R_PPC64_TPREL16_HIGHERA: +- case R_PPC64_DTPREL16_HIGHERA: + *(Elf64_Half *) reloc_addr = PPC_HIGHERA (value); + break; + + case R_PPC64_ADDR16_HIGHESTA: +- case R_PPC64_TPREL16_HIGHESTA: +- case R_PPC64_DTPREL16_HIGHESTA: + *(Elf64_Half *) reloc_addr = PPC_HIGHESTA (value); + break; + +@@ -832,10 +817,10 @@ + case R_PPC64_ADDR14_BRTAKEN: + case R_PPC64_ADDR14_BRNTAKEN: + { +- Elf64_Word insn; + if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0)) + _dl_reloc_overflow (map, "R_PPC64_ADDR14", reloc_addr, sym, refsym); +- insn = BIT_INSERT (*(Elf64_Word *) reloc_addr, value, 0xfffc); ++ Elf64_Word insn = *(Elf64_Word *) reloc_addr; ++ BIT_INSERT (insn, value, 0xfffc); + if (r_type != R_PPC64_ADDR14) + { + insn &= ~(1 << 21); +@@ -851,7 +836,11 @@ + break; + + case R_PPC64_REL32: +- *(Elf64_Word *) reloc_addr = value - (Elf64_Xword) reloc_addr; ++ *(Elf64_Word *) reloc_addr = value - (Elf64_Addr) reloc_addr; ++ return; ++ ++ case R_PPC64_REL64: ++ *reloc_addr = value - (Elf64_Addr) reloc_addr; + return; + #endif /* !RTLD_BOOTSTRAP */ + +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/powerpc64/elf/configure glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc64/elf/configure +--- glibc-2.3.2/sysdeps/powerpc/powerpc64/elf/configure Wed Feb 26 00:41:08 2003 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc64/elf/configure Wed Mar 12 22:39:43 2003 +@@ -70,7 +70,3 @@ + fi + fi + +-cat >>confdefs.h <<\_ACEOF +-#define PI_STATIC_AND_HIDDEN 1 +-_ACEOF +- +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/powerpc64/elf/configure.in glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc64/elf/configure.in +--- glibc-2.3.2/sysdeps/powerpc/powerpc64/elf/configure.in Wed Feb 26 00:26:57 2003 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc64/elf/configure.in Wed Mar 12 22:39:43 2003 +@@ -56,6 +56,3 @@ + fi + fi + +-dnl It is always possible to access static and hidden symbols in an +-dnl position independent way. +-AC_DEFINE(PI_STATIC_AND_HIDDEN) +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/powerpc64/memcpy.S glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc64/memcpy.S +--- glibc-2.3.2/sysdeps/powerpc/powerpc64/memcpy.S Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc64/memcpy.S Tue Mar 18 23:58:31 2003 +@@ -0,0 +1,210 @@ ++/* Optimized memcpy implementation for PowerPC64. ++ Copyright (C) 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 ++ 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 ++ ++/* __ptr_t [r3] memcpy (__ptr_t dst [r3], __ptr_t src [r4], size_t len [r5]); ++ Returns 'dst'. ++ ++ Memcpy handles short copies (< 32-bytes) using an unaligned ++ word lwz/stw loop. The tail (remaining 1-3) bytes is handled with the ++ appropriate combination of byte and halfword load/stores. There is no ++ attempt to optimize the alignment of short moves. The 64-bit ++ implementations of POWER3 and POWER4 do a reasonable job of handling ++ unligned load/stores that do not cross 32-byte boundries. ++ ++ Longer moves (>= 32-bytes) justify the effort to get at least the ++ destination doubleword (8-byte) aligned. Further optimization is ++ posible when both source and destination are doubleword aligned. ++ Each case has a optimized unrolled loop. */ ++ ++EALIGN (BP_SYM (memcpy), 5, 0) ++ cmpldi cr1,5,31 ++ neg 0,3 ++ std 30,-16(1) ++ std 31,-8(1) ++ rldicl. 0,0,0,61 ++ mr 12,4 ++ mr 31,5 ++ mr 30,3 ++ ble- cr1,.L2 ++ subf 31,0,5 ++ ++ /* Move 0-7 bytes as needed to get the destination doubleword alligned. */ ++ beq 0f ++ mtcrf 0x01,0 ++1: bf 31,2f ++ lbz 6,0(12) ++ addi 12,12,1 ++ stb 6,0(3) ++ addi 3,3,1 ++2: bf 30,4f ++ lhz 6,0(12) ++ addi 12,12,2 ++ sth 6,0(3) ++ addi 3,3,2 ++4: bf 29,0f ++ lwz 6,0(12) ++ addi 12,12,4 ++ stw 6,0(3) ++ addi 3,3,4 ++0: ++ /* Copy doublewords from source to destination, assumpting the ++ destination is aligned on a doubleword boundary. ++ ++ First verify that there is > 7 bytes to copy and check if the source ++ is also doubleword aligned. If there are < 8 bytes to copy fall ++ through to the tail byte copy code. Otherwise if the source and ++ destination are both doubleword aligned use an optimized doubleword ++ copy loop. Otherwise the source has a different alignment and we use ++ a load, shift, store strategy. */ ++ rldicl. 0,12,0,61 ++ cmpldi cr6,31,7 ++ ble- cr6,.L2 /* less than 8 bytes left. */ ++ bne- 0,.L6 /* Source is not DW aligned. */ ++ srdi. 9,31,3 ++ mr 10,3 ++ mr 11,12 ++ ++ /* Move doublewords where destination and source are aligned. ++ Use a unrolled loop to copy 4 doubleword (32-bytes) per iteration. ++ If the remainder is >0 and < 32 bytes copy 1-3 doublewords. */ ++ cmpldi cr1,9,4 ++ beq 0f ++ mtcrf 0x01,9 ++ blt cr1,2f ++ ld 6,0(11) ++ .align 4 ++4: ++ ld 7,8(11) ++ addi 9,9,-4 ++ std 6,0(10) ++ ld 6,16(11) ++ std 7,8(10) ++ ld 7,24(11) ++ addi 11,11,32 ++ cmpldi cr1,9,4 ++ std 6,16(10) ++ blt cr1,3f ++ ld 6,0(11) ++ std 7,24(10) ++ addi 10,10,32 ++ b 4b ++3: std 7,24(10) ++ addi 10,10,32 ++2: bf 30,1f ++ ld 6,0(11) ++ ld 7,8(11) ++ addi 11,11,16 ++ std 6,0(10) ++ std 7,8(10) ++ addi 10,10,16 ++1: bf 31,0f ++ ld 6,0(11) ++ addi 11,11,8 ++ std 6,0(10) ++ addi 10,10,8 ++0: ++ ++.L8: ++ rldicr 0,31,0,60 ++ rldicl 31,31,0,61 ++ add 3,3,0 ++ add 12,12,0 ++ ++ /* Copy the tail for up to 31 bytes. If this is the tail of a longer ++ copy then the destination will be aligned and the length will be ++ less than 8. So it is normally not worth the set-up overhead to ++ get doubleword aligned and do doubleword load/store. */ ++.L2: ++ mr. 10,31 ++ cmpldi cr1,31,4 ++ beq 0f ++ mtcrf 0x01,31 ++ blt cr1,2f ++4: lwz 6,0(12) ++ addi 12,12,4 ++ addi 10,10,-4 ++ stw 6,0(3) ++ cmpldi cr1,10,4 ++ addi 3,3,4 ++ bge cr1,4b ++2: bf 30,1f ++ lhz 6,0(12) ++ addi 12,12,2 ++ sth 6,0(3) ++ addi 3,3,2 ++1: bf 31,0f ++ lbz 6,0(12) ++ addi 12,12,1 ++ stb 6,0(3) ++ addi 3,3,1 ++0: ++ /* Return original dst pointer. */ ++ ld 31,-8(1) ++ mr 3,30 ++ ld 30,-16(1) ++ blr ++ ++.L6: ++ srdi 11,31,3 ++ mr 4,3 ++ mr 5,12 ++ ++ /* Copy doublewords where the destination is aligned but the source is ++ not. Use aligned doubleword loads from the source, shifted to realign ++ the data, to allow aligned destination stores. */ ++ andi. 10,5,7 ++ andi. 0,11,1 ++ subf 5,10,5 ++ ld 6,0(5) ++ sldi 10,10,3 ++ ld 7,8(5) ++ subfic 9,10,64 ++ beq 2f ++ sld 0,6,10 ++ addi 11,11,-1 ++ mr 6,7 ++ addi 4,4,-8 ++ cmpldi 11,0 ++ b 1f ++2: addi 5,5,8 ++ .align 4 ++0: sld 0,6,10 ++ srd 8,7,9 ++ addi 11,11,-2 ++ ld 6,8(5) ++ or 0,0,8 ++ cmpldi 11,0 ++ std 0,0(4) ++ sld 0,7,10 ++1: srd 8,6,9 ++ or 0,0,8 ++ beq 8f ++ ld 7,16(5) ++ std 0,8(4) ++ addi 5,5,16 ++ addi 4,4,16 ++ b 0b ++8: ++ std 0,8(4) ++ b .L8 ++END_GEN_TB (BP_SYM (memcpy),TB_TOCLESS) +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/powerpc64/memset.S glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc64/memset.S +--- glibc-2.3.2/sysdeps/powerpc/powerpc64/memset.S Wed Sep 18 01:50:02 2002 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc64/memset.S Sun Mar 16 00:09:13 2003 +@@ -1,5 +1,5 @@ + /* Optimized memset implementation for PowerPC64. +- Copyright (C) 1997, 1999, 2000, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1997, 1999, 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 +@@ -26,12 +26,7 @@ + to obtain the value set by the kernel and store it into this + variable. */ + .globl __cache_line_size +- .section ".data" +- .align 2 +- .type __cache_line_size,@object +- .size __cache_line_size,4 +-__cache_line_size: +- .long 0 ++ .lcomm __cache_line_size,4,4 + .section ".toc","aw" + .LC0: + .tc __cache_line_size[TC],__cache_line_size +@@ -293,4 +288,3 @@ + END_GEN_TB (BP_SYM (__bzero),TB_TOCLESS) + + weak_alias (BP_SYM (__bzero), BP_SYM (bzero)) +- +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/powerpc64/sysdep.h glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc64/sysdep.h +--- glibc-2.3.2/sysdeps/powerpc/powerpc64/sysdep.h Sun Jan 12 09:09:45 2003 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/powerpc64/sysdep.h Mon Mar 24 19:45:27 2003 +@@ -225,6 +225,20 @@ + #define PSEUDO_END(name) \ + END (name) + ++#define PSEUDO_NOERRNO(name, syscall_name, args) \ ++ .section ".text"; \ ++ ENTRY (name) \ ++ DO_CALL (SYS_ify (syscall_name)); ++ ++#define PSEUDO_RET_NOERRNO \ ++ blr ++ ++#define ret_NOERRNO PSEUDO_RET_NOERRNO ++ ++#undef PSEUDO_END_NOERRNO ++#define PSEUDO_END_NOERRNO(name) \ ++ END (name) ++ + /* Label in text section. */ + /* ppc64 function descriptors which requires . notation */ + #define C_TEXT(name) .##name +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/test-arith.c glibc-2.3.2-200304020432/sysdeps/powerpc/test-arith.c +--- glibc-2.3.2/sysdeps/powerpc/test-arith.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/test-arith.c Fri Jul 6 06:56:01 2001 +@@ -0,0 +1,605 @@ ++/* Test floating-point arithmetic operations. ++ Copyright (C) 1997, 1998 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 _GNU_SOURCE ++#define _GNU_SOURCE ++#endif ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#ifndef ESIZE ++typedef double tocheck_t; ++#define ESIZE 11 ++#define MSIZE 52 ++#define FUNC(x) x ++#endif ++ ++#define R_NEAREST 1 ++#define R_ZERO 2 ++#define R_UP 4 ++#define R_DOWN 8 ++#define R_ALL (R_NEAREST|R_ZERO|R_UP|R_DOWN) ++static fenv_t rmodes[4]; ++static const char * const rmnames[4] = ++{ "nearest","zero","+Inf","-Inf" }; ++ ++typedef union { ++ tocheck_t tc; ++ unsigned char c[sizeof(tocheck_t)]; ++} union_t; ++ ++/* Don't try reading these in a font that doesn't distinguish ++ O and zero. */ ++typedef enum { ++ P_Z = 0x0, /* 00000...0 */ ++ P_000O = 0x1, /* 00011...1 */ ++ P_001Z = 0x2, /* 00100...0 */ ++ P_00O = 0x3, /* 00111...1 */ ++ P_01Z = 0x4, /* 01000...0 */ ++ P_010O = 0x5, /* 01011...1 */ ++ P_011Z = 0x6, /* 01100...0 */ ++ P_0O = 0x7, /* 01111...1 */ ++ P_1Z = 0x8, /* 10000...0 */ ++ P_100O = 0x9, /* 10011...1 */ ++ P_101Z = 0xa, /* 10100...0 */ ++ P_10O = 0xb, /* 10111...1 */ ++ P_11Z = 0xc, /* 11000...0 */ ++ P_110O = 0xd, /* 11011...1 */ ++ P_111Z = 0xe, /* 11100...0 */ ++ P_O = 0xf, /* 11111...1 */ ++ P_Z1 = 0x11, /* 000...001 */ ++ P_Z10 = 0x12, /* 000...010 */ ++ P_Z11 = 0x13, /* 000...011 */ ++ P_0O00 = 0x14, /* 011...100 */ ++ P_0O01 = 0x15, /* 011...101 */ ++ P_0O0 = 0x16, /* 011...110 */ ++ P_1Z1 = 0x19, /* 100...001 */ ++ P_1Z10 = 0x1a, /* 100...010 */ ++ P_1Z11 = 0x1b, /* 100...011 */ ++ P_O00 = 0x1c, /* 111...100 */ ++ P_O01 = 0x1d, /* 111...101 */ ++ P_O0 = 0x1e, /* 111...110 */ ++ P_R = 0x20, /* rrr...rrr */ /* ('r' means random. ) */ ++ P_Ro = 0x21, /* rrr...rrr, with odd parity. */ ++ P_0R = 0x22, /* 0rr...rrr */ ++ P_1R = 0x23, /* 1rr...rrr */ ++ P_Rno = 0x24, /* rrr...rrr, but not all ones. */ ++} pattern_t; ++ ++static void ++pattern_fill(pattern_t ptn, unsigned char *start, int bitoffset, int count) ++{ ++#define bitset(count, value) \ ++ start[(count)/8] = (start[(count)/8] & ~(1 << 7-(count)%8) \ ++ | (value) << 7-(count)%8) ++ int i; ++ ++ if (ptn >= 0 && ptn <= 0xf) ++ { ++ /* Patterns between 0 and 0xF have the following format: ++ The LSBit is used to fill the last n-3 bits of the pattern; ++ The next 3 bits are the first 3 bits of the pattern. */ ++ for (i = 0; i < count; i++) ++ if (i < 3) ++ bitset((bitoffset+i), ptn >> (3-i) & 1); ++ else ++ bitset((bitoffset+i), ptn >> 0 & 1); ++ } ++ else if (ptn <= 0x1f) ++ { ++ /* Patterns between 0x10 and 0x1F have the following format: ++ The two LSBits are the last two bits of the pattern; ++ The 0x8 bit is the first bit of the pattern; ++ The 0x4 bit is used to fill the remainder. */ ++ for (i = 0; i < count; i++) ++ if (i == 0) ++ bitset((bitoffset+i), ptn >> 3 & 1); ++ else if (i >= count-2) ++ bitset((bitoffset+i), ptn >> (count-1-i) & 1); ++ else ++ bitset((bitoffset+i), ptn >> 2 & 1); ++ } ++ else switch (ptn) ++ { ++ case P_0R: case P_1R: ++ assert(count > 0); ++ bitset(bitoffset, ptn & 1); ++ count--; ++ bitoffset++; ++ case P_R: ++ for (; count > 0; count--, bitoffset++) ++ bitset(bitoffset, rand() & 1); ++ break; ++ case P_Ro: ++ { ++ int op = 1; ++ assert(count > 0); ++ for (; count > 1; count--, bitoffset++) ++ bitset(bitoffset, op ^= (rand() & 1)); ++ bitset(bitoffset, op); ++ break; ++ } ++ case P_Rno: ++ { ++ int op = 1; ++ assert(count > 0); ++ for (; count > 1; count--, bitoffset++) ++ { ++ int r = rand() & 1; ++ op &= r; ++ bitset(bitoffset, r); ++ } ++ bitset(bitoffset, rand() & (op ^ 1)); ++ break; ++ } ++ ++ default: ++ assert(0); ++ } ++#undef bitset ++} ++ ++static tocheck_t ++pattern(int negative, pattern_t exp, pattern_t mant) ++{ ++ union_t result; ++#if 0 ++ int i; ++#endif ++ ++ pattern_fill(negative ? P_O : P_Z, result.c, 0, 1); ++ pattern_fill(exp, result.c, 1, ESIZE); ++ pattern_fill(mant, result.c, ESIZE+1, MSIZE); ++#if 0 ++ printf("neg=%d exp=%02x mant=%02x: ", negative, exp, mant); ++ for (i = 0; i < sizeof(tocheck_t); i++) ++ printf("%02x", result.c[i]); ++ printf("\n"); ++#endif ++ return result.tc; ++} ++ ++/* Return the closest different tocheck_t to 'x' in the direction of ++ 'direction', or 'x' if there is no such value. Assumes 'x' is not ++ a NaN. */ ++static tocheck_t ++delta(tocheck_t x, int direction) ++{ ++ union_t xx; ++ int i; ++ ++ xx.tc = x; ++ if (xx.c[0] & 0x80) ++ direction = -direction; ++ if (direction == +1) ++ { ++ union_t tx; ++ tx.tc = pattern(xx.c[0] >> 7, P_O, P_Z); ++ if (memcmp(tx.c, xx.c, sizeof(tocheck_t)) == 0) ++ return x; ++ } ++ for (i = sizeof(tocheck_t)-1; i > 0; i--) ++ { ++ xx.c[i] += direction; ++ if (xx.c[i] != (direction > 0 ? 0 : 0xff)) ++ return xx.tc; ++ } ++ if (direction < 0 && (xx.c[0] & 0x7f) == 0) ++ return pattern(~(xx.c[0] >> 7) & 1, P_Z, P_Z1); ++ else ++ { ++ xx.c[0] += direction; ++ return xx.tc; ++ } ++} ++ ++static int nerrors = 0; ++ ++#ifdef FE_ALL_INVALID ++static const int all_exceptions = FE_ALL_INVALID | FE_ALL_EXCEPT; ++#else ++static const int all_exceptions = FE_ALL_EXCEPT; ++#endif ++ ++static void ++check_result(int line, const char *rm, tocheck_t expected, tocheck_t actual) ++{ ++ if (memcmp(&expected, &actual, sizeof(tocheck_t)) != 0) ++ { ++ unsigned char *ex, *ac; ++ size_t i; ++ ++ printf("%s:%d:round %s:result failed\n" ++ " expected result 0x", __FILE__, line, rm); ++ ex = (unsigned char *)&expected; ++ ac = (unsigned char *)&actual; ++ for (i = 0; i < sizeof(tocheck_t); i++) ++ printf("%02x", ex[i]); ++ printf(" got 0x"); ++ for (i = 0; i < sizeof(tocheck_t); i++) ++ printf("%02x", ac[i]); ++ printf("\n"); ++ nerrors++; ++ } ++} ++ ++static const struct { ++ int except; ++ const char *name; ++} excepts[] = { ++#define except_entry(ex) { ex, #ex } , ++#ifdef FE_INEXACT ++ except_entry(FE_INEXACT) ++#else ++# define FE_INEXACT 0 ++#endif ++#ifdef FE_DIVBYZERO ++ except_entry(FE_DIVBYZERO) ++#else ++# define FE_DIVBYZERO 0 ++#endif ++#ifdef FE_UNDERFLOW ++ except_entry(FE_UNDERFLOW) ++#else ++# define FE_UNDERFLOW 0 ++#endif ++#ifdef FE_OVERFLOW ++ except_entry(FE_OVERFLOW) ++#else ++# define FE_OVERFLOW 0 ++#endif ++#ifdef FE_INVALID ++ except_entry(FE_INVALID) ++#else ++# define FE_INVALID 0 ++#endif ++#ifdef FE_INVALID_SNAN ++ except_entry(FE_INVALID_SNAN) ++#else ++# define FE_INVALID_SNAN FE_INVALID ++#endif ++#ifdef FE_INVALID_ISI ++ except_entry(FE_INVALID_ISI) ++#else ++# define FE_INVALID_ISI FE_INVALID ++#endif ++#ifdef FE_INVALID_IDI ++ except_entry(FE_INVALID_IDI) ++#else ++# define FE_INVALID_IDI FE_INVALID ++#endif ++#ifdef FE_INVALID_ZDZ ++ except_entry(FE_INVALID_ZDZ) ++#else ++# define FE_INVALID_ZDZ FE_INVALID ++#endif ++#ifdef FE_INVALID_COMPARE ++ except_entry(FE_INVALID_COMPARE) ++#else ++# define FE_INVALID_COMPARE FE_INVALID ++#endif ++#ifdef FE_INVALID_SOFTWARE ++ except_entry(FE_INVALID_SOFTWARE) ++#else ++# define FE_INVALID_SOFTWARE FE_INVALID ++#endif ++#ifdef FE_INVALID_SQRT ++ except_entry(FE_INVALID_SQRT) ++#else ++# define FE_INVALID_SQRT FE_INVALID ++#endif ++#ifdef FE_INVALID_INTEGER_CONVERSION ++ except_entry(FE_INVALID_INTEGER_CONVERSION) ++#else ++# define FE_INVALID_INTEGER_CONVERSION FE_INVALID ++#endif ++}; ++ ++static int excepts_missing = 0; ++ ++static void ++check_excepts(int line, const char *rm, int expected, int actual) ++{ ++ if (expected & excepts_missing) ++ expected = expected & ~excepts_missing | FE_INVALID_SNAN; ++ if ((expected & all_exceptions) != actual) ++ { ++ size_t i; ++ printf("%s:%d:round %s:exceptions failed\n" ++ " expected exceptions ", __FILE__, line,rm); ++ for (i = 0; i < sizeof(excepts)/sizeof(excepts[0]); i++) ++ if (expected & excepts[i].except) ++ printf("%s ",excepts[i].name); ++ if ((expected & all_exceptions) == 0) ++ printf("- "); ++ printf("got"); ++ for (i = 0; i < sizeof(excepts)/sizeof(excepts[0]); i++) ++ if (actual & excepts[i].except) ++ printf(" %s",excepts[i].name); ++ if ((actual & all_exceptions) == 0) ++ printf("- "); ++ printf(".\n"); ++ nerrors++; ++ } ++} ++ ++typedef enum { ++ B_ADD, B_SUB, B_MUL, B_DIV, B_NEG, B_ABS, B_SQRT ++} op_t; ++typedef struct { ++ int line; ++ op_t op; ++ int a_sgn; ++ pattern_t a_exp, a_mant; ++ int b_sgn; ++ pattern_t b_exp, b_mant; ++ int rmode; ++ int excepts; ++ int x_sgn; ++ pattern_t x_exp, x_mant; ++} optest_t; ++static const optest_t optests[] = { ++ /* Additions of zero. */ ++ {__LINE__,B_ADD, 0,P_Z,P_Z, 0,P_Z,P_Z, R_ALL,0, 0,P_Z,P_Z }, ++ {__LINE__,B_ADD, 1,P_Z,P_Z, 0,P_Z,P_Z, R_ALL & ~R_DOWN,0, 0,P_Z,P_Z }, ++ {__LINE__,B_ADD, 1,P_Z,P_Z, 0,P_Z,P_Z, R_DOWN,0, 1,P_Z,P_Z }, ++ {__LINE__,B_ADD, 1,P_Z,P_Z, 1,P_Z,P_Z, R_ALL,0, 1,P_Z,P_Z }, ++ ++ /* Additions with NaN. */ ++ {__LINE__,B_ADD, 0,P_O,P_101Z, 0,P_Z,P_Z, R_ALL,0, 0,P_O,P_101Z }, ++ {__LINE__,B_ADD, 0,P_O,P_01Z, 0,P_Z,P_Z, R_ALL, ++ FE_INVALID | FE_INVALID_SNAN, 0,P_O,P_11Z }, ++ {__LINE__,B_ADD, 0,P_O,P_Z, 0,P_O,P_0O, R_ALL, ++ FE_INVALID | FE_INVALID_SNAN, 0,P_O,P_O }, ++ {__LINE__,B_ADD, 0,P_Z,P_Z, 0,P_O,P_11Z, R_ALL,0, 0,P_O,P_11Z }, ++ {__LINE__,B_ADD, 0,P_O,P_001Z, 0,P_O,P_001Z, R_ALL, ++ FE_INVALID | FE_INVALID_SNAN, 0,P_O,P_101Z }, ++ {__LINE__,B_ADD, 0,P_O,P_1Z, 0,P_Z,P_Z, R_ALL,0, 0,P_O,P_1Z }, ++ {__LINE__,B_ADD, 0,P_0O,P_Z, 0,P_O,P_10O, R_ALL,0, 0,P_O,P_10O }, ++ ++ /* Additions with infinity. */ ++ {__LINE__,B_ADD, 0,P_O,P_Z, 0,P_Z,P_Z, R_ALL,0, 0,P_O,P_Z }, ++ {__LINE__,B_ADD, 0,P_O,P_Z, 1,P_Z,P_Z, R_ALL,0, 0,P_O,P_Z }, ++ {__LINE__,B_ADD, 1,P_O,P_Z, 0,P_Z,P_Z, R_ALL,0, 1,P_O,P_Z }, ++ {__LINE__,B_ADD, 1,P_O,P_Z, 1,P_Z,P_Z, R_ALL,0, 1,P_O,P_Z }, ++ {__LINE__,B_ADD, 0,P_O,P_Z, 0,P_O,P_Z, R_ALL,0, 0,P_O,P_Z }, ++ {__LINE__,B_ADD, 1,P_O,P_Z, 1,P_O,P_Z, R_ALL,0, 1,P_O,P_Z }, ++ {__LINE__,B_ADD, 0,P_O,P_Z, 1,P_O,P_Z, R_ALL, ++ FE_INVALID | FE_INVALID_ISI, 0,P_O,P_1Z }, ++ {__LINE__,B_ADD, 1,P_O,P_Z, 0,P_O,P_Z, R_ALL, ++ FE_INVALID | FE_INVALID_ISI, 0,P_O,P_1Z }, ++ {__LINE__,B_ADD, 0,P_O,P_Z, 0,P_0O,P_Z, R_ALL,0, 0,P_O,P_Z }, ++ {__LINE__,B_ADD, 1,P_O,P_Z, 0,P_0O,P_Z, R_ALL,0, 1,P_O,P_Z }, ++ {__LINE__,B_ADD, 0,P_O,P_Z, 1,P_0O,P_Z, R_ALL,0, 0,P_O,P_Z }, ++ {__LINE__,B_ADD, 1,P_O,P_Z, 1,P_0O,P_Z, R_ALL,0, 1,P_O,P_Z }, ++ ++ /* Overflow (and zero). */ ++ {__LINE__,B_ADD, 0,P_O0,P_Z, 0,P_O0,P_Z, R_NEAREST | R_UP, ++ FE_INEXACT | FE_OVERFLOW, 0,P_O,P_Z }, ++ {__LINE__,B_ADD, 0,P_O0,P_Z, 0,P_O0,P_Z, R_ZERO | R_DOWN, ++ FE_INEXACT | FE_OVERFLOW, 0,P_O0,P_O }, ++ {__LINE__,B_ADD, 1,P_O0,P_Z, 1,P_O0,P_Z, R_NEAREST | R_DOWN, ++ FE_INEXACT | FE_OVERFLOW, 1,P_O,P_Z }, ++ {__LINE__,B_ADD, 1,P_O0,P_Z, 1,P_O0,P_Z, R_ZERO | R_UP, ++ FE_INEXACT | FE_OVERFLOW, 1,P_O0,P_O }, ++ {__LINE__,B_ADD, 0,P_O0,P_Z, 1,P_O0,P_Z, R_ALL & ~R_DOWN, ++ 0, 0,P_Z,P_Z }, ++ {__LINE__,B_ADD, 0,P_O0,P_Z, 1,P_O0,P_Z, R_DOWN, ++ 0, 1,P_Z,P_Z }, ++ ++ /* Negation. */ ++ {__LINE__,B_NEG, 0,P_Z,P_Z, 0,0,0, R_ALL, 0, 1,P_Z,P_Z }, ++ {__LINE__,B_NEG, 1,P_Z,P_Z, 0,0,0, R_ALL, 0, 0,P_Z,P_Z }, ++ {__LINE__,B_NEG, 0,P_O,P_Z, 0,0,0, R_ALL, 0, 1,P_O,P_Z }, ++ {__LINE__,B_NEG, 1,P_O,P_Z, 0,0,0, R_ALL, 0, 0,P_O,P_Z }, ++ {__LINE__,B_NEG, 0,P_O,P_1Z, 0,0,0, R_ALL, 0, 1,P_O,P_1Z }, ++ {__LINE__,B_NEG, 1,P_O,P_1Z, 0,0,0, R_ALL, 0, 0,P_O,P_1Z }, ++ {__LINE__,B_NEG, 0,P_O,P_01Z, 0,0,0, R_ALL, 0, 1,P_O,P_01Z }, ++ {__LINE__,B_NEG, 1,P_O,P_01Z, 0,0,0, R_ALL, 0, 0,P_O,P_01Z }, ++ {__LINE__,B_NEG, 0,P_1Z,P_1Z1, 0,0,0, R_ALL, 0, 1,P_1Z,P_1Z1 }, ++ {__LINE__,B_NEG, 1,P_1Z,P_1Z1, 0,0,0, R_ALL, 0, 0,P_1Z,P_1Z1 }, ++ {__LINE__,B_NEG, 0,P_Z,P_Z1, 0,0,0, R_ALL, 0, 1,P_Z,P_Z1 }, ++ {__LINE__,B_NEG, 1,P_Z,P_Z1, 0,0,0, R_ALL, 0, 0,P_Z,P_Z1 }, ++ ++ /* Absolute value. */ ++ {__LINE__,B_ABS, 0,P_Z,P_Z, 0,0,0, R_ALL, 0, 0,P_Z,P_Z }, ++ {__LINE__,B_ABS, 1,P_Z,P_Z, 0,0,0, R_ALL, 0, 0,P_Z,P_Z }, ++ {__LINE__,B_ABS, 0,P_O,P_Z, 0,0,0, R_ALL, 0, 0,P_O,P_Z }, ++ {__LINE__,B_ABS, 1,P_O,P_Z, 0,0,0, R_ALL, 0, 0,P_O,P_Z }, ++ {__LINE__,B_ABS, 0,P_O,P_1Z, 0,0,0, R_ALL, 0, 0,P_O,P_1Z }, ++ {__LINE__,B_ABS, 1,P_O,P_1Z, 0,0,0, R_ALL, 0, 0,P_O,P_1Z }, ++ {__LINE__,B_ABS, 0,P_O,P_01Z, 0,0,0, R_ALL, 0, 0,P_O,P_01Z }, ++ {__LINE__,B_ABS, 1,P_O,P_01Z, 0,0,0, R_ALL, 0, 0,P_O,P_01Z }, ++ {__LINE__,B_ABS, 0,P_1Z,P_1Z1, 0,0,0, R_ALL, 0, 0,P_1Z,P_1Z1 }, ++ {__LINE__,B_ABS, 1,P_1Z,P_1Z1, 0,0,0, R_ALL, 0, 0,P_1Z,P_1Z1 }, ++ {__LINE__,B_ABS, 0,P_Z,P_Z1, 0,0,0, R_ALL, 0, 0,P_Z,P_Z1 }, ++ {__LINE__,B_ABS, 1,P_Z,P_Z1, 0,0,0, R_ALL, 0, 0,P_Z,P_Z1 }, ++ ++ /* Square root. */ ++ {__LINE__,B_SQRT, 0,P_Z,P_Z, 0,0,0, R_ALL, 0, 0,P_Z,P_Z }, ++ {__LINE__,B_SQRT, 1,P_Z,P_Z, 0,0,0, R_ALL, 0, 1,P_Z,P_Z }, ++ {__LINE__,B_SQRT, 0,P_O,P_1Z, 0,0,0, R_ALL, 0, 0,P_O,P_1Z }, ++ {__LINE__,B_SQRT, 1,P_O,P_1Z, 0,0,0, R_ALL, 0, 1,P_O,P_1Z }, ++ {__LINE__,B_SQRT, 0,P_O,P_01Z, 0,0,0, R_ALL, ++ FE_INVALID | FE_INVALID_SNAN, 0,P_O,P_11Z }, ++ {__LINE__,B_SQRT, 1,P_O,P_01Z, 0,0,0, R_ALL, ++ FE_INVALID | FE_INVALID_SNAN, 1,P_O,P_11Z }, ++ ++ {__LINE__,B_SQRT, 0,P_O,P_Z, 0,0,0, R_ALL, 0, 0,P_O,P_Z }, ++ {__LINE__,B_SQRT, 0,P_0O,P_Z, 0,0,0, R_ALL, 0, 0,P_0O,P_Z }, ++ ++ {__LINE__,B_SQRT, 1,P_O,P_Z, 0,0,0, R_ALL, ++ FE_INVALID | FE_INVALID_SQRT, 0,P_O,P_1Z }, ++ {__LINE__,B_SQRT, 1,P_1Z,P_1Z1, 0,0,0, R_ALL, ++ FE_INVALID | FE_INVALID_SQRT, 0,P_O,P_1Z }, ++ {__LINE__,B_SQRT, 1,P_Z,P_Z1, 0,0,0, R_ALL, ++ FE_INVALID | FE_INVALID_SQRT, 0,P_O,P_1Z }, ++ ++}; ++ ++static void ++check_op(void) ++{ ++ size_t i; ++ int j; ++ tocheck_t r, a, b, x; ++ int raised; ++ ++ for (i = 0; i < sizeof(optests)/sizeof(optests[0]); i++) ++ { ++ a = pattern(optests[i].a_sgn, optests[i].a_exp, ++ optests[i].a_mant); ++ b = pattern(optests[i].b_sgn, optests[i].b_exp, ++ optests[i].b_mant); ++ x = pattern(optests[i].x_sgn, optests[i].x_exp, ++ optests[i].x_mant); ++ for (j = 0; j < 4; j++) ++ if (optests[i].rmode & 1<= fabs(x1) && fabs(x1) <= fabs(x2); ++ break; ++ case R_ZERO: case R_DOWN: ++ x2 = r2 * r2 - a; ++ ok = x1 <= 0 && x2 >= 0; ++ break; ++ case R_UP: ++ x0 = r0 * r0 - a; ++ ok = x1 >= 0 && x0 <= 0; ++ break; ++ default: ++ assert(0); ++ } ++ } ++ else ++ ok = x1 == 0; ++ if (!ok) ++ fail_xr(__LINE__,rmnames[j],a,r1,x1,excepts&FE_INEXACT); ++ } ++ check_excepts(__LINE__,"all",0,raised); ++} ++ ++int main(int argc, char **argv) ++{ ++ int i; ++ ++ _LIB_VERSION = _IEEE_; ++ ++ /* Set up environments for rounding modes. */ ++ fesetenv(FE_DFL_ENV); ++ fesetround(FE_TONEAREST); ++ fegetenv(rmodes+0); ++ fesetround(FE_TOWARDZERO); ++ fegetenv(rmodes+1); ++ fesetround(FE_UPWARD); ++ fegetenv(rmodes+2); ++ fesetround(FE_DOWNWARD); ++ fegetenv(rmodes+3); ++ ++#if defined(FE_INVALID_SOFTWARE) || defined(FE_INVALID_SQRT) ++ /* There's this really stupid feature of the 601... */ ++ fesetenv(FE_DFL_ENV); ++ feraiseexcept(FE_INVALID_SOFTWARE); ++ if (!fetestexcept(FE_INVALID_SOFTWARE)) ++ excepts_missing |= FE_INVALID_SOFTWARE; ++ fesetenv(FE_DFL_ENV); ++ feraiseexcept(FE_INVALID_SQRT); ++ if (!fetestexcept(FE_INVALID_SQRT)) ++ excepts_missing |= FE_INVALID_SQRT; ++#endif ++ ++ check_op(); ++ for (i = 0; i < 100000; i++) ++ check_sqrt(pattern(0, P_Rno, P_R)); ++ for (i = 0; i < 100; i++) ++ check_sqrt(pattern(0, P_Z, P_R)); ++ check_sqrt(pattern(0,P_Z,P_Z1)); ++ ++ printf("%d errors.\n", nerrors); ++ return nerrors == 0 ? 0 : 1; ++} +diff -u -udbrN glibc-2.3.2/sysdeps/powerpc/test-arithf.c glibc-2.3.2-200304020432/sysdeps/powerpc/test-arithf.c +--- glibc-2.3.2/sysdeps/powerpc/test-arithf.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/powerpc/test-arithf.c Sun Aug 10 19:49:46 1997 +@@ -0,0 +1,6 @@ ++typedef float tocheck_t; ++#define ESIZE 8 ++#define MSIZE 23 ++#define FUNC(x) x##f ++ ++#include "test-arith.c" +diff -u -udbrN glibc-2.3.2/sysdeps/s390/bits/atomic.h glibc-2.3.2-200304020432/sysdeps/s390/bits/atomic.h +--- glibc-2.3.2/sysdeps/s390/bits/atomic.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/s390/bits/atomic.h Wed Mar 26 05:01:47 2003 +@@ -0,0 +1,76 @@ ++/* Copyright (C) 2003 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Martin Schwidefsky , 2003. ++ ++ 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 ++ ++typedef int8_t atomic8_t; ++typedef uint8_t uatomic8_t; ++typedef int_fast8_t atomic_fast8_t; ++typedef uint_fast8_t uatomic_fast8_t; ++ ++typedef int16_t atomic16_t; ++typedef uint16_t uatomic16_t; ++typedef int_fast16_t atomic_fast16_t; ++typedef uint_fast16_t uatomic_fast16_t; ++ ++typedef int32_t atomic32_t; ++typedef uint32_t uatomic32_t; ++typedef int_fast32_t atomic_fast32_t; ++typedef uint_fast32_t uatomic_fast32_t; ++ ++typedef int64_t atomic64_t; ++typedef uint64_t uatomic64_t; ++typedef int_fast64_t atomic_fast64_t; ++typedef uint_fast64_t uatomic_fast64_t; ++ ++typedef intptr_t atomicptr_t; ++typedef uintptr_t uatomicptr_t; ++typedef intmax_t atomic_max_t; ++typedef uintmax_t uatomic_max_t; ++ ++ ++#define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \ ++ (abort (), 0) ++ ++#define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \ ++ (abort (), 0) ++ ++#define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \ ++ ({ __typeof (mem) __archmem = (mem); \ ++ __typeof (*mem) __archold = (oldval); \ ++ __asm __volatile ("cs %0,%2,%1" \ ++ : "+d" (__archold), "=Q" (*__archmem) \ ++ : "d" (newval), "m" (*__archmem) : "cc" ); \ ++ __archold; }) ++ ++#ifdef __s390x__ ++# define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \ ++ ({ __typeof (mem) __archmem = (mem); \ ++ __typeof (*mem) __archold = (oldval); \ ++ __asm __volatile ("csg %0,%2,%1" \ ++ : "+d" (__archold), "=Q" (*__archmem) \ ++ : "d" ((long) (newval)), "m" (*__archmem) : "cc" ); \ ++ __archold; }) ++#else ++/* For 31 bit we do not really need 64-bit compare-and-exchange. We can ++ implement them by use of the csd instruction. The straightforward ++ implementation causes warnings so we skip the definition for now. */ ++# define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \ ++ (abort (), 0) ++#endif +diff -u -udbrN glibc-2.3.2/sysdeps/s390/fpu/libm-test-ulps glibc-2.3.2-200304020432/sysdeps/s390/fpu/libm-test-ulps +--- glibc-2.3.2/sysdeps/s390/fpu/libm-test-ulps Thu Sep 5 01:12:20 2002 ++++ glibc-2.3.2-200304020432/sysdeps/s390/fpu/libm-test-ulps Sun Mar 23 01:52:10 2003 +@@ -94,7 +94,7 @@ + idouble: 1 + + # ccos +-Test "Imaginary part of: ccos (-2 - 3 i) == -4.1896256909688072301 - 9.1092278937553365979 i": ++Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": + float: 1 + ifloat: 1 + Test "Real part of: ccos (0.75 + 1.25 i) == 1.38173873063425888530729933139078645 - 1.09193013555397466170919531722024128 i": +@@ -107,10 +107,10 @@ + ifloat: 1 + + # ccosh +-Test "Real part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Real part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Imaginary part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 + Test "Real part of: ccosh (0.75 + 1.25 i) == 0.408242591877968807788852146397499084 + 0.780365930845853240391326216300863152 i": +@@ -145,7 +145,7 @@ + Test "Imaginary part of: clog10 (-0 - inf i) == inf - pi/2*log10(e) i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: clog10 (-2 - 3 i) == 0.5569716761534183846 - 0.9375544629863747085 i": ++Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": + double: 1 + float: 5 + idouble: 1 +@@ -239,7 +239,7 @@ + ifloat: 2 + + # csinh +-Test "Imaginary part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i": ++Test "Imaginary part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": + double: 1 + idouble: 1 + Test "Real part of: csinh (0.75 + 1.25 i) == 0.259294854551162779153349830618433028 + 1.22863452409509552219214606515777594 i": +@@ -258,7 +258,7 @@ + ifloat: 1 + + # ctan +-Test "Real part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i": ++Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": + double: 1 + idouble: 1 + Test "Imaginary part of: ctan (0.75 + 1.25 i) == 0.160807785916206426725166058173438663 + 0.975363285031235646193581759755216379 i": +@@ -266,7 +266,7 @@ + idouble: 1 + + # ctanh +-Test "Real part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i": ++Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": + double: 1 + float: 2 + idouble: 1 +@@ -453,12 +453,12 @@ + ifloat: 2 + + # lgamma +-Test "lgamma (0.7) == 0.26086724653166651439": ++Test "lgamma (0.7) == 0.260867246531666514385732417016759578": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +-Test "lgamma (1.2) == -0.853740900033158497197e-1": ++Test "lgamma (1.2) == -0.853740900033158497197028392998854470e-1": + double: 1 + float: 2 + idouble: 1 +@@ -513,7 +513,7 @@ + Test "tgamma (0.5) == sqrt (pi)": + float: 1 + ifloat: 1 +-Test "tgamma (0.7) == 1.29805533264755778568": ++Test "tgamma (0.7) == 1.29805533264755778568117117915281162": + double: 1 + float: 1 + idouble: 1 +diff -u -udbrN glibc-2.3.2/sysdeps/s390/s390-32/atomicity.h glibc-2.3.2-200304020432/sysdeps/s390/s390-32/atomicity.h +--- glibc-2.3.2/sysdeps/s390/s390-32/atomicity.h Sat Jul 7 21:21:28 2001 ++++ glibc-2.3.2-200304020432/sysdeps/s390/s390-32/atomicity.h Thu Jan 1 01:00:00 1970 +@@ -1,76 +0,0 @@ +-/* Low-level functions for atomic operations. S390 version. +- Copyright (C) 2000, 2001 Free Software Foundation, Inc. +- Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). +- 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 _ATOMICITY_H +-#define _ATOMICITY_H 1 +- +-#include +- +-static inline int +-__attribute__ ((unused)) +-exchange_and_add (volatile uint32_t *mem, int val) +-{ +- int result; +- __asm__ __volatile__( +- " L %0,%2\n" +- " LA 2,%1\n" +- "0: LR 0,%0\n" +- " AR 0,%3\n" +- " CS %0,0,0(2)\n" +- " JL 0b" +- : "=&d" (result), "=m" (*mem) +- : "1" (*mem), "d" (val) : "0", "1", "2" ); +- return result; +-} +- +-static inline void +-__attribute__ ((unused)) +-atomic_add (volatile uint32_t *mem, int val) +-{ +- __asm__ __volatile__( +- " LA 2,%0\n" +- "0: L 0,%1\n" +- " LR 1,0\n" +- " AR 1,%2\n" +- " CS 0,1,0(2)\n" +- " JL 0b" +- : "=m" (*mem) : "0" (*mem), "d" (val) : "0", "1", "2" ); +-} +- +-static inline int +-__attribute__ ((unused)) +-compare_and_swap (volatile long int *p, long int oldval, long int newval) +-{ +- int retval; +- +- __asm__ __volatile__( +- " la 1,%1\n" +- " lr 0,%2\n" +- " cs 0,%3,0(1)\n" +- " ipm %0\n" +- " srl %0,28\n" +- "0:" +- : "=&r" (retval), "+m" (*p) +- : "d" (oldval) , "d" (newval) +- : "memory", "0", "1", "cc"); +- return !retval; +-} +- +-#endif /* atomicity.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/s390/s390-32/backtrace.c glibc-2.3.2-200304020432/sysdeps/s390/s390-32/backtrace.c +--- glibc-2.3.2/sysdeps/s390/s390-32/backtrace.c Sat Jul 7 21:21:28 2001 ++++ glibc-2.3.2-200304020432/sysdeps/s390/s390-32/backtrace.c Wed Mar 26 04:43:53 2003 +@@ -71,7 +71,7 @@ + out of range. */ + break; + +- array[cnt++] = stack->save_grps[8]; ++ array[cnt++] = stack->save_grps[8] & 0x7fffffff; + + stack = (struct layout *) stack->back_chain; + } +diff -u -udbrN glibc-2.3.2/sysdeps/s390/s390-32/sysdep.h glibc-2.3.2-200304020432/sysdeps/s390/s390-32/sysdep.h +--- glibc-2.3.2/sysdeps/s390/s390-32/sysdep.h Tue Jan 14 02:04:15 2003 ++++ glibc-2.3.2-200304020432/sysdeps/s390/s390-32/sysdep.h Fri Mar 7 11:06:56 2003 +@@ -111,7 +111,7 @@ + + /* Local label name for asm code. */ + #ifndef L +-#define L(name) name ++#define L(name) .L##name + #endif + + #endif /* __ASSEMBLER__ */ +diff -u -udbrN glibc-2.3.2/sysdeps/s390/s390-64/atomicity.h glibc-2.3.2-200304020432/sysdeps/s390/s390-64/atomicity.h +--- glibc-2.3.2/sysdeps/s390/s390-64/atomicity.h Sat Jul 7 21:21:28 2001 ++++ glibc-2.3.2-200304020432/sysdeps/s390/s390-64/atomicity.h Thu Jan 1 01:00:00 1970 +@@ -1,76 +0,0 @@ +-/* Low-level functions for atomic operations. 64 bit S/390 version. +- Copyright (C) 2001 Free Software Foundation, Inc. +- Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). +- 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 _ATOMICITY_H +-#define _ATOMICITY_H 1 +- +-#include +- +-static inline int +-__attribute__ ((unused)) +-exchange_and_add (volatile uint32_t *mem, int val) +-{ +- int result; +- __asm__ __volatile__( +- " L %0,%2\n" +- " LA 2,%1\n" +- "0: LR 0,%0\n" +- " AR 0,%3\n" +- " CS %0,0,0(2)\n" +- " JL 0b" +- : "=&d" (result), "=m" (*mem) +- : "1" (*mem), "d" (val) : "0", "1", "2" ); +- return result; +-} +- +-static inline void +-__attribute__ ((unused)) +-atomic_add (volatile uint32_t *mem, int val) +-{ +- __asm__ __volatile__( +- " LA 2,%0\n" +- "0: L 0,%1\n" +- " LR 1,0\n" +- " AR 1,%2\n" +- " CS 0,1,0(2)\n" +- " JL 0b" +- : "=m" (*mem) : "0" (*mem), "d" (val) : "0", "1", "2" ); +-} +- +-static inline int +-__attribute__ ((unused)) +-compare_and_swap (volatile long int *p, long int oldval, long int newval) +-{ +- int retval; +- +- __asm__ __volatile__( +- " la 1,%1\n" +- " lgr 0,%2\n" +- " csg 0,%3,0(1)\n" +- " ipm %0\n" +- " srl %0,28\n" +- "0:" +- : "=&r" (retval), "+m" (*p) +- : "d" (oldval) , "d" (newval) +- : "memory", "0", "1", "cc"); +- return !retval; +-} +- +-#endif /* atomicity.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/s390/s390-64/sysdep.h glibc-2.3.2-200304020432/sysdeps/s390/s390-64/sysdep.h +--- glibc-2.3.2/sysdeps/s390/s390-64/sysdep.h Tue Jan 14 02:04:15 2003 ++++ glibc-2.3.2-200304020432/sysdeps/s390/s390-64/sysdep.h Fri Mar 7 11:06:55 2003 +@@ -104,8 +104,7 @@ + + /* Local label name for asm code. */ + #ifndef L +-#define L(name) name ++#define L(name) .L##name + #endif + + #endif /* __ASSEMBLER__ */ +- +diff -u -udbrN glibc-2.3.2/sysdeps/sh/bits/atomic.h glibc-2.3.2-200304020432/sysdeps/sh/bits/atomic.h +--- glibc-2.3.2/sysdeps/sh/bits/atomic.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/sh/bits/atomic.h Sat Mar 29 02:14:29 2003 +@@ -0,0 +1,402 @@ ++/* Copyright (C) 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 ++ 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 ++ ++ ++typedef int8_t atomic8_t; ++typedef uint8_t uatomic8_t; ++typedef int_fast8_t atomic_fast8_t; ++typedef uint_fast8_t uatomic_fast8_t; ++ ++typedef int16_t atomic16_t; ++typedef uint16_t uatomic16_t; ++typedef int_fast16_t atomic_fast16_t; ++typedef uint_fast16_t uatomic_fast16_t; ++ ++typedef int32_t atomic32_t; ++typedef uint32_t uatomic32_t; ++typedef int_fast32_t atomic_fast32_t; ++typedef uint_fast32_t uatomic_fast32_t; ++ ++typedef int64_t atomic64_t; ++typedef uint64_t uatomic64_t; ++typedef int_fast64_t atomic_fast64_t; ++typedef uint_fast64_t uatomic_fast64_t; ++ ++typedef intptr_t atomicptr_t; ++typedef uintptr_t uatomicptr_t; ++typedef intmax_t atomic_max_t; ++typedef uintmax_t uatomic_max_t; ++ ++ ++#define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \ ++ ({ __typeof (*mem) __result; \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ nop\n\ ++ mov r15,r1\n\ ++ mov #-8,r15\n\ ++ 0: mov.b @%1,%0\n\ ++ cmp/eq %0,%3\n\ ++ bf 1f\n\ ++ mov.b %2,@%1\n\ ++ 1: mov r1,r15"\ ++ : "=&r" (__result) : "r" (mem), "r" (newval), "r" (oldval) \ ++ : "r0", "r1", "t", "memory"); \ ++ __result; }) ++ ++#define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \ ++ ({ __typeof (*mem) __result; \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ nop\n\ ++ mov r15,r1\n\ ++ mov #-8,r15\n\ ++ 0: mov.w @%1,%0\n\ ++ cmp/eq %0,%3\n\ ++ bf 1f\n\ ++ mov.w %2,@%1\n\ ++ 1: mov r1,r15"\ ++ : "=&r" (__result) : "r" (mem), "r" (newval), "r" (oldval) \ ++ : "r0", "r1", "t", "memory"); \ ++ __result; }) ++ ++#define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \ ++ ({ __typeof (*mem) __result; \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ nop\n\ ++ mov r15,r1\n\ ++ mov #-8,r15\n\ ++ 0: mov.l @%1,%0\n\ ++ cmp/eq %0,%3\n\ ++ bf 1f\n\ ++ mov.l %2,@%1\n\ ++ 1: mov r1,r15"\ ++ : "=&r" (__result) : "r" (mem), "r" (newval), "r" (oldval) \ ++ : "r0", "r1", "t", "memory"); \ ++ __result; }) ++ ++/* 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 ++ such an operation. So don't define any code for now. */ ++ ++# define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \ ++ (abort (), 0) ++ ++#define atomic_exchange_and_add(mem, value) \ ++ ({ __typeof (*mem) __result; \ ++ __typeof (value) __value; \ ++ if (sizeof (*mem) == 1) \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ mov r15,r1\n\ ++ mov #-6,r15\n\ ++ 0: mov.b @%2,%0\n\ ++ add %0,%1\n\ ++ mov.b %1,@%2\n\ ++ 1: mov r1,r15"\ ++ : "=&r" (__result), "=&r" (__value) : "r" (mem), "1" (value) \ ++ : "r0", "r1", "memory"); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ mov r15,r1\n\ ++ mov #-6,r15\n\ ++ 0: mov.w @%2,%0\n\ ++ add %0,%1\n\ ++ mov.w %1,@%2\n\ ++ 1: mov r1,r15"\ ++ : "=&r" (__result), "=&r" (__value) : "r" (mem), "1" (value) \ ++ : "r0", "r1", "memory"); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ mov r15,r1\n\ ++ mov #-6,r15\n\ ++ 0: mov.l @%2,%0\n\ ++ add %0,%1\n\ ++ mov.l %1,@%2\n\ ++ 1: mov r1,r15"\ ++ : "=&r" (__result), "=&r" (__value) : "r" (mem), "1" (value) \ ++ : "r0", "r1", "memory"); \ ++ else \ ++ { \ ++ __typeof (value) addval = (value); \ ++ __typeof (mem) memp = (mem); \ ++ do \ ++ __result = *memp; \ ++ while (__arch_compare_and_exchange_val_64_acq \ ++ (memp, __result + addval, __result) == __result); \ ++ (void) addval; \ ++ } \ ++ __result; }) ++ ++#define atomic_add(mem, value) \ ++ (void) ({ __typeof (value) __value; \ ++ if (sizeof (*mem) == 1) \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ mov r15,r1\n\ ++ mov #-6,r15\n\ ++ 0: mov.b @%1,r2\n\ ++ add r2,%0\n\ ++ mov.b %0,@%1\n\ ++ 1: mov r1,r15"\ ++ : "=&r" (__value) : "r" (mem), "0" (value) \ ++ : "r0", "r1", "r2", "memory"); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ mov r15,r1\n\ ++ mov #-6,r15\n\ ++ 0: mov.w @%1,r2\n\ ++ add r2,%0\n\ ++ mov.w %0,@%1\n\ ++ 1: mov r1,r15"\ ++ : "=&r" (__value) : "r" (mem), "0" (value) \ ++ : "r0", "r1", "r2", "memory"); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ mov r15,r1\n\ ++ mov #-6,r15\n\ ++ 0: mov.l @%1,r2\n\ ++ add r2,%0\n\ ++ mov.l %0,@%1\n\ ++ 1: mov r1,r15"\ ++ : "=&r" (__value) : "r" (mem), "0" (value) \ ++ : "r0", "r1", "r2", "memory"); \ ++ else \ ++ { \ ++ __typeof (value) addval = (value); \ ++ __typeof (*mem) oldval; \ ++ __typeof (mem) memp = (mem); \ ++ do \ ++ oldval = *memp; \ ++ while (__arch_compare_and_exchange_val_64_acq \ ++ (memp, oldval + addval, oldval) == oldval); \ ++ (void) addval; \ ++ } \ ++ }) ++ ++#define atomic_add_negative(mem, value) \ ++ ({ unsigned char __result; \ ++ __typeof (value) __value; \ ++ if (sizeof (*mem) == 1) \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ mov r15,r1\n\ ++ mov #-6,r15\n\ ++ 0: mov.b @%2,r2\n\ ++ add r2,%1\n\ ++ mov.b %1,@%2\n\ ++ 1: mov r1,r15\n\ ++ shal %1\n\ ++ movt %0"\ ++ : "=r" (__result), "=&r" (__value) : "r" (mem), "1" (value) \ ++ : "r0", "r1", "r2", "t", "memory"); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ mov r15,r1\n\ ++ mov #-6,r15\n\ ++ 0: mov.w @%2,r2\n\ ++ add r2,%1\n\ ++ mov.w %1,@%2\n\ ++ 1: mov r1,r15\n\ ++ shal %1\n\ ++ movt %0"\ ++ : "=r" (__result), "=&r" (__value) : "r" (mem), "1" (value) \ ++ : "r0", "r1", "r2", "t", "memory"); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ mov r15,r1\n\ ++ mov #-6,r15\n\ ++ 0: mov.l @%2,r2\n\ ++ add r2,%1\n\ ++ mov.l %1,@%2\n\ ++ 1: mov r1,r15\n\ ++ shal %1\n\ ++ movt %0"\ ++ : "=r" (__result), "=&r" (__value) : "r" (mem), "1" (value) \ ++ : "r0", "r1", "r2", "t", "memory"); \ ++ else \ ++ abort (); \ ++ __result; }) ++ ++#define atomic_add_zero(mem, value) \ ++ ({ unsigned char __result; \ ++ __typeof (value) __value; \ ++ if (sizeof (*mem) == 1) \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ mov r15,r1\n\ ++ mov #-6,r15\n\ ++ 0: mov.b @%2,r2\n\ ++ add r2,%1\n\ ++ mov.b %1,@%2\n\ ++ 1: mov r1,r15\n\ ++ tst %1,%1\n\ ++ movt %0"\ ++ : "=r" (__result), "=&r" (__value) : "r" (mem), "1" (value) \ ++ : "r0", "r1", "r2", "t", "memory"); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ mov r15,r1\n\ ++ mov #-6,r15\n\ ++ 0: mov.w @%2,r2\n\ ++ add r2,%1\n\ ++ mov.w %1,@%2\n\ ++ 1: mov r1,r15\n\ ++ tst %1,%1\n\ ++ movt %0"\ ++ : "=r" (__result), "=&r" (__value) : "r" (mem), "1" (value) \ ++ : "r0", "r1", "r2", "t", "memory"); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ mov r15,r1\n\ ++ mov #-6,r15\n\ ++ 0: mov.l @%2,r2\n\ ++ add r2,%1\n\ ++ mov.l %1,@%2\n\ ++ 1: mov r1,r15\n\ ++ tst %1,%1\n\ ++ movt %0"\ ++ : "=r" (__result), "=&r" (__value) : "r" (mem), "1" (value) \ ++ : "r0", "r1", "r2", "t", "memory"); \ ++ else \ ++ abort (); \ ++ __result; }) ++ ++#define atomic_increment_and_test(mem) atomic_add_zero((mem), 1) ++#define atomic_decrement_and_test(mem) atomic_add_zero((mem), -1) ++ ++#define atomic_bit_set(mem, bit) \ ++ (void) ({ unsigned int __mask = 1 << (bit); \ ++ if (sizeof (*mem) == 1) \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ mov r15,r1\n\ ++ mov #-6,r15\n\ ++ 0: mov.b @%0,r2\n\ ++ or %1,r2\n\ ++ mov.b r2,@%0\n\ ++ 1: mov r1,r15"\ ++ : : "r" (mem), "r" (__mask) \ ++ : "r0", "r1", "r2", "memory"); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ mov r15,r1\n\ ++ mov #-6,r15\n\ ++ 0: mov.w @%0,r2\n\ ++ or %1,r2\n\ ++ mov.w r2,@%0\n\ ++ 1: mov r1,r15"\ ++ : : "r" (mem), "r" (__mask) \ ++ : "r0", "r1", "r2", "memory"); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ mov r15,r1\n\ ++ mov #-6,r15\n\ ++ 0: mov.l @%0,r2\n\ ++ or %1,r2\n\ ++ mov.l r2,@%0\n\ ++ 1: mov r1,r15"\ ++ : : "r" (mem), "r" (__mask) \ ++ : "r0", "r1", "r2", "memory"); \ ++ else \ ++ abort (); \ ++ }) ++ ++#define atomic_bit_test_set(mem, bit) \ ++ ({ unsigned int __mask = 1 << (bit); \ ++ unsigned int __result = __mask; \ ++ if (sizeof (*mem) == 1) \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ nop\n\ ++ mov r15,r1\n\ ++ mov #-8,r15\n\ ++ 0: mov.b @%2,r2\n\ ++ or r2,%1\n\ ++ and r2,%0\n\ ++ mov.b %1,@%2\n\ ++ 1: mov r1,r15"\ ++ : "=&r" (__result), "=&r" (__mask) \ ++ : "r" (mem), "0" (__result), "1" (__mask) \ ++ : "r0", "r1", "r2", "memory"); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ nop\n\ ++ mov r15,r1\n\ ++ mov #-8,r15\n\ ++ 0: mov.w @%2,r2\n\ ++ or r2,%1\n\ ++ and r2,%0\n\ ++ mov.w %1,@%2\n\ ++ 1: mov r1,r15"\ ++ : "=&r" (__result), "=&r" (__mask) \ ++ : "r" (mem), "0" (__result), "1" (__mask) \ ++ : "r0", "r1", "r2", "memory"); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile ("\ ++ .align 2\n\ ++ mova 1f,r0\n\ ++ nop\n\ ++ mov r15,r1\n\ ++ mov #-8,r15\n\ ++ 0: mov.l @%2,r2\n\ ++ or r2,%1\n\ ++ and r2,%0\n\ ++ mov.l %1,@%2\n\ ++ 1: mov r1,r15"\ ++ : "=&r" (__result), "=&r" (__mask) \ ++ : "r" (mem), "0" (__result), "1" (__mask) \ ++ : "r0", "r1", "r2", "memory"); \ ++ else \ ++ abort (); \ ++ __result; }) +diff -u -udbrN glibc-2.3.2/sysdeps/sh/sh4/fpu/libm-test-ulps glibc-2.3.2-200304020432/sysdeps/sh/sh4/fpu/libm-test-ulps +--- glibc-2.3.2/sysdeps/sh/sh4/fpu/libm-test-ulps Sun Apr 22 06:53:11 2001 ++++ glibc-2.3.2-200304020432/sysdeps/sh/sh4/fpu/libm-test-ulps Sun Mar 23 01:52:10 2003 +@@ -145,7 +145,7 @@ + idouble: 1 + + # ccos +-Test "Imaginary part of: ccos (-2 - 3 i) == -4.1896256909688072301 - 9.1092278937553365979 i": ++Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": + float: 1 + ifloat: 1 + Test "Real part of: ccos (0.7 + 1.2 i) == 1.3848657645312111080 - 0.97242170335830028619 i": +@@ -156,10 +156,10 @@ + idouble: 1 + + # ccosh +-Test "Real part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Real part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Imaginary part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 + Test "Real part of: ccosh (0.7 + 1.2 i) == 0.4548202223691477654 + 0.7070296600921537682 i": +@@ -198,7 +198,7 @@ + Test "Imaginary part of: clog10 (-0 - inf i) == inf - pi/2*log10(e) i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: clog10 (-2 - 3 i) == 0.5569716761534183846 - 0.9375544629863747085 i": ++Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": + double: 1 + float: 5 + idouble: 1 +@@ -291,7 +291,7 @@ + ifloat: 1 + + # csinh +-Test "Imaginary part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i": ++Test "Imaginary part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": + double: 1 + idouble: 1 + Test "Real part of: csinh (0.7 + 1.2 i) == 0.27487868678117583582 + 1.1698665727426565139 i": +@@ -318,7 +318,7 @@ + ifloat: 1 + + # ctan +-Test "Real part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i": ++Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": + double: 1 + idouble: 1 + Test "Real part of: ctan (0.7 + 1.2 i) == 0.1720734197630349001 + 0.9544807059989405538 i": +@@ -331,7 +331,7 @@ + ifloat: 1 + + # ctanh +-Test "Real part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i": ++Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": + double: 1 + float: 2 + idouble: 1 +@@ -520,12 +520,12 @@ + ifloat: 2 + + # lgamma +-Test "lgamma (0.7) == 0.26086724653166651439": ++Test "lgamma (0.7) == 0.260867246531666514385732417016759578": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +-Test "lgamma (1.2) == -0.853740900033158497197e-1": ++Test "lgamma (1.2) == -0.853740900033158497197028392998854470e-1": + double: 1 + float: 2 + idouble: 1 +@@ -615,7 +615,7 @@ + Test "tgamma (0.5) == sqrt (pi)": + float: 1 + ifloat: 1 +-Test "tgamma (0.7) == 1.29805533264755778568": ++Test "tgamma (0.7) == 1.29805533264755778568117117915281162": + double: 1 + float: 1 + idouble: 1 +diff -u -udbrN glibc-2.3.2/sysdeps/sparc/sparc32/atomicity.h glibc-2.3.2-200304020432/sysdeps/sparc/sparc32/atomicity.h +--- glibc-2.3.2/sysdeps/sparc/sparc32/atomicity.h Sat Jul 7 21:21:29 2001 ++++ glibc-2.3.2-200304020432/sysdeps/sparc/sparc32/atomicity.h Mon Mar 31 01:36:39 2003 +@@ -1,98 +0,0 @@ +-/* Low-level functions for atomic operations. Sparc32 version. +- Copyright (C) 1999 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 _ATOMICITY_H +-#define _ATOMICITY_H 1 +- +-#include +- +-static int +-__attribute__ ((unused)) +-exchange_and_add (volatile uint32_t *mem, int val) +-{ +- static unsigned char lock; +- int result, tmp; +- +- __asm__ __volatile__("1: ldstub [%1], %0\n\t" +- " cmp %0, 0\n\t" +- " bne 1b\n\t" +- " nop" +- : "=&r" (tmp) +- : "r" (&lock) +- : "memory"); +- result = *mem; +- *mem += val; +- __asm__ __volatile__("stb %%g0, [%0]" +- : /* no outputs */ +- : "r" (&lock) +- : "memory"); +- return result; +-} +- +-static void +-__attribute__ ((unused)) +-atomic_add (volatile uint32_t *mem, int val) +-{ +- static unsigned char lock; +- int tmp; +- +- __asm__ __volatile__("1: ldstub [%1], %0\n\t" +- " cmp %0, 0\n\t" +- " bne 1b\n\t" +- " nop" +- : "=&r" (tmp) +- : "r" (&lock) +- : "memory"); +- *mem += val; +- __asm__ __volatile__("stb %%g0, [%0]" +- : /* no outputs */ +- : "r" (&lock) +- : "memory"); +-} +- +-static int +-__attribute__ ((unused)) +-compare_and_swap (volatile long int *p, long int oldval, long int newval) +-{ +- static unsigned char lock; +- int ret, tmp; +- +- __asm__ __volatile__("1: ldstub [%1], %0\n\t" +- " cmp %0, 0\n\t" +- " bne 1b\n\t" +- " nop" +- : "=&r" (tmp) +- : "r" (&lock) +- : "memory"); +- if (*p != oldval) +- ret = 0; +- else +- { +- *p = newval; +- ret = 1; +- } +- __asm__ __volatile__("stb %%g0, [%0]" +- : /* no outputs */ +- : "r" (&lock) +- : "memory"); +- +- return ret; +-} +- +-#endif /* atomicity.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/sparc/sparc32/bits/atomic.h glibc-2.3.2-200304020432/sysdeps/sparc/sparc32/bits/atomic.h +--- glibc-2.3.2/sysdeps/sparc/sparc32/bits/atomic.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/sparc/sparc32/bits/atomic.h Mon Mar 31 01:36:39 2003 +@@ -0,0 +1,75 @@ ++/* Atomic operations. sparc32 version. ++ Copyright (C) 2003 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Jakub Jelinek , 2003. ++ ++ 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 _BITS_ATOMIC_H ++#define _BITS_ATOMIC_H 1 ++ ++/* We have no compare and swap, just test and set. ++ The following implementation contends on one single global lock ++ per library and assumes no variable will be accessed using atomic.h ++ macros from two different libraries. */ ++ ++volatile unsigned char __sparc32_atomic_lock ++ __attribute__ ((nocommon, section (".gnu.linkonce.b.__sparc32_atomic_lock"), ++ visibility ("hidden"))); ++ ++#define __sparc32_atomic_do_lock() \ ++ do \ ++ { \ ++ unsigned int __old_lock; \ ++ do \ ++ __asm ("ldstub %1, %0" \ ++ : "=r" (__old_lock), "=m" (__sparc32_atomic_lock) \ ++ : "m" (__sparc32_atomic_lock)); \ ++ while (__old_lock); \ ++ } \ ++ while (0) ++ ++#define __sparc32_atomic_do_unlock() \ ++ do __sparc32_atomic_lock = 0; while (0) ++ ++/* The only basic operation needed is compare and exchange. */ ++#define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \ ++ ({ __typeof (mem) __acev_memp = (mem); \ ++ __typeof (*mem) __acev_ret; \ ++ __typeof (*mem) __acev_newval = (newval); \ ++ \ ++ __sparc32_atomic_do_lock (); \ ++ __acev_ret = *__acev_memp; \ ++ if (__acev_ret == (oldval)) \ ++ *__acev_memp = __acev_newval; \ ++ __sparc32_atomic_do_unlock (); \ ++ __acev_ret; }) ++ ++#define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \ ++ ({ __typeof (mem) __aceb_memp = (mem); \ ++ int __aceb_ret; \ ++ __typeof (*mem) __aceb_newval = (newval); \ ++ \ ++ __sparc32_atomic_do_lock (); \ ++ __aceb_ret = 0; \ ++ if (*__aceb_memp == (oldval)) \ ++ *__aceb_memp = __aceb_newval; \ ++ else \ ++ __aceb_ret = 1; \ ++ __sparc32_atomic_do_unlock (); \ ++ __aceb_ret; }) ++ ++#endif /* bits/atomic.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/sparc/sparc32/fpu/libm-test-ulps glibc-2.3.2-200304020432/sysdeps/sparc/sparc32/fpu/libm-test-ulps +--- glibc-2.3.2/sysdeps/sparc/sparc32/fpu/libm-test-ulps Tue Sep 17 18:46:01 2002 ++++ glibc-2.3.2-200304020432/sysdeps/sparc/sparc32/fpu/libm-test-ulps Sun Mar 23 01:52:09 2003 +@@ -94,7 +94,7 @@ + idouble: 1 + + # ccos +-Test "Imaginary part of: ccos (-2 - 3 i) == -4.1896256909688072301 - 9.1092278937553365979 i": ++Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": + float: 1 + ifloat: 1 + Test "Real part of: ccos (0.75 + 1.25 i) == 1.38173873063425888530729933139078645 - 1.09193013555397466170919531722024128 i": +@@ -107,10 +107,10 @@ + ifloat: 1 + + # ccosh +-Test "Real part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Real part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Imaginary part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 + Test "Real part of: ccosh (0.75 + 1.25 i) == 0.408242591877968807788852146397499084 + 0.780365930845853240391326216300863152 i": +@@ -145,7 +145,7 @@ + Test "Imaginary part of: clog10 (-0 - inf i) == inf - pi/2*log10(e) i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: clog10 (-2 - 3 i) == 0.5569716761534183846 - 0.9375544629863747085 i": ++Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": + double: 1 + float: 5 + idouble: 1 +@@ -239,7 +239,7 @@ + ifloat: 2 + + # csinh +-Test "Imaginary part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i": ++Test "Imaginary part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": + double: 1 + idouble: 1 + Test "Real part of: csinh (0.75 + 1.25 i) == 0.259294854551162779153349830618433028 + 1.22863452409509552219214606515777594 i": +@@ -258,7 +258,7 @@ + ifloat: 1 + + # ctan +-Test "Real part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i": ++Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": + double: 1 + idouble: 1 + Test "Imaginary part of: ctan (0.75 + 1.25 i) == 0.160807785916206426725166058173438663 + 0.975363285031235646193581759755216379 i": +@@ -266,7 +266,7 @@ + idouble: 1 + + # ctanh +-Test "Real part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i": ++Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": + double: 1 + float: 2 + idouble: 1 +@@ -453,12 +453,12 @@ + ifloat: 2 + + # lgamma +-Test "lgamma (0.7) == 0.26086724653166651439": ++Test "lgamma (0.7) == 0.260867246531666514385732417016759578": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +-Test "lgamma (1.2) == -0.853740900033158497197e-1": ++Test "lgamma (1.2) == -0.853740900033158497197028392998854470e-1": + double: 1 + float: 2 + idouble: 1 +@@ -513,7 +513,7 @@ + Test "tgamma (0.5) == sqrt (pi)": + float: 1 + ifloat: 1 +-Test "tgamma (0.7) == 1.29805533264755778568": ++Test "tgamma (0.7) == 1.29805533264755778568117117915281162": + double: 1 + float: 1 + idouble: 1 +diff -u -udbrN glibc-2.3.2/sysdeps/sparc/sparc32/sparcv9/atomicity.h glibc-2.3.2-200304020432/sysdeps/sparc/sparc32/sparcv9/atomicity.h +--- glibc-2.3.2/sysdeps/sparc/sparc32/sparcv9/atomicity.h Sat Jul 7 21:21:29 2001 ++++ glibc-2.3.2-200304020432/sysdeps/sparc/sparc32/sparcv9/atomicity.h Mon Mar 31 01:36:38 2003 +@@ -1,82 +0,0 @@ +-/* Low-level functions for atomic operations. Sparc32+v9 version. +- Copyright (C) 1999 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 _ATOMICITY_H +-#define _ATOMICITY_H 1 +- +-#include +- +-static inline int +-__attribute__ ((unused)) +-exchange_and_add (volatile uint32_t *mem, int val) +-{ +- uint32_t tmp1, tmp2; +- +- __asm__ __volatile__("1: lduw [%2], %0\n\t" +- " add %0, %3, %1\n\t" +- " cas [%2], %0, %1\n\t" +- " sub %0, %1, %0\n\t" +- " brnz,pn %0, 1b\n\t" +- " nop" +- : "=&r" (tmp1), "=&r" (tmp2) +- : "r" (mem), "r" (val) +- : "memory"); +- return tmp2; +-} +- +-static inline void +-__attribute__ ((unused)) +-atomic_add (volatile uint32_t *mem, int val) +-{ +- uint32_t tmp1, tmp2; +- +- __asm__ __volatile__("1: lduw [%2], %0\n\t" +- " add %0, %3, %1\n\t" +- " cas [%2], %0, %1\n\t" +- " sub %0, %1, %0\n\t" +- " brnz,pn %0, 1b\n\t" +- " nop" +- : "=&r" (tmp1), "=&r" (tmp2) +- : "r" (mem), "r" (val) +- : "memory"); +-} +- +-static inline int +-__attribute__ ((unused)) +-compare_and_swap (volatile long int *p, long int oldval, long int newval) +-{ +- register long int tmp, tmp2; +- +- __asm__ __volatile__("1: lduw [%4], %0\n\t" +- " mov %2, %1\n\t" +- " cmp %0, %3\n\t" +- " bne,a,pn %%xcc, 2f\n\t" +- " mov 0, %0\n\t" +- " cas [%4], %0, %1\n\t" +- " sub %0, %1, %0\n\t" +- " brnz,pn %0, 1b\n\t" +- " mov 1, %0\n\t" +- "2:" +- : "=&r" (tmp), "=&r" (tmp2) +- : "r" (newval), "r" (oldval), "r" (p) +- : "memory"); +- return tmp; +-} +- +-#endif /* atomicity.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/sparc/sparc32/sparcv9/bits/atomic.h glibc-2.3.2-200304020432/sysdeps/sparc/sparc32/sparcv9/bits/atomic.h +--- glibc-2.3.2/sysdeps/sparc/sparc32/sparcv9/bits/atomic.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/sparc/sparc32/sparcv9/bits/atomic.h Mon Mar 31 01:36:38 2003 +@@ -0,0 +1,88 @@ ++/* Atomic operations. sparcv9 version. ++ Copyright (C) 2003 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Jakub Jelinek , 2003. ++ ++ 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 ++ ++typedef int8_t atomic8_t; ++typedef uint8_t uatomic8_t; ++typedef int_fast8_t atomic_fast8_t; ++typedef uint_fast8_t uatomic_fast8_t; ++ ++typedef int16_t atomic16_t; ++typedef uint16_t uatomic16_t; ++typedef int_fast16_t atomic_fast16_t; ++typedef uint_fast16_t uatomic_fast16_t; ++ ++typedef int32_t atomic32_t; ++typedef uint32_t uatomic32_t; ++typedef int_fast32_t atomic_fast32_t; ++typedef uint_fast32_t uatomic_fast32_t; ++ ++typedef int64_t atomic64_t; ++typedef uint64_t uatomic64_t; ++typedef int_fast64_t atomic_fast64_t; ++typedef uint_fast64_t uatomic_fast64_t; ++ ++typedef intptr_t atomicptr_t; ++typedef uintptr_t uatomicptr_t; ++typedef intmax_t atomic_max_t; ++typedef uintmax_t uatomic_max_t; ++ ++ ++#define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \ ++ (abort (), 0) ++ ++#define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \ ++ (abort (), 0) ++ ++#define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \ ++({ \ ++ __typeof (*(mem)) __acev_tmp; \ ++ __typeof (mem) __acev_mem = (mem); \ ++ __asm __volatile ("cas [%4], %2, %0" \ ++ : "=r" (__acev_tmp), "=m" (*__acev_mem) \ ++ : "r" (oldval), "m" (*__acev_mem), "r" (__acev_mem), \ ++ "0" (newval)); \ ++ __acev_tmp; }) ++ ++/* This can be implemented if needed. */ ++#define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \ ++ (abort (), 0) ++ ++#define atomic_exchange(mem, newvalue) \ ++ ({ __typeof (*(mem)) __oldval; \ ++ __typeof (mem) __memp = (mem); \ ++ __typeof (*(mem)) __value = (newvalue); \ ++ \ ++ if (sizeof (*(mem)) == 4) \ ++ __asm ("swap %0, %1" \ ++ : "=m" (*__memp), "=r" (__oldval) \ ++ : "m" (*__memp), "1" (__value)); \ ++ else \ ++ abort (); \ ++ __oldval; }) ++ ++#define atomic_full_barrier() \ ++ __asm __volatile ("membar #LoadLoad | #LoadStore" \ ++ " | #StoreLoad | #StoreStore" : : : "memory") ++#define atomic_read_barrier() \ ++ __asm __volatile ("membar #LoadLoad | #LoadStore" : : : "memory") ++#define atomic_write_barrier() \ ++ __asm __volatile ("membar #StoreLoad | #StoreStore" : : : "memory") +diff -u -udbrN glibc-2.3.2/sysdeps/sparc/sparc64/atomicity.h glibc-2.3.2-200304020432/sysdeps/sparc/sparc64/atomicity.h +--- glibc-2.3.2/sysdeps/sparc/sparc64/atomicity.h Sat Jul 7 21:21:29 2001 ++++ glibc-2.3.2-200304020432/sysdeps/sparc/sparc64/atomicity.h Mon Mar 31 01:36:38 2003 +@@ -1,82 +0,0 @@ +-/* Low-level functions for atomic operations. Sparc64 version. +- Copyright (C) 1999 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 _ATOMICITY_H +-#define _ATOMICITY_H 1 +- +-#include +- +-static inline int +-__attribute__ ((unused)) +-exchange_and_add (volatile uint32_t *mem, int val) +-{ +- uint32_t tmp1, tmp2; +- +- __asm__ __volatile__("1: lduw [%2], %0\n\t" +- " add %0, %3, %1\n\t" +- " cas [%2], %0, %1\n\t" +- " sub %0, %1, %0\n\t" +- " brnz,pn %0, 1b\n\t" +- " nop" +- : "=&r" (tmp1), "=&r" (tmp2) +- : "r" (mem), "r" (val) +- : "memory"); +- return tmp2; +-} +- +-static inline void +-__attribute__ ((unused)) +-atomic_add (volatile uint32_t *mem, int val) +-{ +- uint32_t tmp1, tmp2; +- +- __asm__ __volatile__("1: lduw [%2], %0\n\t" +- " add %0, %3, %1\n\t" +- " cas [%2], %0, %1\n\t" +- " sub %0, %1, %0\n\t" +- " brnz,pn %0, 1b\n\t" +- " nop" +- : "=&r" (tmp1), "=&r" (tmp2) +- : "r" (mem), "r" (val) +- : "memory"); +-} +- +-static inline int +-__attribute__ ((unused)) +-compare_and_swap (volatile long int *p, long int oldval, long int newval) +-{ +- register long int tmp, tmp2; +- +- __asm__ __volatile__("1: ldx [%4], %0\n\t" +- " mov %2, %1\n\t" +- " cmp %0, %3\n\t" +- " bne,a,pn %%xcc, 2f\n\t" +- " mov 0, %0\n\t" +- " casx [%4], %0, %1\n\t" +- " sub %0, %1, %0\n\t" +- " brnz,pn %0, 1b\n\t" +- " mov 1, %0\n\t" +- "2:" +- : "=&r" (tmp), "=&r" (tmp2) +- : "r" (newval), "r" (oldval), "r" (p) +- : "memory"); +- return tmp; +-} +- +-#endif /* atomicity.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/sparc/sparc64/bits/atomic.h glibc-2.3.2-200304020432/sysdeps/sparc/sparc64/bits/atomic.h +--- glibc-2.3.2/sysdeps/sparc/sparc64/bits/atomic.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/sparc/sparc64/bits/atomic.h Mon Mar 31 01:36:39 2003 +@@ -0,0 +1,103 @@ ++/* Atomic operations. sparc64 version. ++ Copyright (C) 2003 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Jakub Jelinek , 2003. ++ ++ 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 ++ ++typedef int8_t atomic8_t; ++typedef uint8_t uatomic8_t; ++typedef int_fast8_t atomic_fast8_t; ++typedef uint_fast8_t uatomic_fast8_t; ++ ++typedef int16_t atomic16_t; ++typedef uint16_t uatomic16_t; ++typedef int_fast16_t atomic_fast16_t; ++typedef uint_fast16_t uatomic_fast16_t; ++ ++typedef int32_t atomic32_t; ++typedef uint32_t uatomic32_t; ++typedef int_fast32_t atomic_fast32_t; ++typedef uint_fast32_t uatomic_fast32_t; ++ ++typedef int64_t atomic64_t; ++typedef uint64_t uatomic64_t; ++typedef int_fast64_t atomic_fast64_t; ++typedef uint_fast64_t uatomic_fast64_t; ++ ++typedef intptr_t atomicptr_t; ++typedef uintptr_t uatomicptr_t; ++typedef intmax_t atomic_max_t; ++typedef uintmax_t uatomic_max_t; ++ ++ ++#define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \ ++ (abort (), 0) ++ ++#define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \ ++ (abort (), 0) ++ ++#define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \ ++({ \ ++ __typeof (*(mem)) __acev_tmp; \ ++ __typeof (mem) __acev_mem = (mem); \ ++ __asm __volatile ("cas [%4], %2, %0" \ ++ : "=r" (__acev_tmp), "=m" (*__acev_mem) \ ++ : "r" (oldval), "m" (*__acev_mem), "r" (__acev_mem), \ ++ "0" (newval)); \ ++ __acev_tmp; }) ++ ++#define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \ ++({ \ ++ __typeof (*(mem)) __acev_tmp; \ ++ __typeof (mem) __acev_mem = (mem); \ ++ __asm __volatile ("casx [%4], %2, %0" \ ++ : "=r" (__acev_tmp), "=m" (*__acev_mem) \ ++ : "r" ((long) (oldval)), "m" (*__acev_mem), \ ++ "r" (__acev_mem), "0" ((long) (newval))); \ ++ __acev_tmp; }) ++ ++#define atomic_exchange(mem, newvalue) \ ++ ({ __typeof (*(mem)) __oldval, __val; \ ++ __typeof (mem) __memp = (mem); \ ++ __typeof (*(mem)) __value = (newvalue); \ ++ \ ++ if (sizeof (*(mem)) == 4) \ ++ __asm ("swap %0, %1" \ ++ : "=m" (*__memp), "=r" (__oldval) \ ++ : "m" (*__memp), "1" (__value)); \ ++ else \ ++ { \ ++ __val = *__memp; \ ++ do \ ++ { \ ++ __oldval = __val; \ ++ __val = atomic_compare_and_exchange_val_acq (__memp, __value, \ ++ __oldval); \ ++ } \ ++ while (__builtin_expect (__val != __oldval, 0)); \ ++ } \ ++ __oldval; }) ++ ++#define atomic_full_barrier() \ ++ __asm __volatile ("membar #LoadLoad | #LoadStore" \ ++ " | #StoreLoad | #StoreStore" : : : "memory") ++#define atomic_read_barrier() \ ++ __asm __volatile ("membar #LoadLoad | #LoadStore" : : : "memory") ++#define atomic_write_barrier() \ ++ __asm __volatile ("membar #StoreLoad | #StoreStore" : : : "memory") +diff -u -udbrN glibc-2.3.2/sysdeps/sparc/sparc64/fpu/libm-test-ulps glibc-2.3.2-200304020432/sysdeps/sparc/sparc64/fpu/libm-test-ulps +--- glibc-2.3.2/sysdeps/sparc/sparc64/fpu/libm-test-ulps Mon Oct 1 01:31:32 2001 ++++ glibc-2.3.2-200304020432/sysdeps/sparc/sparc64/fpu/libm-test-ulps Sun Mar 23 01:52:10 2003 +@@ -1,85 +1,31 @@ +- + # Begin of automatic generation + +-# acos +-Test "acos (0.7) == 0.79539883018414355549096833892476432": +-ldouble: 1 +-ildouble: 1 +- +-# asin +-Test "asin (-0.5) == -pi/6": +-float: 2 +-ifloat: 2 +-Test "asin (0.5) == pi/6": +-float: 2 +-ifloat: 2 +-Test "asin (0.7) == 0.77539749661075306374035335271498708": +-double: 1 +-float: 2 +-idouble: 1 +-ifloat: 2 +- +-# atan +-Test "atan (0.7) == 0.61072596438920861654375887649023613": +-ildouble: 1 +-ldouble: 1 +- +-# atanh +-Test "atanh (0.7) == 0.8673005276940531944": +-double: 1 +-idouble: 1 +- + # atan2 +-Test "atan2 (0.4, 0.0003) == 1.5700463269355215717704032607580829": ++Test "atan2 (-0.75, -1.0) == -2.49809154479650885165983415456218025": ++float: 3 ++ifloat: 3 + ildouble: 1 + ldouble: 1 +-Test "atan2 (0.7, 1) == 0.61072596438920861654375887649023613": ++Test "atan2 (0.75, -1.0) == 2.49809154479650885165983415456218025": ++float: 3 ++ifloat: 3 + ildouble: 1 + ldouble: 1 +-Test "atan2 (-0.7, 1.0) == -0.61072596438920861654375887649023613": ++Test "atan2 (1.390625, 0.9296875) == 0.981498387184244311516296577615519772": ++float: 1 ++ifloat: 1 + ildouble: 1 + ldouble: 1 +-Test "atan2 (0.7, -1.0) == 2.530866689200584621918884506789267": +-float: 3 +-ifloat: 3 +-Test "atan2 (-0.7, -1.0) == -2.530866689200584621918884506789267": +-float: 3 +-ifloat: 3 +-Test "atan2 (1.4, -0.93) == 2.1571487668237843754887415992772736": +-float: 4 +-ifloat: 4 + +-# cabs +-Test "cabs (-0.7 + 12.4 i) == 12.419742348374220601176836866763271": +-float: 1 +-ifloat: 1 +-Test "cabs (-0.7 - 12.4 i) == 12.419742348374220601176836866763271": +-float: 1 +-ifloat: 1 +-Test "cabs (-12.4 + 0.7 i) == 12.419742348374220601176836866763271": +-float: 1 +-ifloat: 1 +-Test "cabs (-12.4 - 0.7 i) == 12.419742348374220601176836866763271": +-float: 1 +-ifloat: 1 +-Test "cabs (0.7 + 1.2 i) == 1.3892443989449804508432547041028554": +-double: 1 +-idouble: 1 +-Test "cabs (0.7 + 12.4 i) == 12.419742348374220601176836866763271": ++# atanh ++Test "atanh (0.75) == 0.972955074527656652552676371721589865": + float: 1 + ifloat: 1 + + # cacos +-Test "Real part of: cacos (0.7 + 1.2 i) == 1.1351827477151551088992008271819053 - 1.0927647857577371459105272080819308 i": +-double: 1 +-float: 1 +-idouble: 1 +-ifloat: 1 +-Test "Imaginary part of: cacos (0.7 + 1.2 i) == 1.1351827477151551088992008271819053 - 1.0927647857577371459105272080819308 i": +-float: 1 +-ifloat: 1 +-ildouble: 3 +-ldouble: 3 ++Test "Imaginary part of: cacos (0.75 + 1.25 i) == 1.11752014915610270578240049553777969 - 1.13239363160530819522266333696834467 i": ++ildouble: 1 ++ldouble: 1 + + # cacosh + Test "Real part of: cacosh (-2 - 3 i) == -1.9833870299165354323470769028940395 + 2.1414491111159960199416055713254211 i": +@@ -96,25 +42,16 @@ + ifloat: 3 + ildouble: 1 + ldouble: 1 +-Test "Real part of: cacosh (0.7 + 1.2 i) == 1.0927647857577371459105272080819308 + 1.1351827477151551088992008271819053 i": ++ ++# casin ++Test "Real part of: casin (0.75 + 1.25 i) == 0.453276177638793913448921196101971749 + 1.13239363160530819522266333696834467 i": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +- +-# casin +-Test "Real part of: casin (0.7 + 1.2 i) == 0.4356135790797415103321208644578462 + 1.0927647857577371459105272080819308 i": +-double: 3 +-float: 2 +-idouble: 3 +-ifloat: 2 ++Test "Imaginary part of: casin (0.75 + 1.25 i) == 0.453276177638793913448921196101971749 + 1.13239363160530819522266333696834467 i": + ildouble: 1 + ldouble: 1 +-Test "Imaginary part of: casin (0.7 + 1.2 i) == 0.4356135790797415103321208644578462 + 1.0927647857577371459105272080819308 i": +-float: 1 +-ifloat: 1 +-ildouble: 3 +-ldouble: 3 + + # casinh + Test "Real part of: casinh (-2 - 3 i) == -1.9686379257930962917886650952454982 - 0.96465850440760279204541105949953237 i": +@@ -131,13 +68,15 @@ + ifloat: 6 + ildouble: 2 + ldouble: 2 +-Test "Real part of: casinh (0.7 + 1.2 i) == 0.97865459559367387689317593222160964 + 0.91135418953156011567903546856170941 i": +-double: 1 +-idouble: 1 ++Test "Real part of: casinh (0.75 + 1.25 i) == 1.03171853444778027336364058631006594 + 0.911738290968487636358489564316731207 i": ++float: 1 ++ifloat: 1 + ildouble: 1 + ldouble: 1 +-Test "Imaginary part of: casinh (0.7 + 1.2 i) == 0.97865459559367387689317593222160964 + 0.91135418953156011567903546856170941 i": ++Test "Imaginary part of: casinh (0.75 + 1.25 i) == 1.03171853444778027336364058631006594 + 0.911738290968487636358489564316731207 i": ++double: 1 + float: 1 ++idouble: 1 + ifloat: 1 + ildouble: 1 + ldouble: 1 +@@ -151,12 +90,10 @@ + float: 1 + idouble: 1 + ifloat: 1 +-Test "Real part of: catan (0.7 + 1.2 i) == 1.0785743834118921877443707996386368 + 0.57705737765343067644394541889341712 i": ++Test "Real part of: catan (0.75 + 1.25 i) == 1.10714871779409050301706546017853704 + 0.549306144334054845697622618461262852 i": + float: 4 + ifloat: 4 +-Test "Imaginary part of: catan (0.7 + 1.2 i) == 1.0785743834118921877443707996386368 + 0.57705737765343067644394541889341712 i": +-double: 1 +-idouble: 1 ++Test "Imaginary part of: catan (0.75 + 1.25 i) == 1.10714871779409050301706546017853704 + 0.549306144334054845697622618461262852 i": + ildouble: 1 + ldouble: 1 + +@@ -167,49 +104,59 @@ + Test "Imaginary part of: catanh (-2 - 3 i) == -0.14694666622552975204743278515471595 - 1.3389725222944935611241935759091443 i": + float: 4 + ifloat: 4 +-Test "Real part of: catanh (0.7 + 1.2 i) == 0.2600749516525135959200648705635915 + 0.97024030779509898497385130162655963 i": +-float: 1 +-ifloat: 1 +-Test "Imaginary part of: catanh (0.7 + 1.2 i) == 0.2600749516525135959200648705635915 + 0.97024030779509898497385130162655963 i": ++Test "Real part of: catanh (0.75 + 1.25 i) == 0.261492138795671927078652057366532140 + 0.996825126463918666098902241310446708 i": + double: 1 +-float: 6 + idouble: 1 ++ildouble: 1 ++ldouble: 1 ++Test "Imaginary part of: catanh (0.75 + 1.25 i) == 0.261492138795671927078652057366532140 + 0.996825126463918666098902241310446708 i": ++float: 6 + ifloat: 6 ++ildouble: 1 ++ldouble: 1 + + # cbrt ++Test "cbrt (-0.001) == -0.1": ++ildouble: 1 ++ldouble: 1 + Test "cbrt (-27.0) == -3.0": + double: 1 + idouble: 1 +-Test "cbrt (0.970299) == 0.99": ++Test "cbrt (0.75) == 0.908560296416069829445605878163630251": ++double: 1 ++idouble: 1 ++Test "cbrt (0.9921875) == 0.997389022060725270579075195353955217": + double: 1 + idouble: 1 + + # ccos +-Test "Imaginary part of: ccos (-2 - 3 i) == -4.1896256909688072301 - 9.1092278937553365979 i": ++Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": + float: 1 + ifloat: 1 +-Test "Real part of: ccos (0.7 + 1.2 i) == 1.3848657645312111080 - 0.97242170335830028619 i": +-double: 1 +-idouble: 1 +-Test "Imaginary part of: ccos (0.7 + 1.2 i) == 1.3848657645312111080 - 0.97242170335830028619 i": ++Test "Real part of: ccos (0.75 + 1.25 i) == 1.38173873063425888530729933139078645 - 1.09193013555397466170919531722024128 i": + double: 1 ++float: 1 + idouble: 1 ++ifloat: 1 ++Test "Imaginary part of: ccos (0.75 + 1.25 i) == 1.38173873063425888530729933139078645 - 1.09193013555397466170919531722024128 i": ++float: 1 ++ifloat: 1 + + # ccosh +-Test "Real part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Real part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Imaginary part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 +-Test "Real part of: ccosh (0.7 + 1.2 i) == 0.4548202223691477654 + 0.7070296600921537682 i": ++Test "Real part of: ccosh (0.75 + 1.25 i) == 0.408242591877968807788852146397499084 + 0.780365930845853240391326216300863152 i": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +-Test "Imaginary part of: ccosh (0.7 + 1.2 i) == 0.4548202223691477654 + 0.7070296600921537682 i": +-double: 1 +-idouble: 1 ++Test "Imaginary part of: ccosh (0.75 + 1.25 i) == 0.408242591877968807788852146397499084 + 0.780365930845853240391326216300863152 i": ++float: 1 ++ifloat: 1 + + # cexp + Test "Real part of: cexp (-2.0 - 3.0 i) == -0.13398091492954261346140525546115575 - 0.019098516261135196432576240858800925 i": +@@ -220,23 +167,22 @@ + ifloat: 1 + ildouble: 1 + ldouble: 1 +-Test "Real part of: cexp (0.7 + 1.2 i) == 0.72969890915032360123451688642930727 + 1.8768962328348102821139467908203072 i": +-double: 1 +-float: 1 +-idouble: 1 +-ifloat: 1 +-Test "Imaginary part of: cexp (0.7 + 1.2 i) == 0.72969890915032360123451688642930727 + 1.8768962328348102821139467908203072 i": ++Test "Real part of: cexp (0.75 + 1.25 i) == 0.667537446429131586942201977015932112 + 2.00900045494094876258347228145863909 i": + float: 1 + ifloat: 1 ++Test "Imaginary part of: cexp (0.75 + 1.25 i) == 0.667537446429131586942201977015932112 + 2.00900045494094876258347228145863909 i": + ildouble: 1 + ldouble: 1 + + # clog + Test "Imaginary part of: clog (-2 - 3 i) == 1.2824746787307683680267437207826593 - 2.1587989303424641704769327722648368 i": +-double: 1 + float: 3 +-idouble: 1 + ifloat: 3 ++Test "Real part of: clog (0.75 + 1.25 i) == 0.376885901188190075998919126749298416 + 1.03037682652431246378774332703115153 i": ++float: 1 ++ifloat: 1 ++ildouble: 1 ++ldouble: 1 + + # clog10 + Test "Imaginary part of: clog10 (-0 + inf i) == inf + pi/2*log10(e) i": +@@ -249,7 +195,7 @@ + float: 1 + idouble: 1 + ifloat: 1 +-Test "Imaginary part of: clog10 (-2 - 3 i) == 0.5569716761534183846 - 0.9375544629863747085 i": ++Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": + double: 1 + float: 5 + idouble: 1 +@@ -297,14 +243,12 @@ + float: 1 + idouble: 1 + ifloat: 1 +-Test "Real part of: clog10 (0.7 + 1.2 i) == 0.1427786545038868803 + 0.4528483579352493248 i": +-double: 1 ++Test "Real part of: clog10 (0.75 + 1.25 i) == 0.163679467193165171449476605077428975 + 0.447486970040493067069984724340855636 i": + float: 1 +-idouble: 1 + ifloat: 1 +-Test "Imaginary part of: clog10 (0.7 + 1.2 i) == 0.1427786545038868803 + 0.4528483579352493248 i": +-double: 1 +-idouble: 1 ++Test "Imaginary part of: clog10 (0.75 + 1.25 i) == 0.163679467193165171449476605077428975 + 0.447486970040493067069984724340855636 i": ++ildouble: 1 ++ldouble: 1 + Test "Imaginary part of: clog10 (3 + inf i) == inf + pi/2*log10(e) i": + double: 1 + float: 1 +@@ -327,16 +271,11 @@ + ifloat: 1 + + # cos +-Test "cos (0.7) == 0.76484218728448842625585999019186495": ++Test "cos (M_PI_6l * 2.0) == 0.5": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +-Test "cos (M_PI_6l * 2.0) == 0.5": +-double: 1 +-float: 0.5 +-idouble: 1 +-ifloat: 0.5 + ildouble: 1 + ldouble: 1 + Test "cos (M_PI_6l * 4.0) == -0.5": +@@ -347,14 +286,40 @@ + ildouble: 1 + ldouble: 1 + Test "cos (pi/2) == 0": +-double: 0.2758 +-float: 0.3667 +-idouble: 0.2758 +-ifloat: 0.3667 +-ildouble: 0.2252 +-ldouble: 0.2252 ++double: 1 ++float: 1 ++idouble: 1 ++ifloat: 1 ++ildouble: 1 ++ldouble: 1 + + # cpow ++Test "Real part of: cpow (0.75 + 1.25 i, 0.0 + 1.0 i) == 0.331825439177608832276067945276730566 + 0.131338600281188544930936345230903032 i": ++float: 1 ++ifloat: 1 ++Test "Imaginary part of: cpow (0.75 + 1.25 i, 0.0 + 1.0 i) == 0.331825439177608832276067945276730566 + 0.131338600281188544930936345230903032 i": ++float: 1 ++ifloat: 1 ++Test "Real part of: cpow (0.75 + 1.25 i, 0.75 + 1.25 i) == 0.117506293914473555420279832210420483 + 0.346552747708338676483025352060418001 i": ++double: 1 ++float: 4 ++idouble: 1 ++ifloat: 4 ++ildouble: 4 ++ldouble: 4 ++Test "Real part of: cpow (0.75 + 1.25 i, 1.0 + 0.0 i) == 0.75 + 1.25 i": ++ildouble: 2 ++ldouble: 2 ++Test "Imaginary part of: cpow (0.75 + 1.25 i, 1.0 + 0.0 i) == 0.75 + 1.25 i": ++ildouble: 1 ++ldouble: 1 ++Test "Real part of: cpow (0.75 + 1.25 i, 1.0 + 1.0 i) == 0.0846958290317209430433805274189191353 + 0.513285749182902449043287190519090481 i": ++double: 2 ++float: 3 ++idouble: 2 ++ifloat: 3 ++ildouble: 1 ++ldouble: 1 + Test "Real part of: cpow (2 + 0 i, 10 + 0 i) == 1024.0 + 0.0 i": + ildouble: 2 + ldouble: 2 +@@ -369,26 +334,26 @@ + float: 2 + ifloat: 2 + Test "Imaginary part of: cpow (e + 0 i, 0 + 2 * M_PIl i) == 1.0 + 0.0 i": +-double: 1.1031 +-float: 1.4668 +-idouble: 1.1031 +-ifloat: 1.4668 +-ildouble: 0.9006 +-ldouble: 0.9006 ++double: 2 ++float: 2 ++idouble: 2 ++ifloat: 2 ++ildouble: 1 ++ldouble: 1 + + # csin +-Test "Imaginary part of: csin (0.7 + 1.2 i) == 1.1664563419657581376 + 1.1544997246948547371 i": +-float: 1 +-ifloat: 1 ++Test "Real part of: csin (0.75 + 1.25 i) == 1.28722291002649188575873510790565441 + 1.17210635989270256101081285116138863 i": ++ildouble: 1 ++ldouble: 1 + + # csinh +-Test "Imaginary part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i": ++Test "Imaginary part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": + double: 1 + idouble: 1 +-Test "Real part of: csinh (0.7 + 1.2 i) == 0.27487868678117583582 + 1.1698665727426565139 i": ++Test "Real part of: csinh (0.75 + 1.25 i) == 0.259294854551162779153349830618433028 + 1.22863452409509552219214606515777594 i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: csinh (0.7 + 1.2 i) == 0.27487868678117583582 + 1.1698665727426565139 i": ++Test "Imaginary part of: csinh (0.75 + 1.25 i) == 0.259294854551162779153349830618433028 + 1.22863452409509552219214606515777594 i": + float: 1 + ifloat: 1 + +@@ -403,32 +368,22 @@ + ifloat: 1 + ildouble: 1 + ldouble: 1 +-Test "Real part of: csqrt (0.7 + 1.2 i) == 1.022067610030026450706487883081139 + 0.58704531296356521154977678719838035 i": +-double: 1 +-float: 1 +-idouble: 1 +-ifloat: 1 +-Test "Imaginary part of: csqrt (0.7 + 1.2 i) == 1.022067610030026450706487883081139 + 0.58704531296356521154977678719838035 i": +-float: 1 +-ifloat: 1 ++Test "Imaginary part of: csqrt (0.75 + 1.25 i) == 1.05065169626078392338656675760808326 + 0.594868882070379067881984030639932657 i": + ildouble: 1 + ldouble: 1 + + # ctan +-Test "Real part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i": ++Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": + double: 1 + idouble: 1 +-Test "Real part of: ctan (0.7 + 1.2 i) == 0.1720734197630349001 + 0.9544807059989405538 i": +-float: 1 +-ifloat: 1 +-Test "Imaginary part of: ctan (0.7 + 1.2 i) == 0.1720734197630349001 + 0.9544807059989405538 i": ++Test "Imaginary part of: ctan (0.75 + 1.25 i) == 0.160807785916206426725166058173438663 + 0.975363285031235646193581759755216379 i": + double: 1 +-float: 1 + idouble: 1 +-ifloat: 1 ++ildouble: 2 ++ldouble: 2 + + # ctanh +-Test "Real part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i": ++Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": + double: 1 + float: 2 + idouble: 1 +@@ -436,34 +391,25 @@ + Test "Imaginary part of: ctanh (0 + pi/4 i) == 0.0 + 1.0 i": + float: 1 + ifloat: 1 +-Test "Real part of: ctanh (0.7 + 1.2 i) == 1.3472197399061191630 + 0.4778641038326365540 i": +-double: 2 +-float: 1 +-idouble: 2 +-ifloat: 1 +-Test "Imaginary part of: ctanh (0.7 + 1.2 i) == 1.3472197399061191630 + 0.4778641038326365540 i": +-double: 2 +-float: 1 +-idouble: 2 +-ifloat: 1 ++Test "Real part of: ctanh (0.75 + 1.25 i) == 1.37260757053378320258048606571226857 + 0.385795952609750664177596760720790220 i": ++double: 1 ++idouble: 1 ++ ++# erf ++Test "erf (1.25) == 0.922900128256458230136523481197281140": ++double: 1 ++idouble: 1 + + # erfc +-Test "erfc (0.7) == 0.32219880616258152702": ++Test "erfc (2.0) == 0.00467773498104726583793074363274707139": + double: 1 + idouble: 1 +-Test "erfc (1.2) == 0.089686021770364619762": +-double: 2 +-float: 2 +-idouble: 2 +-ifloat: 2 +-Test "erfc (2.0) == 0.0046777349810472658379": ++Test "erfc (27.0) == 0.523704892378925568501606768284954709e-318": ++ildouble: 1 ++ldouble: 1 ++Test "erfc (4.125) == 0.542340079956506600531223408575531062e-8": + double: 1 + idouble: 1 +-Test "erfc (4.1) == 0.67000276540848983727e-8": +-double: 24 +-float: 12 +-idouble: 24 +-ifloat: 12 + + # exp10 + Test "exp10 (-1) == 0.1": +@@ -471,11 +417,11 @@ + float: 1 + idouble: 2 + ifloat: 1 +-Test "exp10 (0.7) == 5.0118723362727228500155418688494574": ++Test "exp10 (0.75) == 5.62341325190349080394951039776481231": ++double: 1 + float: 1 ++idouble: 1 + ifloat: 1 +-ildouble: 1 +-ldouble: 1 + Test "exp10 (3) == 1000": + double: 6 + float: 2 +@@ -485,6 +431,9 @@ + ldouble: 1 + + # expm1 ++Test "expm1 (0.75) == 1.11700001661267466854536981983709561": ++double: 1 ++idouble: 1 + Test "expm1 (1) == M_El - 1.0": + double: 1 + float: 1 +@@ -493,36 +442,10 @@ + ildouble: 1 + ldouble: 1 + +- +-# fmod +-Test "fmod (-6.5, -2.3) == -1.9": +-double: 2 +-float: 1 +-idouble: 2 +-ifloat: 1 +-ildouble: 2 +-ldouble: 2 +-Test "fmod (-6.5, 2.3) == -1.9": +-double: 2 +-float: 1 +-idouble: 2 +-ifloat: 1 +-ildouble: 2 +-ldouble: 2 +-Test "fmod (6.5, -2.3) == 1.9": +-double: 2 +-float: 1 +-idouble: 2 +-ifloat: 1 +-ildouble: 2 +-ldouble: 2 +-Test "fmod (6.5, 2.3) == 1.9": +-double: 2 +-float: 1 +-idouble: 2 +-ifloat: 1 +-ildouble: 2 +-ldouble: 2 ++# gamma ++Test "gamma (-0.5) == log(2*sqrt(pi))": ++ildouble: 1 ++ldouble: 1 + + # hypot + Test "hypot (-0.7, -12.4) == 12.419742348374220601176836866763271": +@@ -540,9 +463,6 @@ + Test "hypot (0.7, -12.4) == 12.419742348374220601176836866763271": + float: 1 + ifloat: 1 +-Test "hypot (0.7, 1.2) == 1.3892443989449804508432547041028554": +-double: 1 +-idouble: 1 + Test "hypot (0.7, 12.4) == 12.419742348374220601176836866763271": + float: 1 + ifloat: 1 +@@ -554,161 +474,213 @@ + ifloat: 1 + + # j0 +-Test "j0 (10.0) == -0.24593576445134833520": ++Test "j0 (-4.0) == -3.9714980986384737228659076845169804197562E-1": ++double: 1 ++float: 1 ++idouble: 1 ++ifloat: 1 ++Test "j0 (0.75) == 0.864242275166648623555731103820923211": ++float: 1 ++ifloat: 1 ++Test "j0 (10.0) == -0.245935764451348335197760862485328754": + double: 2 + float: 1 + idouble: 2 + ifloat: 1 +-Test "j0 (2.0) == 0.22389077914123566805": ++ildouble: 2 ++ldouble: 2 ++Test "j0 (2.0) == 0.223890779141235668051827454649948626": + float: 2 + ifloat: 2 +-Test "j0 (4.0) == -3.9714980986384737228659076845169804197562E-1" ++ildouble: 2 ++ldouble: 2 ++Test "j0 (4.0) == -3.9714980986384737228659076845169804197562E-1": + double: 1 +-idouble: 1 + float: 1 +-ifloat: 1 +-Test "j0 (-4.0) == -3.9714980986384737228659076845169804197562E-1" +-double: 1 + idouble: 1 +-float: 1 + ifloat: 1 +-Test "j0 (8.0) == 0.17165080713755390609": ++Test "j0 (8.0) == 0.171650807137553906090869407851972001": + float: 1 + ifloat: 1 ++ildouble: 1 ++ldouble: 1 + + # j1 +-Test "j1 (10.0) == 0.043472746168861436670": ++Test "j1 (-1.0) == -0.440050585744933515959682203718914913": ++ildouble: 1 ++ldouble: 1 ++Test "j1 (0.75) == 0.349243602174862192523281016426251335": ++ildouble: 1 ++ldouble: 1 ++Test "j1 (1.0) == 0.440050585744933515959682203718914913": ++ildouble: 1 ++ldouble: 1 ++Test "j1 (10.0) == 0.0434727461688614366697487680258592883": + float: 2 + ifloat: 2 +-Test "j1 (2.0) == 0.57672480775687338720": ++ildouble: 2 ++ldouble: 2 ++Test "j1 (2.0) == 0.576724807756873387202448242269137087": + double: 1 + idouble: 1 +-Test "j1 (8.0) == 0.23463634685391462438": ++Test "j1 (8.0) == 0.234636346853914624381276651590454612": + double: 1 + idouble: 1 ++ildouble: 4 ++ldouble: 4 + + # jn +-Test "jn (0, 10.0) == -0.24593576445134833520": ++Test "jn (0, -4.0) == -3.9714980986384737228659076845169804197562E-1": ++double: 1 ++float: 1 ++idouble: 1 ++ifloat: 1 ++Test "jn (0, 0.75) == 0.864242275166648623555731103820923211": ++float: 1 ++ifloat: 1 ++Test "jn (0, 10.0) == -0.245935764451348335197760862485328754": + double: 2 + float: 1 + idouble: 2 + ifloat: 1 +-Test "jn (0, 2.0) == 0.22389077914123566805": ++ildouble: 2 ++ldouble: 2 ++Test "jn (0, 2.0) == 0.223890779141235668051827454649948626": + float: 2 + ifloat: 2 +-Test "jn (0, 8.0) == 0.17165080713755390609": ++ildouble: 2 ++ldouble: 2 ++Test "jn (0, 4.0) == -3.9714980986384737228659076845169804197562E-1": ++double: 1 + float: 1 ++idouble: 1 + ifloat: 1 +-Test "jn (1, 10.0) == 0.043472746168861436670": ++Test "jn (0, 8.0) == 0.171650807137553906090869407851972001": ++float: 1 ++ifloat: 1 ++ildouble: 1 ++ldouble: 1 ++Test "jn (1, -1.0) == -0.440050585744933515959682203718914913": ++ildouble: 1 ++ldouble: 1 ++Test "jn (1, 0.75) == 0.349243602174862192523281016426251335": ++ildouble: 1 ++ldouble: 1 ++Test "jn (1, 1.0) == 0.440050585744933515959682203718914913": ++ildouble: 1 ++ldouble: 1 ++Test "jn (1, 10.0) == 0.0434727461688614366697487680258592883": + float: 2 + ifloat: 2 +-Test "jn (1, 2.0) == 0.57672480775687338720": ++ildouble: 2 ++ldouble: 2 ++Test "jn (1, 2.0) == 0.576724807756873387202448242269137087": + double: 1 + idouble: 1 +-Test "jn (1, 8.0) == 0.23463634685391462438": ++Test "jn (1, 8.0) == 0.234636346853914624381276651590454612": + double: 1 + idouble: 1 +-Test "jn (10, 0.1) == 0.26905328954342155795e-19": +-double: 6 +-float: 4 +-idouble: 6 +-ifloat: 4 +-Test "jn (10, 0.7) == 0.75175911502153953928e-11": +-double: 3 ++ildouble: 4 ++ldouble: 4 ++Test "jn (10, -1.0) == 0.263061512368745320699785368779050294e-9": ++ildouble: 1 ++ldouble: 1 ++Test "jn (10, 0.125) == 0.250543369809369890173993791865771547e-18": ++double: 1 + float: 1 +-idouble: 3 ++idouble: 1 + ifloat: 1 +-Test "jn (10, 10.0) == 0.20748610663335885770": ++ildouble: 1 ++ldouble: 1 ++Test "jn (10, 0.75) == 0.149621713117596814698712483621682835e-10": ++double: 1 ++float: 1 ++idouble: 1 ++ifloat: 1 ++ildouble: 1 ++ldouble: 1 ++Test "jn (10, 1.0) == 0.263061512368745320699785368779050294e-9": ++ildouble: 1 ++ldouble: 1 ++Test "jn (10, 10.0) == 0.207486106633358857697278723518753428": + double: 4 + float: 3 + idouble: 4 + ifloat: 3 +-Test "jn (10, 2.0) == 0.25153862827167367096e-6": ++ildouble: 2 ++ldouble: 2 ++Test "jn (10, 2.0) == 0.251538628271673670963516093751820639e-6": + float: 4 + ifloat: 4 +-Test "jn (3, 0.1) == 0.000020820315754756261429": ++Test "jn (3, 0.125) == 0.406503832554912875023029337653442868e-4": + double: 1 ++float: 1 + idouble: 1 +-Test "jn (3, 0.7) == 0.0069296548267508408077": ++ifloat: 1 ++Test "jn (3, 0.75) == 0.848438342327410884392755236884386804e-2": ++double: 1 + float: 1 ++idouble: 1 + ifloat: 1 +-Test "jn (3, 10.0) == 0.058379379305186812343": ++Test "jn (3, 10.0) == 0.0583793793051868123429354784103409563": + double: 3 + float: 1 + idouble: 3 + ifloat: 1 +-Test "jn (3, 2.0) == 0.12894324947440205110": ++ildouble: 2 ++ldouble: 2 ++Test "jn (3, 2.0) == 0.128943249474402051098793332969239835": + double: 1 + float: 2 + idouble: 1 + ifloat: 2 + + # lgamma +-Test "lgamma (0.7) == 0.26086724653166651439": ++Test "lgamma (-0.5) == log(2*sqrt(pi))": ++ildouble: 1 ++ldouble: 1 ++Test "lgamma (0.7) == 0.260867246531666514385732417016759578": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +-Test "lgamma (1.2) == -0.853740900033158497197e-1": ++Test "lgamma (1.2) == -0.853740900033158497197028392998854470e-1": + double: 1 + float: 2 + idouble: 1 + ifloat: 2 + +-# log +-Test "log (0.7) == -0.35667494393873237891263871124118447": +-double: 1 +-float: 1 +-idouble: 1 +-ifloat: 1 +-ildouble: 1 +-ldouble: 1 +- + # log10 +-Test "log10 (0.7) == -0.15490195998574316929": ++Test "log10 (0.75) == -0.124938736608299953132449886193870744": + double: 1 +-float: 1 ++float: 2 + idouble: 1 +-ifloat: 1 ++ifloat: 2 + Test "log10 (e) == log10(e)": + float: 1 + ifloat: 1 ++ildouble: 1 ++ldouble: 1 + + # log1p +-Test "log1p (-0.3) == -0.35667494393873237891263871124118447": +-double: 1 ++Test "log1p (-0.25) == -0.287682072451780927439219005993827432": + float: 1 +-idouble: 1 + ifloat: 1 ++Test "log1p (M_El - 1.0) == 1": + ildouble: 1 + ldouble: 1 + + # log2 +-Test "log2 (0.7) == -0.51457317282975824043": +-double: 1 +-float: 1 +-idouble: 1 +-ifloat: 1 +- +-# remquo +-Test "remquo (-1.625, 1.0, &x) sets x to -2": +-ildouble: 4 +-ldouble: 4 +-Test "remquo (1.625, -1.0, &x) sets x to -2": +-ildouble: 4 +-ldouble: 4 ++Test "log2 (0.75) == -.415037499278843818546261056052183492": ++ildouble: 1 ++ldouble: 1 + + # sincos +-Test "sincos (0.7, &sin_res, &cos_res) puts 0.76484218728448842625585999019186495 in cos_res": ++Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +-Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res": +-double: 1 +-float: 0.5 +-idouble: 1 +-ifloat: 0.5 + ildouble: 1 + ldouble: 1 + Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in sin_res": +@@ -719,22 +691,15 @@ + ildouble: 1 + ldouble: 1 + Test "sincos (pi/2, &sin_res, &cos_res) puts 0 in cos_res": +-double: 0.2758 +-float: 0.3667 +-idouble: 0.2758 +-ifloat: 0.3667 +-ildouble: 0.2252 +-ldouble: 0.2252 +-Test "sincos (pi/6, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in cos_res": +-float: 1 +-ifloat: 1 +- +-# sinh +-Test "sinh (0.7) == 0.75858370183953350346": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 ++ildouble: 1 ++ldouble: 1 ++Test "sincos (pi/6, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in cos_res": ++float: 1 ++ifloat: 1 + + # sqrt + Test "sqrt (2) == M_SQRT2l": +@@ -742,31 +707,23 @@ + ldouble: 1 + + # tan +-Test "tan (0.7) == 0.84228838046307944812813500221293775": +-ildouble: 1 +-ldouble: 1 + Test "tan (pi/4) == 1": +-double: 0.5 +-idouble: 0.5 +- +-# tanh +-Test "tanh (0.7) == 0.60436777711716349631": +-double: 1 +-float: 1 +-idouble: 1 +-ifloat: 1 +-Test "tanh (-0.7) == -0.60436777711716349631": + double: 1 +-float: 1 + idouble: 1 +-ifloat: 1 +-Test "tanh (1.0) == 0.7615941559557648881194582826047935904": +-ldouble: 1 ++ ++# tanh ++Test "tanh (-0.75) == -0.635148952387287319214434357312496495": + ildouble: 1 ++ldouble: 1 + Test "tanh (-1.0) == -0.7615941559557648881194582826047935904": ++ildouble: 1 + ldouble: 1 ++Test "tanh (0.75) == 0.635148952387287319214434357312496495": + ildouble: 1 +-Function: "tanh": ++ldouble: 1 ++Test "tanh (1.0) == 0.7615941559557648881194582826047935904": ++ildouble: 1 ++ldouble: 1 + + # tgamma + Test "tgamma (-0.5) == -2 sqrt (pi)": +@@ -774,198 +731,193 @@ + float: 1 + idouble: 1 + ifloat: 1 ++ildouble: 1 ++ldouble: 1 + Test "tgamma (0.5) == sqrt (pi)": + float: 1 + ifloat: 1 +-Test "tgamma (0.7) == 1.29805533264755778568": ++Test "tgamma (0.7) == 1.29805533264755778568117117915281162": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 ++Test "tgamma (4) == 6": ++ildouble: 1 ++ldouble: 1 + + # y0 +-Test "y0 (0.7) == -0.19066492933739506743": +-double: 2 +-float: 1 +-idouble: 2 +-ifloat: 1 +-Test "y0 (1.0) == 0.088256964215676957983": ++Test "y0 (1.0) == 0.0882569642156769579829267660235151628": + double: 2 + float: 1 + idouble: 2 + ifloat: 1 +-Test "y0 (1.5) == 0.38244892379775884396": ++Test "y0 (1.5) == 0.382448923797758843955068554978089862": + double: 2 + float: 1 + idouble: 2 + ifloat: 1 +-Test "y0 (10.0) == 0.055671167283599391424": ++Test "y0 (10.0) == 0.0556711672835993914244598774101900481": + float: 1 + ifloat: 1 +-Test "y0 (8.0) == 0.22352148938756622053": ++ildouble: 3 ++ldouble: 3 ++Test "y0 (8.0) == 0.223521489387566220527323400498620359": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 ++ildouble: 3 ++ldouble: 3 + + # y1 +-Test "y1 (0.1) == -6.4589510947020269877": ++Test "y1 (0.125) == -5.19993611253477499595928744876579921": + double: 1 + idouble: 1 +-Test "y1 (0.7) == -1.1032498719076333697": +-double: 1 +-float: 1 +-idouble: 1 +-ifloat: 1 +-Test "y1 (1.5) == -0.41230862697391129595": ++Test "y1 (0.75) == -1.03759455076928541973767132140642198": ++ildouble: 1 ++ldouble: 1 ++Test "y1 (1.5) == -0.412308626973911295952829820633445323": + float: 1 + ifloat: 1 +-Test "y1 (10.0) == 0.24901542420695388392": ++ildouble: 1 ++ldouble: 1 ++Test "y1 (10.0) == 0.249015424206953883923283474663222803": + double: 3 + float: 1 + idouble: 3 + ifloat: 1 +-Test "y1 (2.0) == -0.10703243154093754689": ++Test "y1 (2.0) == -0.107032431540937546888370772277476637": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +-Test "y1 (8.0) == -0.15806046173124749426": ++ildouble: 1 ++ldouble: 1 ++Test "y1 (8.0) == -0.158060461731247494255555266187483550": + double: 1 + float: 2 + idouble: 1 + ifloat: 2 ++ildouble: 1 ++ldouble: 1 + + # yn +-Test "yn (0, 0.7) == -0.19066492933739506743": +-double: 2 +-float: 1 +-idouble: 2 +-ifloat: 1 +-Test "yn (0, 1.0) == 0.088256964215676957983": ++Test "yn (0, 1.0) == 0.0882569642156769579829267660235151628": + double: 2 + float: 1 + idouble: 2 + ifloat: 1 +-Test "yn (0, 1.5) == 0.38244892379775884396": ++Test "yn (0, 1.5) == 0.382448923797758843955068554978089862": + double: 2 + float: 1 + idouble: 2 + ifloat: 1 +-Test "yn (0, 10.0) == 0.055671167283599391424": ++Test "yn (0, 10.0) == 0.0556711672835993914244598774101900481": + float: 1 + ifloat: 1 +-Test "yn (0, 8.0) == 0.22352148938756622053": ++ildouble: 3 ++ldouble: 3 ++Test "yn (0, 8.0) == 0.223521489387566220527323400498620359": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +-Test "yn (1, 0.1) == -6.4589510947020269877": +-double: 1 +-idouble: 1 +-Test "yn (1, 0.7) == -1.1032498719076333697": ++ildouble: 3 ++ldouble: 3 ++Test "yn (1, 0.125) == -5.19993611253477499595928744876579921": + double: 1 +-float: 1 + idouble: 1 +-ifloat: 1 +-Test "yn (1, 1.5) == -0.41230862697391129595": ++Test "yn (1, 0.75) == -1.03759455076928541973767132140642198": ++ildouble: 1 ++ldouble: 1 ++Test "yn (1, 1.5) == -0.412308626973911295952829820633445323": + float: 1 + ifloat: 1 +-Test "yn (1, 10.0) == 0.24901542420695388392": ++ildouble: 1 ++ldouble: 1 ++Test "yn (1, 10.0) == 0.249015424206953883923283474663222803": + double: 3 + float: 1 + idouble: 3 + ifloat: 1 +-Test "yn (1, 2.0) == -0.10703243154093754689": ++Test "yn (1, 2.0) == -0.107032431540937546888370772277476637": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +-Test "yn (1, 8.0) == -0.15806046173124749426": ++ildouble: 1 ++ldouble: 1 ++Test "yn (1, 8.0) == -0.158060461731247494255555266187483550": + double: 1 + float: 2 + idouble: 1 + ifloat: 2 +-Test "yn (10, 0.1) == -0.11831335132045197885e19": +-double: 2 +-float: 2 +-idouble: 2 +-ifloat: 2 +-Test "yn (10, 0.7) == -0.42447194260703866924e10": +-double: 3 +-idouble: 3 +-Test "yn (10, 1.0) == -0.12161801427868918929e9": ++ildouble: 1 ++ldouble: 1 ++Test "yn (10, 0.125) == -127057845771019398.252538486899753195": + double: 1 + idouble: 1 +-Test "yn (10, 10.0) == -0.35981415218340272205": ++ildouble: 2 ++ldouble: 2 ++Test "yn (10, 0.75) == -2133501638.90573424452445412893839236": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +-Test "yn (10, 2.0) == -129184.54220803928264": +-double: 2 +-idouble: 2 +-Test "yn (3, 0.1) == -5099.3323786129048894": ++ildouble: 5 ++ldouble: 5 ++Test "yn (10, 1.0) == -121618014.278689189288130426667971145": + double: 1 +-float: 1 + idouble: 1 +-ifloat: 1 +-Test "yn (3, 0.7) == -15.819479052819633505": +-double: 3 ++ildouble: 1 ++ldouble: 1 ++Test "yn (10, 10.0) == -0.359814152183402722051986577343560609": ++double: 1 + float: 1 +-idouble: 3 ++idouble: 1 + ifloat: 1 +-Test "yn (3, 10.0) == -0.25136265718383732978": ++ildouble: 2 ++ldouble: 2 ++Test "yn (10, 2.0) == -129184.542208039282635913145923304214": ++double: 2 ++idouble: 2 ++ildouble: 2 ++ldouble: 2 ++Test "yn (3, 0.125) == -2612.69757350066712600220955744091741": ++double: 1 ++idouble: 1 ++Test "yn (3, 0.75) == -12.9877176234475433186319774484809207": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +-Test "yn (3, 2.0) == -1.1277837768404277861": ++ildouble: 2 ++ldouble: 2 ++Test "yn (3, 10.0) == -0.251362657183837329779204747654240998": + double: 1 ++float: 1 + idouble: 1 +- +-# Maximal error of functions: +-Function: "acos": +-ldouble: 1 ++ifloat: 1 + ildouble: 1 +- +-Function: "asin": ++ldouble: 1 ++Test "yn (3, 2.0) == -1.12778377684042778608158395773179238": + double: 1 +-float: 2 + idouble: 1 +-ifloat: 2 +- +-Function: "atan": +-ildouble: 1 +-ldouble: 1 + ++# Maximal error of functions: + Function: "atan2": ++float: 3 ++ifloat: 3 + ildouble: 1 + ldouble: 1 +-float: 4 +-ifloat: 4 + + Function: "atanh": +-double: 1 +-idouble: 1 +- +-Function: "cabs": +-double: 1 +-float: 1 +-idouble: 1 +-ifloat: 1 +- +-Function: Real part of "cacos": +-double: 1 + float: 1 +-idouble: 1 + ifloat: 1 + + Function: Imaginary part of "cacos": +-float: 1 +-ifloat: 1 +-ildouble: 3 +-ldouble: 3 ++ildouble: 1 ++ldouble: 1 + + Function: Real part of "cacosh": + double: 1 +@@ -984,18 +936,14 @@ + ldouble: 1 + + Function: Real part of "casin": +-double: 3 +-float: 2 +-idouble: 3 +-ifloat: 2 +-ildouble: 1 +-ldouble: 1 +- +-Function: Imaginary part of "casin": ++double: 1 + float: 1 ++idouble: 1 + ifloat: 1 +-ildouble: 3 +-ldouble: 3 ++ ++Function: Imaginary part of "casin": ++ildouble: 1 ++ldouble: 1 + + Function: Real part of "casinh": + double: 5 +@@ -1027,28 +975,30 @@ + + Function: Real part of "catanh": + double: 4 +-float: 1 + idouble: 4 +-ifloat: 1 ++ildouble: 1 ++ldouble: 1 + + Function: Imaginary part of "catanh": +-double: 1 + float: 6 +-idouble: 1 + ifloat: 6 ++ildouble: 1 ++ldouble: 1 + + Function: "cbrt": + double: 1 + idouble: 1 ++ildouble: 1 ++ldouble: 1 + + Function: Real part of "ccos": + double: 1 ++float: 1 + idouble: 1 ++ifloat: 1 + + Function: Imaginary part of "ccos": +-double: 1 + float: 1 +-idouble: 1 + ifloat: 1 + + Function: Real part of "ccosh": +@@ -1058,15 +1008,11 @@ + ifloat: 1 + + Function: Imaginary part of "ccosh": +-double: 1 + float: 1 +-idouble: 1 + ifloat: 1 + + Function: Real part of "cexp": +-double: 1 + float: 1 +-idouble: 1 + ifloat: 1 + ildouble: 1 + ldouble: 1 +@@ -1077,16 +1023,18 @@ + ildouble: 1 + ldouble: 1 + ++Function: Real part of "clog": ++float: 1 ++ifloat: 1 ++ildouble: 1 ++ldouble: 1 ++ + Function: Imaginary part of "clog": +-double: 1 + float: 3 +-idouble: 1 + ifloat: 3 + + Function: Real part of "clog10": +-double: 1 + float: 1 +-idouble: 1 + ifloat: 1 + + Function: Imaginary part of "clog10": +@@ -1094,6 +1042,7 @@ + float: 5 + idouble: 1 + ifloat: 5 ++ldouble: 1 + + Function: "cos": + double: 2 +@@ -1104,24 +1053,24 @@ + ldouble: 1 + + Function: Real part of "cpow": +-double: 1 ++double: 2 + float: 4 +-idouble: 1 ++idouble: 2 + ifloat: 4 +-ildouble: 3 +-ldouble: 3 ++ildouble: 1 ++ldouble: 1 + + Function: Imaginary part of "cpow": +-double: 1.1031 ++double: 2 + float: 2 +-idouble: 1.1031 ++idouble: 2 + ifloat: 2 +-ildouble: 0.9006 +-ldouble: 0.9006 ++ildouble: 1 ++ldouble: 1 + +-Function: Imaginary part of "csin": +-float: 1 +-ifloat: 1 ++Function: Real part of "csin": ++ildouble: 1 ++ldouble: 1 + + Function: Real part of "csinh": + float: 1 +@@ -1134,48 +1083,44 @@ + ifloat: 1 + + Function: Real part of "csqrt": +-double: 1 + float: 1 +-idouble: 1 + ifloat: 1 + ildouble: 1 + ldouble: 1 + + Function: Imaginary part of "csqrt": +-float: 1 +-ifloat: 1 + ildouble: 1 + ldouble: 1 + + Function: Real part of "ctan": + double: 1 +-float: 1 + idouble: 1 +-ifloat: 1 + + Function: Imaginary part of "ctan": + double: 1 +-float: 1 + idouble: 1 +-ifloat: 1 ++ildouble: 2 ++ldouble: 2 + + Function: Real part of "ctanh": +-double: 2 ++double: 1 + float: 2 +-idouble: 2 ++idouble: 1 + ifloat: 2 + + Function: Imaginary part of "ctanh": +-double: 2 + float: 1 +-idouble: 2 + ifloat: 1 + ++Function: "erf": ++double: 1 ++idouble: 1 ++ + Function: "erfc": +-double: 24 +-float: 12 +-idouble: 24 +-ifloat: 12 ++double: 1 ++idouble: 1 ++ildouble: 1 ++ldouble: 1 + + Function: "exp10": + double: 6 +@@ -1190,19 +1135,15 @@ + float: 1 + idouble: 1 + ifloat: 1 ++ildouble: 1 ++ldouble: 1 + +-Function: "fmod": +-double: 2 +-float: 1 +-idouble: 2 +-ifloat: 1 +-ildouble: 2 +-ldouble: 2 ++Function: "gamma": ++ildouble: 1 ++ldouble: 1 + + Function: "hypot": +-double: 1 + float: 1 +-idouble: 1 + ifloat: 1 + + Function: "j0": +@@ -1210,52 +1151,50 @@ + float: 2 + idouble: 2 + ifloat: 2 ++ildouble: 2 ++ldouble: 2 + + Function: "j1": + double: 1 + float: 2 + idouble: 1 + ifloat: 2 ++ildouble: 4 ++ldouble: 4 + + Function: "jn": +-double: 6 ++double: 4 + float: 4 +-idouble: 6 ++idouble: 4 + ifloat: 4 ++ildouble: 4 ++ldouble: 4 + + Function: "lgamma": + double: 1 + float: 2 + idouble: 1 + ifloat: 2 +- +-Function: "log": +-double: 1 +-float: 1 +-idouble: 1 +-ifloat: 1 + ildouble: 1 + ldouble: 1 + + Function: "log10": + double: 1 +-float: 1 ++float: 2 + idouble: 1 +-ifloat: 1 ++ifloat: 2 ++ildouble: 1 ++ldouble: 1 + + Function: "log1p": +-double: 1 + float: 1 +-idouble: 1 + ifloat: 1 + ildouble: 1 + ldouble: 1 + + Function: "log2": +-double: 1 +-float: 1 +-idouble: 1 +-ifloat: 1 ++ildouble: 1 ++ldouble: 1 + + Function: "sincos": + double: 1 +@@ -1265,50 +1204,48 @@ + ildouble: 1 + ldouble: 1 + +-Function: "sinh": +-double: 1 +-float: 1 +-idouble: 1 +-ifloat: 1 +- + Function: "sqrt": + ildouble: 1 + ldouble: 1 + + Function: "tan": +-double: 0.5 +-idouble: 0.5 +-ildouble: 1 +-ldouble: 1 +- +-Function: "tanh": + double: 1 +-float: 1 + idouble: 1 +-ifloat: 1 ++ ++Function: "tanh": ++ildouble: 1 ++ldouble: 1 + + Function: "tgamma": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 ++ildouble: 1 ++ldouble: 1 + + Function: "y0": + double: 2 + float: 1 + idouble: 2 + ifloat: 1 ++ildouble: 3 ++ldouble: 3 + + Function: "y1": + double: 3 + float: 2 + idouble: 3 + ifloat: 2 ++ildouble: 1 ++ldouble: 1 + + Function: "yn": + double: 3 + float: 2 + idouble: 3 + ifloat: 2 ++ildouble: 5 ++ldouble: 5 + + # end of automatic generation +diff -u -udbrN glibc-2.3.2/sysdeps/unix/Makefile glibc-2.3.2-200304020432/sysdeps/unix/Makefile +--- glibc-2.3.2/sysdeps/unix/Makefile Thu Jan 16 01:47:25 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/Makefile Thu Mar 27 10:47:16 2003 +@@ -1,4 +1,5 @@ +-# Copyright (C) 1991,92,93,94,95,96,97,98,99 Free Software Foundation, Inc. ++# Copyright (C) 1991,1992,1993,1994,1995,1996,1997,1998,1999,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 +@@ -281,10 +282,47 @@ + + ifeq (misc,$(subdir)) + sysdep_routines += $(unix-extra-syscalls) ++ ++ifdef unix-stub-syscalls ++# The system call entry points in this list are supposed to be additional ++# functions not overriding any other sysdeps/.../call.c implementation, but ++# their system call numbers are unavailable in the kernel headers we're ++# using. Instead of a system call stub, these get a function that fails ++# with ENOSYS. We just generate a single module defining one function and ++# making all these entry point names aliases for it. ++sysdep_routines += stub-syscalls ++$(objpfx)stub-syscalls.c: $(common-objpfx)sysd-syscalls \ ++ $(..)sysdeps/unix/Makefile ++ (echo '#include '; \ ++ echo 'long int _no_syscall (void)'; \ ++ echo '{ __set_errno (ENOSYS); return -1L; }'; \ ++ for call in $(unix-stub-syscalls); do \ ++ case $$call in \ ++ *@@*) ver=$${call##*@}; call=$${call%%*@}; \ ++ echo "strong_alias (_no_syscall, $${call}_$${ver})"; \ ++ echo "default_symbol_version \ ++ ($${call}_$${ver}, $$call, $$ver);" ;; \ ++ *@@*) ver=$${call##*@}; call=$${call%%*@}; \ ++ echo "strong_alias (_no_syscall, $${call}_$${ver})"; \ ++ echo "symbol_version ($${call}_$${ver}, $$call, $$ver);" ;; \ ++ *) echo "weak_alias (_no_syscall, $$call)"; \ ++ echo "stub_warning ($$call)"; \ ++ echo "weak_alias (_no_syscall, __GI_$$call)" ;; \ ++ esac; \ ++ echo '#include '; \ ++ done) > $@T ++ mv -f $@T $@ ++generated += stub-syscalls.c ++endif + endif + + export sysdirs + export asm_CPP := $(COMPILE.S) -E -x assembler-with-cpp ++ ++# This is the end of the pipeline for compiling the syscall stubs. ++# The stdin in assembler with cpp using sysdep.h macros. ++# Be sure to disable debugging info since it would all just say "". ++compile-syscall = $(filter-out -g%,$(COMPILE.S)) -x assembler-with-cpp -o $@ - + + ifndef avoid-generated + $(common-objpfx)sysd-syscalls: $(..)sysdeps/unix/make-syscalls.sh \ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/alpha/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/alpha/sysdep.h +--- glibc-2.3.2/sysdeps/unix/alpha/sysdep.h Sun Jan 26 22:07:32 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/alpha/sysdep.h Sun Mar 23 20:42:22 2003 +@@ -119,6 +119,21 @@ + END(sym) + #endif + ++#define PSEUDO_NOERRNO(name, syscall_name, args) \ ++ .globl name; \ ++ .align 4; \ ++ .ent name,0; \ ++__LABEL(name) \ ++ PSEUDO_PROLOGUE; \ ++ PSEUDO_PREPARE_ARGS \ ++ lda v0, SYS_ify(syscall_name); \ ++ call_pal PAL_callsys; ++ ++#undef PSEUDO_END_NOERRNO ++#define PSEUDO_END_NOERRNO(sym) END(sym) ++ ++#define ret_NOERRNO ret ++ + #define r0 v0 + #define r1 a4 + +diff -u -udbrN glibc-2.3.2/sysdeps/unix/clock_gettime.c glibc-2.3.2-200304020432/sysdeps/unix/clock_gettime.c +--- glibc-2.3.2/sysdeps/unix/clock_gettime.c Fri Feb 1 00:39:56 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/clock_gettime.c Sun Mar 16 11:08:19 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ++/* Copyright (C) 1999, 2000, 2001, 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 +@@ -41,17 +41,28 @@ + int + clock_gettime (clockid_t clock_id, struct timespec *tp) + { +- struct timeval tv; + int retval = -1; + + switch (clock_id) + { ++#define HANDLE_REALTIME \ ++ do { \ ++ struct timeval tv; \ ++ retval = gettimeofday (&tv, NULL); \ ++ if (retval == 0) \ ++ /* Convert into `timespec'. */ \ ++ TIMEVAL_TO_TIMESPEC (&tv, tp); \ ++ } while (0) ++ ++#ifdef SYSDEP_GETTIME ++ SYSDEP_GETTIME; ++#endif ++ ++#ifndef HANDLED_REALTIME + case CLOCK_REALTIME: +- retval = gettimeofday (&tv, NULL); +- if (retval == 0) +- /* Convert into `timespec'. */ +- TIMEVAL_TO_TIMESPEC (&tv, tp); ++ HANDLE_REALTIME; + break; ++#endif + + #if HP_TIMING_AVAIL + case CLOCK_PROCESS_CPUTIME_ID: +diff -u -udbrN glibc-2.3.2/sysdeps/unix/clock_nanosleep.c glibc-2.3.2-200304020432/sysdeps/unix/clock_nanosleep.c +--- glibc-2.3.2/sysdeps/unix/clock_nanosleep.c Sat Jul 7 21:21:29 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/clock_nanosleep.c Mon Mar 3 05:46:57 2003 +@@ -1,5 +1,5 @@ + /* High-resolution sleep with the specified clock. +- Copyright (C) 2000, 2001 Free Software Foundation, Inc. ++ Copyright (C) 2000, 2001, 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 +@@ -24,11 +24,16 @@ + + + #if HP_TIMING_AVAIL +-# define CLOCK_P(clock) \ +- (clock) != CLOCK_PROCESS_CPUTIME_ID \ +- && (clock) != CLOCK_THREAD_CPUTIME_ID ++# define CPUCLOCK_P(clock) \ ++ ((clock) != CLOCK_PROCESS_CPUTIME_ID \ ++ && (clock) != CLOCK_THREAD_CPUTIME_ID) + #else +-# define CLOCK_P(clock) 0 ++# define CPUCLOCK_P(clock) 0 ++#endif ++ ++#ifndef INVALID_CLOCK_P ++# define INVALID_CLOCK_P(cl) \ ++ ((cl) < CLOCK_REALTIME || (cl) > CLOCK_THREAD_CPUTIME_ID || CPUCLOCK_P (cl)) + #endif + + +@@ -44,6 +49,16 @@ + || __builtin_expect (req->tv_nsec, 0) >= 1000000000) + return EINVAL; + ++ if (CPUCLOCK_P (clock_id)) ++ return ENOTSUP; ++ ++ if (INVALID_CLOCK_P (clock_id)) ++ return EINVAL; ++ ++#ifdef SYSDEP_NANOSLEEP ++ SYSDEP_NANOSLEEP; ++#endif ++ + /* If we got an absolute time, remap it. */ + if (flags == TIMER_ABSTIME) + { +@@ -76,11 +91,8 @@ + else if (__builtin_expect (flags, 0) != 0) + return EINVAL; + else if (clock_id != CLOCK_REALTIME) +- { +- /* Make sure the clock ID is correct. */ +- if (__builtin_expect (! CLOCK_P (clock_id), 0)) +- return EINVAL; +- } ++ /* Not supported. */ ++ return ENOTSUP; + + return __builtin_expect (nanosleep (req, rem), 0) ? errno : 0; + } +diff -u -udbrN glibc-2.3.2/sysdeps/unix/clock_settime.c glibc-2.3.2-200304020432/sysdeps/unix/clock_settime.c +--- glibc-2.3.2/sysdeps/unix/clock_settime.c Fri Feb 1 00:40:41 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/clock_settime.c Sun Mar 16 11:08:38 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ++/* Copyright (C) 1999, 2000, 2001, 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,7 +40,6 @@ + int + clock_settime (clockid_t clock_id, const struct timespec *tp) + { +- struct timeval tv; + int retval; + + /* Make sure the time cvalue is OK. */ +@@ -52,11 +51,23 @@ + + switch (clock_id) + { +- case CLOCK_REALTIME: +- TIMESPEC_TO_TIMEVAL (&tv, tp); ++#define HANDLE_REALTIME \ ++ do { \ ++ struct timeval tv; \ ++ TIMESPEC_TO_TIMEVAL (&tv, tp); \ ++ \ ++ retval = settimeofday (&tv, NULL); \ ++ } while (0) + +- retval = settimeofday (&tv, NULL); ++#ifdef SYSDEP_GETTIME ++ SYSDEP_GETTIME; ++#endif ++ ++#ifndef HANDLED_REALTIME ++ case CLOCK_REALTIME: ++ HANDLE_REALTIME; + break; ++#endif + + #if HP_TIMING_AVAIL + case CLOCK_PROCESS_CPUTIME_ID: +diff -u -udbrN glibc-2.3.2/sysdeps/unix/make-syscalls.sh glibc-2.3.2-200304020432/sysdeps/unix/make-syscalls.sh +--- glibc-2.3.2/sysdeps/unix/make-syscalls.sh Thu Jan 16 01:47:25 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/make-syscalls.sh Wed Mar 26 23:49:15 2003 +@@ -84,8 +84,10 @@ + esac + + cancellable= ++ noerrno= + case $args in + C*) cancellable=-cancel; args=`echo $args | sed 's/C:\?//'`;; ++ E*) noerrno=_NOERRNO; args=`echo $args | sed 's/E:\?//'`;; + esac + + # Derive the number of arguments from the argument signature +@@ -109,6 +111,16 @@ + echo "#### CALL=$file NUMBER=$callnum ARGS=$args SOURCE=$srcfile" + + case x$srcfile"$callnum" in ++ x--) ++ # Undefined callnum for an extra syscall. ++ if [ x$caller != x- ]; then ++ if [ x$noerrno != x ]; then ++ echo >&2 "$0: no number for $fileno, no-error syscall ($strong $weak)" ++ exit 2 ++ fi ++ echo "unix-stub-syscalls += $strong $weak" ++ fi ++ ;; + x*-) ;; ### Do nothing for undefined callnum + x-*) + echo "ifeq (,\$(filter $file,\$(unix-syscalls)))" +@@ -149,9 +161,9 @@ + echo "\ + \$(make-target-directory) + (echo '#include '; \\ +- echo 'PSEUDO ($strong, $syscall, $nargs)'; \\ +- echo ' ret'; \\ +- echo 'PSEUDO_END($strong)'; \\ ++ echo 'PSEUDO$noerrno ($strong, $syscall, $nargs)'; \\ ++ echo ' ret$noerrno'; \\ ++ echo 'PSEUDO_END$noerrno($strong)'; \\ + echo 'libc_hidden_def ($strong)'; \\" + ;; + esac +@@ -198,7 +210,7 @@ + done + + # And finally, pipe this all into the compiler. +- echo ' ) | $(COMPILE.S) -x assembler-with-cpp -o $@ -' ++ echo ' ) | $(compile-syscall)' + + case $weak in + *@*) +diff -u -udbrN glibc-2.3.2/sysdeps/unix/mips/brk.S glibc-2.3.2-200304020432/sysdeps/unix/mips/brk.S +--- glibc-2.3.2/sysdeps/unix/mips/brk.S Sun Jan 12 08:54:14 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/mips/brk.S Mon Mar 17 16:47:12 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1992, 1995, 1997 Free Software Foundation, Inc. ++/* Copyright (C) 1992, 1995, 1997, 2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + +@@ -18,6 +18,7 @@ + 02111-1307 USA. */ + + #include ++#include + + #ifndef SYS_brk + #define SYS_brk 17 +@@ -37,9 +38,9 @@ + .set reorder + /* Handle the query case. */ + bnez a0, 1f +- move a0,v0 ++ move a0, v0 + 1: /* Update __curbrk and exit cleanly. */ +- sw a0, __curbrk ++ PTR_S a0, __curbrk + move v0, zero + jr ra + PSEUDO_END(__brk) +diff -u -udbrN glibc-2.3.2/sysdeps/unix/mips/mips32/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/mips/mips32/sysdep.h +--- glibc-2.3.2/sysdeps/unix/mips/mips32/sysdep.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/mips/mips32/sysdep.h Sat Mar 29 09:15:28 2003 +@@ -0,0 +1,52 @@ ++/* Copyright (C) 1992, 1995, 1997, 1999, 2000, 2002, 2003 ++ Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Brendan Kehoe (brendan@zen.org). ++ ++ 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 ++ ++/* Note that while it's better structurally, going back to call __syscall_error ++ can make things confusing if you're debugging---it looks like it's jumping ++ backwards into the previous fn. */ ++#ifdef __PIC__ ++#define PSEUDO(name, syscall_name, args) \ ++ .align 2; \ ++ 99: la t9,__syscall_error; \ ++ jr t9; \ ++ ENTRY(name) \ ++ .set noreorder; \ ++ .cpload t9; \ ++ li v0, SYS_ify(syscall_name); \ ++ syscall; \ ++ .set reorder; \ ++ bne a3, zero, 99b; \ ++L(syse1): ++#else ++#define PSEUDO(name, syscall_name, args) \ ++ .set noreorder; \ ++ .align 2; \ ++ 99: j __syscall_error; \ ++ nop; \ ++ ENTRY(name) \ ++ .set noreorder; \ ++ li v0, SYS_ify(syscall_name); \ ++ syscall; \ ++ .set reorder; \ ++ bne a3, zero, 99b; \ ++L(syse1): ++#endif +diff -u -udbrN glibc-2.3.2/sysdeps/unix/mips/mips64/n32/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/mips/mips64/n32/sysdep.h +--- glibc-2.3.2/sysdeps/unix/mips/mips64/n32/sysdep.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/mips/mips64/n32/sysdep.h Sat Mar 29 09:15:28 2003 +@@ -0,0 +1,57 @@ ++/* Copyright (C) 1992, 1995, 1997, 1999, 2000, 2002, 2003 ++ Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Alexandre Oliva . ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++ ++#ifdef __ASSEMBLER__ ++ ++/* Note that while it's better structurally, going back to call __syscall_error ++ can make things confusing if you're debugging---it looks like it's jumping ++ backwards into the previous fn. */ ++#ifdef __PIC__ ++#define PSEUDO(name, syscall_name, args) \ ++ .align 2; \ ++ 99:; \ ++ .set noat; \ ++ .cpsetup t9, $1, name; \ ++ .set at; \ ++ la t9,__syscall_error; \ ++ .cpreturn; \ ++ jr t9; \ ++ ENTRY(name) \ ++ li v0, SYS_ify(syscall_name); \ ++ syscall; \ ++ bne a3, zero, 99b; \ ++L(syse1): ++#else ++#define PSEUDO(name, syscall_name, args) \ ++ .set noreorder; \ ++ .align 2; \ ++ 99: j __syscall_error; \ ++ ENTRY(name) \ ++ .set noreorder; \ ++ li v0, SYS_ify(syscall_name); \ ++ syscall; \ ++ .set reorder; \ ++ bne a3, zero, 99b; \ ++L(syse1): ++#endif ++ ++#endif +diff -u -udbrN glibc-2.3.2/sysdeps/unix/mips/mips64/n64/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/mips/mips64/n64/sysdep.h +--- glibc-2.3.2/sysdeps/unix/mips/mips64/n64/sysdep.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/mips/mips64/n64/sysdep.h Sat Mar 29 09:15:28 2003 +@@ -0,0 +1,57 @@ ++/* Copyright (C) 1992, 1995, 1997, 1999, 2000, 2002, 2003 ++ Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Alexandre Oliva . ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++ ++#ifdef __ASSEMBLER__ ++ ++/* Note that while it's better structurally, going back to call __syscall_error ++ can make things confusing if you're debugging---it looks like it's jumping ++ backwards into the previous fn. */ ++#ifdef __PIC__ ++#define PSEUDO(name, syscall_name, args) \ ++ .align 2; \ ++ 99:; \ ++ .set noat; \ ++ .cpsetup t9, $1, name; \ ++ .set at; \ ++ dla t9,__syscall_error; \ ++ .cpreturn; \ ++ jr t9; \ ++ ENTRY(name) \ ++ li v0, SYS_ify(syscall_name); \ ++ syscall; \ ++ bne a3, zero, 99b; \ ++L(syse1): ++#else ++#define PSEUDO(name, syscall_name, args) \ ++ .set noreorder; \ ++ .align 2; \ ++ 99: j __syscall_error; \ ++ ENTRY(name) \ ++ .set noreorder; \ ++ li v0, SYS_ify(syscall_name); \ ++ syscall; \ ++ .set reorder; \ ++ bne a3, zero, 99b; \ ++L(syse1): ++#endif ++ ++#endif +diff -u -udbrN glibc-2.3.2/sysdeps/unix/mips/sysdep.S glibc-2.3.2-200304020432/sysdeps/unix/mips/sysdep.S +--- glibc-2.3.2/sysdeps/unix/mips/sysdep.S Mon Jan 27 19:55:20 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/mips/sysdep.S Fri Mar 28 08:02:35 2003 +@@ -1,4 +1,5 @@ +-/* Copyright (C) 1992,93,94,97,98,99,2000 Free Software Foundation, Inc. ++/* Copyright (C) 1992, 1993, 1994, 1997, 1998, 1999, 2000, 2002, 2003 ++ Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + +@@ -20,47 +21,52 @@ + #include + #define _ERRNO_H + #include ++#include + + #ifdef _LIBC_REENTRANT + ++LOCALSZ= 3 ++FRAMESZ= (((NARGSAVE+LOCALSZ)*SZREG)+ALSZ)&ALMASK ++RAOFF= FRAMESZ-(1*SZREG) ++GPOFF= FRAMESZ-(2*SZREG) ++V0OFF= FRAMESZ-(3*SZREG) ++ + ENTRY(__syscall_error) + #ifdef __PIC__ +- .set noreorder + .set noat +- move AT, ra +- bltzal zero, 0f +- nop +-0: .cpload ra +- move ra, AT ++ SETUP_GPX (AT) + .set at +- .set reorder + #endif +- subu sp, 32 ++ PTR_SUBU sp, FRAMESZ ++ .set noat ++ SETUP_GPX64(GPOFF,AT) ++ .set at + #ifdef __PIC__ +- .cprestore 16 ++ SAVE_GP(GPOFF) + #endif +- sw v0, 20(sp) +- sw ra, 24(sp) ++ REG_S v0, V0OFF(sp) ++ REG_S ra, RAOFF(sp) + + #if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN + /* We translate the system's EWOULDBLOCK error into EAGAIN. + The GNU C library always defines EWOULDBLOCK==EAGAIN. + EWOULDBLOCK_sys is the original number. */ +- bne v0, EWOULDBLOCK_sys, skip ++ bne v0, EWOULDBLOCK_sys, L(skip) + nop + li v0, EAGAIN +-skip: ++L(skip): + #endif + /* Find our per-thread errno address */ + jal __errno_location + + /* Store the error value. */ +- lw t0, 20(sp) +- sw t0, 0(v0) ++ REG_L t4, V0OFF(sp) ++ sw t4, 0(v0) + + /* And just kick back a -1. */ +- lw ra, 24(sp) +- addiu sp, 32 ++ REG_L ra, RAOFF(sp) ++ RESTORE_GP64 ++ PTR_ADDU sp, FRAMESZ + li v0, -1 + j ra + END(__syscall_error) +@@ -70,29 +76,25 @@ + + ENTRY(__syscall_error) + #ifdef __PIC__ +- .set noreorder +- .set noat +- move AT, ra +- bltzal zero, 0f +- nop +-0: .cpload ra +- move ra, AT +- .set at +- .set reorder ++ SETUP_GPX (AT) + #endif ++ SETUP_GPX64 (t9, AT) ++ + #if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN + /* We translate the system's EWOULDBLOCK error into EAGAIN. + The GNU C library always defines EWOULDBLOCK==EAGAIN. + EWOULDBLOCK_sys is the original number. */ +- bne v0, EWOULDBLOCK_sys, skip ++ bne v0, EWOULDBLOCK_sys, L(skip) + li v0, EAGAIN +-skip: ++L(skip): + #endif + /* Store it in errno... */ + sw v0, errno + + /* And just kick back a -1. */ + li v0, -1 ++ ++ RESTORE_GP64 + j ra + END(__syscall_error) + #endif /* _LIBC_REENTRANT */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/mips/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/mips/sysdep.h +--- glibc-2.3.2/sysdeps/unix/mips/sysdep.h Wed Nov 6 19:22:28 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/mips/sysdep.h Sat Mar 29 09:15:28 2003 +@@ -1,4 +1,5 @@ +-/* Copyright (C) 1992,95,97,99,2000 Free Software Foundation, Inc. ++/* Copyright (C) 1992, 1995, 1997, 1999, 2000, 2002, 2003 ++ Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + +@@ -29,48 +30,36 @@ + .ent name,0; \ + name##: + +-/* Note that while it's better structurally, going back to call __syscall_error +- can make things confusing if you're debugging---it looks like it's jumping +- backwards into the previous fn. */ +-#ifdef __PIC__ +- #define PSEUDO(name, syscall_name, args) \ +- .align 2; \ +- 99: la t9,__syscall_error; \ +- jr t9; \ +- ENTRY(name) \ +- .set noreorder; \ +- .cpload t9; \ +- li v0, SYS_ify(syscall_name); \ +- syscall; \ +- .set reorder; \ +- bne a3, zero, 99b; \ +-syse1: +-#else +-#define PSEUDO(name, syscall_name, args) \ +- .set noreorder; \ ++#undef END ++#define END(function) \ ++ .end function; \ ++ .size function,.-function ++ ++#define ret j ra ; nop ++ ++#define PSEUDO_END(sym) .end sym; .size sym,.-sym ++ ++#define PSEUDO_NOERRNO(name, syscall_name, args) \ + .align 2; \ +- 99: j __syscall_error; \ +- nop; \ + ENTRY(name) \ + .set noreorder; \ + li v0, SYS_ify(syscall_name); \ +- syscall; \ +- .set reorder; \ +- bne a3, zero, 99b; \ +-syse1: +-#endif +- +-#undef PSEUDO_END +-#define PSEUDO_END(sym) .end sym ++ syscall + +-#define ret j ra ; nop ++#undef PSEUDO_END_NOERRNO ++#define PSEUDO_END_NOERRNO(sym) .end sym; .size sym,.-sym + +-#undef END +-#define END(sym) .end sym ++#define ret_NOERRNO ret + + #define r0 v0 + #define r1 v1 + /* The mips move insn is d,s. */ + #define MOVE(x,y) move y , x ++ ++#if _MIPS_SIM == _MIPS_SIM_ABI32 || _MIPS_SIM == _MIPS_SIM_ABIO64 ++# define L(label) $L ## label ++#else ++# define L(label) .L ## label ++#endif + + #endif +diff -u -udbrN glibc-2.3.2/sysdeps/unix/mips/wait.S glibc-2.3.2-200304020432/sysdeps/unix/mips/wait.S +--- glibc-2.3.2/sysdeps/unix/mips/wait.S Sat Jul 7 21:21:30 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/mips/wait.S Fri Mar 14 04:59:37 2003 +@@ -1,4 +1,5 @@ +-/* Copyright (C) 1992, 1994, 1995, 1997 Free Software Foundation, Inc. ++/* Copyright (C) 1992, 1994, 1995, 1997, 2002, 2003 ++ Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + +@@ -28,18 +29,18 @@ + + li v0, SYS_wait + syscall +- beqz a3, noerror ++ beqz a3, L(noerror) + nop + j __syscall_error + nop + +-noerror: ++L(noerror): + /* If the arg is not NULL, store v1 there. */ +- beqz a0, noarg ++ beqz a0, L(noarg) + nop + sw v1, 0(a0) + nop +-noarg: ++L(noarg): + ret + .end __wait + +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sparc/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/sparc/sysdep.h +--- glibc-2.3.2/sysdeps/unix/sparc/sysdep.h Sat Jul 7 21:21:30 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sparc/sysdep.h Sun Mar 23 20:42:22 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1993, 1994, 1995, 1997 Free Software Foundation, Inc. ++/* Copyright (C) 1993, 1994, 1995, 1997, 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 +@@ -52,7 +52,14 @@ + jmp %g1 + %lo(syscall_error); nop; \ + 1: + ++#define PSEUDO_NOERRNO(name, syscall_name, args) \ ++ .global syscall_error; \ ++ ENTRY (name) \ ++ mov SYS_ify(syscall_name), %g1; \ ++ ta 0 ++ + #define ret retl; nop ++#define ret_NOERRNO retl; nop + #define r0 %o0 + #define r1 %o1 + #define MOVE(x,y) mov x, y +diff -u -udbrN glibc-2.3.2/sysdeps/unix/syscalls.list glibc-2.3.2-200304020432/sysdeps/unix/syscalls.list +--- glibc-2.3.2/sysdeps/unix/syscalls.list Fri Jan 31 04:39:32 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/syscalls.list Sun Mar 23 20:36:50 2003 +@@ -14,13 +14,13 @@ + fstatfs - fstatfs i:ip __fstatfs fstatfs + fsync - fsync Ci:i __libc_fsync fsync + getdomain - getdomainname i:si getdomainname +-getgid - getgid i: __getgid getgid ++getgid - getgid Ei: __getgid getgid + getgroups - getgroups i:ip __getgroups getgroups + getitimer - getitimer i:ip __getitimer getitimer +-getpid - getpid i: __getpid getpid ++getpid - getpid Ei: __getpid getpid + getpriority - getpriority i:ii getpriority + getrlimit - getrlimit i:ip __getrlimit getrlimit +-getuid - getuid i: __getuid getuid ++getuid - getuid Ei: __getuid getuid + ioctl - ioctl i:iiI __ioctl ioctl + kill - kill i:ii __kill kill + link - link i:ss __link link +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/sysdep.h +--- glibc-2.3.2/sysdeps/unix/sysdep.h Sat Jul 7 21:21:29 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysdep.h Wed Mar 26 19:07:28 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1991, 92, 93, 96, 98 Free Software Foundation, Inc. ++/* Copyright (C) 1991, 92, 93, 96, 98, 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 +@@ -46,6 +46,9 @@ + to generate correct debugging information. */ + #ifndef PSEUDO_END + #define PSEUDO_END(sym) ++#endif ++#ifndef PSEUDO_END_NOERRNO ++#define PSEUDO_END_NOERRNO(sym) PSEUDO_END(sym) + #endif + + /* Wrappers around system calls should normally inline the system call code. +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/Makefile glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/Makefile +--- glibc-2.3.2/sysdeps/unix/sysv/linux/Makefile Tue Dec 17 00:36:52 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/Makefile Sat Mar 15 00:36:59 2003 +@@ -42,7 +42,7 @@ + sed -n 's@^#define __NR_\([^ ]*\) .*$$@#define SYS_\1 __NR_\1@p' | \ + LC_ALL=C sort > $(@:.d=.h).new32; \ + SUNPRO_DEPENDENCIES='$(@:.h=.d)-t $@' \ +- $(CC) -E -x c $(sysincludes) $< $(addprefix -U,$(64bit-predefine)) \ ++ $(CC) -E -x c $(sysincludes) $< $(addprefix -U,$(32bit-predefine)) \ + $(addprefix -D,$(64bit-predefine)) -D_LIBC -dM | \ + sed -n 's@^#define __NR_\([^ ]*\) .*$$@#define SYS_\1 __NR_\1@p' | \ + LC_ALL=C sort > $(@:.d=.h).new64; \ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/alpha/bits/mman.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/alpha/bits/mman.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/alpha/bits/mman.h Sat Jul 7 21:21:33 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/alpha/bits/mman.h Mon Mar 3 10:20:08 2003 +@@ -1,5 +1,5 @@ + /* Definitions for POSIX memory map interface. Linux/Alpha version. +- Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc. ++ Copyright (C) 1997, 1998, 2000, 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 +@@ -60,11 +60,13 @@ + + /* These are Linux-specific. */ + #ifdef __USE_MISC +-# define MAP_GROWSDOWN 0x1000 /* Stack-like segment. */ +-# define MAP_DENYWRITE 0x2000 /* ETXTBSY */ +-# define MAP_EXECUTABLE 0x4000 /* Mark it as an executable. */ +-# define MAP_LOCKED 0x8000 /* Lock the mapping. */ ++# define MAP_GROWSDOWN 0x01000 /* Stack-like segment. */ ++# define MAP_DENYWRITE 0x02000 /* ETXTBSY */ ++# define MAP_EXECUTABLE 0x04000 /* Mark it as an executable. */ ++# define MAP_LOCKED 0x08000 /* Lock the mapping. */ + # define MAP_NORESERVE 0x10000 /* Don't check for reservations. */ ++# define MAP_POPULATE 0x20000 /* Populate (prefault) pagetables. */ ++# define MAP_NONBLOCK 0x40000 /* Do not block on IO. */ + #endif + + /* Flags to `msync'. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/alpha/bits/siginfo.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/alpha/bits/siginfo.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/alpha/bits/siginfo.h Thu Dec 5 01:21:41 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/alpha/bits/siginfo.h Thu Mar 27 00:41:57 2003 +@@ -1,5 +1,5 @@ + /* siginfo_t, sigevent and constants. Linux/Alpha version. +- Copyright (C) 1997,1998,1999,2000,2001,2002 Free Software Foundation, Inc. ++ Copyright (C) 1997-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 +@@ -22,8 +22,6 @@ + # error "Never include this file directly. Use instead" + #endif + +-#include +- + #if (!defined __have_sigval_t \ + && (defined _SIGNAL_H || defined __need_siginfo_t \ + || defined __need_sigevent_t)) +@@ -42,11 +40,7 @@ + # define __have_siginfo_t 1 + + # define __SI_MAX_SIZE 128 +-# if __WORDSIZE == 64 + # define __SI_PAD_SIZE ((__SI_MAX_SIZE / sizeof (int)) - 4) +-# else +-# define __SI_PAD_SIZE ((__SI_MAX_SIZE / sizeof (int)) - 3) +-# endif + + typedef struct siginfo + { +@@ -69,8 +63,9 @@ + /* POSIX.1b timers. */ + struct + { +- unsigned int _timer1; +- unsigned int _timer2; ++ int si_tid; /* Timer ID. */ ++ int si_overrun; /* Overrun count. */ ++ sigval_t si_sigval; /* Signal value. */ + } _timer; + + /* POSIX.1b signals. */ +@@ -110,8 +105,8 @@ + /* X/Open requires some more fields with fixed names. */ + # define si_pid _sifields._kill.si_pid + # define si_uid _sifields._kill.si_uid +-# define si_timer1 _sifields._timer._timer1 +-# define si_timer2 _sifields._timer._timer2 ++# define si_timerid _sifields._timer.si_tid ++# define si_overrun _sifields._timer.si_overrun + # define si_status _sifields._sigchld.si_status + # define si_utime _sifields._sigchld.si_utime + # define si_stime _sifields._sigchld.si_stime +@@ -261,14 +256,7 @@ + + /* Structure to transport application-defined values with signals. */ + # define __SIGEV_MAX_SIZE 64 +-# if __WORDSIZE == 64 + # define __SIGEV_PAD_SIZE ((__SIGEV_MAX_SIZE / sizeof (int)) - 4) +-# else +-# define __SIGEV_PAD_SIZE ((__SIGEV_MAX_SIZE / sizeof (int)) - 3) +-# endif +- +-/* Forward declaration of the `pthread_attr_t' type. */ +-struct __pthread_attr_s; + + typedef struct sigevent + { +@@ -280,6 +268,10 @@ + { + int _pad[__SIGEV_PAD_SIZE]; + ++ /* When SIGEV_SIGNAL and SIGEV_THREAD_ID set, LWP ID of the ++ thread to receive the signal. */ ++ __pid_t _tid; ++ + struct + { + void (*_function) (sigval_t); /* Function to start. */ +@@ -299,8 +291,11 @@ + # define SIGEV_SIGNAL SIGEV_SIGNAL + SIGEV_NONE, /* Other notification: meaningless. */ + # define SIGEV_NONE SIGEV_NONE +- SIGEV_THREAD /* Deliver via thread creation. */ ++ SIGEV_THREAD, /* Deliver via thread creation. */ + # define SIGEV_THREAD SIGEV_THREAD ++ ++ SIGEV_THREAD_ID = 4 /* Send signal to specific thread. */ ++#define SIGEV_THREAD_ID SIGEV_THREAD_ID + }; + + #endif /* have _SIGNAL_H. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/alpha/bits/signum.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/alpha/bits/signum.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/alpha/bits/signum.h Sat Jul 7 21:21:33 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/alpha/bits/signum.h Tue Apr 1 08:15:15 2003 +@@ -1,5 +1,5 @@ + /* Signal number definitions. Linux/Alpha version. +- Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. ++ Copyright (C) 1996, 1997, 1998, 1999, 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 +@@ -69,7 +69,7 @@ + #define SIGPWR SIGINFO + #define SIGIOT SIGABRT + +-#define _NSIG 64 /* Biggest signal number + 1. */ ++#define _NSIG 65 /* Biggest signal number + 1. */ + + #define SIGRTMIN (__libc_current_sigrtmin ()) + #define SIGRTMAX (__libc_current_sigrtmax ()) +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h Thu Oct 24 01:48:49 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h Tue Mar 25 22:59:17 2003 +@@ -1,5 +1,5 @@ + /* bits/typesizes.h -- underlying types for *_t. Linux/Alpha version. +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 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 +@@ -54,7 +54,7 @@ + #define __SWBLK_T_TYPE __SLONGWORD_TYPE + #define __KEY_T_TYPE __S32_TYPE + #define __CLOCKID_T_TYPE __S32_TYPE +-#define __TIMER_T_TYPE __S32_TYPE ++#define __TIMER_T_TYPE void * + #define __BLKSIZE_T_TYPE __U32_TYPE + #define __FSID_T_TYPE struct { int __val[2]; } + +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/arm/bits/mman.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/arm/bits/mman.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/bits/mman.h Sat Jul 7 21:21:34 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/arm/bits/mman.h Mon Mar 3 10:57:38 2003 +@@ -1,5 +1,5 @@ + /* Definitions for POSIX memory map interface. Linux/ARM version. +- Copyright (C) 1997, 2000 Free Software Foundation, Inc. ++ Copyright (C) 1997, 2000, 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 +@@ -52,11 +52,13 @@ + + /* These are Linux-specific. */ + #ifdef __USE_MISC +-# define MAP_GROWSDOWN 0x0100 /* Stack-like segment. */ +-# define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +-# define MAP_EXECUTABLE 0x1000 /* Mark it as an executable. */ +-# define MAP_LOCKED 0x2000 /* Lock the mapping. */ +-# define MAP_NORESERVE 0x4000 /* Don't check for reservations. */ ++# define MAP_GROWSDOWN 0x00100 /* Stack-like segment. */ ++# define MAP_DENYWRITE 0x00800 /* ETXTBSY */ ++# define MAP_EXECUTABLE 0x01000 /* Mark it as an executable. */ ++# define MAP_LOCKED 0x02000 /* Lock the mapping. */ ++# define MAP_NORESERVE 0x04000 /* Don't check for reservations. */ ++# define MAP_POPULATE 0x08000 /* Populate (prefault) pagetables. */ ++# define MAP_NONBLOCK 0x10000 /* Do not block on IO. */ + #endif + + /* Flags to `msync'. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/arm/mmap64.S glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/arm/mmap64.S +--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/mmap64.S Sat Jul 7 21:21:33 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/arm/mmap64.S Thu Mar 27 03:45:46 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 2000 Free Software Foundation, Inc. ++/* Copyright (C) 2000, 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 +@@ -21,6 +21,8 @@ + #define EINVAL 22 + #define ENOSYS 38 + ++#include "kernel-features.h" ++ + /* The mmap2 system call takes six arguments, all in registers. */ + .text + ENTRY (__mmap64) +@@ -39,6 +41,10 @@ + swi SYS_ify (mmap2) + cmn r0, $4096 + LOADREGS(ccfd, sp!, {r4, r5, pc}) ++# ifdef __ASSUME_MMAP2_SYSCALL ++ ldmfd sp!, {r4, r5, lr} ++ b PLTJMP(syscall_error) ++# else + cmn r0, $ENOSYS + ldmnefd sp!, {r4, r5, lr} + bne PLTJMP(syscall_error) +@@ -49,6 +55,7 @@ + teq r5, $0 + ldmeqfd sp!, {r4, r5, lr} + beq PLTJMP(__mmap) ++# endif + .Linval: + mov r0, $-EINVAL + ldmfd sp!, {r4, r5, lr} +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/arm/sigaction.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/arm/sigaction.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/sigaction.c Fri Jan 3 00:26:04 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/arm/sigaction.c Thu Mar 27 03:45:46 2003 +@@ -22,6 +22,7 @@ + + #include + #include ++#include + + /* The difference here is that the sigaction structure used in the + kernel is not the same as we use in the libc. Therefore we must +@@ -60,15 +61,21 @@ + const struct sigaction *act; + struct sigaction *oact; + { ++#ifndef __ASSUME_REALTIME_SIGNALS + struct old_kernel_sigaction k_sigact, k_osigact; ++#endif + int result; + + #ifdef __NR_rt_sigaction + /* First try the RT signals. */ ++# ifndef __ASSUME_REALTIME_SIGNALS + if (!__libc_missing_rt_sigs) ++# endif + { + struct kernel_sigaction kact, koact; ++# ifndef __ASSUME_REALTIME_SIGNALS + int saved_errno = errno; ++# endif + + if (act) + { +@@ -99,7 +106,9 @@ + act ? __ptrvalue (&kact) : NULL, + oact ? __ptrvalue (&koact) : NULL, _NSIG / 8); + ++# ifndef __ASSUME_REALTIME_SIGNALS + if (result >= 0 || errno != ENOSYS) ++# endif + { + if (oact && result >= 0) + { +@@ -113,17 +122,20 @@ + return result; + } + ++# ifndef __ASSUME_REALTIME_SIGNALS + __set_errno (saved_errno); + __libc_missing_rt_sigs = 1; ++# endif + } + #endif + ++#ifndef __ASSUME_REALTIME_SIGNALS + if (act) + { + k_sigact.k_sa_handler = act->sa_handler; + k_sigact.sa_mask = act->sa_mask.__val[0]; + k_sigact.sa_flags = act->sa_flags; +-#ifdef HAVE_SA_RESTORER ++# ifdef HAVE_SA_RESTORER + /* See the comments above for why we test SA_ONSTACK. */ + if (k_sigact.sa_flags & (SA_RESTORER | SA_ONSTACK)) + k_sigact.sa_restorer = act->sa_restorer; +@@ -132,7 +144,7 @@ + k_sigact.sa_restorer = choose_restorer (k_sigact.sa_flags); + k_sigact.sa_flags |= SA_RESTORER; + } +-#endif ++# endif + } + result = INLINE_SYSCALL (sigaction, 3, sig, + act ? __ptrvalue (&k_sigact) : NULL, +@@ -142,11 +154,12 @@ + oact->sa_handler = k_osigact.k_sa_handler; + oact->sa_mask.__val[0] = k_osigact.sa_mask; + oact->sa_flags = k_osigact.sa_flags; +-#ifdef HAVE_SA_RESTORER ++# ifdef HAVE_SA_RESTORER + oact->sa_restorer = k_osigact.sa_restorer; +-#endif ++# endif + } + return result; ++#endif + } + libc_hidden_def (__libc_sigaction) + +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/arm/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/arm/sysdep.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/sysdep.h Thu Feb 20 21:22:10 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/arm/sysdep.h Thu Mar 27 03:45:49 2003 +@@ -64,6 +64,22 @@ + SYSCALL_ERROR_HANDLER \ + END (name) + ++#undef PSEUDO_NOERRNO ++#define PSEUDO_NOERRNO(name, syscall_name, args) \ ++ .text; \ ++ ENTRY (name); \ ++ DO_CALL (syscall_name, args); ++ ++#define PSEUDO_RET_NOERRNO \ ++ RETINSTR(mov, pc, lr); ++ ++#undef ret_NOERRNO ++#define ret_NOERRNO PSEUDO_RET_NOERRNO ++ ++#undef PSEUDO_END_NOERRNO ++#define PSEUDO_END_NOERRNO(name) \ ++ END (name) ++ + #if NOT_IN_libc + # define SYSCALL_ERROR __local_syscall_error + # define SYSCALL_ERROR_HANDLER \ +@@ -158,7 +174,7 @@ + asm volatile ("swi %1 @ syscall " #name \ + : "=r" (_a1) \ + : "i" (SYS_ify(name)) ASM_ARGS_##nr \ +- : "a1", "memory"); \ ++ : "memory"); \ + _sys_result = _a1; \ + } \ + (int) _sys_result; }) +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/arm/vfork.S glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/arm/vfork.S +--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/vfork.S Tue Dec 31 20:13:28 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/arm/vfork.S Thu Mar 27 03:45:46 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1999, 2002 Free Software Foundation, Inc. ++/* Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Philip Blundell . + +@@ -20,6 +20,7 @@ + #include + #define _ERRNO_H 1 + #include ++#include + + /* Clone the calling process, but without copying the whole address space. + The calling process is suspended until the new process exits or is +@@ -33,17 +34,23 @@ + cmn a1, #4096 + RETINSTR(movcc, pc, lr) + ++# ifdef __ASSUME_VFORK_SYSCALL ++ b PLTJMP(C_SYMBOL_NAME(__syscall_error)) ++# else + /* Check if vfork syscall is known at all. */ + ldr a2, =-ENOSYS + teq a1, a2 + bne PLTJMP(C_SYMBOL_NAME(__syscall_error)) ++# endif + #endif + ++#ifndef __ASSUME_VFORK_SYSCALL + /* If we don't have vfork, fork is close enough. */ + swi __NR_fork + cmn a1, #4096 + RETINSTR(movcc, pc, lr) + b PLTJMP(C_SYMBOL_NAME(__syscall_error)) ++#endif + + PSEUDO_END (__vfork) + libc_hidden_def (__vfork) +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/bits/posix_opt.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/bits/posix_opt.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/bits/posix_opt.h Fri Nov 29 02:32:18 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/bits/posix_opt.h Mon Mar 3 05:52:01 2003 +@@ -1,5 +1,5 @@ + /* Define POSIX options for Linux. +- Copyright (C) 1996, 1997, 1999, 2000, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1996,1997,1999,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 +@@ -89,5 +89,8 @@ + + /* The `spawn' function family is supported. */ + #define _POSIX_SPAWN 200112L ++ ++/* The monotonic clock might be available. */ ++#define _POSIX_MONOTONIC_CLOCK 0 + + #endif /* bits/posix_opt.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/bits/siginfo.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/bits/siginfo.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/bits/siginfo.h Thu Dec 5 01:09:55 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/bits/siginfo.h Thu Mar 27 00:41:57 2003 +@@ -1,5 +1,5 @@ + /* siginfo_t, sigevent and constants. Linux version. +- Copyright (C) 1997,1998,1999,2000,2001,2002 Free Software Foundation, Inc. ++ Copyright (C) 1997-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 +@@ -69,8 +69,9 @@ + /* POSIX.1b timers. */ + struct + { +- unsigned int _timer1; +- unsigned int _timer2; ++ int si_tid; /* Timer ID. */ ++ int si_overrun; /* Overrun count. */ ++ sigval_t si_sigval; /* Signal value. */ + } _timer; + + /* POSIX.1b signals. */ +@@ -110,8 +111,8 @@ + /* X/Open requires some more fields with fixed names. */ + # define si_pid _sifields._kill.si_pid + # define si_uid _sifields._kill.si_uid +-# define si_timer1 _sifields._timer._timer1 +-# define si_timer2 _sifields._timer._timer2 ++# define si_timerid _sifields._timer.si_tid ++# define si_overrun _sifields._timer.si_overrun + # define si_status _sifields._sigchld.si_status + # define si_utime _sifields._sigchld.si_utime + # define si_stime _sifields._sigchld.si_stime +@@ -267,9 +268,6 @@ + # define __SIGEV_PAD_SIZE ((__SIGEV_MAX_SIZE / sizeof (int)) - 3) + # endif + +-/* Forward declaration of the `pthread_attr_t' type. */ +-struct __pthread_attr_s; +- + typedef struct sigevent + { + sigval_t sigev_value; +@@ -280,6 +278,10 @@ + { + int _pad[__SIGEV_PAD_SIZE]; + ++ /* When SIGEV_SIGNAL and SIGEV_THREAD_ID set, LWP ID of the ++ thread to receive the signal. */ ++ __pid_t _tid; ++ + struct + { + void (*_function) (sigval_t); /* Function to start. */ +@@ -299,8 +301,11 @@ + # define SIGEV_SIGNAL SIGEV_SIGNAL + SIGEV_NONE, /* Other notification: meaningless. */ + # define SIGEV_NONE SIGEV_NONE +- SIGEV_THREAD /* Deliver via thread creation. */ ++ SIGEV_THREAD, /* Deliver via thread creation. */ + # define SIGEV_THREAD SIGEV_THREAD ++ ++ SIGEV_THREAD_ID = 4 /* Send signal to specific thread. */ ++#define SIGEV_THREAD_ID SIGEV_THREAD_ID + }; + + #endif /* have _SIGNAL_H. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/bits/signum.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/bits/signum.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/bits/signum.h Sat Feb 22 01:01:06 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/bits/signum.h Tue Apr 1 07:51:57 2003 +@@ -66,7 +66,7 @@ + #define SIGSYS 31 /* Bad system call. */ + #define SIGUNUSED 31 + +-#define _NSIG 64 /* Biggest signal number + 1 ++#define _NSIG 65 /* Biggest signal number + 1 + (including real-time signals). */ + + #define SIGRTMIN (__libc_current_sigrtmin ()) +@@ -75,6 +75,6 @@ + /* These are the hard limits of the kernel. These values should not be + used directly at user level. */ + #define __SIGRTMIN 32 +-#define __SIGRTMAX _NSIG ++#define __SIGRTMAX (_NSIG - 1) + + #endif /* included. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/clock_getres.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/clock_getres.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/clock_getres.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/clock_getres.c Mon Mar 3 05:48:47 2003 +@@ -0,0 +1,76 @@ ++/* Copyright (C) 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 ++ 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 "kernel-features.h" ++ ++ ++#ifdef __ASSUME_POSIX_TIMERS ++/* This means the REALTIME and MONOTONIC clock are definitely ++ supported in the kernel. */ ++# define SYSDEP_GETRES \ ++ case CLOCK_REALTIME: \ ++ case CLOCK_MONOTONIC: \ ++ retval = INLINE_SYSCALL (clock_getres, 2, clock_id, res); \ ++ break ++#elif defined __NR_clock_getres ++/* Is the syscall known to exist? */ ++extern int __libc_missing_posix_timers attribute_hidden; ++ ++/* The REALTIME and MONOTONIC clock might be available. Try the ++ syscall first. */ ++# define SYSDEP_GETRES \ ++ case CLOCK_REALTIME: \ ++ case CLOCK_MONOTONIC: \ ++ { \ ++ int e = EINVAL; \ ++ \ ++ if (!__libc_missing_posix_timers) \ ++ { \ ++ INTERNAL_SYSCALL_DECL (err); \ ++ int r = INTERNAL_SYSCALL (clock_getres, err, 2, clock_id, res); \ ++ if (!INTERNAL_SYSCALL_ERROR_P (r, err)) \ ++ { \ ++ retval = 0; \ ++ break; \ ++ } \ ++ \ ++ e = INTERNAL_SYSCALL_ERRNO (r, err); \ ++ if (e == ENOSYS) \ ++ { \ ++ __libc_missing_posix_timers = 1; \ ++ e = EINVAL; \ ++ } \ ++ } \ ++ \ ++ /* Fallback code. */ \ ++ if (e == EINVAL && clock_id == CLOCK_REALTIME) \ ++ HANDLE_REALTIME; \ ++ else \ ++ __set_errno (e); \ ++ } \ ++ break ++#endif ++ ++#ifdef __NR_clock_getres ++/* We handled the REALTIME clock here. */ ++# define HANDLED_REALTIME 1 ++#endif ++ ++#include +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/clock_gettime.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/clock_gettime.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/clock_gettime.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/clock_gettime.c Mon Mar 3 05:49:06 2003 +@@ -0,0 +1,76 @@ ++/* Copyright (C) 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 ++ 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 "kernel-features.h" ++ ++ ++#ifdef __ASSUME_POSIX_TIMERS ++/* This means the REALTIME and MONOTONIC clock are definitely ++ supported in the kernel. */ ++# define SYSDEP_GETTIME \ ++ case CLOCK_REALTIME: \ ++ case CLOCK_MONOTONIC: \ ++ retval = INLINE_SYSCALL (clock_gettime, 2, clock_id, tp); \ ++ break ++#elif defined __NR_clock_gettime ++/* Is the syscall known to exist? */ ++int __libc_missing_posix_timers attribute_hidden; ++ ++/* The REALTIME and MONOTONIC clock might be available. Try the ++ syscall first. */ ++# define SYSDEP_GETTIME \ ++ case CLOCK_REALTIME: \ ++ case CLOCK_MONOTONIC: \ ++ { \ ++ int e = EINVAL; \ ++ \ ++ if (!__libc_missing_posix_timers) \ ++ { \ ++ INTERNAL_SYSCALL_DECL (err); \ ++ int r = INTERNAL_SYSCALL (clock_gettime, err, 2, clock_id, tp); \ ++ if (!INTERNAL_SYSCALL_ERROR_P (r, err)) \ ++ { \ ++ retval = 0; \ ++ break; \ ++ } \ ++ \ ++ e = INTERNAL_SYSCALL_ERRNO (r, err); \ ++ if (e == ENOSYS) \ ++ { \ ++ __libc_missing_posix_timers = 1; \ ++ e = EINVAL; \ ++ } \ ++ } \ ++ \ ++ /* Fallback code. */ \ ++ if (e == EINVAL && clock_id == CLOCK_REALTIME) \ ++ HANDLE_REALTIME; \ ++ else \ ++ __set_errno (e); \ ++ } \ ++ break ++#endif ++ ++#ifdef __NR_clock_gettime ++/* We handled the REALTIME clock here. */ ++# define HANDLED_REALTIME 1 ++#endif ++ ++#include +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/clock_nanosleep.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/clock_nanosleep.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/clock_nanosleep.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/clock_nanosleep.c Mon Mar 3 05:49:43 2003 +@@ -0,0 +1,65 @@ ++/* Copyright (C) 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 ++ 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 "kernel-features.h" ++ ++ ++#ifdef __ASSUME_POSIX_TIMERS ++/* We can simply use the syscall. The CPU clocks are not supported ++ with this function. */ ++int ++clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req, ++ struct timespec *rem) ++{ ++ INTERNAL_SYSCALL_DECL (err); ++ int r; ++ ++ r = INTERNAL_SYSCALL (clock_nanosleep, err, 4, clock_id, flags, req, rem); ++ return (INTERNAL_SYSCALL_ERROR_P (r, err) ++ ? INTERNAL_SYSCALL_ERRNO (r, err) : 0); ++} ++ ++#else ++# ifdef __NR_clock_nanosleep ++/* Is the syscall known to exist? */ ++extern int __libc_missing_posix_timers attribute_hidden; ++ ++/* The REALTIME and MONOTONIC clock might be available. Try the ++ syscall first. */ ++# define SYSDEP_NANOSLEEP \ ++ if (!__libc_missing_posix_timers) \ ++ { \ ++ INTERNAL_SYSCALL_DECL (err); \ ++ int r = INTERNAL_SYSCALL (clock_nanosleep, err, 4, clock_id, flags, \ ++ req, rem); \ ++ \ ++ if (!INTERNAL_SYSCALL_ERROR_P (r, err)) \ ++ return 0; \ ++ \ ++ if (INTERNAL_SYSCALL_ERRNO (r, err) != ENOSYS) \ ++ return INTERNAL_SYSCALL_ERRNO (r, err); \ ++ \ ++ __libc_missing_posix_timers = 1; \ ++ } ++# endif ++ ++# include ++#endif +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/clock_settime.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/clock_settime.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/clock_settime.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/clock_settime.c Mon Mar 3 05:49:24 2003 +@@ -0,0 +1,73 @@ ++/* Copyright (C) 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 ++ 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 "kernel-features.h" ++ ++ ++#ifdef __ASSUME_POSIX_TIMERS ++/* This means the REALTIME clock is definitely supported in the ++ kernel. */ ++# define SYSDEP_SETTIME \ ++ case CLOCK_REALTIME: \ ++ retval = INLINE_SYSCALL (clock_settime, 2, clock_id, tp); \ ++ break ++#elif defined __NR_clock_settime ++/* Is the syscall known to exist? */ ++extern int __libc_missing_posix_timers attribute_hidden; ++ ++/* The REALTIME clock might be available. Try the syscall first. */ ++# define SYSDEP_SETTIME \ ++ case CLOCK_REALTIME: \ ++ { \ ++ int e = EINVAL; \ ++ \ ++ if (!__libc_missing_posix_timers) \ ++ { \ ++ INTERNAL_SYSCALL_DECL (err); \ ++ int r = INTERNAL_SYSCALL (clock_settime, err, 2, clock_id, tp); \ ++ if (!INTERNAL_SYSCALL_ERROR_P (r, err)) \ ++ { \ ++ retval = 0; \ ++ break; \ ++ } \ ++ \ ++ e = INTERNAL_SYSCALL_ERRNO (r, err); \ ++ if (e == ENOSYS) \ ++ { \ ++ __libc_missing_posix_timers = 1; \ ++ e = EINVAL; \ ++ } \ ++ } \ ++ \ ++ /* Fallback code. */ \ ++ if (e == EINVAL && clock_id == CLOCK_REALTIME) \ ++ HANDLE_REALTIME; \ ++ else \ ++ __set_errno (e); \ ++ } \ ++ break ++#endif ++ ++#ifdef __NR_clock_settime ++/* We handled the REALTIME clock here. */ ++# define HANDLED_REALTIME 1 ++#endif ++ ++#include +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/configure glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/configure +--- glibc-2.3.2/sysdeps/unix/sysv/linux/configure Wed Feb 26 02:07:12 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/configure Sun Mar 23 03:10:04 2003 +@@ -44,7 +44,11 @@ + else + cat >conftest.$ac_ext <<_ACEOF + #line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include + #if !defined LINUX_VERSION_CODE || LINUX_VERSION_CODE < (2 *65536+ 0 *256+ 10) /* 2.0.10 */ + eat flaming death +@@ -165,7 +169,11 @@ + abinum=`echo "$minimum_kernel.0.0.0" | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1,\2,\3/'`; + cat >conftest.$ac_ext <<_ACEOF + #line $LINENO "configure" +-#include "confdefs.h" ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include + #if LINUX_VERSION_CODE < $decnum + eat flaming death +@@ -216,7 +224,8 @@ + /usr | /usr/) + # 64-bit libraries on bi-arch platforms go in /lib64 instead of /lib + case $machine in +- sparc/sparc64 | x86_64 | powerpc/powerpc64 | s390/s390-64 ) ++ sparc/sparc64 | x86_64 | powerpc/powerpc64 | s390/s390-64 | \ ++ mips/mips64/n64/* ) + libc_cv_slibdir="/lib64" + if test "$libdir" = '${exec_prefix}/lib'; then + libdir='${exec_prefix}/lib64'; +@@ -224,6 +233,14 @@ + libc_cv_localedir='${exec_prefix}/lib/locale' + fi + ;; ++ mips/mips64/n32/* ) ++ libc_cv_slibdir="/lib32" ++ if test "$libdir" = '${exec_prefix}/lib'; then ++ libdir='${exec_prefix}/lib32'; ++ # Locale data can be shared between 32bit and 64bit libraries ++ libc_cv_localedir='${exec_prefix}/lib/locale' ++ fi ++ ;; + *) + libc_cv_slibdir="/lib" + ;; +@@ -302,6 +319,9 @@ + ;; + ia64*) + ldd_rewrite_script=../sysdeps/unix/sysv/linux/ia64/ldd-rewrite.sed ++ ;; ++ mips/*64*) ++ ldd_rewrite_script=../sysdeps/unix/sysv/linux/mips/mips64/ldd-rewrite.sed + ;; + s390*) + ldd_rewrite_script=../sysdeps/unix/sysv/linux/s390/ldd-rewrite.sed +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/configure.in glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/configure.in +--- glibc-2.3.2/sysdeps/unix/sysv/linux/configure.in Sat Feb 1 21:22:36 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/configure.in Sun Mar 23 03:10:04 2003 +@@ -157,7 +157,8 @@ + /usr | /usr/) + # 64-bit libraries on bi-arch platforms go in /lib64 instead of /lib + case $machine in +- sparc/sparc64 | x86_64 | powerpc/powerpc64 | s390/s390-64 ) ++ sparc/sparc64 | x86_64 | powerpc/powerpc64 | s390/s390-64 | \ ++ mips/mips64/n64/* ) + libc_cv_slibdir="/lib64" + if test "$libdir" = '${exec_prefix}/lib'; then + libdir='${exec_prefix}/lib64'; +@@ -165,6 +166,14 @@ + libc_cv_localedir='${exec_prefix}/lib/locale' + fi + ;; ++ mips/mips64/n32/* ) ++ libc_cv_slibdir="/lib32" ++ if test "$libdir" = '${exec_prefix}/lib'; then ++ libdir='${exec_prefix}/lib32'; ++ # Locale data can be shared between 32bit and 64bit libraries ++ libc_cv_localedir='${exec_prefix}/lib/locale' ++ fi ++ ;; + *) + libc_cv_slibdir="/lib" + ;; +@@ -243,6 +252,9 @@ + ;; + ia64*) + ldd_rewrite_script=../sysdeps/unix/sysv/linux/ia64/ldd-rewrite.sed ++ ;; ++ mips/*64*) ++ ldd_rewrite_script=../sysdeps/unix/sysv/linux/mips/mips64/ldd-rewrite.sed + ;; + s390*) + ldd_rewrite_script=../sysdeps/unix/sysv/linux/s390/ldd-rewrite.sed +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/cris/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/cris/sysdep.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/cris/sysdep.h Sat Jul 7 21:21:34 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/cris/sysdep.h Sun Mar 23 20:42:22 2003 +@@ -1,5 +1,5 @@ + /* Assembler macros for CRIS. +- Copyright (C) 1999, 2001 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001, 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 +@@ -104,6 +104,18 @@ + 0: @ \ + SETUP_PIC @ \ + PLTJUMP (syscall_error) @ \ ++ END (name) ++ ++#define PSEUDO_NOERRNO(name, syscall_name, args) \ ++ ENTRY (name) @ \ ++ DOARGS_##args @ \ ++ movu.w SYS_ify (syscall_name),$r9 @ \ ++ break 13 @ \ ++ UNDOARGS_return_##args ++ ++#define ret_NOERRNO ++ ++#define PSEUDO_END_NOERRNO(name) \ + END (name) + + #define DOARGS_0 +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/fpathconf.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/fpathconf.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/fpathconf.c Wed Oct 23 08:21:19 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/fpathconf.c Fri Mar 14 07:22:16 2003 +@@ -1,5 +1,5 @@ + /* Get file-specific information about descriptor FD. Linux version. +- Copyright (C) 1991,95,96,98,99,2000,2001,2002 Free Software Foundation, Inc. ++ Copyright (C) 1991,1995,1996,1998-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 +@@ -38,8 +38,13 @@ + { + case _PC_LINK_MAX: + return statfs_link_max (__fstatfs (fd, &fsbuf), &fsbuf); ++ + case _PC_FILESIZEBITS: + return statfs_filesize_max (__fstatfs (fd, &fsbuf), &fsbuf); ++ ++ case _PC_2_SYMLINKS: ++ return statfs_symlinks (__fstatfs (fd, &fsbuf), &fsbuf); ++ + default: + return posix_fpathconf (fd, name); + } +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/getsysstats.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/getsysstats.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/getsysstats.c Sat Nov 2 03:16:02 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/getsysstats.c Fri Mar 21 08:45:55 2003 +@@ -1,5 +1,5 @@ + /* Determine various system internal values, Linux version. +- Copyright (C) 1996-2001, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1996-2001, 2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1996. + +@@ -31,7 +31,7 @@ + #include + #include + +-#include ++#include + + + /* The default value for the /proc filesystem mount point. */ +@@ -85,8 +85,7 @@ + + /* Now store the copied value. But do it atomically. */ + assert (sizeof (long int) == sizeof (void *__unbounded)); +- if (compare_and_swap ((long int *) &mount_proc, (long int) 0, +- (long int) copy_result) == 0) ++ if (! atomic_compare_and_exchange_bool_acq (&mount_proc, copy_result, NULL)) + /* Replacing the value failed. This means another thread was + faster and we don't need the copy anymore. */ + free (copy_result); +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/hppa/bits/mman.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/hppa/bits/mman.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/hppa/bits/mman.h Sun Oct 15 05:12:00 2000 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/hppa/bits/mman.h Mon Mar 3 10:53:18 2003 +@@ -1,4 +1,21 @@ +-/* Definitions for POSIX memory map interface. Insert rest of disclaimer here */ ++/* Definitions for POSIX memory map interface. Linux/HPPA version. ++ Copyright (C) 1997, 1998, 2000, 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 ++ 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_MMAN_H + # error "Never use directly; include instead." +@@ -22,6 +39,8 @@ + #define MAP_LOCKED 0x2000 /* pages are locked */ + #define MAP_NORESERVE 0x4000 /* don't check for reservations */ + #define MAP_GROWSDOWN 0x8000 /* stack-like segment */ ++#define MAP_POPULATE 0x10000 /* populate (prefault) pagetables */ ++#define MAP_NONBLOCK 0x20000 /* do not block on IO */ + + #define MS_SYNC 1 /* synchronous memory sync */ + #define MS_ASYNC 2 /* sync memory asynchronously */ +@@ -58,4 +77,3 @@ + #ifdef __USE_GNU + # define MREMAP_MAYMOVE 1 + #endif +- +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/hppa/bits/signum.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/hppa/bits/signum.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/hppa/bits/signum.h Sat Jul 7 21:21:34 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/hppa/bits/signum.h Tue Apr 1 08:16:53 2003 +@@ -1,5 +1,5 @@ + /* Signal number definitions. Linux/HPPA version. +- Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. ++ Copyright (C) 1995,1996,1997,1998,1999,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 +@@ -68,7 +68,7 @@ + #define SIGXFSZ 34 /* File size limit exceeded (4.2 BSD). */ + #define SIGSTKFLT 36 /* Stack fault. */ + +-#define _NSIG 64 /* Biggest signal number + 1 ++#define _NSIG 65 /* Biggest signal number + 1 + (including real-time signals). */ + + #define SIGRTMIN (__libc_current_sigrtmin ()) +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/hppa/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/hppa/sysdep.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/hppa/sysdep.h Mon Aug 26 23:16:19 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/hppa/sysdep.h Sun Mar 23 20:42:22 2003 +@@ -1,5 +1,5 @@ + /* Assembler macros for PA-RISC. +- Copyright (C) 1999,2001,02 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001, 2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper, , August 1999. + Linux/PA-RISC changes by Philipp Rumpf, , March 2000. +@@ -84,6 +84,10 @@ + bv 0(2) ASM_LINE_SEP \ + nop + ++#define ret_NOERRNO \ ++ bv 0(2) ASM_LINE_SEP \ ++ nop ++ + #undef END + #define END(name) \ + 1: .size C_SYMBOL_NAME(name),1b-C_SYMBOL_NAME(name) +@@ -113,6 +117,15 @@ + + #undef PSEUDO_END + #define PSEUDO_END(name) \ ++ END (name) ++ ++#define PSEUDO_NOERRNO(name, syscall_name, args) \ ++ ENTRY (name) \ ++ DO_CALL(syscall_name, args) ASM_LINE_SEP \ ++ nop ++ ++#undef PSEUDO_END_NOERRNO ++#define PSEUDO_END_NOERRNO(name) \ + END (name) + + #define JUMPTARGET(name) name +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/i386/bits/mman.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/i386/bits/mman.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/i386/bits/mman.h Sat Jul 7 21:21:34 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/i386/bits/mman.h Mon Mar 3 10:15:57 2003 +@@ -1,5 +1,5 @@ + /* Definitions for POSIX memory map interface. Linux/i386 version. +- Copyright (C) 1997, 2000 Free Software Foundation, Inc. ++ Copyright (C) 1997, 2000, 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 +@@ -52,11 +52,13 @@ + + /* These are Linux-specific. */ + #ifdef __USE_MISC +-# define MAP_GROWSDOWN 0x0100 /* Stack-like segment. */ +-# define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +-# define MAP_EXECUTABLE 0x1000 /* Mark it as an executable. */ +-# define MAP_LOCKED 0x2000 /* Lock the mapping. */ +-# define MAP_NORESERVE 0x4000 /* Don't check for reservations. */ ++# define MAP_GROWSDOWN 0x00100 /* Stack-like segment. */ ++# define MAP_DENYWRITE 0x00800 /* ETXTBSY */ ++# define MAP_EXECUTABLE 0x01000 /* Mark it as an executable. */ ++# define MAP_LOCKED 0x02000 /* Lock the mapping. */ ++# define MAP_NORESERVE 0x04000 /* Don't check for reservations. */ ++# define MAP_POPULATE 0x08000 /* Populate (prefault) pagetables. */ ++# define MAP_NONBLOCK 0x10000 /* Do not block on IO. */ + #endif + + /* Flags to `msync'. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/i386/chown.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/i386/chown.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/i386/chown.c Fri Aug 2 23:46:59 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/i386/chown.c Wed Mar 26 04:44:17 2003 +@@ -148,20 +148,15 @@ + #endif + + #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1) +-strong_alias (__chown_is_lchown, _chown_is_lchown) +-compat_symbol (libc, __chown_is_lchown, __chown, GLIBC_2_0); +-compat_symbol (libc, _chown_is_lchown, chown, GLIBC_2_0); ++compat_symbol (libc, __chown_is_lchown, chown, GLIBC_2_0); + #endif + + #ifdef __NR_lchown +-strong_alias (__real_chown, _real_chown) +-versioned_symbol (libc, __real_chown, __chown, GLIBC_2_1); +-versioned_symbol (libc, _real_chown, chown, GLIBC_2_1); +-libc_hidden_ver (__real_chown, __chown) ++versioned_symbol (libc, __real_chown, chown, GLIBC_2_1); ++strong_alias (__real_chown, __chown) + #else + strong_alias (__chown_is_lchown, __chown_is_lchown21) +-strong_alias (__chown_is_lchown, _chown_is_lchown21) +-versioned_symbol (libc, __chown_is_lchown21, __chown, GLIBC_2_1); +-versioned_symbol (libc, _chown_is_lchown21, chown, GLIBC_2_1); +-libc_hidden_ver (__chown_is_lchown, __chown) ++versioned_symbol (libc, __chown_is_lchown21, chown, GLIBC_2_1); ++strong_alias (__chown_is_lchown, __chown) + #endif ++libc_hidden_def (__chown) +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/i386/clone.S glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/i386/clone.S +--- glibc-2.3.2/sysdeps/unix/sysv/linux/i386/clone.S Fri Nov 22 00:59:20 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/i386/clone.S Tue Mar 11 10:30:18 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1996, 1997,98,99,2000,02 Free Software Foundation, Inc. ++/* Copyright (C) 1996,1997,98,99,2000,02,03 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@tamu.edu) + +@@ -28,7 +28,7 @@ + #include + + /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg, +- pid_t *tid, struct user_desc *tls); */ ++ pid_t *ptid, struct user_desc *tls, pid_t *ctid); */ + + #define PARMS LINKAGE /* no space for saved regs */ + #define FUNC PARMS +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/i386/getgroups.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/i386/getgroups.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/i386/getgroups.c Sat Jul 7 21:21:34 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/i386/getgroups.c Wed Mar 26 19:15:57 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1997, 1998, 2000, 2001 Free Software Foundation, Inc. ++/* Copyright (C) 1997, 1998, 2000, 2001, 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 +@@ -36,7 +36,7 @@ + # if __ASSUME_32BITUIDS == 0 + /* This variable is shared with all files that need to check for 32bit + uids. */ +-extern int __libc_missing_32bit_uids; ++extern int __libc_missing_32bit_uids attribute_hidden; + # endif + #endif /* __NR_getgroups32 */ + +@@ -64,7 +64,7 @@ + int saved_errno = errno; + + result = INLINE_SYSCALL (getgroups32, 2, n, CHECK_N (groups, n)); +- if (result == 0 || errno != ENOSYS) ++ if (result != -1 || errno != ENOSYS) + return result; + + __set_errno (saved_errno); +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/i386/setfsgid.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/i386/setfsgid.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/i386/setfsgid.c Sat Jul 7 21:21:34 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/i386/setfsgid.c Thu Mar 27 10:47:49 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1998, 2000 Free Software Foundation, Inc. ++/* Copyright (C) 1998, 2000, 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 +@@ -35,27 +35,28 @@ + # if __ASSUME_32BITUIDS == 0 + /* This variable is shared with all files that need to check for 32bit + uids. */ +-extern int __libc_missing_32bit_uids; ++extern int __libc_missing_32bit_uids attribute_hidden; + # endif + # endif /* __NR_setfsgid32 */ + + int + setfsgid (gid_t gid) + { ++ INTERNAL_SYSCALL_DECL (err); + # if __ASSUME_32BITUIDS > 0 +- return INLINE_SYSCALL (setfsgid32, 1, gid); ++ /* No error checking. */ ++ return INTERNAL_SYSCALL (setfsgid32, err, 1, gid); + # else + # ifdef __NR_setfsgid32 + if (__libc_missing_32bit_uids <= 0) + { + int result; +- int saved_errno = errno; + +- result = INLINE_SYSCALL (setfsgid32, 1, gid); +- if (result == 0 || errno != ENOSYS) ++ result = INTERNAL_SYSCALL (setfsgid32, err, 1, gid); ++ if (! INTERNAL_SYSCALL_ERROR_P (result, err) ++ || INTERNAL_SYSCALL_ERRNO (result, err) != ENOSYS) + return result; + +- __set_errno (saved_errno); + __libc_missing_32bit_uids = 1; + } + # endif /* __NR_setfsgid32 */ +@@ -65,7 +66,8 @@ + return -1; + } + +- return INLINE_SYSCALL (setfsgid, 1, gid); ++ /* No error checking. */ ++ return INTERNAL_SYSCALL (setfsgid, err, 1, gid); + # endif + } + #endif +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/i386/setfsuid.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/i386/setfsuid.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/i386/setfsuid.c Sat Jul 7 21:21:34 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/i386/setfsuid.c Thu Mar 27 10:47:49 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1998, 2000 Free Software Foundation, Inc. ++/* Copyright (C) 1998, 2000, 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 +@@ -35,27 +35,28 @@ + # if __ASSUME_32BITUIDS == 0 + /* This variable is shared with all files that need to check for 32bit + uids. */ +-extern int __libc_missing_32bit_uids; ++extern int __libc_missing_32bit_uids attribute_hidden; + # endif + # endif /* __NR_setfsuid32 */ + + int + setfsuid (uid_t uid) + { ++ INTERNAL_SYSCALL_DECL (err); + # if __ASSUME_32BITUIDS > 0 +- return INLINE_SYSCALL (setfsuid32, 1, uid); ++ /* No error checking. */ ++ return INTERNAL_SYSCALL (setfsuid32, err, 1, uid); + # else + # ifdef __NR_setfsuid32 + if (__libc_missing_32bit_uids <= 0) + { + int result; +- int saved_errno = errno; + +- result = INLINE_SYSCALL (setfsuid32, 1, uid); +- if (result == 0 || errno != ENOSYS) ++ result = INTERNAL_SYSCALL (setfsuid32, err, 1, uid); ++ if (! INTERNAL_SYSCALL_ERROR_P (result, err) ++ || INTERNAL_SYSCALL_ERRNO (result, err) != ENOSYS) + return result; + +- __set_errno (saved_errno); + __libc_missing_32bit_uids = 1; + } + # endif /* __NR_setfsuid32 */ +@@ -66,7 +67,8 @@ + return -1; + } + +- return INLINE_SYSCALL (setfsuid, 1, uid); ++ /* No error checking. */ ++ return INTERNAL_SYSCALL (setfsuid, err, 1, uid); + # endif + } + #endif +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/i386/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/i386/sysdep.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/i386/sysdep.h Thu Jan 9 03:54:57 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/i386/sysdep.h Sun Mar 23 20:42:23 2003 +@@ -78,6 +78,18 @@ + SYSCALL_ERROR_HANDLER \ + END (name) + ++#undef PSEUDO_NOERRNO ++#define PSEUDO_NOERRNO(name, syscall_name, args) \ ++ .text; \ ++ ENTRY (name) \ ++ DO_CALL (syscall_name, args) ++ ++#undef PSEUDO_END_NOERRNO ++#define PSEUDO_END_NOERRNO(name) \ ++ END (name) ++ ++#define ret_NOERRNO ret ++ + #ifndef PIC + # define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */ + #else +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/i386/system.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/i386/system.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/i386/system.c Tue Jan 28 07:24:41 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/i386/system.c Thu Jan 1 01:00:00 1970 +@@ -1,73 +0,0 @@ +-/* Copyright (C) 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 +- 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 +- +-/* We have to and actually can handle cancelable system(). The big +- problem: we have to kill the child process if necessary. To do +- this a cleanup handler has to be registered and is has to be able +- to find the PID of the child. The main problem is to reliable have +- the PID when needed. It is not necessary for the parent thread to +- return. It might still be in the kernel when the cancellation +- request comes. Therefore we have to use the clone() calls ability +- to have the kernel write the PID into the user-level variable. */ +-#ifdef __ASSUME_CLONE_THREAD_FLAGS +-# define FORK() \ +- INLINE_SYSCALL (clone, 3, CLONE_PARENT_SETTID | SIGCHLD, 0, &pid) +-#endif +- +-static void cancel_handler (void *arg); +- +-#define CLEANUP_HANDLER \ +- __libc_cleanup_region_start (1, cancel_handler, &pid) +- +-#define CLEANUP_RESET \ +- __libc_cleanup_region_end (0) +- +- +-/* Linux has waitpid(), so override the generic unix version. */ +-#include +- +- +-/* The cancellation handler. */ +-static void +-cancel_handler (void *arg) +-{ +- pid_t child = *(pid_t *) arg; +- +- INTERNAL_SYSCALL_DECL (err); +- INTERNAL_SYSCALL (kill, err, 2, child, SIGKILL); +- +- TEMP_FAILURE_RETRY (__waitpid (child, NULL, 0)); +- +- DO_LOCK (); +- +- if (SUB_REF () == 0) +- { +- (void) __sigaction (SIGQUIT, &quit, (struct sigaction *) NULL); +- (void) __sigaction (SIGINT, &intr, (struct sigaction *) NULL); +- } +- +- DO_UNLOCK (); +-} +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/ia64/bits/mman.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/ia64/bits/mman.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/ia64/bits/mman.h Thu Jul 18 01:38:55 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/ia64/bits/mman.h Mon Mar 3 10:56:24 2003 +@@ -1,5 +1,5 @@ + /* Definitions for POSIX memory map interface. Linux/ia64 version. +- Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc. ++ Copyright (C) 1997, 1998, 2000, 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 +@@ -52,12 +52,14 @@ + + /* These are Linux-specific. */ + #ifdef __USE_MISC +-# define MAP_GROWSDOWN 0x0100 /* Stack-like segment. */ +-# define MAP_GROWSUP 0x0200 /* Register stack-like segment */ +-# define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +-# define MAP_EXECUTABLE 0x1000 /* Mark it as an executable. */ +-# define MAP_LOCKED 0x2000 /* Lock the mapping. */ +-# define MAP_NORESERVE 0x4000 /* Don't check for reservations. */ ++# define MAP_GROWSDOWN 0x00100 /* Stack-like segment. */ ++# define MAP_GROWSUP 0x00200 /* Register stack-like segment */ ++# define MAP_DENYWRITE 0x00800 /* ETXTBSY */ ++# define MAP_EXECUTABLE 0x01000 /* Mark it as an executable. */ ++# define MAP_LOCKED 0x02000 /* Lock the mapping. */ ++# define MAP_NORESERVE 0x04000 /* Don't check for reservations. */ ++# define MAP_POPULATE 0x08000 /* Populate (prefault) pagetables. */ ++# define MAP_NONBLOCK 0x10000 /* Do not block on IO. */ + #endif + + /* Flags to `msync'. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/ia64/bits/siginfo.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/ia64/bits/siginfo.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/ia64/bits/siginfo.h Thu Dec 5 01:21:53 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/ia64/bits/siginfo.h Tue Apr 1 21:01:17 2003 +@@ -1,5 +1,5 @@ + /* siginfo_t, sigevent and constants. Linux/ia64 version. +- Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. ++ Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by David Mosberger-Tang . + +@@ -65,8 +65,9 @@ + /* POSIX.1b timers. */ + struct + { +- unsigned int _timer1; +- unsigned int _timer2; ++ int si_tid; /* Timer ID. */ ++ int si_overrun; /* Overrun count. */ ++ sigval_t si_sigval; /* Signal value. */ + } _timer; + + /* POSIX.1b signals. */ +@@ -109,6 +110,8 @@ + /* X/Open requires some more fields with fixed names. */ + # define si_pid _sifields._kill.si_pid + # define si_uid _sifields._kill.si_uid ++# define si_timerid _sifields._timer.si_tid ++# define si_overrun _sifields._timer.si_overrun + # define si_status _sifields._sigchld.si_status + # define si_utime _sifields._sigchld.si_utime + # define si_stime _sifields._sigchld.si_stime +@@ -294,9 +297,6 @@ + # define __SIGEV_MAX_SIZE 64 + # define __SIGEV_PAD_SIZE ((__SIGEV_MAX_SIZE / sizeof (int)) - 4) + +-/* Forward declaration of the `pthread_attr_t' type. */ +-struct __pthread_attr_s; +- + typedef struct sigevent + { + sigval_t sigev_value; +@@ -326,8 +326,11 @@ + # define SIGEV_SIGNAL SIGEV_SIGNAL + SIGEV_NONE, /* Other notification: meaningless. */ + # define SIGEV_NONE SIGEV_NONE +- SIGEV_THREAD /* Deliver via thread creation. */ ++ SIGEV_THREAD, /* Deliver via thread creation. */ + # define SIGEV_THREAD SIGEV_THREAD ++ ++ SIGEV_THREAD_ID = 4 /* Send signal to specific thread. */ ++#define SIGEV_THREAD_ID SIGEV_THREAD_ID + }; + + #endif /* have _SIGNAL_H. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/ia64/brk.S glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/ia64/brk.S +--- glibc-2.3.2/sysdeps/unix/sysv/linux/ia64/brk.S Sat Jul 7 21:21:34 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/ia64/brk.S Mon Mar 3 08:11:46 2003 +@@ -1,5 +1,5 @@ + /* brk system call for Linux/ia64 +- Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. ++ Copyright (C) 1999,2000,2001,2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Stephane Eranian and + Jes Sorensen, , April 1999. +@@ -25,6 +25,8 @@ + #include + + .global __curbrk ++ .type __curbrk,@object ++ .size __curbrk,8 + .data + .align 8 + __curbrk: +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/ia64/clone2.S glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/ia64/clone2.S +--- glibc-2.3.2/sysdeps/unix/sysv/linux/ia64/clone2.S Sat Jul 7 21:21:34 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/ia64/clone2.S Thu Mar 13 05:36:59 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 2000, 2001 Free Software Foundation, Inc. ++/* Copyright (C) 2000, 2001, 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 +@@ -22,10 +22,11 @@ + + + /* int __clone2(int (*fn) (void *arg), void *child_stack_base, */ +-/* size_t child_stack_size, int flags, void *arg) */ ++/* size_t child_stack_size, int flags, void *arg, */ ++/* pid_t *parent_tid, void *tls, pid_t *child_tid) */ + + ENTRY(__clone2) +- alloc r2=ar.pfs,5,2,3,0 ++ alloc r2=ar.pfs,8,2,6,0 + cmp.eq p6,p0=0,in0 + mov r8=EINVAL + (p6) br.cond.spnt.few __syscall_error +@@ -41,6 +42,9 @@ + mov out0=in3 /* Flags are first syscall argument. */ + mov out1=in1 /* Stack address. */ + mov out2=in2 /* Stack size. */ ++ mov out3=in5 /* Parent TID Pointer */ ++ mov out4=in7 /* Child TID Pointer */ ++ mov out5=in6 /* TLS pointer */ + DO_CALL (SYS_ify (clone2)) + cmp.eq p6,p0=-1,r10 + ;; +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/ia64/fork.S glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/ia64/fork.S +--- glibc-2.3.2/sysdeps/unix/sysv/linux/ia64/fork.S Tue Dec 31 20:13:28 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/ia64/fork.S Sat Mar 29 20:18:46 2003 +@@ -32,7 +32,6 @@ + ;; + DO_CALL (SYS_ify (clone)) + cmp.eq p6,p0=-1,r10 +- ;; + (p6) br.cond.spnt.few __syscall_error + ret + PSEUDO_END(__libc_fork) +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/ia64/getcontext.S glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/ia64/getcontext.S +--- glibc-2.3.2/sysdeps/unix/sysv/linux/ia64/getcontext.S Wed Oct 9 11:57:31 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/ia64/getcontext.S Thu Mar 27 20:50:25 2003 +@@ -34,6 +34,7 @@ + other than the PRESERVED state. */ + + ENTRY(__getcontext) ++ .prologue + alloc r16 = ar.pfs, 1, 0, 3, 0 + + // sigprocmask (SIG_BLOCK, NULL, &sc->sc_mask): +@@ -53,7 +54,9 @@ + add r2 = SC_GR+1*8, r32 + ;; + mov.m rBSP = ar.bsp ++ .save ar.unat, rUNAT + mov.m rUNAT = ar.unat ++ .body + add r3 = SC_GR+4*8, r32 + ;; + +@@ -65,8 +68,8 @@ + .mem.offset 8,0; st8.spill [r3] = r6, 48 + and rTMP = ~0x3, rRSC + ;; +- st8.spill [r2] = r7, (SC_FR+2*16-(SC_GR+7*8)) +- st8.spill [r3] = sp, (SC_FR+3*16-(SC_GR+12*8)) ++.mem.offset 0,0; st8.spill [r2] = r7, (SC_FR+2*16-(SC_GR+7*8)) ++.mem.offset 8,0; st8.spill [r3] = sp, (SC_FR+3*16-(SC_GR+12*8)) + ;; + mov.m ar.rsc = rTMP // put RSE into enforced lazy mode + mov.m rNAT = ar.unat +@@ -119,8 +122,8 @@ + stf.spill [r3] = f31, 32 + mov rB1 = b1 + ;; ++ mov ar.unat = rUNAT // we're done spilling integer regs; restore caller's UNaT + add r2 = SC_NAT, r32 +- nop 0 + add r3 = SC_BSP, r32 + ;; + st8 [r2] = rNAT, (SC_RNAT-SC_NAT) +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/ia64/setjmp.S glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/ia64/setjmp.S +--- glibc-2.3.2/sysdeps/unix/sysv/linux/ia64/setjmp.S Tue Dec 31 20:13:28 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/ia64/setjmp.S Thu Mar 27 20:50:25 2003 +@@ -87,21 +87,22 @@ + ENTRY(__sigsetjmp) + .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2) + alloc loc1=ar.pfs,2,2,2,0 ++ .save ar.unat, r16 + mov r16=ar.unat + ;; + mov r17=ar.fpsr + mov r2=in0 + add r3=8,in0 + ;; +- st8.spill.nta [r2]=sp,16 // r12 (sp) +- st8.spill.nta [r3]=gp,16 // r1 (gp) ++.mem.offset 8,0; st8.spill.nta [r2]=sp,16 // r12 (sp) ++.mem.offset 0,0; st8.spill.nta [r3]=gp,16 // r1 (gp) + ;; + st8.nta [r2]=r16,16 // save caller's unat + st8.nta [r3]=r17,16 // save fpsr + add r8=0xa0,in0 + ;; +- st8.spill.nta [r2]=r4,16 // r4 +- st8.spill.nta [r3]=r5,16 // r5 ++.mem.offset 8,0; st8.spill.nta [r2]=r4,16 // r4 ++.mem.offset 0,0; st8.spill.nta [r3]=r5,16 // r5 + add r9=0xb0,in0 + ;; + stf.spill.nta [r8]=f2,32 +@@ -143,8 +144,8 @@ + stf.spill.nta [r8]=f30 + stf.spill.nta [r9]=f31 + +- st8.spill.nta [r2]=r6,16 // r6 +- st8.spill.nta [r3]=r7,16 // r7 ++.mem.offset 8,0; st8.spill.nta [r2]=r6,16 // r6 ++.mem.offset 0,0; st8.spill.nta [r3]=r7,16 // r7 + ;; + mov r23=ar.bsp + mov r25=ar.unat +@@ -170,9 +171,10 @@ + st8.nta [r3]=in0 // &__jmp_buf + br.call.dpnt.few rp=__sigjmp_save + .ret0: // force a new bundle ::q +- mov r8=0 ++ mov.m ar.unat=r16 // restore caller's unat + mov rp=loc0 + mov ar.pfs=loc1 ++ mov r8=0 + ret + END(__sigsetjmp) + +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/ia64/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/ia64/sysdep.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/ia64/sysdep.h Thu Jan 9 03:54:57 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/ia64/sysdep.h Mon Mar 24 08:54:28 2003 +@@ -96,15 +96,27 @@ + #undef PSEUDO_END + #define PSEUDO_END(name) .endp C_SYMBOL_NAME(name); + ++#undef PSEUDO_NOERRNO ++#define PSEUDO_NOERRNO(name, syscall_name, args) \ ++ ENTRY(name) \ ++ DO_CALL (SYS_ify(syscall_name)); ++ ++#undef PSEUDO_END_NOERRNO ++#define PSEUDO_END_NOERRNO(name) .endp C_SYMBOL_NAME(name); ++ + #undef END + #define END(name) \ + .size C_SYMBOL_NAME(name), . - C_SYMBOL_NAME(name) ; \ + .endp C_SYMBOL_NAME(name) + + #define ret br.ret.sptk.few b0 ++#define ret_NOERRNO ret + + #else /* not __ASSEMBLER__ */ + ++#define BREAK_INSN_1(num) "break " #num ";;\n\t" ++#define BREAK_INSN(num) BREAK_INSN_1(num) ++ + /* On IA-64 we have stacked registers for passing arguments. The + "out" registers end up being the called function's "in" + registers. +@@ -121,10 +133,10 @@ + register long _r15 asm ("r15") = __NR_##name; \ + long _retval; \ + LOAD_ARGS_##nr (args); \ +- __asm __volatile ("break %3;;\n\t" \ ++ __asm __volatile (BREAK_INSN (__BREAK_SYSCALL) \ + : "=r" (_r8), "=r" (_r10), "=r" (_r15) \ +- : "i" (__BREAK_SYSCALL), "2" (_r15) \ +- ASM_ARGS_##nr \ ++ ASM_OUTARGS_##nr \ ++ : "2" (_r15) ASM_ARGS_##nr \ + : "memory" ASM_CLOBBERS_##nr); \ + _retval = _r8; \ + if (_r10 == -1) \ +@@ -145,10 +157,10 @@ + register long _r15 asm ("r15") = __NR_##name; \ + long _retval; \ + LOAD_ARGS_##nr (args); \ +- __asm __volatile ("break %3;;\n\t" \ ++ __asm __volatile (BREAK_INSN (__BREAK_SYSCALL) \ + : "=r" (_r8), "=r" (_r10), "=r" (_r15) \ +- : "i" (__BREAK_SYSCALL), "2" (_r15) \ +- ASM_ARGS_##nr \ ++ ASM_OUTARGS_##nr \ ++ : "2" (_r15) ASM_ARGS_##nr \ + : "memory" ASM_CLOBBERS_##nr); \ + _retval = _r8; \ + err = _r10; \ +@@ -176,20 +188,33 @@ + #define LOAD_ARGS_5(out0, out1, out2, out3, out4) \ + register long _out4 asm ("out4") = (long) (out4); \ + LOAD_ARGS_4 (out0, out1, out2, out3) ++#define LOAD_ARGS_6(out0, out1, out2, out3, out4, out5) \ ++ register long _out5 asm ("out5") = (long) (out5); \ ++ LOAD_ARGS_5 (out0, out1, out2, out3, out4) ++ ++#define ASM_OUTARGS_0 ++#define ASM_OUTARGS_1 ASM_OUTARGS_0, "=r" (_out0) ++#define ASM_OUTARGS_2 ASM_OUTARGS_1, "=r" (_out1) ++#define ASM_OUTARGS_3 ASM_OUTARGS_2, "=r" (_out2) ++#define ASM_OUTARGS_4 ASM_OUTARGS_3, "=r" (_out3) ++#define ASM_OUTARGS_5 ASM_OUTARGS_4, "=r" (_out4) ++#define ASM_OUTARGS_6 ASM_OUTARGS_5, "=r" (_out5) + + #define ASM_ARGS_0 +-#define ASM_ARGS_1 ASM_ARGS_0, "r" (_out0) +-#define ASM_ARGS_2 ASM_ARGS_1, "r" (_out1) +-#define ASM_ARGS_3 ASM_ARGS_2, "r" (_out2) +-#define ASM_ARGS_4 ASM_ARGS_3, "r" (_out3) +-#define ASM_ARGS_5 ASM_ARGS_4, "r" (_out4) ++#define ASM_ARGS_1 ASM_ARGS_0, "3" (_out0) ++#define ASM_ARGS_2 ASM_ARGS_1, "4" (_out1) ++#define ASM_ARGS_3 ASM_ARGS_2, "5" (_out2) ++#define ASM_ARGS_4 ASM_ARGS_3, "6" (_out3) ++#define ASM_ARGS_5 ASM_ARGS_4, "7" (_out4) ++#define ASM_ARGS_6 ASM_ARGS_5, "8" (_out5) + + #define ASM_CLOBBERS_0 ASM_CLOBBERS_1, "out0" + #define ASM_CLOBBERS_1 ASM_CLOBBERS_2, "out1" + #define ASM_CLOBBERS_2 ASM_CLOBBERS_3, "out2" + #define ASM_CLOBBERS_3 ASM_CLOBBERS_4, "out3" + #define ASM_CLOBBERS_4 ASM_CLOBBERS_5, "out4" +-#define ASM_CLOBBERS_5 , "out5", "out6", "out7", \ ++#define ASM_CLOBBERS_5 ASM_CLOBBERS_6, "out5" ++#define ASM_CLOBBERS_6 , "out6", "out7", \ + /* Non-stacked integer registers, minus r8, r10, r15. */ \ + "r2", "r3", "r9", "r11", "r12", "r13", "r14", "r16", "r17", "r18", \ + "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26", "r27", \ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/ia64/system.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/ia64/system.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/ia64/system.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/ia64/system.c Sun Mar 16 00:47:44 2003 +@@ -0,0 +1,35 @@ ++/* Copyright (C) 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 ++ 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 ++ ++/* We have to and actually can handle cancelable system(). The big ++ problem: we have to kill the child process if necessary. To do ++ this a cleanup handler has to be registered and is has to be able ++ to find the PID of the child. The main problem is to reliable have ++ the PID when needed. It is not necessary for the parent thread to ++ return. It might still be in the kernel when the cancellation ++ request comes. Therefore we have to use the clone() calls ability ++ to have the kernel write the PID into the user-level variable. */ ++#ifdef __ASSUME_CLONE_THREAD_FLAGS ++# define FORK() \ ++ INLINE_SYSCALL (clone2, 6, CLONE_PARENT_SETTID | SIGCHLD, NULL, 0, \ ++ &pid, NULL, NULL) ++#endif ++ ++#include "../system.c" +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/ifaddrs.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/ifaddrs.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/ifaddrs.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/ifaddrs.c Sat Mar 29 10:07:18 2003 +@@ -0,0 +1,774 @@ ++/* getifaddrs -- get names and addresses of all network interfaces ++ Copyright (C) 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 ++ 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include "kernel-features.h" ++ ++/* We don't know if we have NETLINK support compiled in in our ++ Kernel, so include the old implementation as fallback. */ ++#if __ASSUME_NETLINK_SUPPORT == 0 ++static int no_netlink_support; ++ ++# define getifaddrs fallback_getifaddrs ++# include "sysdeps/gnu/ifaddrs.c" ++# undef getifaddrs ++ ++#else ++ ++# define no_netlink_support 0 ++ ++#endif ++ ++ ++struct netlink_res ++{ ++ struct netlink_res *next; ++ struct nlmsghdr *nlh; ++ size_t size; /* Size of response. */ ++ uint32_t seq; /* sequential number we used. */ ++}; ++ ++ ++struct netlink_handle ++{ ++ int fd; /* Netlink file descriptor. */ ++ pid_t pid; /* Process ID. */ ++ uint32_t seq; /* The sequence number we use currently. */ ++ struct netlink_res *nlm_list; /* Pointer to list of responses. */ ++ struct netlink_res *end_ptr; /* For faster append of new entries. */ ++}; ++ ++ ++/* struct to hold the data for one ifaddrs entry, so we can allocate ++ everything at once. */ ++struct ifaddrs_storage ++{ ++ struct ifaddrs ifa; ++ union ++ { ++ /* Save space for the biggest of the four used sockaddr types and ++ avoid a lot of casts. */ ++ struct sockaddr sa; ++ struct sockaddr_ll sl; ++ struct sockaddr_in s4; ++ struct sockaddr_in6 s6; ++ } addr, netmask, broadaddr; ++ char name[IF_NAMESIZE + 1]; ++}; ++ ++ ++static void ++free_netlink_handle (struct netlink_handle *h) ++{ ++ struct netlink_res *ptr; ++ int saved_errno = errno; ++ ++ ptr = h->nlm_list; ++ while (ptr != NULL) ++ { ++ struct netlink_res *tmpptr; ++ ++ free (ptr->nlh); ++ tmpptr = ptr->next; ++ free (ptr); ++ ptr = tmpptr; ++ } ++ ++ errno = saved_errno; ++} ++ ++ ++static int ++netlink_sendreq (struct netlink_handle *h, int type) ++{ ++ struct ++ { ++ struct nlmsghdr nlh; ++ struct rtgenmsg g; ++ } req; ++ struct sockaddr_nl nladdr; ++ ++ if (h->seq == 0) ++ h->seq = time (NULL); ++ ++ req.nlh.nlmsg_len = sizeof (req); ++ req.nlh.nlmsg_type = type; ++ req.nlh.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST; ++ req.nlh.nlmsg_pid = 0; ++ req.nlh.nlmsg_seq = h->seq; ++ req.g.rtgen_family = AF_UNSPEC; ++ ++ memset (&nladdr, '\0', sizeof (nladdr)); ++ nladdr.nl_family = AF_NETLINK; ++ ++ return TEMP_FAILURE_RETRY (sendto (h->fd, (void *) &req, sizeof (req), 0, ++ (struct sockaddr *) &nladdr, ++ sizeof (nladdr))); ++} ++ ++ ++static int ++netlink_receive (struct netlink_handle *h) ++{ ++ struct netlink_res *nlm_next; ++ char buf[4096]; ++ struct iovec iov = { buf, sizeof (buf) }; ++ struct sockaddr_nl nladdr; ++ struct nlmsghdr *nlmh; ++ int read_len; ++ bool done = false; ++ ++ while (! done) ++ { ++ struct msghdr msg = ++ { ++ (void *) &nladdr, sizeof (nladdr), ++ &iov, 1, ++ NULL, 0, ++ 0 ++ }; ++ ++ read_len = TEMP_FAILURE_RETRY (recvmsg (h->fd, &msg, 0)); ++ if (read_len < 0) ++ return -1; ++ ++ if (msg.msg_flags & MSG_TRUNC) ++ return -1; ++ ++ nlm_next = (struct netlink_res *) malloc (sizeof (struct netlink_res)); ++ if (nlm_next == NULL) ++ return -1; ++ nlm_next->next = NULL; ++ nlm_next->nlh = (struct nlmsghdr *) malloc (read_len); ++ if (nlm_next->nlh == NULL) ++ { ++ free (nlm_next); ++ return -1; ++ } ++ memcpy (nlm_next->nlh, buf, read_len); ++ nlm_next->size = read_len; ++ nlm_next->seq = h->seq; ++ if (h->nlm_list == NULL) ++ { ++ h->nlm_list = nlm_next; ++ h->end_ptr = nlm_next; ++ } ++ else ++ { ++ h->end_ptr->next = nlm_next; ++ h->end_ptr = nlm_next; ++ } ++ ++ for (nlmh = (struct nlmsghdr *) buf; ++ NLMSG_OK (nlmh, (size_t) read_len); ++ nlmh = (struct nlmsghdr *) NLMSG_NEXT (nlmh, read_len)) ++ { ++ if ((pid_t) nlmh->nlmsg_pid != h->pid || nlmh->nlmsg_seq != h->seq) ++ continue; ++ ++ if (nlmh->nlmsg_type == NLMSG_DONE) ++ { ++ /* we found the end, leave the loop. */ ++ done = true; ++ break; ++ } ++ if (nlmh->nlmsg_type == NLMSG_ERROR) ++ { ++ struct nlmsgerr *nlerr = (struct nlmsgerr *) NLMSG_DATA (nlmh); ++ if (nlmh->nlmsg_len < NLMSG_LENGTH (sizeof (struct nlmsgerr))) ++ errno = EIO; ++ else ++ errno = -nlerr->error; ++ return -1; ++ } ++ } ++ } ++ return 0; ++} ++ ++ ++static void ++netlink_close (struct netlink_handle *h) ++{ ++ /* Don't modify errno. */ ++ INTERNAL_SYSCALL_DECL (err); ++ (void) INTERNAL_SYSCALL (close, err, 1, h->fd); ++} ++ ++ ++/* Open a NETLINK socket. */ ++static int ++netlink_open (struct netlink_handle *h) ++{ ++ struct sockaddr_nl nladdr; ++ ++ h->fd = socket (PF_NETLINK, SOCK_RAW, NETLINK_ROUTE); ++ if (h->fd < 0) ++ return -1; ++ ++ memset (&nladdr, '\0', sizeof (nladdr)); ++ nladdr.nl_family = AF_NETLINK; ++ if (bind (h->fd, (struct sockaddr *) &nladdr, sizeof (nladdr)) < 0) ++ { ++ netlink_close (h); ++ return -1; ++ } ++ return 0; ++} ++ ++ ++/* We know the number of RTM_NEWLINK entries, so we reserve the first ++ # of entries for this type. All RTM_NEWADDR entries have an index ++ pointer to the RTM_NEWLINK entry. To find the entry, create ++ a table to map kernel index entries to our index numbers. ++ Since we get at first all RTM_NEWLINK entries, it can never happen ++ that a RTM_NEWADDR index is not known to this map. */ ++static int ++map_newlink (int index, int *map, int max) ++{ ++ int i; ++ ++ for (i = 0; i < max; i++) ++ { ++ if (map[i] == -1) ++ { ++ map[i] = index; ++ return i; ++ } ++ else if (map[i] == index) ++ return i; ++ } ++ /* This should never be reached. If this will be reached, we have ++ very big problem. */ ++ abort (); ++} ++ ++ ++/* Create a linked list of `struct ifaddrs' structures, one for each ++ network interface on the host machine. If successful, store the ++ list in *IFAP and return 0. On errors, return -1 and set `errno'. */ ++int ++getifaddrs (struct ifaddrs **ifap) ++{ ++ struct netlink_handle nh = { 0, 0, 0, NULL, NULL }; ++ struct netlink_res *nlp; ++ struct ifaddrs_storage *ifas; ++ unsigned int i, newlink, newaddr, newaddr_idx; ++ int *map_newlink_data; ++ size_t ifa_data_size = 0; /* Size to allocate for all ifa_data. */ ++ char *ifa_data_ptr; /* Pointer to the unused part of memory for ++ ifa_data. */ ++ ++ if (ifap) ++ *ifap = NULL; ++ ++ if (! no_netlink_support && netlink_open (&nh) < 0) ++ { ++#if __ASSUME_NETLINK_SUPPORT == 0 ++ no_netlink_support = 1; ++#else ++ return -1; ++#endif ++ } ++ ++#if __ASSUME_NETLINK_SUPPORT == 0 ++ if (no_netlink_support) ++ return fallback_getifaddrs (ifap); ++#endif ++ ++ nh.pid = getpid (); ++ ++ /* Tell the kernel that we wish to get a list of all ++ active interfaces. */ ++ if (netlink_sendreq (&nh, RTM_GETLINK) < 0) ++ { ++ netlink_close (&nh); ++ return -1; ++ } ++ /* Collect all data for every interface. */ ++ if (netlink_receive (&nh) < 0) ++ { ++ free_netlink_handle (&nh); ++ netlink_close (&nh); ++ return -1; ++ } ++ ++ ++ /* Now ask the kernel for all addresses which are assigned ++ to an interface. Since we store the addresses after the ++ interfaces in the list, we will later always find the ++ interface before the corresponding addresses. */ ++ ++nh.seq; ++ if (netlink_sendreq (&nh, RTM_GETADDR) < 0) ++ { ++ free_netlink_handle (&nh); ++ netlink_close (&nh); ++ return -1; ++ } ++ /* Collect all data for every inerface. */ ++ if (netlink_receive (&nh) < 0) ++ { ++ free_netlink_handle (&nh); ++ netlink_close (&nh); ++ return -1; ++ } ++ ++ /* Count all RTM_NEWLINK and RTM_NEWADDR entries to allocate ++ enough memory. */ ++ newlink = newaddr = 0; ++ for (nlp = nh.nlm_list; nlp; nlp = nlp->next) ++ { ++ struct nlmsghdr *nlh; ++ size_t size = nlp->size; ++ ++ if (nlp->nlh == NULL) ++ continue; ++ ++ /* Walk through all entries we got from the kernel and look, which ++ message type they contain. */ ++ for (nlh = nlp->nlh; NLMSG_OK (nlh, size); nlh = NLMSG_NEXT (nlh, size)) ++ { ++ /* check if the message is what we want */ ++ if ((pid_t) nlh->nlmsg_pid != nh.pid || nlh->nlmsg_seq != nlp->seq) ++ continue; ++ ++ if (nlh->nlmsg_type == NLMSG_DONE) ++ break; /* ok */ ++ ++ if (nlh->nlmsg_type == RTM_NEWLINK) ++ { ++ /* A RTM_NEWLINK message can have IFLA_STATS data. We need to ++ know the size before creating the list to allocate enough ++ memory. */ ++ struct ifinfomsg *ifim = (struct ifinfomsg *) NLMSG_DATA (nlh); ++ struct rtattr *rta = IFLA_RTA (ifim); ++ size_t rtasize = IFLA_PAYLOAD (nlh); ++ ++ while (RTA_OK (rta, rtasize)) ++ { ++ size_t rta_payload = RTA_PAYLOAD (rta); ++ ++ if (rta->rta_type == IFLA_STATS) ++ { ++ ifa_data_size += rta_payload; ++ break; ++ } ++ else ++ rta = RTA_NEXT (rta, rtasize); ++ } ++ ++newlink; ++ } ++ else if (nlh->nlmsg_type == RTM_NEWADDR) ++ ++newaddr; ++ } ++ } ++ ++ /* Return if no interface is up. */ ++ if ((newlink + newaddr) == 0) ++ { ++ free_netlink_handle (&nh); ++ netlink_close (&nh); ++ return 0; ++ } ++ ++ /* Table for mapping kernel index to entry in our list. */ ++ map_newlink_data = alloca (newlink * sizeof (int)); ++ ++ /* Allocate memory for all entries we have and initialize next ++ pointer. */ ++ ifas = (struct ifaddrs_storage *) calloc (1, ++ (newlink + newaddr) ++ * sizeof (struct ifaddrs_storage) ++ + ifa_data_size); ++ if (ifas == NULL) ++ { ++ free_netlink_handle (&nh); ++ netlink_close (&nh); ++ return -1; ++ } ++ ++ for (i = 0; i < newlink + newaddr - 1; i++) ++ { ++ ifas[i].ifa.ifa_next = &ifas[i + 1].ifa; ++ map_newlink_data[i] = -1; ++ } ++ ifa_data_ptr = (char *)&ifas[newlink + newaddr]; ++ newaddr_idx = 0; /* Counter for newaddr index. */ ++ ++ /* Walk through the list of data we got from the kernel. */ ++ for (nlp = nh.nlm_list; nlp; nlp = nlp->next) ++ { ++ struct nlmsghdr *nlh; ++ size_t size = nlp->size; ++ ++ if (nlp->nlh == NULL) ++ continue; ++ ++ /* Walk through one message and look at the type: If it is our ++ message, we need RTM_NEWLINK/RTM_NEWADDR and stop if we reach ++ the end or we find the end marker (in this case we ignore the ++ following data. */ ++ for (nlh = nlp->nlh; NLMSG_OK (nlh, size); nlh = NLMSG_NEXT (nlh, size)) ++ { ++ int ifa_index = 0; ++ ++ /* check if the message is the one we want */ ++ if ((pid_t) nlh->nlmsg_pid != nh.pid || nlh->nlmsg_seq != nlp->seq) ++ continue; ++ ++ if (nlh->nlmsg_type == NLMSG_DONE) ++ break; /* ok */ ++ else if (nlh->nlmsg_type == RTM_NEWLINK) ++ { ++ /* We found a new interface. Now extract everything from the ++ interface data we got and need. */ ++ struct ifinfomsg *ifim = (struct ifinfomsg *) NLMSG_DATA (nlh); ++ struct rtattr *rta = IFLA_RTA (ifim); ++ size_t rtasize = IFLA_PAYLOAD (nlh); ++ ++ /* interfaces are stored in the first "newlink" entries ++ of our list, starting in the order as we got from the ++ kernel. */ ++ ifa_index = map_newlink (ifim->ifi_index - 1, ++ map_newlink_data, newlink); ++ ifas[ifa_index].ifa.ifa_flags = ifim->ifi_flags; ++ ++ while (RTA_OK (rta, rtasize)) ++ { ++ char *rta_data = RTA_DATA (rta); ++ size_t rta_payload = RTA_PAYLOAD (rta); ++ ++ switch (rta->rta_type) ++ { ++ case IFLA_ADDRESS: ++ ifas[ifa_index].addr.sl.sll_family = AF_PACKET; ++ memcpy (ifas[ifa_index].addr.sl.sll_addr, ++ (char *) rta_data, rta_payload); ++ ifas[ifa_index].addr.sl.sll_halen = rta_payload; ++ ifas[ifa_index].addr.sl.sll_ifindex = ifim->ifi_index; ++ ifas[ifa_index].addr.sl.sll_hatype = ifim->ifi_type; ++ ++ ifas[ifa_index].ifa.ifa_addr = &ifas[ifa_index].addr.sa; ++ break; ++ ++ case IFLA_BROADCAST: ++ ifas[ifa_index].broadaddr.sl.sll_family = AF_PACKET; ++ memcpy (ifas[ifa_index].broadaddr.sl.sll_addr, ++ (char *) rta_data, rta_payload); ++ ifas[ifa_index].broadaddr.sl.sll_halen = rta_payload; ++ ifas[ifa_index].broadaddr.sl.sll_ifindex ++ = ifim->ifi_index; ++ ifas[ifa_index].broadaddr.sl.sll_hatype = ifim->ifi_type; ++ ++ ifas[ifa_index].ifa.ifa_broadaddr ++ = &ifas[ifa_index].broadaddr.sa; ++ break; ++ ++ case IFLA_IFNAME: /* Name of Interface */ ++ if ((rta_payload + 1) <= sizeof (ifas[ifa_index].name)) ++ { ++ ifas[ifa_index].ifa.ifa_name = ifas[ifa_index].name; ++ strncpy (ifas[ifa_index].name, rta_data, ++ rta_payload); ++ ifas[ifa_index].name[rta_payload] = '\0'; ++ } ++ break; ++ ++ case IFLA_STATS: /* Statistics of Interface */ ++ ifas[ifa_index].ifa.ifa_data = ifa_data_ptr; ++ ifa_data_ptr += rta_payload; ++ memcpy (ifas[ifa_index].ifa.ifa_data, rta_data, ++ rta_payload); ++ break; ++ ++ case IFLA_UNSPEC: ++ break; ++ case IFLA_MTU: ++ break; ++ case IFLA_LINK: ++ break; ++ case IFLA_QDISC: ++ break; ++ default: ++ break; ++ } ++ ++ rta = RTA_NEXT (rta, rtasize); ++ } ++ } ++ else if (nlh->nlmsg_type == RTM_NEWADDR) ++ { ++ struct ifaddrmsg *ifam = (struct ifaddrmsg *) NLMSG_DATA (nlh); ++ struct rtattr *rta = IFA_RTA (ifam); ++ size_t rtasize = IFA_PAYLOAD (nlh); ++ ++ /* New Addresses are stored in the order we got them from ++ the kernel after interfaces. Theoretical it is possible ++ that we have holes in the interface part of the list, ++ but we always have already the interface for this address. */ ++ ifa_index = newlink + newaddr_idx; ++ ifas[ifa_index].ifa.ifa_flags ++ = ifas[map_newlink (ifam->ifa_index - 1, ++ map_newlink_data, newlink)].ifa.ifa_flags; ++ ++newaddr_idx; ++ ++ while (RTA_OK (rta, rtasize)) ++ { ++ char *rta_data = RTA_DATA (rta); ++ size_t rta_payload = RTA_PAYLOAD (rta); ++ ++ switch (rta->rta_type) ++ { ++ case IFA_ADDRESS: ++ { ++ struct sockaddr *sa; ++ ++ if (ifas[ifa_index].ifa.ifa_addr != NULL) ++ { ++ /* In a point-to-poing network IFA_ADDRESS ++ contains the destination address, local ++ address is supplied in IFA_LOCAL attribute. ++ destination address and broadcast address ++ are stored in an union, so it doesn't matter ++ which name we use. */ ++ ifas[ifa_index].ifa.ifa_broadaddr ++ = &ifas[ifa_index].broadaddr.sa; ++ sa = &ifas[ifa_index].broadaddr.sa; ++ } ++ else ++ { ++ ifas[ifa_index].ifa.ifa_addr ++ = &ifas[ifa_index].addr.sa; ++ sa = &ifas[ifa_index].addr.sa; ++ } ++ ++ sa->sa_family = ifam->ifa_family; ++ ++ switch (ifam->ifa_family) ++ { ++ case AF_INET: ++ memcpy (&((struct sockaddr_in *) sa)->sin_addr, ++ rta_data, rta_payload); ++ break; ++ ++ case AF_INET6: ++ memcpy (&((struct sockaddr_in6 *) sa)->sin6_addr, ++ rta_data, rta_payload); ++ if (IN6_IS_ADDR_LINKLOCAL (rta_data) || ++ IN6_IS_ADDR_MC_LINKLOCAL (rta_data)) ++ ((struct sockaddr_in6 *) sa)->sin6_scope_id = ++ ifam->ifa_scope; ++ break; ++ ++ default: ++ memcpy (sa->sa_data, rta_data, rta_payload); ++ break; ++ } ++ } ++ break; ++ ++ case IFA_LOCAL: ++ if (ifas[ifa_index].ifa.ifa_addr != NULL) ++ { ++ /* If ifa_addr is set and we get IFA_LOCAL, ++ assume we have a point-to-point network. ++ Move address to correct field. */ ++ ifas[ifa_index].broadaddr = ifas[ifa_index].addr; ++ ifas[ifa_index].ifa.ifa_broadaddr ++ = &ifas[ifa_index].broadaddr.sa; ++ memset (&ifas[ifa_index].addr, '\0', ++ sizeof (ifas[ifa_index].addr)); ++ } ++ ++ ifas[ifa_index].ifa.ifa_addr = &ifas[ifa_index].addr.sa; ++ ifas[ifa_index].ifa.ifa_addr->sa_family ++ = ifam->ifa_family; ++ ++ switch (ifam->ifa_family) ++ { ++ case AF_INET: ++ memcpy (&ifas[ifa_index].addr.s4.sin_addr, ++ rta_data, rta_payload); ++ break; ++ ++ case AF_INET6: ++ memcpy (&ifas[ifa_index].addr.s6.sin6_addr, ++ rta_data, rta_payload); ++ if (IN6_IS_ADDR_LINKLOCAL (rta_data) || ++ IN6_IS_ADDR_MC_LINKLOCAL (rta_data)) ++ ifas[ifa_index].addr.s6.sin6_scope_id = ++ ifam->ifa_scope; ++ break; ++ ++ default: ++ memcpy (ifas[ifa_index].addr.sa.sa_data, ++ rta_data, rta_payload); ++ break; ++ } ++ break; ++ ++ case IFA_BROADCAST: ++ /* We get IFA_BROADCAST, so IFA_LOCAL was too much. */ ++ if (ifas[ifa_index].ifa.ifa_broadaddr != NULL) ++ memset (&ifas[ifa_index].broadaddr, '\0', ++ sizeof (ifas[ifa_index].broadaddr)); ++ ++ ifas[ifa_index].ifa.ifa_broadaddr ++ = &ifas[ifa_index].broadaddr.sa; ++ ifas[ifa_index].ifa.ifa_broadaddr->sa_family ++ = ifam->ifa_family; ++ ++ switch (ifam->ifa_family) ++ { ++ case AF_INET: ++ memcpy (&ifas[ifa_index].broadaddr.s4.sin_addr, ++ rta_data, rta_payload); ++ break; ++ ++ case AF_INET6: ++ memcpy (&ifas[ifa_index].broadaddr.s6.sin6_addr, ++ rta_data, rta_payload); ++ if (IN6_IS_ADDR_LINKLOCAL (rta_data) || ++ IN6_IS_ADDR_MC_LINKLOCAL (rta_data)) ++ ifas[ifa_index].broadaddr.s6.sin6_scope_id = ++ ifam->ifa_scope; ++ break; ++ ++ default: ++ memcpy (&ifas[ifa_index].broadaddr.sa.sa_data, ++ rta_data, rta_payload); ++ break; ++ } ++ break; ++ ++ case IFA_LABEL: ++ if (rta_payload + 1 <= sizeof (ifas[ifa_index].name)) ++ { ++ ifas[ifa_index].ifa.ifa_name = ifas[ifa_index].name; ++ strncpy (ifas[ifa_index].name, rta_data, ++ rta_payload); ++ ifas[ifa_index].name[rta_payload] = '\0'; ++ } ++ else ++ abort (); ++ break; ++ ++ case IFA_UNSPEC: ++ break; ++ case IFA_CACHEINFO: ++ break; ++ default: ++ break; ++ } ++ ++ rta = RTA_NEXT (rta, rtasize); ++ } ++ ++ /* If we didn't get the interface name with the ++ address, use the name from the interface entry. */ ++ if (ifas[ifa_index].ifa.ifa_name == NULL) ++ ifas[ifa_index].ifa.ifa_name ++ = ifas[map_newlink (ifam->ifa_index - 1, ++ map_newlink_data, newlink)].ifa.ifa_name; ++ ++ /* Calculate the netmask. */ ++ if (ifas[ifa_index].ifa.ifa_addr ++ && ifas[ifa_index].ifa.ifa_addr->sa_family != AF_UNSPEC ++ && ifas[ifa_index].ifa.ifa_addr->sa_family != AF_PACKET) ++ { ++ uint32_t max_prefixlen = 0; ++ char *cp = NULL; ++ ++ ifas[ifa_index].ifa.ifa_netmask ++ = &ifas[ifa_index].netmask.sa; ++ ++ switch (ifas[ifa_index].ifa.ifa_addr->sa_family) ++ { ++ case AF_INET: ++ cp = (char *) &ifas[ifa_index].netmask.s4.sin_addr; ++ max_prefixlen = 32; ++ break; ++ ++ case AF_INET6: ++ cp = (char *) &ifas[ifa_index].netmask.s6.sin6_addr; ++ max_prefixlen = 128; ++ break; ++ } ++ ++ ifas[ifa_index].ifa.ifa_netmask->sa_family ++ = ifas[ifa_index].ifa.ifa_addr->sa_family; ++ ++ if (cp != NULL) ++ { ++ char c; ++ unsigned int preflen; ++ ++ if ((max_prefixlen > 0) && ++ (ifam->ifa_prefixlen > max_prefixlen)) ++ preflen = max_prefixlen; ++ else ++ preflen = ifam->ifa_prefixlen; ++ ++ for (i = 0; i < (preflen / 8); i++) ++ *cp++ = 0xff; ++ c = 0xff; ++ c <<= (8 - (preflen % 8)); ++ *cp = c; ++ } ++ } ++ } ++ } ++ } ++ ++ free_netlink_handle (&nh); ++ ++ netlink_close (&nh); ++ ++ if (ifap != NULL) ++ *ifap = &ifas[0].ifa; ++ ++ return 0; ++} ++ ++ ++#if __ASSUME_NETLINK_SUPPORT != 0 ++void ++freeifaddrs (struct ifaddrs *ifa) ++{ ++ free (ifa); ++} ++#endif +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/kernel-features.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/kernel-features.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/kernel-features.h Thu Feb 20 23:11:52 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/kernel-features.h Sat Mar 29 08:24:55 2003 +@@ -1,6 +1,6 @@ + /* Set flags signalling availability of kernel features based on given + kernel version number. +- Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2000, 2001, 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 +@@ -229,8 +229,8 @@ + # define __ASSUME_SET_THREAD_AREA_SYSCALL 1 + #endif + +-/* The vfork syscall on x86 was definitely available in 2.4. */ +-#if __LINUX_KERNEL_VERSION >= 132097 && defined __i386__ ++/* The vfork syscall on x86 and arm was definitely available in 2.4. */ ++#if __LINUX_KERNEL_VERSION >= 132097 && (defined __i386__ || defined __arm__) + # define __ASSUME_VFORK_SYSCALL 1 + #endif + +@@ -264,3 +264,24 @@ + # define __ASSUME_FCNTL64 1 + # define __ASSUME_VFORK_SYSCALL 1 + #endif ++ ++/* Beginning with 2.5.63 support for realtime and monotonic clocks and ++ timers based on them is available. */ ++#if __LINUX_KERNEL_VERSION >= 132415 ++# define __ASSUME_POSIX_TIMERS 1 ++#endif ++ ++/* The late 2.5 kernels saw a lot of new CLONE_* flags. Summarize ++ their availability with one define. The changes were made first ++ for i386 and the have to be done separately for the other archs. ++ For ia64, s390*, PPC we pick 2.5.64 as the first version with support. */ ++#if __LINUX_KERNEL_VERSION >= 132416 \ ++ && (defined __ia64__ || defined __s390__ || defined __powerpc__) ++# define __ASSUME_CLONE_THREAD_FLAGS 1 ++#endif ++ ++/* With kernel 2.4.17 we always have netlink support. */ ++#if __LINUX_KERNEL_VERSION >= (132096+17) ++# define __ASSUME_NETLINK_SUPPORT 1 ++#endif ++ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/linux_fsinfo.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/linux_fsinfo.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/linux_fsinfo.h Wed Oct 23 08:21:19 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/linux_fsinfo.h Fri Mar 14 07:25:31 2003 +@@ -1,5 +1,5 @@ + /* Constants from kernel header for various FSes. +- Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1998,1999,2000,2001,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,6 +40,9 @@ + /* Constants that identify the `coherent' filesystem. */ + #define COH_SUPER_MAGIC 0x012ff7b7 + ++/* Constant that identifies the `ramfs' filesystem. */ ++#define CRAMFS_MAGIC 0x28cd3d45 ++ + /* Constant that identifies the `devfs' filesystem. */ + #define DEVFS_SUPER_MAGIC 0x1373 + +@@ -48,6 +51,7 @@ + + /* Constant that identifies the `efs' filesystem. */ + #define EFS_SUPER_MAGIC 0x414A53 ++#define EFS_MAGIC 0x072959 + + /* Constant that identifies the `ext2' and `ext3' filesystems. */ + #define EXT2_SUPER_MAGIC 0xef53 +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/m68k/bits/mman.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/m68k/bits/mman.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/m68k/bits/mman.h Thu Feb 20 21:33:25 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/m68k/bits/mman.h Mon Mar 3 10:58:55 2003 +@@ -52,11 +52,13 @@ + + /* These are Linux-specific. */ + #ifdef __USE_MISC +-# define MAP_GROWSDOWN 0x0100 /* Stack-like segment. */ +-# define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +-# define MAP_EXECUTABLE 0x1000 /* Mark it as an executable. */ +-# define MAP_LOCKED 0x2000 /* Lock the mapping. */ +-# define MAP_NORESERVE 0x4000 /* Don't check for reservations. */ ++# define MAP_GROWSDOWN 0x00100 /* Stack-like segment. */ ++# define MAP_DENYWRITE 0x00800 /* ETXTBSY */ ++# define MAP_EXECUTABLE 0x01000 /* Mark it as an executable. */ ++# define MAP_LOCKED 0x02000 /* Lock the mapping. */ ++# define MAP_NORESERVE 0x04000 /* Don't check for reservations. */ ++# define MAP_POPULATE 0x08000 /* Populate (prefault) pagetables. */ ++# define MAP_NONBLOCK 0x10000 /* Do not block on IO. */ + #endif + + /* Flags to `msync'. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/m68k/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/m68k/sysdep.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/m68k/sysdep.h Thu Jan 9 03:54:57 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/m68k/sysdep.h Wed Mar 26 00:15:40 2003 +@@ -68,6 +68,18 @@ + SYSCALL_ERROR_HANDLER; \ + END (name) + ++#undef PSEUDO_NOERRNO ++#define PSEUDO_NOERRNO(name, syscall_name, args) \ ++ .text; \ ++ ENTRY (name) \ ++ DO_CALL (syscall_name, args) ++ ++#undef PSEUDO_END_NOERRNO ++#define PSEUDO_END_NOERRNO(name) \ ++ END (name) ++ ++#define ret_NOERRNO ret ++ + #ifdef PIC + # if RTLD_PRIVATE_ERRNO + # define SYSCALL_ERROR_HANDLER \ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/Makefile glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/Makefile +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/Makefile Fri Mar 29 00:41:51 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/Makefile Mon Mar 17 16:50:05 2003 +@@ -8,4 +8,43 @@ + sysdep_routines += cachectl cacheflush sysmips _test_and_set + + sysdep_headers += sys/cachectl.h sys/sysmips.h sys/tas.h ++ ++no_syscall_list_h = 1 ++ ++# Generate the list of SYS_* macros for the system calls (__NR_* macros). ++# We generate not only SYS_, pointing at SYS__ if ++# it exists, but also define SYS__ for all ABIs. ++$(objpfx)syscall-%.h $(objpfx)syscall-%.d: ../sysdeps/unix/sysv/linux/mips/sys/syscall.h ++ rm -f $(@:.h=.d)-t ++ { \ ++ echo '/* Generated at libc build time from kernel syscall list. */';\ ++ echo ''; \ ++ echo '#ifndef _SYSCALL_H'; \ ++ echo '# error "Never use directly; include instead."'; \ ++ echo '#endif'; \ ++ echo ''; \ ++ rm -f $(@:.d=.h).newt; \ ++ SUNPRO_DEPENDENCIES='$(@:.h=.d)-t $@' \ ++ $(CC) -E -x c -I $(common-objdir) $(sysincludes) $< -D_LIBC -dM | \ ++ sed -n 's@^#define __NR_\([^ ]*\) .*$$@#define SYS_\1 __NR_\1@p' > $(@:.d=.h).newt; \ ++ if grep SYS_O32_ $(@:.d=.h).newt > /dev/null; then \ ++ echo '#if defined _ABI64 && _MIPS_SIM == _ABI64'; \ ++ sed -n 's/^\(#define SYS_\)N64_/\1/p' < $(@:.d=.h).newt; \ ++ echo '#elif defined _ABIN32 && _MIPS_SIM == _ABIN32'; \ ++ sed -n 's/^\(#define SYS_\)N32_/\1/p' < $(@:.d=.h).newt; \ ++ echo '#else'; \ ++ sed -n 's/^\(#define SYS_\)O32_/\1/p' < $(@:.d=.h).newt; \ ++ echo '#endif'; \ ++ sed -n '/^#define SYS_\([ON]32\|N64\)_/p' < $(@:.d=.h).newt; \ ++ else \ ++ cat $(@:.d=.h).newt; \ ++ fi; \ ++ rm $(@:.d=.h).newt; \ ++ } > $(@:.d=.h).new ++ mv -f $(@:.d=.h).new $(@:.d=.h) ++ sed < $(@:.h=.d)-t > $(@:.h=.d)-t2 \ ++ -e 's,$(subst .,\.,$@),$(patsubst $(objpfx)%,$$(objpfx)%,\ ++ $(@:.d=.h) $(@:.h=.d)),' ++ rm -f $(@:.h=.d)-t ++ mv -f $(@:.h=.d)-t2 $(@:.h=.d) + endif +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/bits/mman.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/bits/mman.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/bits/mman.h Sat Jul 7 21:21:35 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/bits/mman.h Fri Mar 7 10:46:33 2003 +@@ -1,5 +1,5 @@ + /* Definitions for POSIX memory map interface. Linux/MIPS version. +- Copyright (C) 1997, 2000 Free Software Foundation, Inc. ++ Copyright (C) 1997, 2000, 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 +@@ -59,6 +59,8 @@ + # define MAP_DENYWRITE 0x2000 /* ETXTBSY */ + # define MAP_EXECUTABLE 0x4000 /* mark it as an executable */ + # define MAP_LOCKED 0x8000 /* pages are locked */ ++# define MAP_POPULATE 0x10000 /* populate (prefault) pagetables */ ++# define MAP_NONBLOCK 0x20000 /* do not block on IO */ + #endif + + /* Flags to `msync'. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/bits/sigaction.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/bits/sigaction.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/bits/sigaction.h Sat Jul 7 21:21:35 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/bits/sigaction.h Tue Mar 25 22:51:52 2003 +@@ -1,5 +1,6 @@ + /* The proper definitions for Linux/MIPS's sigaction. +- Copyright (C) 1993,94,95,97,98,99,2000 Free Software Foundation, Inc. ++ Copyright (C) 1993, 1994, 1995, 1997, 1998, 1999, 2000, 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 +@@ -49,7 +50,7 @@ + /* Restore handler. */ + void (*sa_restorer) (void); + +-#if _MIPS_ISA == _MIPS_ISA_MIPS1 || _MIPS_ISA == _MIPS_ISA_MIPS2 ++#if _MIPS_SZPTR < 64 + int sa_resv[1]; + #endif + }; +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/clone.S glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/clone.S +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/clone.S Sat Jul 7 21:21:35 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/clone.S Sat Mar 29 09:01:57 2003 +@@ -1,6 +1,6 @@ +-/* Copyright (C) 1996, 1997, 2000 Free Software Foundation, Inc. ++/* Copyright (C) 1996, 1997, 2000, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. +- Contributed by Ralf Baechle , 1996. ++ Contributed by Ralf Baechle , 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public +@@ -21,7 +21,6 @@ + and invokes a function in the right context after its all over. */ + + #include +-#include + #include + #define _ERRNO_H 1 + #include +@@ -29,15 +28,17 @@ + /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg) */ + + .text ++LOCALSZ= 1 ++FRAMESZ= (((NARGSAVE+LOCALSZ)*SZREG)+ALSZ)&ALMASK ++GPOFF= FRAMESZ-(1*SZREG) + NESTED(__clone,4*SZREG,sp) + #ifdef __PIC__ +- .set noreorder +- .cpload $25 +- .set reorder +- subu sp,32 +- .cprestore 16 +-#else +- subu sp,32 ++ SETUP_GP ++#endif ++ PTR_SUBU sp, FRAMESZ ++ SETUP_GP64 (GPOFF, __clone) ++#ifdef __PIC__ ++ SAVE_GP (GPOFF) + #endif + #ifdef PROF + .set noat +@@ -49,12 +50,12 @@ + + /* Sanity check arguments. */ + li v0,EINVAL +- beqz a0,error /* No NULL function pointers. */ +- beqz a1,error /* No NULL stack pointers. */ ++ beqz a0,L(error) /* No NULL function pointers. */ ++ beqz a1,L(error) /* No NULL stack pointers. */ + +- subu a1,32 /* Reserve argument save space. */ +- sw a0,0(a1) /* Save function pointer. */ +- sw a3,4(a1) /* Save argument pointer. */ ++ PTR_SUBU a1,32 /* Reserve argument save space. */ ++ PTR_S a0,0(a1) /* Save function pointer. */ ++ PTR_S a3,PTRSIZE(a1) /* Save argument pointer. */ + + + /* Do the system call */ +@@ -62,20 +63,24 @@ + li v0,__NR_clone + syscall + +- bnez a3,error +- beqz v0,__thread_start ++ bnez a3,L(error) ++ beqz v0,L(thread_start) + + /* Successful return from the parent */ +- addiu sp,32 ++ RESTORE_GP64 ++ PTR_ADDU sp, FRAMESZ + ret + + /* Something bad happened -- no child created */ +-error: +- addiu sp,32 ++L(error): + #ifdef __PIC__ +- la t9,__syscall_error ++ PTR_LA t9,__syscall_error ++ RESTORE_GP64 ++ PTR_ADDU sp, FRAMESZ + jr t9 + #else ++ RESTORE_GP64 ++ PTR_ADDU sp, FRAMESZ + j __syscall_error + #endif + END(__clone) +@@ -85,20 +90,21 @@ + debug info. */ + + ENTRY(__thread_start) ++L(thread_start): + /* cp is already loaded. */ +- .cprestore 16 ++ SAVE_GP (GPOFF) + /* The stackframe has been created on entry of clone(). */ + /* Restore the arg for user's function. */ +- lw t9,0(sp) /* Function pointer. */ +- lw a0,4(sp) /* Argument pointer. */ ++ PTR_L t9,0(sp) /* Function pointer. */ ++ PTR_L a0,PTRSIZE(sp) /* Argument pointer. */ + + /* Call the user's function. */ +- jalr t9 ++ jal t9 + + /* Call _exit rather than doing it inline for breakpoint purposes. */ + move a0,v0 + #ifdef __PIC__ +- la t9,_exit ++ PTR_LA t9,_exit + jalr t9 + #else + jal _exit +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/configure glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/configure +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/configure Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/configure Fri Mar 28 07:11:03 2003 +@@ -0,0 +1,75 @@ ++# This file is generated from configure.in by Autoconf. DO NOT EDIT! ++ # Local configure fragment for sysdeps/unix/sysv/linux/mips. ++ ++case $machine in ++mips*64*) ++ rm -f asm-unistd.h ++ asm_unistd_h=$sysheaders/asm/unistd.h ++ if test ! -f $asm_unistd_h; then ++ # Try to find asm/unistd.h in compiler header search path. ++ try_asm_unistd_h=`echo '#include ' | $CPP - | ++ sed -n '/^# 1 "\(\/[^"]*\)".*/{s,,\1,p;q;}'` ++ if test -n "$try_asm_unistd_h" && ++ test -f "$try_asm_unistd_h"; then ++ asm_unistd_h=$try_asm_unistd_h ++ fi ++ fi ++ if test ! -f "$asm_unistd_h"; then ++ { echo "$as_me:$LINENO: WARNING: *** asm/unistd.h not found, it will not be pre-processed" >&5 ++echo "$as_me: WARNING: *** asm/unistd.h not found, it will not be pre-processed" >&2;} ++ echo '#include ' > asm-unistd.h ++ else ++ # The point of this preprocessing is to turn __NR_ into ++ # __NR_N64_, as well as to define __NR_ to ++ # __NR__, if __NR__ is defined ++ # and is the compiler-enabled ABI. ++ cat "$asm_unistd_h" | ++ sed -e 's,__NR_,__NR_N64_,g' \ ++ -e 's,__NR_N64_##,__NR_##,g' \ ++ -e 's,__NR_N64_O32_,__NR_O32_,g' \ ++ -e 's,__NR_N64_N32_,__NR_N32_,g' \ ++ -e 's,__NR_N64_N64_,__NR_N64_,g' \ ++ | awk > asm-unistd.h ' ++/^#define __NR.*unused/ { print; next; } ++/^#define __NR_N64__exit __NR_N64_exit/ { ++ print "#define __NR__exit __NR_exit"; ++ print "#define __NR_O32__exit __NR_O32_exit"; ++ print "#define __NR_N32__exit __NR_N32_exit"; ++ print; next; ++} ++/^#define __NR_O32_/ { ++ name = $2; ++ sub (/_O32_/, "_", name); ++ print; ++ print "#if _MIPS_SIM == _MIPS_SIM_ABI32"; ++ print "# define " name " " $2; ++ print "#endif"; ++ next; ++} ++/^#define __NR_N32_/ { ++ name = $2; ++ sub (/_N32_/, "_", name); ++ print; ++ print "#if defined _ABIN32 && _MIPS_SIM == _ABIN32"; ++ print "# define " name " " $2; ++ print "#endif"; ++ next; ++} ++/^#define __NR_N64_/ { ++ name = $2; ++ sub (/_N64_/, "_", name); ++ print; ++ print "#if defined _ABI64 && _MIPS_SIM == _ABI64"; ++ print "# define " name " " $2; ++ print "#endif"; ++ next; ++} ++{ ++ print; ++}' ++ fi ;; ++mips*) ++ rm -f asm-unistd.h ++ echo '#include ' > asm-unistd.h ++ ;; ++esac +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/configure.in glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/configure.in +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/configure.in Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/configure.in Mon Mar 17 16:50:05 2003 +@@ -0,0 +1,75 @@ ++sinclude(./aclocal.m4)dnl Autoconf lossage ++GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. ++# Local configure fragment for sysdeps/unix/sysv/linux/mips. ++ ++case $machine in ++mips*64*) ++ rm -f asm-unistd.h ++ asm_unistd_h=$sysheaders/asm/unistd.h ++ if test ! -f $asm_unistd_h; then ++ # Try to find asm/unistd.h in compiler header search path. ++ try_asm_unistd_h=`echo '#include ' | $CPP - | ++ sed -n '/^# 1 "\(\/[^"]*\)".*/{s,,\1,p;q;}'` ++ if test -n "$try_asm_unistd_h" && ++ test -f "$try_asm_unistd_h"; then ++ asm_unistd_h=$try_asm_unistd_h ++ fi ++ fi ++ if test ! -f "$asm_unistd_h"; then ++ AC_MSG_WARN([*** asm/unistd.h not found, it will not be pre-processed]) ++ echo '#include ' > asm-unistd.h ++ else ++ # The point of this preprocessing is to turn __NR_ into ++ # __NR_N64_, as well as to define __NR_ to ++ # __NR__, if __NR__ is defined ++ # and is the compiler-enabled ABI. ++ cat "$asm_unistd_h" | ++ sed -e 's,__NR_,__NR_N64_,g' \ ++ -e 's,__NR_N64_##,__NR_##,g' \ ++ -e 's,__NR_N64_O32_,__NR_O32_,g' \ ++ -e 's,__NR_N64_N32_,__NR_N32_,g' \ ++ -e 's,__NR_N64_N64_,__NR_N64_,g' \ ++ | awk > asm-unistd.h ' ++/^#define __NR.*unused/ { print; next; } ++/^#define __NR_N64__exit __NR_N64_exit/ { ++ print "#define __NR__exit __NR_exit"; ++ print "#define __NR_O32__exit __NR_O32_exit"; ++ print "#define __NR_N32__exit __NR_N32_exit"; ++ print; next; ++} ++/^#define __NR_O32_/ { ++ name = $2; ++ sub (/_O32_/, "_", name); ++ print; ++ print "#if _MIPS_SIM == _MIPS_SIM_ABI32"; ++ print "# define " name " " $2; ++ print "#endif"; ++ next; ++} ++/^#define __NR_N32_/ { ++ name = $2; ++ sub (/_N32_/, "_", name); ++ print; ++ print "#if defined _ABIN32 && _MIPS_SIM == _ABIN32"; ++ print "# define " name " " $2; ++ print "#endif"; ++ next; ++} ++/^#define __NR_N64_/ { ++ name = $2; ++ sub (/_N64_/, "_", name); ++ print; ++ print "#if defined _ABI64 && _MIPS_SIM == _ABI64"; ++ print "# define " name " " $2; ++ print "#endif"; ++ next; ++} ++{ ++ print; ++}' ++ fi ;; ++mips*) ++ rm -f asm-unistd.h ++ echo '#include ' > asm-unistd.h ++ ;; ++esac +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/kernel_sigaction.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/kernel_sigaction.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/kernel_sigaction.h Fri Dec 15 07:05:44 2000 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/kernel_sigaction.h Tue Mar 25 22:51:53 2003 +@@ -12,7 +12,7 @@ + + /* Abi says here follows reserved int[2] */ + void (*sa_restorer)(void); +-#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2) ++#if (_MIPS_SZPTR < 64) + /* + * For 32 bit code we have to pad struct sigaction to get + * constant size for the ABI +@@ -23,7 +23,7 @@ + + + #define _KERNEL_NSIG 128 +-#define _KERNEL_NSIG_BPW 32 ++#define _KERNEL_NSIG_BPW _MIPS_SZLONG + #define _KERNEL_NSIG_WORDS (_KERNEL_NSIG / _KERNEL_NSIG_BPW) + + typedef struct { +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/kernel_stat.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/kernel_stat.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/kernel_stat.h Mon Nov 20 09:45:43 2000 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/kernel_stat.h Mon Mar 17 16:47:13 2003 +@@ -1,4 +1,28 @@ + /* Definition of `struct stat' used in the kernel.. */ ++#if defined _ABI64 && _MIPS_SIM == _ABI64 ++struct kernel_stat ++ { ++ unsigned int st_dev; ++ unsigned int __pad1[3]; ++ unsigned long st_ino; ++ unsigned int st_mode; ++ unsigned int st_nlink; ++ int st_uid; ++ int st_gid; ++ unsigned int st_rdev; ++ unsigned int __pad2[3]; ++ long st_size; ++ unsigned int st_atime; ++ unsigned int __unused1; ++ unsigned int st_mtime; ++ unsigned int __unused2; ++ unsigned int st_ctime; ++ unsigned int __unused3; ++ unsigned int st_blksize; ++ unsigned int __pad3; ++ unsigned long st_blocks; ++ }; ++#else + struct kernel_stat + { + unsigned long int st_dev; +@@ -26,3 +50,4 @@ + unsigned int st_flags; + unsigned int st_gen; + }; ++#endif +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h Sat Mar 29 09:15:29 2003 +@@ -0,0 +1,36 @@ ++/* Copyright (C) 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 ++ 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 _LINUX_MIPS_MIPS32_KERN64_SYSDEP_H ++#define _LINUX_MIPS_MIPS32_KERN64_SYSDEP_H 1 ++ ++/* There is some commonality. */ ++#include ++ ++/* For Linux we can use the system call table in the header file ++ /usr/include/asm/unistd.h ++ of the kernel. But these symbols do not follow the SYS_* syntax ++ so we have to redefine the `SYS_ify' macro here. */ ++#undef SYS_ify ++#ifdef __STDC__ ++# define SYS_ify(syscall_name) __NR_O32_##syscall_name ++#else ++# define SYS_ify(syscall_name) __NR_O32_/**/syscall_name ++#endif ++ ++#endif /* linux/mips/mips32/kern64/sysdep.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h Sat Mar 29 09:15:29 2003 +@@ -0,0 +1,282 @@ ++/* Copyright (C) 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 ++ 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 _LINUX_MIPS_MIPS32_SYSDEP_H ++#define _LINUX_MIPS_MIPS32_SYSDEP_H 1 ++ ++/* There is some commonality. */ ++#include ++ ++/* For Linux we can use the system call table in the header file ++ /usr/include/asm/unistd.h ++ of the kernel. But these symbols do not follow the SYS_* syntax ++ so we have to redefine the `SYS_ify' macro here. */ ++#undef SYS_ify ++#ifdef __STDC__ ++# define SYS_ify(syscall_name) __NR_##syscall_name ++#else ++# define SYS_ify(syscall_name) __NR_/**/syscall_name ++#endif ++ ++#ifdef __ASSEMBLER__ ++ ++/* We don't want the label for the error handler to be visible in the symbol ++ table when we define it here. */ ++#ifdef __PIC__ ++# define SYSCALL_ERROR_LABEL 99b ++#endif ++ ++#else /* ! __ASSEMBLER__ */ ++ ++/* Define a macro which expands into the inline wrapper code for a system ++ call. */ ++#undef INLINE_SYSCALL ++#define INLINE_SYSCALL(name, nr, args...) \ ++ ({ INTERNAL_SYSCALL_DECL(err); \ ++ long result_var = INTERNAL_SYSCALL (name, err, nr, args); \ ++ if ( INTERNAL_SYSCALL_ERROR_P (result_var, err) ) \ ++ { \ ++ __set_errno (INTERNAL_SYSCALL_ERRNO (result_var, err)); \ ++ result_var = -1L; \ ++ } \ ++ result_var; }) ++ ++#undef INTERNAL_SYSCALL_DECL ++#define INTERNAL_SYSCALL_DECL(err) long err ++ ++#undef INTERNAL_SYSCALL_ERROR_P ++#define INTERNAL_SYSCALL_ERROR_P(val, err) ((long) (err)) ++ ++#undef INTERNAL_SYSCALL_ERRNO ++#define INTERNAL_SYSCALL_ERRNO(val, err) (val) ++ ++#undef INTERNAL_SYSCALL ++#define INTERNAL_SYSCALL(name, err, nr, args...) internal_syscall##nr(name, err, args) ++ ++#define internal_syscall0(name, err, dummy...) \ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long __v0 asm("$2"); \ ++ register long __a3 asm("$7"); \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %2\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set reorder" \ ++ : "=r" (__v0), "=r" (__a3) \ ++ : "i" (SYS_ify(name)) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall1(name, err, arg1) \ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long __v0 asm("$2"); \ ++ register long __a0 asm("$4") = (long) arg1; \ ++ register long __a3 asm("$7"); \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %3\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set reorder" \ ++ : "=r" (__v0), "=r" (__a3) \ ++ : "r" (__a0), "i" (SYS_ify(name)) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall2(name, err, arg1, arg2) \ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long __v0 asm("$2"); \ ++ register long __a0 asm("$4") = (long) arg1; \ ++ register long __a1 asm("$5") = (long) arg2; \ ++ register long __a3 asm("$7"); \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %4\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set\treorder" \ ++ : "=r" (__v0), "=r" (__a3) \ ++ : "r" (__a0), "r" (__a1), "i" (SYS_ify(name)) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall3(name, err, arg1, arg2, arg3) \ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long __v0 asm("$2"); \ ++ register long __a0 asm("$4") = (long) arg1; \ ++ register long __a1 asm("$5") = (long) arg2; \ ++ register long __a2 asm("$6") = (long) arg3; \ ++ register long __a3 asm("$7"); \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %5\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set\treorder" \ ++ : "=r" (__v0), "=r" (__a3) \ ++ : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall4(name, err, arg1, arg2, arg3, arg4) \ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long __v0 asm("$2"); \ ++ register long __a0 asm("$4") = (long) arg1; \ ++ register long __a1 asm("$5") = (long) arg2; \ ++ register long __a2 asm("$6") = (long) arg3; \ ++ register long __a3 asm("$7") = (long) arg4; \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %5\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set\treorder" \ ++ : "=r" (__v0), "+r" (__a3) \ ++ : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall5(name, err, arg1, arg2, arg3, arg4, arg5) \ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long __v0 asm("$2"); \ ++ register long __a0 asm("$4") = (long) arg1; \ ++ register long __a1 asm("$5") = (long) arg2; \ ++ register long __a2 asm("$6") = (long) arg3; \ ++ register long __a3 asm("$7") = (long) arg4; \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "lw\t$2, %6\n\t" \ ++ "subu\t$29, 32\n\t" \ ++ "sw\t$2, 16($29)\n\t" \ ++ "li\t$2, %5\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ "addiu\t$29, 32\n\t" \ ++ ".set\treorder" \ ++ : "=r" (__v0), "+r" (__a3) \ ++ : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), \ ++ "m" ((long)arg5) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall6(name, err, arg1, arg2, arg3, arg4, arg5, arg6)\ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long __v0 asm("$2"); \ ++ register long __a0 asm("$4") = (long) arg1; \ ++ register long __a1 asm("$5") = (long) arg2; \ ++ register long __a2 asm("$6") = (long) arg3; \ ++ register long __a3 asm("$7") = (long) arg4; \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "lw\t$2, %6\n\t" \ ++ "lw\t$8, %7\n\t" \ ++ "subu\t$29, 32\n\t" \ ++ "sw\t$2, 16($29)\n\t" \ ++ "sw\t$8, 20($29)\n\t" \ ++ "li\t$2, %5\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ "addiu\t$29, 32\n\t" \ ++ ".set\treorder" \ ++ : "=r" (__v0), "+r" (__a3) \ ++ : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), \ ++ "m" ((long)arg5), "m" ((long)arg6) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall7(name, err, arg1, arg2, arg3, arg4, arg5, arg6, arg7)\ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long __v0 asm("$2"); \ ++ register long __a0 asm("$4") = (long) arg1; \ ++ register long __a1 asm("$5") = (long) arg2; \ ++ register long __a2 asm("$6") = (long) arg3; \ ++ register long __a3 asm("$7") = (long) arg4; \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "lw\t$2, %6\n\t" \ ++ "lw\t$8, %7\n\t" \ ++ "lw\t$9, %8\n\t" \ ++ "subu\t$29, 32\n\t" \ ++ "sw\t$2, 16($29)\n\t" \ ++ "sw\t$8, 20($29)\n\t" \ ++ "sw\t$9, 24($29)\n\t" \ ++ "li\t$2, %5\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ "addiu\t$29, 32\n\t" \ ++ ".set\treorder" \ ++ : "=r" (__v0), "+r" (__a3) \ ++ : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), \ ++ "m" ((long)arg5), "m" ((long)arg6), "m" ((long)arg7) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define __SYSCALL_CLOBBERS "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25" ++ ++#endif /* __ASSEMBLER__ */ ++ ++#endif /* linux/mips/mips32/sysdep.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/Dist glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/Dist +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/Dist Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/Dist Mon Mar 17 16:57:19 2003 +@@ -0,0 +1 @@ ++ldd-rewrite.sed +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/ldconfig.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/ldconfig.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/ldconfig.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/ldconfig.h Mon Mar 17 17:20:44 2003 +@@ -0,0 +1,26 @@ ++/* Copyright (C) 2001, 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 ++ 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 ++ ++#define SYSDEP_KNOWN_INTERPRETER_NAMES \ ++ { "/lib32/ld.so.1", FLAG_ELF_LIBC6 }, \ ++ { "/lib64/ld.so.1", FLAG_ELF_LIBC6 }, ++#define SYSDEP_KNOWN_LIBRARY_NAMES \ ++ { "libc.so.6", FLAG_ELF_LIBC6 }, \ ++ { "libm.so.6", FLAG_ELF_LIBC6 }, +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/ldd-rewrite.sed glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/ldd-rewrite.sed +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/ldd-rewrite.sed Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/ldd-rewrite.sed Mon Mar 17 16:57:19 2003 +@@ -0,0 +1 @@ ++s_^\(RTLDLIST=\)\(.*lib\)\(\|32\|64\)\(/[^/]*\.so\.[0-9.]*\)[ ]*$_\1"\232\4 \264\4 \2\4"_ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/llseek.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/llseek.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/llseek.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/llseek.c Mon Mar 17 17:20:44 2003 +@@ -0,0 +1 @@ ++/* lseek() is 64-bit capable already. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h Mon Mar 17 17:20:44 2003 +@@ -0,0 +1,263 @@ ++/* Copyright (C) 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 ++ 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 _LINUX_MIPS_SYSDEP_H ++#define _LINUX_MIPS_SYSDEP_H 1 ++ ++/* There is some commonality. */ ++#include ++ ++/* For Linux we can use the system call table in the header file ++ /usr/include/asm/unistd.h ++ of the kernel. But these symbols do not follow the SYS_* syntax ++ so we have to redefine the `SYS_ify' macro here. */ ++#undef SYS_ify ++#ifdef __STDC__ ++# define SYS_ify(syscall_name) __NR_N32_##syscall_name ++#else ++# define SYS_ify(syscall_name) __NR_N32_/**/syscall_name ++#endif ++ ++ ++#ifndef __ASSEMBLER__ ++#if 0 /* untested */ ++/* Define a macro which expands into the inline wrapper code for a system ++ call. */ ++#undef INLINE_SYSCALL ++#define INLINE_SYSCALL(name, nr, args...) \ ++ ({ INTERNAL_SYSCALL_DECL(err); \ ++ long result_var = INTERNAL_SYSCALL (name, err, nr, args); \ ++ if ( INTERNAL_SYSCALL_ERROR_P (result_var, err) ) \ ++ { \ ++ __set_errno (INTERNAL_SYSCALL_ERRNO (result_var, err)); \ ++ result_var = -1L; \ ++ } \ ++ result_var; }) ++ ++#undef INTERNAL_SYSCALL_DECL ++#define INTERNAL_SYSCALL_DECL(err) long err ++ ++#undef INTERNAL_SYSCALL_ERROR_P ++#define INTERNAL_SYSCALL_ERROR_P(val, err) ((long) (err)) ++ ++#undef INTERNAL_SYSCALL_ERRNO ++#define INTERNAL_SYSCALL_ERRNO(val, err) (val) ++ ++#undef INTERNAL_SYSCALL ++#define INTERNAL_SYSCALL(name, err, nr, args...) internal_syscall##nr(name, err, args) ++ ++#define internal_syscall0(name, err, dummy...) \ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long __v0 asm("$2"); \ ++ register long __a3 asm("$7"); \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %2\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set reorder" \ ++ : "=r" (__v0), "=r" (__a3) \ ++ : "i" (SYS_ify(name)) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall1(name, err, arg1) \ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long long __v0 asm("$2"); \ ++ register long long __a0 asm("$4") = (long long) arg1; \ ++ register long long __a3 asm("$7"); \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %3\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set reorder" \ ++ : "=r" (__v0), "=r" (__a3) \ ++ : "r" (__a0), "i" (SYS_ify(name)) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall2(name, err, arg1, arg2) \ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long long __v0 asm("$2"); \ ++ register long long __a0 asm("$4") = (long long) arg1; \ ++ register long long __a1 asm("$5") = (long long) arg2; \ ++ register long long __a3 asm("$7"); \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %4\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set\treorder" \ ++ : "=r" (__v0), "=r" (__a3) \ ++ : "r" (__a0), "r" (__a1), "i" (SYS_ify(name)) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall3(name, err, arg1, arg2, arg3) \ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long long __v0 asm("$2"); \ ++ register long long __a0 asm("$4") = (long long) arg1; \ ++ register long long __a1 asm("$5") = (long long) arg2; \ ++ register long long __a2 asm("$6") = (long long) arg3; \ ++ register long long __a3 asm("$7"); \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %5\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set\treorder" \ ++ : "=r" (__v0), "=r" (__a3) \ ++ : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall4(name, err, arg1, arg2, arg3, arg4) \ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long long __v0 asm("$2"); \ ++ register long long __a0 asm("$4") = (long long) arg1; \ ++ register long long __a1 asm("$5") = (long long) arg2; \ ++ register long long __a2 asm("$6") = (long long) arg3; \ ++ register long long __a3 asm("$7") = (long long) arg4; \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %5\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set\treorder" \ ++ : "=r" (__v0), "+r" (__a3) \ ++ : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall5(name, err, arg1, arg2, arg3, arg4, arg5) \ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long long __v0 asm("$2"); \ ++ register long long __a0 asm("$4") = (long long) arg1; \ ++ register long long __a1 asm("$5") = (long long) arg2; \ ++ register long long __a2 asm("$6") = (long long) arg3; \ ++ register long long __a3 asm("$7") = (long long) arg4; \ ++ register long long __a4 asm("$8") = (long long) arg5; \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %5\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set\treorder" \ ++ : "=r" (__v0), "+r" (__a3) \ ++ : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), \ ++ "r" (__a4) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall6(name, err, arg1, arg2, arg3, arg4, arg5, arg6)\ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long long __v0 asm("$2"); \ ++ register long long __a0 asm("$4") = (long long) arg1; \ ++ register long long __a1 asm("$5") = (long long) arg2; \ ++ register long long __a2 asm("$6") = (long long) arg3; \ ++ register long long __a3 asm("$7") = (long long) arg4; \ ++ register long long __a4 asm("$8") = (long long) arg5; \ ++ register long long __a5 asm("$9") = (long long) arg6; \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %5\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set\treorder" \ ++ : "=r" (__v0), "+r" (__a3) \ ++ : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), \ ++ "r" (__a5), "r" (__a6) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall7(name, err, arg1, arg2, arg3, arg4, arg5, arg6, arg7)\ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long long __v0 asm("$2"); \ ++ register long long __a0 asm("$4") = (long long) arg1; \ ++ register long long __a1 asm("$5") = (long long) arg2; \ ++ register long long __a2 asm("$6") = (long long) arg3; \ ++ register long long __a3 asm("$7") = (long long) arg4; \ ++ register long long __a4 asm("$8") = (long long) arg5; \ ++ register long long __a5 asm("$9") = (long long) arg6; \ ++ register long long __a6 asm("$10") = (long long) arg7; \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %5\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set\treorder" \ ++ : "=r" (__v0), "+r" (__a3) \ ++ : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), \ ++ "r" (__a5), "r" (__a6), "r" (__a7) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define __SYSCALL_CLOBBERS "$1", "$3", "$11", "$12", "$13", "$14", "$15", "$24", "$25" ++#endif /* untested */ ++#endif /* __ASSEMBLER__ */ ++ ++#endif /* linux/mips/sysdep.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/n64/glob64.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/n64/glob64.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/n64/glob64.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/n64/glob64.c Mon Mar 17 17:20:44 2003 +@@ -0,0 +1 @@ ++/* glob64 is in glob.c */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/n64/ioctl.S glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/n64/ioctl.S +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/n64/ioctl.S Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/n64/ioctl.S Thu Mar 20 08:54:56 2003 +@@ -0,0 +1,42 @@ ++/* Copyright 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 ++ 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 ++ ++/* Sign-extend the ioctl number, since the kernel wants it as a ++ sign-extended 32-bit value, but our prototype is that of a long. */ ++ ++ .text ++ENTRY (__ioctl) ++ li v0, __NR_ioctl ++ sll a1,a1,0 ++ syscall /* Do the system call. */ ++ bne a3, zero, L(error) ++ ret ++ ++L(error): ++ .cpsetup t9, a0, __ioctl ++ PTR_LA t9,__syscall_error ++ .cprestore ++ jr t9 ++ ++PSEUDO_END (__ioctl) ++ ++weak_alias (__ioctl, ioctl) +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h Mon Mar 17 17:20:44 2003 +@@ -0,0 +1,263 @@ ++/* Copyright (C) 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 ++ 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 _LINUX_MIPS_SYSDEP_H ++#define _LINUX_MIPS_SYSDEP_H 1 ++ ++/* There is some commonality. */ ++#include ++ ++/* For Linux we can use the system call table in the header file ++ /usr/include/asm/unistd.h ++ of the kernel. But these symbols do not follow the SYS_* syntax ++ so we have to redefine the `SYS_ify' macro here. */ ++#undef SYS_ify ++#ifdef __STDC__ ++# define SYS_ify(syscall_name) __NR_N64_##syscall_name ++#else ++# define SYS_ify(syscall_name) __NR_N64_/**/syscall_name ++#endif ++ ++ ++#ifndef __ASSEMBLER__ ++#if 0 /* untested */ ++/* Define a macro which expands into the inline wrapper code for a system ++ call. */ ++#undef INLINE_SYSCALL ++#define INLINE_SYSCALL(name, nr, args...) \ ++ ({ INTERNAL_SYSCALL_DECL(err); \ ++ long result_var = INTERNAL_SYSCALL (name, err, nr, args); \ ++ if ( INTERNAL_SYSCALL_ERROR_P (result_var, err) ) \ ++ { \ ++ __set_errno (INTERNAL_SYSCALL_ERRNO (result_var, err)); \ ++ result_var = -1L; \ ++ } \ ++ result_var; }) ++ ++#undef INTERNAL_SYSCALL_DECL ++#define INTERNAL_SYSCALL_DECL(err) long err ++ ++#undef INTERNAL_SYSCALL_ERROR_P ++#define INTERNAL_SYSCALL_ERROR_P(val, err) ((long) (err)) ++ ++#undef INTERNAL_SYSCALL_ERRNO ++#define INTERNAL_SYSCALL_ERRNO(val, err) (val) ++ ++#undef INTERNAL_SYSCALL ++#define INTERNAL_SYSCALL(name, err, nr, args...) internal_syscall##nr(name, err, args) ++ ++#define internal_syscall0(name, err, dummy...) \ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long __v0 asm("$2"); \ ++ register long __a3 asm("$7"); \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %2\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set reorder" \ ++ : "=r" (__v0), "=r" (__a3) \ ++ : "i" (SYS_ify(name)) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall1(name, err, arg1) \ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long __v0 asm("$2"); \ ++ register long __a0 asm("$4") = (long) arg1; \ ++ register long __a3 asm("$7"); \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %3\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set reorder" \ ++ : "=r" (__v0), "=r" (__a3) \ ++ : "r" (__a0), "i" (SYS_ify(name)) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall2(name, err, arg1, arg2) \ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long __v0 asm("$2"); \ ++ register long __a0 asm("$4") = (long) arg1; \ ++ register long __a1 asm("$5") = (long) arg2; \ ++ register long __a3 asm("$7"); \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %4\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set\treorder" \ ++ : "=r" (__v0), "=r" (__a3) \ ++ : "r" (__a0), "r" (__a1), "i" (SYS_ify(name)) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall3(name, err, arg1, arg2, arg3) \ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long __v0 asm("$2"); \ ++ register long __a0 asm("$4") = (long) arg1; \ ++ register long __a1 asm("$5") = (long) arg2; \ ++ register long __a2 asm("$6") = (long) arg3; \ ++ register long __a3 asm("$7"); \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %5\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set\treorder" \ ++ : "=r" (__v0), "=r" (__a3) \ ++ : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall4(name, err, arg1, arg2, arg3, arg4) \ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long __v0 asm("$2"); \ ++ register long __a0 asm("$4") = (long) arg1; \ ++ register long __a1 asm("$5") = (long) arg2; \ ++ register long __a2 asm("$6") = (long) arg3; \ ++ register long __a3 asm("$7") = (long) arg4; \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %5\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set\treorder" \ ++ : "=r" (__v0), "+r" (__a3) \ ++ : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall5(name, err, arg1, arg2, arg3, arg4, arg5) \ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long __v0 asm("$2"); \ ++ register long __a0 asm("$4") = (long) arg1; \ ++ register long __a1 asm("$5") = (long) arg2; \ ++ register long __a2 asm("$6") = (long) arg3; \ ++ register long __a3 asm("$7") = (long) arg4; \ ++ register long __a4 asm("$8") = (long) arg5; \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %5\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set\treorder" \ ++ : "=r" (__v0), "+r" (__a3) \ ++ : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), \ ++ "r" (__a4) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall6(name, err, arg1, arg2, arg3, arg4, arg5, arg6)\ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long __v0 asm("$2"); \ ++ register long __a0 asm("$4") = (long) arg1; \ ++ register long __a1 asm("$5") = (long) arg2; \ ++ register long __a2 asm("$6") = (long) arg3; \ ++ register long __a3 asm("$7") = (long) arg4; \ ++ register long __a4 asm("$8") = (long) arg5; \ ++ register long __a5 asm("$9") = (long) arg6; \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %5\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set\treorder" \ ++ : "=r" (__v0), "+r" (__a3) \ ++ : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), \ ++ "r" (__a5), "r" (__a6) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define internal_syscall7(name, err, arg1, arg2, arg3, arg4, arg5, arg6, arg7)\ ++({ \ ++ long _sys_result; \ ++ \ ++ { \ ++ register long __v0 asm("$2"); \ ++ register long __a0 asm("$4") = (long) arg1; \ ++ register long __a1 asm("$5") = (long) arg2; \ ++ register long __a2 asm("$6") = (long) arg3; \ ++ register long __a3 asm("$7") = (long) arg4; \ ++ register long __a4 asm("$8") = (long) arg5; \ ++ register long __a5 asm("$9") = (long) arg6; \ ++ register long __a6 asm("$10") = (long) arg7; \ ++ __asm__ volatile ( \ ++ ".set\tnoreorder\n\t" \ ++ "li\t$2, %5\t\t\t# " #name "\n\t" \ ++ "syscall\n\t" \ ++ ".set\treorder" \ ++ : "=r" (__v0), "+r" (__a3) \ ++ : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), \ ++ "r" (__a5), "r" (__a6), "r" (__a7) \ ++ : __SYSCALL_CLOBBERS); \ ++ err = __a3; \ ++ _sys_result = __v0; \ ++ } \ ++ _sys_result; \ ++}) ++ ++#define __SYSCALL_CLOBBERS "$1", "$3", "$11", "$12", "$13", "$14", "$15", "$24", "$25" ++#endif /* untested */ ++#endif /* __ASSEMBLER__ */ ++ ++#endif /* linux/mips/sysdep.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/recv.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/recv.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/recv.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/recv.c Mon Mar 17 17:20:44 2003 +@@ -0,0 +1 @@ ++#include +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/send.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/send.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/send.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/send.c Mon Mar 17 17:20:44 2003 +@@ -0,0 +1 @@ ++#include +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/syscall.S glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/syscall.S +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/syscall.S Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/syscall.S Mon Mar 17 17:20:44 2003 +@@ -0,0 +1,53 @@ ++/* Copyright (C) 2001, 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 ++ 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 ++ ++/* Please consult the file sysdeps/unix/sysv/linux/x86-64/sysdep.h for ++ more information about the value -4095 used below. */ ++ ++/* Usage: long syscall (syscall_number, arg1, arg2, arg3, arg4, arg5) ++ We need to do some arg shifting, the syscall_number will be in ++ rax. */ ++ ++ ++ .text ++ENTRY (syscall) ++ move v0, a0 /* Syscall number -> v0 */ ++ move a0, a1 /* shift arg1 - arg7. */ ++ move a1, a2 ++ move a2, a3 ++ move a3, a4 ++ move a4, a5 ++ move a5, a6 ++ move a6, a7 ++ ++ syscall /* Do the system call. */ ++ bne a3, zero, L(error) ++ ++ ret ++ ++L(error): ++ .cpsetup t9, a0, syscall ++ PTR_LA t9,__syscall_error ++ .cprestore ++ jr t9 ++ ++PSEUDO_END (syscall) +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/syscalls.list glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/syscalls.list +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/syscalls.list Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/syscalls.list Mon Mar 17 17:20:44 2003 +@@ -0,0 +1,20 @@ ++# File name Caller Syscall name Args Strong name Weak names ++ ++lseek - lseek i:iii __libc_lseek __lseek lseek __llseek llseek __libc_lseek64 __lseek64 lseek64 ++ ++# proper socket implementations: ++recvfrom - recvfrom i:ibniBN __libc_recvfrom __recvfrom recvfrom __syscall_recvfrom ++sendto - sendto i:ibnibn __libc_sendto __sendto sendto __syscall_sendto ++ ++# semaphore and shm system calls ++msgctl - msgctl i:iip __msgctl msgctl ++msgget - msgget i:ii __msgget msgget ++msgrcv - msgrcv i:ibnii __msgrcv msgrcv ++msgsnd - msgsnd i:ibni __msgsnd msgsnd ++shmat - shmat i:ipi __shmat shmat ++shmctl - shmctl i:iip __shmctl shmctl ++shmdt - shmdt i:s __shmdt shmdt ++shmget - shmget i:iii __shmget shmget ++semop - semop i:ipi __semop semop ++semget - semget i:iii __semget semget ++semctl - semctl i:iiii __semctl semctl +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/umount.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/umount.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/mips64/umount.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/mips64/umount.c Mon Mar 17 17:20:44 2003 +@@ -0,0 +1 @@ ++#include +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/pread.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/pread.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/pread.c Mon Jan 27 19:55:20 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/pread.c Thu Mar 20 21:58:02 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1997, 1998, 2000, 2002 Free Software Foundation, Inc. ++/* Copyright (C) 1997, 1998, 2000, 2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1997. + +@@ -42,7 +42,13 @@ + off_t offset) internal_function; + # endif + extern ssize_t __syscall_pread (int fd, void *__unbounded buf, size_t count, +- int dummy, off_t offset_hi, off_t offset_lo); ++ int dummy, ++#if defined _ABI64 && _MIPS_SIM == _ABI64 ++ off_t offset ++#else ++ off_t offset_hi, off_t offset_lo ++#endif ++ ); + + + +@@ -59,8 +65,13 @@ + { + /* First try the syscall. */ + assert (sizeof (offset) == 4); ++#if defined _ABI64 && _MIPS_SIM == _ABI64 ++ result = INLINE_SYSCALL (pread, 6, fd, CHECK_N (buf, count), count, 0, ++ offset); ++#else + result = INLINE_SYSCALL (pread, 6, fd, CHECK_N (buf, count), count, 0, + __LONG_LONG_PAIR (offset >> 31, offset)); ++#endif + # if __ASSUME_PREAD_SYSCALL == 0 + if (result == -1 && errno == ENOSYS) + /* No system call available. Use the emulation. */ +@@ -73,8 +84,13 @@ + + /* First try the syscall. */ + assert (sizeof (offset) == 4); ++#if defined _ABI64 && _MIPS_SIM == _ABI64 ++ result = INLINE_SYSCALL (pread, 6, fd, CHECK_N (buf, count), count, 0, ++ offset); ++#else + result = INLINE_SYSCALL (pread, 6, fd, CHECK_N (buf, count), count, 0, + __LONG_LONG_PAIR (offset >> 31, offset)); ++#endif + # if __ASSUME_PREAD_SYSCALL == 0 + if (result == -1 && errno == ENOSYS) + /* No system call available. Use the emulation. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/pread64.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/pread64.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/pread64.c Mon Jan 27 19:55:20 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/pread64.c Thu Mar 20 21:58:02 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc. ++/* Copyright (C) 1997, 1998, 2000, 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1997. + +@@ -42,7 +42,13 @@ + # endif + + extern ssize_t __syscall_pread (int fd, void *__unbounded buf, size_t count, +- int dummy, off_t offset_hi, off_t offset_lo); ++ int dummy, ++#if defined _ABI64 && _MIPS_SIM == _ABI64 ++ off_t offset ++#else ++ off_t offset_hi, off_t offset_lo ++#endif ++ ); + + + +@@ -59,9 +65,14 @@ + if (SINGLE_THREAD_P) + { + /* First try the syscall. */ ++#if defined _ABI64 && _MIPS_SIM == _ABI64 ++ result = INLINE_SYSCALL (pread, 6, fd, CHECK_N (buf, count), count, 0, ++ offset); ++#else + result = INLINE_SYSCALL (pread, 6, fd, CHECK_N (buf, count), count, 0, + __LONG_LONG_PAIR ((off_t) (offset >> 32), + (off_t) (offset & 0xffffffff))); ++#endif + # if __ASSUME_PREAD_SYSCALL == 0 + if (result == -1 && errno == ENOSYS) + /* No system call available. Use the emulation. */ +@@ -73,9 +84,14 @@ + int oldtype = LIBC_CANCEL_ASYNC (); + + /* First try the syscall. */ ++#if defined _ABI64 && _MIPS_SIM == _ABI64 ++ result = INLINE_SYSCALL (pread, 6, fd, CHECK_N (buf, count), count, 0, ++ offset); ++#else + result = INLINE_SYSCALL (pread, 6, fd, CHECK_N (buf, count), count, 0, + __LONG_LONG_PAIR ((off_t) (offset >> 32), + (off_t) (offset & 0xffffffff))); ++#endif + # if __ASSUME_PREAD_SYSCALL == 0 + if (result == -1 && errno == ENOSYS) + /* No system call available. Use the emulation. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/ptrace.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/ptrace.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/ptrace.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/ptrace.c Mon Mar 17 16:48:52 2003 +@@ -0,0 +1,112 @@ ++/* Copyright (C) 1995, 1996, 1997, 1998, 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 ++ 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 ++#include ++ ++#if defined _ABIN32 && _MIPS_SIM == _ABIN32 ++__extension__ typedef long long int reg_type; ++#else ++typedef long int reg_type; ++#endif ++ ++extern reg_type __syscall_ptrace (int, pid_t, void *__unbounded, ++ reg_type __unbounded); ++ ++reg_type ++ptrace (enum __ptrace_request request, ...) ++{ ++ reg_type res, ret; ++ va_list ap; ++ pid_t pid; ++ void *addr; ++ reg_type data; ++ ++ va_start (ap, request); ++ pid = va_arg (ap, pid_t); ++ addr = va_arg (ap, void *); ++ data = va_arg (ap, reg_type); ++ va_end (ap); ++ ++ if (request > 0 && request < 4) ++ data = &ret; ++ ++#if __BOUNDED_POINTERS__ ++ switch (request) ++ { ++ case PTRACE_PEEKTEXT: ++ case PTRACE_PEEKDATA: ++ case PTRACE_PEEKUSER: ++ case PTRACE_POKETEXT: ++ case PTRACE_POKEDATA: ++ case PTRACE_POKEUSER: ++ (void) CHECK_1 ((int *) addr); ++ (void) CHECK_1 ((int *) data); ++ break; ++ ++ case PTRACE_GETREGS: ++ case PTRACE_SETREGS: ++ /* We don't know the size of data, so the best we can do is ensure ++ that `data' is valid for at least one word. */ ++ (void) CHECK_1 ((int *) data); ++ break; ++ ++ case PTRACE_GETFPREGS: ++ case PTRACE_SETFPREGS: ++ /* We don't know the size of data, so the best we can do is ensure ++ that `data' is valid for at least one word. */ ++ (void) CHECK_1 ((int *) data); ++ break; ++ ++ case PTRACE_GETFPXREGS: ++ case PTRACE_SETFPXREGS: ++ /* We don't know the size of data, so the best we can do is ensure ++ that `data' is valid for at least one word. */ ++ (void) CHECK_1 ((int *) data); ++ break; ++ ++ case PTRACE_TRACEME: ++ case PTRACE_CONT: ++ case PTRACE_KILL: ++ case PTRACE_SINGLESTEP: ++ case PTRACE_ATTACH: ++ case PTRACE_DETACH: ++ case PTRACE_SYSCALL: ++ /* Neither `data' nor `addr' needs any checks. */ ++ break; ++ }; ++#endif ++ ++ res = INLINE_SYSCALL (ptrace, 4, request, pid, ++ __ptrvalue (addr), __ptrvalue (data)); ++ if (res >= 0 && request > 0 && request < 4) ++ { ++ __set_errno (0); ++ return ret; ++ } ++ ++ return res; ++} +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/pwrite.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/pwrite.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/pwrite.c Mon Jan 27 19:55:20 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/pwrite.c Thu Mar 20 21:58:02 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1997, 1998, 2000, 2002 Free Software Foundation, Inc. ++/* Copyright (C) 1997, 1998, 2000, 2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1997. + +@@ -38,7 +38,13 @@ + #if defined __NR_pwrite || __ASSUME_PWRITE_SYSCALL > 0 + + extern ssize_t __syscall_pwrite (int fd, const void *__unbounded buf, size_t count, +- int dummy, off_t offset_hi, off_t offset_lo); ++ int dummy, ++#if defined _ABI64 && _MIPS_SIM == _ABI64 ++ off_t offset ++#else ++ off_t offset_hi, off_t offset_lo ++#endif ++ ); + + # if __ASSUME_PWRITE_SYSCALL == 0 + static ssize_t __emulate_pwrite (int fd, const void *buf, size_t count, +@@ -58,8 +64,13 @@ + { + /* First try the syscall. */ + assert (sizeof (offset) == 4); ++#if defined _ABI64 && _MIPS_SIM == _ABI64 ++ result = INLINE_SYSCALL (pwrite, 6, fd, CHECK_N (buf, count), count, 0, ++ offset); ++#else + result = INLINE_SYSCALL (pwrite, 6, fd, CHECK_N (buf, count), count, 0, + __LONG_LONG_PAIR (offset >> 31, offset)); ++#endif + # if __ASSUME_PWRITE_SYSCALL == 0 + if (result == -1 && errno == ENOSYS) + /* No system call available. Use the emulation. */ +@@ -73,8 +84,13 @@ + + /* First try the syscall. */ + assert (sizeof (offset) == 4); ++#if defined _ABI64 && _MIPS_SIM == _ABI64 ++ result = INLINE_SYSCALL (pwrite, 6, fd, CHECK_N (buf, count), count, 0, ++ offset); ++#else + result = INLINE_SYSCALL (pwrite, 6, fd, CHECK_N (buf, count), count, 0, + __LONG_LONG_PAIR (offset >> 31, offset)); ++#endif + # if __ASSUME_PWRITE_SYSCALL == 0 + if (result == -1 && errno == ENOSYS) + /* No system call available. Use the emulation. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/pwrite64.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/pwrite64.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/pwrite64.c Mon Jan 27 19:55:20 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/pwrite64.c Thu Mar 20 21:58:02 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1997, 1998, 2000, 2002 Free Software Foundation, Inc. ++/* Copyright (C) 1997, 1998, 2000, 2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ralf Baechle , 1998. + +@@ -37,7 +37,13 @@ + #if defined __NR_pwrite || __ASSUME_PWRITE_SYSCALL > 0 + + extern ssize_t __syscall_pwrite (int fd, const void *__unbounded buf, size_t count, +- int dummy, off_t offset_hi, off_t offset_lo); ++ int dummy, ++#if defined _ABI64 && _MIPS_SIM == _ABI64 ++ off_t offset ++#else ++ off_t offset_hi, off_t offset_lo ++#endif ++ ); + + # if __ASSUME_PWRITE_SYSCALL == 0 + static ssize_t __emulate_pwrite64 (int fd, const void *buf, size_t count, +@@ -56,9 +62,14 @@ + if (SINGLE_THREAD_P) + { + /* First try the syscall. */ ++#if defined _ABI64 && _MIPS_SIM == _ABI64 ++ result = INLINE_SYSCALL (pwrite, 6, fd, CHECK_N (buf, count), count, 0, ++ offset); ++#else + result = INLINE_SYSCALL (pwrite, 6, fd, CHECK_N (buf, count), count, 0, + __LONG_LONG_PAIR ((off_t) (offset >> 32), + (off_t) (offset & 0xffffffff))); ++#endif + # if __ASSUME_PWRITE_SYSCALL == 0 + if (result == -1 && errno == ENOSYS) + /* No system call available. Use the emulation. */ +@@ -71,9 +82,14 @@ + int oldtype = LIBC_CANCEL_ASYNC (); + + /* First try the syscall. */ ++#if defined _ABI64 && _MIPS_SIM == _ABI64 ++ result = INLINE_SYSCALL (pwrite, 6, fd, CHECK_N (buf, count), count, 0, ++ offset); ++#else + result = INLINE_SYSCALL (pwrite, 6, fd, CHECK_N (buf, count), count, 0, + __LONG_LONG_PAIR ((off_t) (offset >> 32), + (off_t) (offset & 0xffffffff))); ++#endif + # if __ASSUME_PWRITE_SYSCALL == 0 + if (result == -1 && errno == ENOSYS) + /* No system call available. Use the emulation. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/readelflib.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/readelflib.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/readelflib.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/readelflib.c Fri Mar 14 08:52:05 2003 +@@ -0,0 +1,71 @@ ++/* Copyright (C) 1999, 2001, 2002, 2003 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Alexandre Oliva ++ Based on work ../x86_64/readelflib.c, ++ contributed by Andreas Jaeger , 1999 and ++ Jakub Jelinek , 1999. ++ ++ 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. */ ++ ++ ++int process_elf32_file (const char *file_name, const char *lib, int *flag, ++ unsigned int *osversion, char **soname, ++ void *file_contents, size_t file_length); ++int process_elf64_file (const char *file_name, const char *lib, int *flag, ++ unsigned int *osversion, char **soname, ++ void *file_contents, size_t file_length); ++ ++/* Returns 0 if everything is ok, != 0 in case of error. */ ++int ++process_elf_file (const char *file_name, const char *lib, int *flag, ++ unsigned int *osversion, char **soname, void *file_contents, ++ size_t file_length) ++{ ++ ElfW(Ehdr) *elf_header = (ElfW(Ehdr) *) file_contents; ++ int ret; ++ ++ if (elf_header->e_ident [EI_CLASS] == ELFCLASS32) ++ { ++ ret = process_elf32_file (file_name, lib, flag, osversion, soname, ++ file_contents, file_length); ++ ++ /* n32 libraries are always libc.so.6+. */ ++ if (ret && (elf_header->e_flags & EF_MIPS_ABI2) != 0) ++ *flag = FLAG_MIPS64_LIBN32|FLAG_ELF_LIBC6; ++ } ++ else ++ { ++ ret = process_elf64_file (file_name, lib, flag, osversion, soname, ++ file_contents, file_length); ++ /* n64 libraries are always libc.so.6+. */ ++ if (!ret) ++ *flag = FLAG_MIPS64_LIBN64|FLAG_ELF_LIBC6; ++ } ++ ++ return ret; ++} ++ ++#undef __ELF_NATIVE_CLASS ++#undef process_elf_file ++#define process_elf_file process_elf32_file ++#define __ELF_NATIVE_CLASS 32 ++#include "sysdeps/generic/readelflib.c" ++ ++#undef __ELF_NATIVE_CLASS ++#undef process_elf_file ++#define process_elf_file process_elf64_file ++#define __ELF_NATIVE_CLASS 64 ++#include "sysdeps/generic/readelflib.c" +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/sigaction.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/sigaction.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/sigaction.c Fri Jan 3 00:26:04 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/sigaction.c Fri Mar 14 08:49:05 2003 +@@ -41,6 +41,15 @@ + extern int __syscall_rt_sigaction (int, const struct kernel_sigaction *__unbounded, + struct kernel_sigaction *__unbounded, size_t); + ++#if _MIPS_SIM != _MIPS_SIM_ABI32 ++ ++# ifdef __NR_rt_sigreturn ++static void restore_rt (void) asm ("__restore_rt"); ++# endif ++# ifdef __NR_sigreturn ++static void restore (void) asm ("__restore"); ++# endif ++#endif + + /* If ACT is not NULL, change the action for SIG to *ACT. + If OACT is not NULL, put the old action for SIG in *OACT. */ +@@ -74,7 +83,11 @@ + memcpy (&kact.sa_mask, &act->sa_mask, sizeof (kernel_sigset_t)); + kact.sa_flags = act->sa_flags; + # ifdef HAVE_SA_RESTORER ++# if _MIPS_SIM == _MIPS_SIM_ABI32 + kact.sa_restorer = act->sa_restorer; ++# else ++ kact.sa_restorer = &restore_rt; ++# endif + # endif + } + +@@ -128,7 +141,11 @@ + oact->sa_mask.__val[0] = k_osigact.sa_mask; + oact->sa_flags = k_osigact.sa_flags; + # ifdef HAVE_SA_RESTORER ++# if _MIPS_SIM == _MIPS_SIM_ABI32 + oact->sa_restorer = k_osigact.sa_restorer; ++# else ++ oact->sa_restorer = &restore; ++# endif + # endif + } + return result; +@@ -140,4 +157,32 @@ + weak_alias (__libc_sigaction, __sigaction) + libc_hidden_weak (__sigaction) + weak_alias (__libc_sigaction, sigaction) ++#endif ++ ++/* NOTE: Please think twice before making any changes to the bits of ++ code below. GDB needs some intimate knowledge about it to ++ recognize them as signal trampolines, and make backtraces through ++ 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. */ ++ ++#define RESTORE(name, syscall) RESTORE2 (name, syscall) ++#define RESTORE2(name, syscall) \ ++asm \ ++ ( \ ++ ".align 4\n" \ ++ "__" #name ":\n" \ ++ " li $2, " #syscall "\n" \ ++ " syscall\n" \ ++ ); ++ ++/* The return code for realtime-signals. */ ++#if _MIPS_SIM != _MIPS_SIM_ABI32 ++# ifdef __NR_rt_sigreturn ++RESTORE (restore_rt, __NR_rt_sigreturn) ++# endif ++# ifdef __NR_sigreturn ++RESTORE (restore, __NR_sigreturn) ++# endif + #endif +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/sys/procfs.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/sys/procfs.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/sys/procfs.h Sat Feb 9 02:19:07 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/sys/procfs.h Mon Mar 17 16:47:13 2003 +@@ -1,4 +1,5 @@ +-/* Copyright (C) 1996, 1997, 1999, 2000, 2002 Free Software Foundation, Inc. ++/* Copyright (C) 1996, 1997, 1999, 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 +@@ -32,7 +33,11 @@ + #define ELF_NGREG 45 + #define ELF_NFPREG 33 + ++#if defined _ABIN32 && _MIPS_SIM == _ABIN32 ++__extension__ typedef unsigned long long elf_greg_t; ++#else + typedef unsigned long elf_greg_t; ++#endif + typedef elf_greg_t elf_gregset_t[ELF_NGREG]; + + typedef double elf_fpreg_t; +@@ -59,8 +64,13 @@ + { + struct elf_siginfo pr_info; /* Info associated with signal. */ + short int pr_cursig; /* Current signal. */ ++#if defined _ABIN32 && _MIPS_SIM == _ABIN32 ++ __extension__ unsigned long long int pr_sigpend; ++ __extension__ unsigned long long int pr_sighold; ++#else + unsigned long int pr_sigpend; /* Set of pending signals. */ + unsigned long int pr_sighold; /* Set of held signals. */ ++#endif + __pid_t pr_pid; + __pid_t pr_ppid; + __pid_t pr_pgrp; +@@ -82,7 +92,11 @@ + char pr_sname; /* Char for pr_state. */ + char pr_zomb; /* Zombie. */ + char pr_nice; /* Nice val. */ ++#if defined _ABIN32 && _MIPS_SIM == _ABIN32 ++ __extension__ unsigned long long int pr_flag; ++#else + unsigned long int pr_flag; /* Flags. */ ++#endif + long pr_uid; + long pr_gid; + int pr_pid, pr_ppid, pr_pgrp, pr_sid; +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/sys/ptrace.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/sys/ptrace.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/sys/ptrace.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/sys/ptrace.h Mon Mar 17 16:48:52 2003 +@@ -0,0 +1,135 @@ ++/* `ptrace' debugger support interface. Linux version. ++ Copyright (C) 1996, 1997, 1998, 1999, 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 ++ 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_PTRACE_H ++#define _SYS_PTRACE_H 1 ++ ++#include ++ ++__BEGIN_DECLS ++ ++/* Type of the REQUEST argument to `ptrace.' */ ++enum __ptrace_request ++{ ++ /* Indicate that the process making this request should be traced. ++ All signals received by this process can be intercepted by its ++ parent, and its parent can use the other `ptrace' requests. */ ++ PTRACE_TRACEME = 0, ++#define PT_TRACE_ME PTRACE_TRACEME ++ ++ /* Return the word in the process's text space at address ADDR. */ ++ PTRACE_PEEKTEXT = 1, ++#define PT_READ_I PTRACE_PEEKTEXT ++ ++ /* Return the word in the process's data space at address ADDR. */ ++ PTRACE_PEEKDATA = 2, ++#define PT_READ_D PTRACE_PEEKDATA ++ ++ /* Return the word in the process's user area at offset ADDR. */ ++ PTRACE_PEEKUSER = 3, ++#define PT_READ_U PTRACE_PEEKUSER ++ ++ /* Write the word DATA into the process's text space at address ADDR. */ ++ PTRACE_POKETEXT = 4, ++#define PT_WRITE_I PTRACE_POKETEXT ++ ++ /* Write the word DATA into the process's data space at address ADDR. */ ++ PTRACE_POKEDATA = 5, ++#define PT_WRITE_D PTRACE_POKEDATA ++ ++ /* Write the word DATA into the process's user area at offset ADDR. */ ++ PTRACE_POKEUSER = 6, ++#define PT_WRITE_U PTRACE_POKEUSER ++ ++ /* Continue the process. */ ++ PTRACE_CONT = 7, ++#define PT_CONTINUE PTRACE_CONT ++ ++ /* Kill the process. */ ++ PTRACE_KILL = 8, ++#define PT_KILL PTRACE_KILL ++ ++ /* Single step the process. ++ This is not supported on all machines. */ ++ PTRACE_SINGLESTEP = 9, ++#define PT_STEP PTRACE_SINGLESTEP ++ ++ /* Get all general purpose registers used by a processes. ++ This is not supported on all machines. */ ++ PTRACE_GETREGS = 12, ++#define PT_GETREGS PTRACE_GETREGS ++ ++ /* Set all general purpose registers used by a processes. ++ This is not supported on all machines. */ ++ PTRACE_SETREGS = 13, ++#define PT_SETREGS PTRACE_SETREGS ++ ++ /* Get all floating point registers used by a processes. ++ This is not supported on all machines. */ ++ PTRACE_GETFPREGS = 14, ++#define PT_GETFPREGS PTRACE_GETFPREGS ++ ++ /* Set all floating point registers used by a processes. ++ This is not supported on all machines. */ ++ PTRACE_SETFPREGS = 15, ++#define PT_SETFPREGS PTRACE_SETFPREGS ++ ++ /* Attach to a process that is already running. */ ++ PTRACE_ATTACH = 16, ++#define PT_ATTACH PTRACE_ATTACH ++ ++ /* Detach from a process attached to with PTRACE_ATTACH. */ ++ PTRACE_DETACH = 17, ++#define PT_DETACH PTRACE_DETACH ++ ++ /* Get all extended floating point registers used by a processes. ++ This is not supported on all machines. */ ++ PTRACE_GETFPXREGS = 18, ++#define PT_GETFPXREGS PTRACE_GETFPXREGS ++ ++ /* Set all extended floating point registers used by a processes. ++ This is not supported on all machines. */ ++ PTRACE_SETFPXREGS = 19, ++#define PT_SETFPXREGS PTRACE_SETFPXREGS ++ ++ /* Continue and stop at the next (return from) syscall. */ ++ PTRACE_SYSCALL = 24 ++#define PT_SYSCALL PTRACE_SYSCALL ++}; ++ ++/* Perform process tracing functions. REQUEST is one of the values ++ above, and determines the action to be taken. ++ For all requests except PTRACE_TRACEME, PID specifies the process to be ++ traced. ++ ++ PID and the other arguments described above for the various requests should ++ appear (those that are used for the particular request) as: ++ pid_t PID, void *ADDR, int DATA, void *ADDR2 ++ after REQUEST. */ ++#if defined _ABIN32 && _MIPS_SIM == _ABIN32 ++__extension__ extern long long int ptrace ++ (enum __ptrace_request __request, ...) __THROW; ++#else ++extern long int ptrace (enum __ptrace_request __request, ...) __THROW; ++#endif ++ ++__END_DECLS ++ ++#endif /* _SYS_PTRACE_H */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/sys/syscall.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/sys/syscall.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/sys/syscall.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/sys/syscall.h Mon Mar 17 16:50:05 2003 +@@ -0,0 +1,42 @@ ++/* Copyright (C) 1995, 1996, 1997, 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 ++ 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 _SYSCALL_H ++#define _SYSCALL_H 1 ++ ++/* This file should list the numbers of the system the system knows. ++ But instead of duplicating this we use the information available ++ from the kernel sources. */ ++#ifdef _LIBC ++/* Since the kernel doesn't define macro names in a way usable for ++ glibc, we preprocess this header, and use it during the glibc build ++ process. */ ++# include ++#else ++# include ++#endif ++ ++#ifndef _LIBC ++/* The Linux kernel header file defines macros `__NR_', but some ++ programs expect the traditional form `SYS_'. So in building libc ++ we scan the kernel's list and produce with macros for ++ all the `SYS_' names. */ ++# include ++#endif ++ ++#endif +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/sys/tas.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/sys/tas.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/sys/tas.h Tue Jul 16 02:52:17 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/sys/tas.h Fri Mar 14 08:03:36 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++/* Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Maciej W. Rozycki , 2000. + +@@ -41,7 +41,9 @@ + ("/* Inline test and set */\n" + "1:\n\t" + ".set push\n\t" ++#if _MIPS_SIM == _MIPS_SIM_ABI32 + ".set mips2\n\t" ++#endif + "ll %0,%3\n\t" + "move %1,%4\n\t" + "beq %0,%4,2f\n\t" +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/sys/ucontext.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/sys/ucontext.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/sys/ucontext.h Sat Jul 7 21:21:35 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/sys/ucontext.h Mon Mar 17 16:47:13 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc. ++/* Copyright (C) 1997, 1998, 2000, 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 +@@ -30,7 +30,11 @@ + + + /* Type for general register. */ ++#if defined _ABIN32 && _MIPS_SIM == _ABIN32 ++__extension__ typedef unsigned long long int greg_t; ++#else + typedef unsigned long int greg_t; ++#endif + + /* Number of general registers. */ + #define NGREG 37 +@@ -70,7 +74,11 @@ + /* Userlevel context. */ + typedef struct ucontext + { ++#if defined _ABIN32 && _MIPS_SIM == _ABIN32 ++ __extension__ unsigned long long int uc_flags; ++#else + unsigned long int uc_flags; ++#endif + struct ucontext *uc_link; + stack_t uc_stack; + mcontext_t uc_mcontext; +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/syscalls.list glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/syscalls.list +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/syscalls.list Fri Jan 31 04:39:32 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/syscalls.list Fri Mar 7 10:46:27 2003 +@@ -32,14 +32,6 @@ + socket - socket i:iii __socket socket + socketpair - socketpair i:iiif __socketpair socketpair + +-# +-# These are defined locally because the caller is also defined in this dir. +-# +-s_llseek llseek _llseek i:iiipi __syscall__llseek +-s_sigaction sigaction sigaction i:ipp __syscall_sigaction +-s_ustat ustat ustat i:ip __syscall_ustat +-sys_mknod xmknod mknod i:sii __syscall_mknod +- + # System calls with wrappers. + rt_sigaction - rt_sigaction i:ippi __syscall_rt_sigaction + rt_sigpending - rt_sigpending i:pi __syscall_rt_sigpending +@@ -47,35 +39,3 @@ + rt_sigqueueinfo - rt_sigqueueinfo i:iip __syscall_rt_sigqueueinfo + rt_sigsuspend - rt_sigsuspend i:pi __syscall_rt_sigsuspend + rt_sigtimedwait - rt_sigtimedwait i:pppi __syscall_rt_sigtimedwait +-s_execve EXTRA execve i:spp __syscall_execve +-s_exit _exit exit i:i __syscall_exit +-s_fcntl fcntl fcntl i:iiF __syscall_fcntl +-s_fcntl64 fcntl64 fcntl64 i:iiF __syscall_fcntl64 +-s_fstat64 fxstat64 fstat64 i:ip __syscall_fstat64 +-s_ftruncate64 ftruncate64 ftruncate64 i:iiii __syscall_ftruncate64 +-s_getcwd getcwd getcwd i:pi __syscall_getcwd +-s_getdents getdents getdents i:ipi __syscall_getdents +-s_getdents64 getdents getdents64 i:ipi __syscall_getdents64 +-s_getpriority getpriority getpriority i:ii __syscall_getpriority +-s_ipc msgget ipc i:iiiip __syscall_ipc +-s_lstat64 lxstat64 lstat64 i:sp __syscall_lstat64 +-s_mmap2 mmap64 mmap2 b:aniiii __syscall_mmap2 +-s_poll poll poll i:pii __syscall_poll +-s_pread64 pread64 pread i:ibniii __syscall_pread +-s_ptrace ptrace ptrace i:iipp __syscall_ptrace +-s_pwrite64 pwrite64 pwrite i:ibniii __syscall_pwrite +-s_readahead EXTRA readahead i:iiii __syscall_readahead +-s_reboot reboot reboot i:iii __syscall_reboot +-s_setrlimit setrlimit setrlimit i:ip __syscall_setrlimit +-s_sigpending sigpending sigpending i:p __syscall_sigpending +-s_sigprocmask sigprocmask sigprocmask i:ipp __syscall_sigprocmask +-s_stat64 xstat64 stat64 i:sp __syscall_stat64 +-s_truncate64 truncate64 truncate64 i:siii __syscall_truncate64 +- +-# Todo: we can pass 6 args in registers, no need for the wrapper +-sys_sysctl sysctl _sysctl i:p __syscall__sysctl +-sys_fstat fxstat fstat i:ip __syscall_fstat +-sys_lstat lxstat lstat i:sp __syscall_lstat +-sys_readv readv readv i:ipi __syscall_readv +-sys_stat xstat stat i:sp __syscall_stat +-sys_writev writev writev i:ipi __syscall_writev +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/mips/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/sysdep.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/sysdep.h Mon Jan 27 19:55:20 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/mips/sysdep.h Thu Jan 1 01:00:00 1970 +@@ -1,282 +0,0 @@ +-/* Copyright (C) 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 _LINUX_MIPS_SYSDEP_H +-#define _LINUX_MIPS_SYSDEP_H 1 +- +-/* There is some commonality. */ +-#include +- +-/* For Linux we can use the system call table in the header file +- /usr/include/asm/unistd.h +- of the kernel. But these symbols do not follow the SYS_* syntax +- so we have to redefine the `SYS_ify' macro here. */ +-#undef SYS_ify +-#ifdef __STDC__ +-# define SYS_ify(syscall_name) __NR_##syscall_name +-#else +-# define SYS_ify(syscall_name) __NR_/**/syscall_name +-#endif +- +-#ifdef __ASSEMBLER__ +- +-/* We don't want the label for the error handler to be visible in the symbol +- table when we define it here. */ +-#ifdef __PIC__ +-# define SYSCALL_ERROR_LABEL 99b +-#endif +- +-#else /* ! __ASSEMBLER__ */ +- +-/* Define a macro which expands into the inline wrapper code for a system +- call. */ +-#undef INLINE_SYSCALL +-#define INLINE_SYSCALL(name, nr, args...) \ +- ({ INTERNAL_SYSCALL_DECL(err); \ +- long result_var = INTERNAL_SYSCALL (name, err, nr, args); \ +- if ( INTERNAL_SYSCALL_ERROR_P (result_var, err) ) \ +- { \ +- __set_errno (INTERNAL_SYSCALL_ERRNO (result_var, err)); \ +- result_var = -1L; \ +- } \ +- result_var; }) +- +-#undef INTERNAL_SYSCALL_DECL +-#define INTERNAL_SYSCALL_DECL(err) long err +- +-#undef INTERNAL_SYSCALL_ERROR_P +-#define INTERNAL_SYSCALL_ERROR_P(val, err) ((long) (err)) +- +-#undef INTERNAL_SYSCALL_ERRNO +-#define INTERNAL_SYSCALL_ERRNO(val, err) (val) +- +-#undef INTERNAL_SYSCALL +-#define INTERNAL_SYSCALL(name, err, nr, args...) internal_syscall##nr(name, err, args) +- +-#define internal_syscall0(name, err, dummy...) \ +-({ \ +- long _sys_result; \ +- \ +- { \ +- register long __v0 asm("$2"); \ +- register long __a3 asm("$7"); \ +- __asm__ volatile ( \ +- ".set\tnoreorder\n\t" \ +- "li\t$2, %2\t\t\t# " #name "\n\t" \ +- "syscall\n\t" \ +- ".set reorder" \ +- : "=r" (__v0), "=r" (__a3) \ +- : "i" (SYS_ify(name)) \ +- : __SYSCALL_CLOBBERS); \ +- err = __a3; \ +- _sys_result = __v0; \ +- } \ +- _sys_result; \ +-}) +- +-#define internal_syscall1(name, err, arg1) \ +-({ \ +- long _sys_result; \ +- \ +- { \ +- register long __v0 asm("$2"); \ +- register long __a0 asm("$4") = (long) arg1; \ +- register long __a3 asm("$7"); \ +- __asm__ volatile ( \ +- ".set\tnoreorder\n\t" \ +- "li\t$2, %3\t\t\t# " #name "\n\t" \ +- "syscall\n\t" \ +- ".set reorder" \ +- : "=r" (__v0), "=r" (__a3) \ +- : "r" (__a0), "i" (SYS_ify(name)) \ +- : __SYSCALL_CLOBBERS); \ +- err = __a3; \ +- _sys_result = __v0; \ +- } \ +- _sys_result; \ +-}) +- +-#define internal_syscall2(name, err, arg1, arg2) \ +-({ \ +- long _sys_result; \ +- \ +- { \ +- register long __v0 asm("$2"); \ +- register long __a0 asm("$4") = (long) arg1; \ +- register long __a1 asm("$5") = (long) arg2; \ +- register long __a3 asm("$7"); \ +- __asm__ volatile ( \ +- ".set\tnoreorder\n\t" \ +- "li\t$2, %4\t\t\t# " #name "\n\t" \ +- "syscall\n\t" \ +- ".set\treorder" \ +- : "=r" (__v0), "=r" (__a3) \ +- : "r" (__a0), "r" (__a1), "i" (SYS_ify(name)) \ +- : __SYSCALL_CLOBBERS); \ +- err = __a3; \ +- _sys_result = __v0; \ +- } \ +- _sys_result; \ +-}) +- +-#define internal_syscall3(name, err, arg1, arg2, arg3) \ +-({ \ +- long _sys_result; \ +- \ +- { \ +- register long __v0 asm("$2"); \ +- register long __a0 asm("$4") = (long) arg1; \ +- register long __a1 asm("$5") = (long) arg2; \ +- register long __a2 asm("$6") = (long) arg3; \ +- register long __a3 asm("$7"); \ +- __asm__ volatile ( \ +- ".set\tnoreorder\n\t" \ +- "li\t$2, %5\t\t\t# " #name "\n\t" \ +- "syscall\n\t" \ +- ".set\treorder" \ +- : "=r" (__v0), "=r" (__a3) \ +- : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)) \ +- : __SYSCALL_CLOBBERS); \ +- err = __a3; \ +- _sys_result = __v0; \ +- } \ +- _sys_result; \ +-}) +- +-#define internal_syscall4(name, err, arg1, arg2, arg3, arg4) \ +-({ \ +- long _sys_result; \ +- \ +- { \ +- register long __v0 asm("$2"); \ +- register long __a0 asm("$4") = (long) arg1; \ +- register long __a1 asm("$5") = (long) arg2; \ +- register long __a2 asm("$6") = (long) arg3; \ +- register long __a3 asm("$7") = (long) arg4; \ +- __asm__ volatile ( \ +- ".set\tnoreorder\n\t" \ +- "li\t$2, %5\t\t\t# " #name "\n\t" \ +- "syscall\n\t" \ +- ".set\treorder" \ +- : "=r" (__v0), "+r" (__a3) \ +- : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)) \ +- : __SYSCALL_CLOBBERS); \ +- err = __a3; \ +- _sys_result = __v0; \ +- } \ +- _sys_result; \ +-}) +- +-#define internal_syscall5(name, err, arg1, arg2, arg3, arg4, arg5) \ +-({ \ +- long _sys_result; \ +- \ +- { \ +- register long __v0 asm("$2"); \ +- register long __a0 asm("$4") = (long) arg1; \ +- register long __a1 asm("$5") = (long) arg2; \ +- register long __a2 asm("$6") = (long) arg3; \ +- register long __a3 asm("$7") = (long) arg4; \ +- __asm__ volatile ( \ +- ".set\tnoreorder\n\t" \ +- "lw\t$2, %6\n\t" \ +- "subu\t$29, 32\n\t" \ +- "sw\t$2, 16($29)\n\t" \ +- "li\t$2, %5\t\t\t# " #name "\n\t" \ +- "syscall\n\t" \ +- "addiu\t$29, 32\n\t" \ +- ".set\treorder" \ +- : "=r" (__v0), "+r" (__a3) \ +- : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), \ +- "m" ((long)arg5) \ +- : __SYSCALL_CLOBBERS); \ +- err = __a3; \ +- _sys_result = __v0; \ +- } \ +- _sys_result; \ +-}) +- +-#define internal_syscall6(name, err, arg1, arg2, arg3, arg4, arg5, arg6)\ +-({ \ +- long _sys_result; \ +- \ +- { \ +- register long __v0 asm("$2"); \ +- register long __a0 asm("$4") = (long) arg1; \ +- register long __a1 asm("$5") = (long) arg2; \ +- register long __a2 asm("$6") = (long) arg3; \ +- register long __a3 asm("$7") = (long) arg4; \ +- __asm__ volatile ( \ +- ".set\tnoreorder\n\t" \ +- "lw\t$2, %6\n\t" \ +- "lw\t$8, %7\n\t" \ +- "subu\t$29, 32\n\t" \ +- "sw\t$2, 16($29)\n\t" \ +- "sw\t$8, 20($29)\n\t" \ +- "li\t$2, %5\t\t\t# " #name "\n\t" \ +- "syscall\n\t" \ +- "addiu\t$29, 32\n\t" \ +- ".set\treorder" \ +- : "=r" (__v0), "+r" (__a3) \ +- : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), \ +- "m" ((long)arg5), "m" ((long)arg6) \ +- : __SYSCALL_CLOBBERS); \ +- err = __a3; \ +- _sys_result = __v0; \ +- } \ +- _sys_result; \ +-}) +- +-#define internal_syscall7(name, err, arg1, arg2, arg3, arg4, arg5, arg6, arg7)\ +-({ \ +- long _sys_result; \ +- \ +- { \ +- register long __v0 asm("$2"); \ +- register long __a0 asm("$4") = (long) arg1; \ +- register long __a1 asm("$5") = (long) arg2; \ +- register long __a2 asm("$6") = (long) arg3; \ +- register long __a3 asm("$7") = (long) arg4; \ +- __asm__ volatile ( \ +- ".set\tnoreorder\n\t" \ +- "lw\t$2, %6\n\t" \ +- "lw\t$8, %7\n\t" \ +- "lw\t$9, %8\n\t" \ +- "subu\t$29, 32\n\t" \ +- "sw\t$2, 16($29)\n\t" \ +- "sw\t$8, 20($29)\n\t" \ +- "sw\t$9, 24($29)\n\t" \ +- "li\t$2, %5\t\t\t# " #name "\n\t" \ +- "syscall\n\t" \ +- "addiu\t$29, 32\n\t" \ +- ".set\treorder" \ +- : "=r" (__v0), "+r" (__a3) \ +- : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), \ +- "m" ((long)arg5), "m" ((long)arg6), "m" ((long)arg7) \ +- : __SYSCALL_CLOBBERS); \ +- err = __a3; \ +- _sys_result = __v0; \ +- } \ +- _sys_result; \ +-}) +- +-#define __SYSCALL_CLOBBERS "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25" +- +-#endif /* __ASSEMBLER__ */ +- +-#endif /* linux/mips/sysdep.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/pathconf.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/pathconf.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/pathconf.c Wed Oct 23 08:21:19 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/pathconf.c Fri Mar 14 07:22:16 2003 +@@ -1,5 +1,5 @@ + /* Get file-specific information about a file. Linux version. +- Copyright (C) 1991,95,96,98,99,2000,2001,2002 Free Software Foundation, Inc. ++ Copyright (C) 1991,1995,1996,1998-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 +@@ -36,8 +36,13 @@ + { + case _PC_LINK_MAX: + return statfs_link_max (__statfs (file, &fsbuf), &fsbuf); ++ + case _PC_FILESIZEBITS: + return statfs_filesize_max (__statfs (file, &fsbuf), &fsbuf); ++ ++ case _PC_2_SYMLINKS: ++ return statfs_symlinks (__statfs (file, &fsbuf), &fsbuf); ++ + default: + return posix_pathconf (file, name); + } +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/pathconf.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/pathconf.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/pathconf.h Wed Oct 23 08:21:19 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/pathconf.h Fri Mar 14 07:26:16 2003 +@@ -1,5 +1,5 @@ + /* Common parts of Linux implementation of pathconf and fpathconf. +- Copyright (C) 1991,95,96,98,99,2000,2001,2002 Free Software Foundation, Inc. ++ Copyright (C) 1991,1995,1996,1998-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 +@@ -22,8 +22,8 @@ + #include + #include "linux_fsinfo.h" + +-/* Used like: return statfs_link_max (__statfs (name, &buf), &buf); */ + ++/* Used like: return statfs_link_max (__statfs (name, &buf), &buf); */ + static inline long int + statfs_link_max (int result, const struct statfs *fsbuf) + { +@@ -75,8 +75,8 @@ + } + } + +-/* Used like: return statfs_filesize_max (__statfs (name, &buf), &buf); */ + ++/* Used like: return statfs_filesize_max (__statfs (name, &buf), &buf); */ + static inline long int + statfs_filesize_max (int result, const struct statfs *fsbuf) + { +@@ -112,5 +112,40 @@ + + default: + return 32; ++ } ++} ++ ++ ++/* Used like: return statfs_link_max (__statfs (name, &buf), &buf); */ ++static inline long int ++statfs_symlinks (int result, const struct statfs *fsbuf) ++{ ++ if (result < 0) ++ { ++ if (errno == ENOSYS) ++ /* Not possible, return the default value. */ ++ return 1; ++ ++ /* Some error occured. */ ++ return -1; ++ } ++ ++ switch (fsbuf->f_type) ++ { ++ case ADFS_SUPER_MAGIC: ++ case BFS_MAGIC: ++ case CRAMFS_MAGIC: ++ case DEVPTS_SUPER_MAGIC: ++ case EFS_SUPER_MAGIC: ++ case EFS_MAGIC: ++ case MSDOS_SUPER_MAGIC: ++ case NTFS_SUPER_MAGIC: ++ case QNX4_SUPER_MAGIC: ++ case ROMFS_SUPER_MAGIC: ++ /* No symlink support. */ ++ return 0; ++ ++ default: ++ return 1; + } + } +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h Sat Mar 1 01:07:36 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h Sat Mar 1 23:31:54 2003 +@@ -45,7 +45,6 @@ + # define O_DIRECT 0400000 /* Direct disk access. */ + # define O_DIRECTORY 040000 /* Must be a directory. */ + # define O_NOFOLLOW 0100000 /* Do not follow links. */ +-# define O_DIRECT 0400000 /* Direct disk access. */ + #endif + + #ifdef __USE_LARGEFILE64 +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/powerpc/bits/mman.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/powerpc/bits/mman.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/powerpc/bits/mman.h Sat Jul 7 21:21:35 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/powerpc/bits/mman.h Mon Mar 3 11:00:51 2003 +@@ -1,5 +1,5 @@ + /* Definitions for POSIX memory map interface. Linux/PowerPC version. +- Copyright (C) 1997, 2000 Free Software Foundation, Inc. ++ Copyright (C) 1997, 2000, 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 +@@ -52,11 +52,13 @@ + + /* These are Linux-specific. */ + #ifdef __USE_MISC +-# define MAP_GROWSDOWN 0x0100 /* Stack-like segment. */ +-# define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +-# define MAP_EXECUTABLE 0x1000 /* Mark it as an executable. */ +-# define MAP_LOCKED 0x0080 /* Lock the mapping. */ +-# define MAP_NORESERVE 0x0040 /* Don't check for reservations. */ ++# define MAP_GROWSDOWN 0x00100 /* Stack-like segment. */ ++# define MAP_DENYWRITE 0x00800 /* ETXTBSY */ ++# define MAP_EXECUTABLE 0x01000 /* Mark it as an executable. */ ++# define MAP_LOCKED 0x00080 /* Lock the mapping. */ ++# define MAP_NORESERVE 0x00040 /* Don't check for reservations. */ ++# define MAP_POPULATE 0x08000 /* Populate (prefault) pagetables. */ ++# define MAP_NONBLOCK 0x10000 /* Do not block on IO. */ + #endif + + /* Flags to `msync'. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/powerpc/chown.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/powerpc/chown.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/powerpc/chown.c Tue Nov 5 09:13:00 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/powerpc/chown.c Sun Mar 16 02:03:52 2003 +@@ -1,5 +1,5 @@ + /* chown() compatibility. +- Copyright (C) 1998, 2000, 2002 Free Software Foundation, Inc. ++ Copyright (C) 1998, 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 +@@ -42,7 +42,7 @@ + char link[PATH_MAX+2]; + char path[2*PATH_MAX+4]; + int loopct; +- int filelen; ++ size_t filelen; + static int libc_old_chown = 0 /* -1=old linux, 1=new linux, 0=unknown */; + + if (libc_old_chown == 1) +@@ -82,7 +82,7 @@ + ENAMETOOLONG before this, usually. */ + for (loopct = 0; loopct < 128; loopct++) + { +- int linklen; ++ size_t linklen; + + if (err >= PATH_MAX+1) + { +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c Fri Aug 23 21:47:00 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c Sun Mar 16 01:40:44 2003 +@@ -1,5 +1,5 @@ + /* Operating system support for run-time dynamic linker. Linux/PPC version. +- Copyright (C) 1997, 1998, 2001 Free Software Foundation, Inc. ++ Copyright (C) 1997, 1998, 2001, 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 +@@ -25,27 +25,18 @@ + extern int __cache_line_size; + weak_extern (__cache_line_size) + +-#define DL_PLATFORM_INIT __aux_init_cache(_dl_auxv) +- + /* Scan the Aux Vector for the "Data Cache Block Size" entry. If found + verify that the static extern __cache_line_size is defined by checking + for not NULL. If it is defined then assign the cache block size + value to __cache_line_size. */ +-static inline void +-__aux_init_cache (ElfW(auxv_t) *av) +-{ +- for (; av->a_type != AT_NULL; ++av) +- switch (av->a_type) +- { +- case AT_DCACHEBSIZE: +- { +- int *cls = & __cache_line_size; +- if (cls != NULL) +- *cls = av->a_un.a_val; +- } ++#define DL_PLATFORM_AUXV \ ++ case AT_DCACHEBSIZE: \ ++ { \ ++ int *cls = & __cache_line_size; \ ++ if (cls != NULL) \ ++ *cls = av->a_un.a_val; \ ++ } \ + break; +- } +-} + + #ifndef __ASSUME_STD_AUXV + +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/powerpc/powerpc32/clone.S glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/powerpc/powerpc32/clone.S +--- glibc-2.3.2/sysdeps/unix/sysv/linux/powerpc/powerpc32/clone.S Sun Aug 4 04:20:06 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/powerpc/powerpc32/clone.S Mon Mar 10 09:52:31 2003 +@@ -28,7 +28,8 @@ + all the freaky stuff we have to do to make the call useful. */ + + /* int [r3] clone(int (*fn)(void *arg) [r3], void *child_stack [r4], +- int flags [r5], void *arg [r6]); */ ++ int flags [r5], void *arg [r6], void *parent_tid [r7], ++ void *tls [r8], void *child_tid [r9]); */ + + ENTRY (BP_SYM (__clone)) + /* GKM FIXME: add bounds checks, where sensible. */ +@@ -58,6 +59,11 @@ + /* 'flags' argument is first parameter to clone syscall. (The other + argument is the stack pointer, already in r4.) */ + mr r3,r5 ++ ++ /* Move the parent_tid, child_tid and tls arguments. */ ++ mr r5,r7 ++ mr r6,r8 ++ mr r7,r9 + + /* Do the call. */ + DO_CALL(SYS_ify(clone)) +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S +--- glibc-2.3.2/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S Wed Sep 18 01:50:03 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S Mon Mar 10 22:04:29 2003 +@@ -28,7 +28,8 @@ + all the freaky stuff we have to do to make the call useful. */ + + /* int [r3] clone(int (*fn)(void *arg) [r3], void *child_stack [r4], +- int flags [r5], void *arg [r6]); */ ++ int flags [r5], void *arg [r6], void *parent_tid [r7], ++ void *tls [r8], void *child_tid [r9]); */ + + ENTRY (BP_SYM (__clone)) + /* GKM FIXME: add bounds checks, where sensible. */ +@@ -37,8 +38,8 @@ + + /* Check for child_stack == NULL || fn == NULL. */ + cmpdi cr0,r4,0 +- ld r7,0(r3) +- cmpdi cr1,r7,0 ++ ld r0,0(r3) ++ cmpdi cr1,r0,0 + cror cr0*4+eq,cr1*4+eq,cr0*4+eq + beq- cr0,L(badargs) + +@@ -61,6 +62,10 @@ + /* 'flags' argument is first parameter to clone syscall. (The other + argument is the stack pointer, already in r4.) */ + mr r3,r5 ++ /* Move the parent_tid, child_tid and tls arguments. */ ++ mr r5,r7 ++ mr r6,r8 ++ mr r7,r9 + + /* Do the call. */ + DO_CALL(SYS_ify(clone)) +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/s390/bits/mman.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/s390/bits/mman.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/s390/bits/mman.h Thu Jul 11 23:39:44 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/s390/bits/mman.h Mon Mar 3 11:02:34 2003 +@@ -1,5 +1,5 @@ + /* Definitions for POSIX memory map interface. Linux/s390 version. +- Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. ++ Copyright (C) 2000, 2001, 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 +@@ -52,12 +52,14 @@ + + /* These are Linux-specific. */ + #ifdef __USE_MISC +-# define MAP_GROWSDOWN 0x0100 /* Stack-like segment. */ +-# define MAP_GROWSUP 0x0200 /* Register stack-like segment */ +-# define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +-# define MAP_EXECUTABLE 0x1000 /* Mark it as an executable. */ +-# define MAP_LOCKED 0x2000 /* Lock the mapping. */ +-# define MAP_NORESERVE 0x4000 /* Don't check for reservations. */ ++# define MAP_GROWSDOWN 0x00100 /* Stack-like segment. */ ++# define MAP_GROWSUP 0x00200 /* Register stack-like segment */ ++# define MAP_DENYWRITE 0x00800 /* ETXTBSY */ ++# define MAP_EXECUTABLE 0x01000 /* Mark it as an executable. */ ++# define MAP_LOCKED 0x02000 /* Lock the mapping. */ ++# define MAP_NORESERVE 0x04000 /* Don't check for reservations. */ ++# define MAP_POPULATE 0x08000 /* Populate (prefault) pagetables. */ ++# define MAP_NONBLOCK 0x10000 /* Do not block on IO. */ + #endif + + /* Flags to `msync'. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/s390/bits/siginfo.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/s390/bits/siginfo.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/s390/bits/siginfo.h Thu Dec 5 01:23:11 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/s390/bits/siginfo.h Thu Mar 27 00:41:58 2003 +@@ -1,5 +1,5 @@ + /* siginfo_t, sigevent and constants. S/390 version. +- Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++ Copyright (C) 2001, 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 +@@ -69,8 +69,9 @@ + /* POSIX.1b timers. */ + struct + { +- unsigned int _timer1; +- unsigned int _timer2; ++ int si_tid; /* Timer ID. */ ++ int si_overrun; /* Overrun count. */ ++ sigval_t si_sigval; /* Signal value. */ + } _timer; + + /* POSIX.1b signals. */ +@@ -111,8 +112,8 @@ + /* X/Open requires some more fields with fixed names. */ + # define si_pid _sifields._kill.si_pid + # define si_uid _sifields._kill.si_uid +-# define si_timer1 _sifields._timer._timer1 +-# define si_timer2 _sifields._timer._timer2 ++# define si_timerid _sifields._timer.si_tid ++# define si_overrun _sifields._timer.si_overrun + # define si_status _sifields._sigchld.si_status + # define si_utime _sifields._sigchld.si_utime + # define si_stime _sifields._sigchld.si_stime +@@ -269,9 +270,6 @@ + # define __SIGEV_PAD_SIZE ((__SIGEV_MAX_SIZE / sizeof (int)) - 3) + # endif + +-/* Forward declaration of the `pthread_attr_t' type. */ +-struct __pthread_attr_s; +- + typedef struct sigevent + { + sigval_t sigev_value; +@@ -301,8 +299,11 @@ + # define SIGEV_SIGNAL SIGEV_SIGNAL + SIGEV_NONE, /* Other notification: meaningless. */ + # define SIGEV_NONE SIGEV_NONE +- SIGEV_THREAD /* Deliver via thread creation. */ ++ SIGEV_THREAD, /* Deliver via thread creation. */ + # define SIGEV_THREAD SIGEV_THREAD ++ ++ SIGEV_THREAD_ID = 4 /* Send signal to specific thread. */ ++#define SIGEV_THREAD_ID SIGEV_THREAD_ID + }; + + #endif /* have _SIGNAL_H. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S +--- glibc-2.3.2/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S Sat Jul 7 21:21:35 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S Mon Mar 3 19:17:44 2003 +@@ -37,15 +37,19 @@ + lr %r4,%r5 /* third parameter */ + lr %r5,%r6 /* fourth parameter */ + l %r6,192(%r15) /* fifth parameter */ +- basr %r7,0 +-.L0: ex %r1,.L1-.L0(%r7) /* lsb of R1 is subsituted as SVC number */ + +- l %r15,0(0,%r15) /* load back chain */ ++ basr %r7,0 ++0: cl %r1,4f-0b(%r7) /* svc number < 256? */ ++ jl 2f ++1: svc 0 ++ j 3f ++2: ex %r1,1b-0b(%r7) /* lsb of R1 is subsituted as SVC number */ ++3: l %r15,0(%r15) /* load back chain */ + lm %r6,15,24(%r15) /* load registers */ + + lhi %r0,-4095 + clr %r2,%r0 /* check R2 for error */ + jnl SYSCALL_ERROR_LABEL + br %r14 /* return to caller */ +-.L1: .word 0x0A00 /* opcode for SVC 0 */ ++4: .long 256 + PSEUDO_END (syscall) +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h Tue Jan 28 11:20:09 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h Wed Mar 26 19:04:22 2003 +@@ -59,6 +59,16 @@ + SYSCALL_ERROR_HANDLER; \ + END (name) + ++#undef PSEUDO_NOERRNO ++#define PSEUDO_NOERRNO(name, syscall_name, args) \ ++ .text; \ ++ ENTRY (name) \ ++ DO_CALL (syscall_name, args) ++ ++#undef PSEUDO_END_NOERRNO ++#define PSEUDO_END_NOERRNO(name) \ ++ END (name) ++ + #ifndef PIC + # define SYSCALL_ERROR_LABEL 0f + # define SYSCALL_ERROR_HANDLER \ +@@ -133,11 +143,19 @@ + */ + + #define DO_CALL(syscall, args) \ +- svc SYS_ify (syscall) ++ .if SYS_ify (syscall) < 256; \ ++ svc SYS_ify (syscall); \ ++ .else; \ ++ lhi %r1,SYS_ify (syscall); \ ++ svc 0; \ ++ .endif + + #define ret \ + br 14 + ++#define ret_NOERRNO \ ++ br 14 ++ + #endif /* __ASSEMBLER__ */ + + #undef INLINE_SYSCALL +@@ -154,8 +172,8 @@ + #undef INTERNAL_SYSCALL_DECL + #define INTERNAL_SYSCALL_DECL(err) do { } while (0) + +-#undef INTERNAL_SYSCALL +-#define INTERNAL_SYSCALL(name, err, nr, args...) \ ++#undef INTERNAL_SYSCALL_DIRECT ++#define INTERNAL_SYSCALL_DIRECT(name, err, nr, args...) \ + ({ \ + DECLARGS_##nr(args) \ + register int _ret asm("2"); \ +@@ -165,6 +183,25 @@ + : "i" (__NR_##name) ASMFMT_##nr \ + : "memory" ); \ + _ret; }) ++ ++#undef INTERNAL_SYSCALL_SVC0 ++#define INTERNAL_SYSCALL_SVC0(name, err, nr, args...) \ ++ ({ \ ++ DECLARGS_##nr(args) \ ++ register unsigned long _nr asm("1") = (unsigned long)(__NR_##name); \ ++ register int _ret asm("2"); \ ++ asm volatile ( \ ++ "svc 0\n\t" \ ++ : "=d" (_ret) \ ++ : "d" (_nr), "i" (__NR_##name) ASMFMT_##nr \ ++ : "memory" ); \ ++ _ret; }) ++ ++#undef INTERNAL_SYSCALL ++#define INTERNAL_SYSCALL(name, err, nr, args...) \ ++ (((__NR_##name) < 256) ? \ ++ INTERNAL_SYSCALL_DIRECT(name, err, nr, args) : \ ++ INTERNAL_SYSCALL_SVC0(name, err,nr, args)) + + #undef INTERNAL_SYSCALL_ERROR_P + #define INTERNAL_SYSCALL_ERROR_P(val, err) \ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/s390/s390-64/syscall.S glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/s390/s390-64/syscall.S +--- glibc-2.3.2/sysdeps/unix/sysv/linux/s390/s390-64/syscall.S Tue Jan 28 11:20:09 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/s390/s390-64/syscall.S Mon Mar 3 19:17:44 2003 +@@ -37,16 +37,20 @@ + lgr %r4,%r5 /* Third parameter. */ + lgr %r5,%r6 /* Fourth parameter. */ + lg %r6,320(%r15) /* Fifth parameter. */ +- basr %r7,0 +-.L0: ex %r1,.L1-.L0(%r7) /* Lsb of R1 is subsituted as SVC number. */ + +- lg %r15,0(%r15) /* Load back chain. */ ++ basr %r7,0 ++0: clg %r1,4f-0b(%r7) /* svc number < 256? */ ++ jl 2f ++1: svc 0 ++ j 3f ++2: ex %r1,1b-0b(%r7) /* lsb of R1 is subsituted as SVC number */ ++3: lg %r15,0(%r15) /* load back chain */ + lmg %r6,15,48(%r15) /* Load registers. */ + + lghi %r0,-4095 + clgr %r2,%r0 /* Check R2 for error. */ + jgnl SYSCALL_ERROR_LABEL + br %r14 /* Return to caller. */ +-.L1: .word 0x0A00 /* Opcode for SVC 0. */ ++4: .quad 256 + PSEUDO_END (syscall) + +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list +--- glibc-2.3.2/sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list Wed Feb 5 22:42:21 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list Mon Mar 10 20:21:15 2003 +@@ -2,8 +2,8 @@ + + llseek EXTRA lseek C:3 __libc_lseek __lseek lseek __libc_lseek64 __llseek llseek __lseek64 lseek64 + lseek llseek - +-pread - pread C:4 __libc_pread __libc_pread64 __pread pread __pread64 pread64 +-pwrite - pwrite C:4 __libc_pwrite __libc_pwrite64 __pwrite pwrite __pwrite64 pwrite64 ++pread - pread64 C:4 __libc_pread __libc_pread64 __pread pread __pread64 pread64 ++pwrite - pwrite64 C:4 __libc_pwrite __libc_pwrite64 __pwrite pwrite __pwrite64 pwrite64 + fstatfs - fstatfs i:ip __fstatfs fstatfs fstatfs64 __fstatfs64 + statfs - statfs i:sp __statfs statfs statfs64 + getpeername - getpeername i:ipp __getpeername getpeername +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h Tue Jan 28 11:20:09 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h Sun Mar 23 20:42:23 2003 +@@ -1,5 +1,5 @@ + /* Assembler macros for 64 bit S/390. +- Copyright (C) 2001,02 Free Software Foundation, Inc. ++ Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). + This file is part of the GNU C Library. + +@@ -31,6 +31,18 @@ + /* In newer 2.1 kernels __NR_syscall is missing so we define it here. */ + #define __NR_syscall 0 + ++/* ++ * Newer kernel versions redefined __NR_pread and __NR_pwrite to ++ * __NR_pread64 and __NR_pwrite64. We use the new names but have ++ * to define them on our own for compiling against older kernels. ++ */ ++#ifndef __NR_pread64 ++# define __NR_pread64 __NR_pread ++#endif ++#ifndef __NR_pwrite64 ++# define __NR_pwrite64 __NR_pwrite ++#endif ++ + #undef SYS_ify + #define SYS_ify(syscall_name) __NR_##syscall_name + +@@ -60,6 +72,17 @@ + SYSCALL_ERROR_HANDLER; \ + END (name) + ++#undef PSEUDO_NOERRNO ++#define PSEUDO_NOERRNO(name, syscall_name, args) \ ++ .text; \ ++ ENTRY (name) \ ++ DO_CALL (syscall_name, args) ++ ++#undef PSEUDO_END_NOERRNO ++#define PSEUDO_END_NOERRNO(name) \ ++ SYSCALL_ERROR_HANDLER; \ ++ END (name) ++ + #ifndef PIC + # define SYSCALL_ERROR_LABEL syscall_error + # define SYSCALL_ERROR_HANDLER +@@ -122,11 +145,19 @@ + */ + + #define DO_CALL(syscall, args) \ +- svc SYS_ify (syscall) ++ .if SYS_ify (syscall) < 256; \ ++ svc SYS_ify (syscall); \ ++ .else; \ ++ lghi %r1,SYS_ify (syscall); \ ++ svc 0; \ ++ .endif + + #define ret \ + br 14 + ++#define ret_NOERRNO \ ++ br 14 ++ + #endif /* __ASSEMBLER__ */ + + #undef INLINE_SYSCALL +@@ -143,8 +174,8 @@ + #undef INTERNAL_SYSCALL_DECL + #define INTERNAL_SYSCALL_DECL(err) do { } while (0) + +-#undef INTERNAL_SYSCALL +-#define INTERNAL_SYSCALL(name, err, nr, args...) \ ++#undef INTERNAL_SYSCALL_DIRECT ++#define INTERNAL_SYSCALL_DIRECT(name, err, nr, args...) \ + ({ \ + DECLARGS_##nr(args) \ + register int _ret asm("2"); \ +@@ -154,6 +185,25 @@ + : "i" (__NR_##name) ASMFMT_##nr \ + : "memory" ); \ + _ret; }) ++ ++#undef INTERNAL_SYSCALL_SVC0 ++#define INTERNAL_SYSCALL_SVC0(name, err, nr, args...) \ ++ ({ \ ++ DECLARGS_##nr(args) \ ++ register unsigned long _nr asm("1") = (unsigned long)(__NR_##name); \ ++ register int _ret asm("2"); \ ++ asm volatile ( \ ++ "svc 0\n\t" \ ++ : "=d" (_ret) \ ++ : "d" (_nr), "i" (__NR_##name) ASMFMT_##nr \ ++ : "memory" ); \ ++ _ret; }) ++ ++#undef INTERNAL_SYSCALL ++#define INTERNAL_SYSCALL(name, err, nr, args...) \ ++ (((__NR_##name) < 256) ? \ ++ INTERNAL_SYSCALL_DIRECT(name, err, nr, args) : \ ++ INTERNAL_SYSCALL_SVC0(name, err,nr, args)) + + #undef INTERNAL_SYSCALL_ERROR_P + #define INTERNAL_SYSCALL_ERROR_P(val, err) \ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/s390/system.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/s390/system.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/s390/system.c Tue Feb 4 19:35:28 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/s390/system.c Thu Jan 1 01:00:00 1970 +@@ -1 +0,0 @@ +-#include +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/sh/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/sh/sysdep.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/sh/sysdep.h Sat Feb 8 03:29:54 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/sh/sysdep.h Sun Mar 23 20:42:23 2003 +@@ -65,6 +65,18 @@ + #define PSEUDO_END(name) \ + END (name) + ++#undef PSEUDO_NOERRNO ++#define PSEUDO_NOERRNO(name, syscall_name, args) \ ++ .text; \ ++ ENTRY (name); \ ++ DO_CALL (syscall_name, args) ++ ++#undef PSEUDO_END_NOERRNO ++#define PSEUDO_END_NOERRNO(name) \ ++ END (name) ++ ++#define ret_NOERRNO ret ++ + #ifndef PIC + # define SYSCALL_ERROR_HANDLER \ + mov.l 0f,r1; \ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/siglist.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/siglist.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/siglist.h Sat Nov 2 03:16:02 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/siglist.h Tue Apr 1 07:50:08 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1996, 1997, 1998, 1999, 2002 Free Software Foundation, Inc. ++/* Copyright (C) 1996,1997,1998,1999,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 +@@ -21,3 +21,5 @@ + #include_next /* Get the canonical list. */ + + #define OLD_SIGLIST_SIZE 32 /* For GLIBC_2.0 binary compatibility. */ ++ ++#define OLD2_SIGLIST_SIZE 64 /* For GLIBC_2.1 binary compatibility. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/bits/siginfo.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/sparc/bits/siginfo.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/bits/siginfo.h Thu Dec 5 01:22:51 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/sparc/bits/siginfo.h Thu Mar 27 00:41:58 2003 +@@ -1,5 +1,5 @@ + /* siginfo_t, sigevent and constants. Linux/SPARC version. +- Copyright (C) 1997,1998,1999,2000,2001,2002 Free Software Foundation, Inc. ++ Copyright (C) 1997-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 +@@ -69,8 +69,9 @@ + /* POSIX.1b timers. */ + struct + { +- unsigned int _timer1; +- unsigned int _timer2; ++ int si_tid; /* Timer ID. */ ++ int si_overrun; /* Overrun count. */ ++ sigval_t si_sigval; /* Signal value. */ + } _timer; + + /* POSIX.1b signals. */ +@@ -111,8 +112,8 @@ + /* X/Open requires some more fields with fixed names. */ + # define si_pid _sifields._kill.si_pid + # define si_uid _sifields._kill.si_uid +-# define si_timer1 _sifields._timer._timer1 +-# define si_timer2 _sifields._timer._timer2 ++# define si_timerid _sifields._timer.si_tid ++# define si_overrun _sifields._timer.si_overrun + # define si_status _sifields._sigchld.si_status + # define si_utime _sifields._sigchld.si_utime + # define si_stime _sifields._sigchld.si_stime +@@ -276,9 +277,6 @@ + # define __SIGEV_PAD_SIZE ((__SIGEV_MAX_SIZE / sizeof (int)) - 3) + # endif + +-/* Forward declaration of the `pthread_attr_t' type. */ +-struct __pthread_attr_s; +- + typedef struct sigevent + { + sigval_t sigev_value; +@@ -308,8 +306,11 @@ + # define SIGEV_SIGNAL SIGEV_SIGNAL + SIGEV_NONE, /* Other notification: meaningless. */ + # define SIGEV_NONE SIGEV_NONE +- SIGEV_THREAD /* Deliver via thread creation. */ ++ SIGEV_THREAD, /* Deliver via thread creation. */ + # define SIGEV_THREAD SIGEV_THREAD ++ ++ SIGEV_THREAD_ID = 4 /* Send signal to specific thread. */ ++#define SIGEV_THREAD_ID SIGEV_THREAD_ID + }; + + #endif /* have _SIGNAL_H. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/bits/signum.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/sparc/bits/signum.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/bits/signum.h Sat Jul 7 21:21:36 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/sparc/bits/signum.h Tue Apr 1 08:17:51 2003 +@@ -1,5 +1,5 @@ + /* Signal number definitions. Linux/SPARC version. +- Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++ Copyright (C) 1996, 1997, 1998, 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 +@@ -70,7 +70,7 @@ + #define SIGUSR1 30 + #define SIGUSR2 31 + +-#define _NSIG 64 /* Biggest signal number + 1 ++#define _NSIG 65 /* Biggest signal number + 1 + (including real-time signals). */ + + #define SIGRTMIN (__libc_current_sigrtmin ()) +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h Thu Oct 24 01:48:46 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h Tue Mar 25 23:00:07 2003 +@@ -1,5 +1,5 @@ + /* bits/typesizes.h -- underlying types for *_t. Linux/SPARC version. +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 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 +@@ -54,7 +54,7 @@ + #define __SWBLK_T_TYPE __SLONGWORD_TYPE + #define __KEY_T_TYPE __S32_TYPE + #define __CLOCKID_T_TYPE __S32_TYPE +-#define __TIMER_T_TYPE __S32_TYPE ++#define __TIMER_T_TYPE void * + #define __BLKSIZE_T_TYPE __SLONGWORD_TYPE + #define __FSID_T_TYPE struct { int __val[2]; } + +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h Mon Jan 27 21:47:54 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h Sun Mar 23 20:42:23 2003 +@@ -35,6 +35,7 @@ + + /* Linux/SPARC uses a different trap number */ + #undef PSEUDO ++#undef PSEUDO_NOERRNO + #undef ENTRY + #undef END + #undef LOC +@@ -107,6 +108,12 @@ + bcs __syscall_error_handler; \ + nop; \ + SYSCALL_ERROR_HANDLER ++ ++#define PSEUDO_NOERRNO(name, syscall_name, args) \ ++ .text; \ ++ ENTRY(name); \ ++ LOADSYSCALL(syscall_name); \ ++ ta 0x10 + + #else /* __ASSEMBLER__ */ + +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc64/pause.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/sparc/sparc64/pause.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc64/pause.c Wed Jun 2 13:10:10 1999 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/sparc/sparc64/pause.c Sat Mar 15 00:37:01 2003 +@@ -1 +1 @@ +-#include ++#include +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc64/sigsuspend.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/sparc/sparc64/sigsuspend.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc64/sigsuspend.c Tue Dec 10 21:31:58 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/sparc/sparc64/sigsuspend.c Wed Apr 2 02:06:44 2003 +@@ -1,41 +1 @@ +-/* Copyright (C) 1996,1997,1998,1999,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 +- 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 +- +-extern int __syscall_rt_sigsuspend (const sigset_t *__unbounded, size_t); +- +-/* Change the set of blocked signals to SET, +- wait until a signal arrives, and restore the set of blocked signals. */ +-int +-__sigsuspend (set) +- const sigset_t *set; +-{ +- /* XXX The size argument hopefully will have to be changed to the +- real size of the user-level sigset_t. */ +- return INLINE_SYSCALL (rt_sigsuspend, 2, CHECK_SIGSET (set), _NSIG / 8); +-} +-libc_hidden_def (__sigsuspend) +-weak_alias (__sigsuspend, sigsuspend) +-strong_alias (__sigsuspend, __libc_sigsuspend) ++#include "../../ia64/sigsuspend.c" +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h Mon Jan 27 21:47:54 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h Wed Mar 26 19:06:28 2003 +@@ -35,6 +35,7 @@ + + /* Linux/SPARC uses a different trap number */ + #undef PSEUDO ++#undef PSEUDO_NOERRNO + #undef ENTRY + + #define ENTRY(name) \ +@@ -101,8 +102,18 @@ + nop; \ + SYSCALL_ERROR_HANDLER + ++#define PSEUDO_NOERRNO(name, syscall_name, args) \ ++ .text; \ ++ ENTRY(name); \ ++ LOADSYSCALL(syscall_name); \ ++ ta 0x6d ++ + #undef PSEUDO_END + #define PSEUDO_END(name) \ ++ .size name,.-name ++ ++#undef PSEUDO_END_NOERRNO ++#define PSEUDO_END_NOERRNO(name) \ + .size name,.-name + + #undef END +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/sys/epoll.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/sys/epoll.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/sys/epoll.h Tue Dec 17 00:24:21 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/sys/epoll.h Tue Mar 25 00:50:25 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 2002 Free Software Foundation, Inc. ++/* Copyright (C) 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 +@@ -42,8 +42,10 @@ + #define EPOLLMSG EPOLLMSG + EPOLLERR = 0x008, + #define EPOLLERR EPOLLERR +- EPOLLHUP = 0x010 ++ EPOLLHUP = 0x010, + #define EPOLLHUP EPOLLHUP ++ EPOLLET = (1 << 31) ++#define EPOLLET EPOLLET + }; + + +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/syscalls.list glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/syscalls.list +--- glibc-2.3.2/sysdeps/unix/sysv/linux/syscalls.list Wed Feb 5 22:04:09 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/syscalls.list Thu Mar 27 10:47:19 2003 +@@ -14,12 +14,12 @@ + 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 +-getegid - getegid i: __getegid getegid +-geteuid - geteuid i: __geteuid geteuid ++getegid - getegid Ei: __getegid getegid ++geteuid - geteuid Ei: __geteuid geteuid + getpgid - getpgid i:i __getpgid getpgid +-getpgrp - getpgrp i: getpgrp ++getpgrp - getpgrp Ei: getpgrp + getpmsg - getpmsg i:ipppp getpmsg +-getppid - getppid i: __getppid getppid ++getppid - getppid Ei: __getppid getppid + getresuid - getresuid i:ppp getresuid + getresgid - getresgid i:ppp getresgid + getsid - getsid i:i getsid +@@ -43,11 +43,12 @@ + personality init-first personality i:i __personality personality + pipe - pipe i:f __pipe pipe + pivot_root EXTRA pivot_root i:ss pivot_root +-posix_fadvise64 - fadvise64 i:iiiii posix_advise64 ++posix_fadvise64 - fadvise64 i:iiiii posix_fadvise64 + prctl EXTRA prctl i:iiiii __prctl prctl + putpmsg - putpmsg i:ippii putpmsg + query_module EXTRA query_module i:sipip query_module + quotactl EXTRA quotactl i:isip quotactl ++remap_file_pages - remap_file_pages i:piiii __remap_file_pages remap_file_pages + sched_getaffinity - sched_getaffinity i:iip sched_getaffinity + sched_getp - sched_getparam i:ip __sched_getparam sched_getparam + sched_gets - sched_getscheduler i:i __sched_getscheduler sched_getscheduler +@@ -76,15 +77,15 @@ + chown - chown i:sii __libc_chown __chown chown + fcntl - fcntl Ci:iiF __libc_fcntl __fcntl fcntl + +-setxattr EXTRA setxattr i:sspii setxattr +-lsetxattr EXTRA lsetxattr i:sspii lsetxattr +-fsetxattr EXTRA fsetxattr i:ispii fsetxattr +-getxattr EXTRA getxattr i:sspi getxattr +-lgetxattr EXTRA lgetxattr i:sspi lgetxattr +-fgetxattr EXTRA fgetxattr i:ispi fgetxattr +-listxattr EXTRA listxattr i:ssi listxattr +-llistxattr EXTRA llistxattr i:ssi llistxattr +-flistxattr EXTRA flistxattr i:isi flistxattr +-removexattr EXTRA removexattr i:ss removexattr +-lremovexattr EXTRA lremovexattr i:ss lremovexattr +-fremovexattr EXTRA fremovexattr i:is fremovexattr ++setxattr - setxattr i:sspii setxattr ++lsetxattr - lsetxattr i:sspii lsetxattr ++fsetxattr - fsetxattr i:ispii fsetxattr ++getxattr - getxattr i:sspi getxattr ++lgetxattr - lgetxattr i:sspi lgetxattr ++fgetxattr - fgetxattr i:ispi fgetxattr ++listxattr - listxattr i:ssi listxattr ++llistxattr - llistxattr i:ssi llistxattr ++flistxattr - flistxattr i:isi flistxattr ++removexattr - removexattr i:ss removexattr ++lremovexattr - lremovexattr i:ss lremovexattr ++fremovexattr - fremovexattr i:is fremovexattr +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/sysconf.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/sysconf.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/sysconf.c Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/sysconf.c Thu Mar 27 18:55:08 2003 +@@ -0,0 +1,52 @@ ++/* Get file-specific information about a file. Linux version. ++ Copyright (C) 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 ++ 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 long int posix_sysconf (int name); ++ ++/* Define this first, so it can be inlined. */ ++#define __sysconf static posix_sysconf ++#include ++ ++ ++/* Get the value of the system variable NAME. */ ++long int ++__sysconf (int name) ++{ ++ switch (name) ++ { ++#ifdef __NR_clock_getres ++ case _SC_MONOTONIC_CLOCK: ++ /* Check using the clock_getres system call. */ ++ { ++ struct timespec ts; ++ INTERNAL_SYSCALL_DECL (err); ++ int r; ++ r = INTERNAL_SYSCALL (clock_getres, err, 2, CLOCK_MONOTONIC, &ts); ++ return INTERNAL_SYSCALL_ERROR_P (r, err) ? -1 : 1; ++ } ++#endif ++ ++ default: ++ return posix_sysconf (name); ++ } ++} +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/system.c glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/system.c +--- glibc-2.3.2/sysdeps/unix/sysv/linux/system.c Thu Sep 12 20:29:32 1996 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/system.c Sun Mar 16 00:43:51 2003 +@@ -1,2 +1,73 @@ ++/* Copyright (C) 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 ++ 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 ++ ++/* We have to and actually can handle cancelable system(). The big ++ problem: we have to kill the child process if necessary. To do ++ this a cleanup handler has to be registered and is has to be able ++ to find the PID of the child. The main problem is to reliable have ++ the PID when needed. It is not necessary for the parent thread to ++ return. It might still be in the kernel when the cancellation ++ request comes. Therefore we have to use the clone() calls ability ++ to have the kernel write the PID into the user-level variable. */ ++#if defined __ASSUME_CLONE_THREAD_FLAGS && !defined FORK ++# define FORK() \ ++ INLINE_SYSCALL (clone, 3, CLONE_PARENT_SETTID | SIGCHLD, 0, &pid) ++#endif ++ ++static void cancel_handler (void *arg); ++ ++#define CLEANUP_HANDLER \ ++ __libc_cleanup_region_start (1, cancel_handler, &pid) ++ ++#define CLEANUP_RESET \ ++ __libc_cleanup_region_end (0) ++ ++ + /* Linux has waitpid(), so override the generic unix version. */ + #include ++ ++ ++/* The cancellation handler. */ ++static void ++cancel_handler (void *arg) ++{ ++ pid_t child = *(pid_t *) arg; ++ ++ INTERNAL_SYSCALL_DECL (err); ++ INTERNAL_SYSCALL (kill, err, 2, child, SIGKILL); ++ ++ TEMP_FAILURE_RETRY (__waitpid (child, NULL, 0)); ++ ++ DO_LOCK (); ++ ++ if (SUB_REF () == 0) ++ { ++ (void) __sigaction (SIGQUIT, &quit, (struct sigaction *) NULL); ++ (void) __sigaction (SIGINT, &intr, (struct sigaction *) NULL); ++ } ++ ++ DO_UNLOCK (); ++} +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/x86_64/bits/mman.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/x86_64/bits/mman.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/x86_64/bits/mman.h Wed Sep 19 12:30:39 2001 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/x86_64/bits/mman.h Mon Mar 3 11:03:36 2003 +@@ -1,5 +1,5 @@ + /* Definitions for POSIX memory map interface. Linux/x86_64 version. +- Copyright (C) 2001 Free Software Foundation, Inc. ++ Copyright (C) 2001, 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 +@@ -53,11 +53,13 @@ + + /* These are Linux-specific. */ + #ifdef __USE_MISC +-# define MAP_GROWSDOWN 0x0100 /* Stack-like segment. */ +-# define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +-# define MAP_EXECUTABLE 0x1000 /* Mark it as an executable. */ +-# define MAP_LOCKED 0x2000 /* Lock the mapping. */ +-# define MAP_NORESERVE 0x4000 /* Don't check for reservations. */ ++# define MAP_GROWSDOWN 0x00100 /* Stack-like segment. */ ++# define MAP_DENYWRITE 0x00800 /* ETXTBSY */ ++# define MAP_EXECUTABLE 0x01000 /* Mark it as an executable. */ ++# define MAP_LOCKED 0x02000 /* Lock the mapping. */ ++# define MAP_NORESERVE 0x04000 /* Don't check for reservations. */ ++# define MAP_POPULATE 0x08000 /* Populate (prefault) pagetables. */ ++# define MAP_NONBLOCK 0x10000 /* Do not block on IO. */ + #endif + + /* Flags to `msync'. */ +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/x86_64/clone.S glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/x86_64/clone.S +--- glibc-2.3.2/sysdeps/unix/sysv/linux/x86_64/clone.S Sun Aug 4 04:20:07 2002 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/x86_64/clone.S Tue Mar 4 20:45:35 2003 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 2001,02 Free Software Foundation, Inc. ++/* Copyright (C) 2001, 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 +@@ -31,16 +31,22 @@ + the kernel entry is: + int clone (long flags, void *child_stack). + +- The parameters are passed in register from userland: ++ The parameters are passed in register and on the stack from userland: + rdi: fn + rsi: child_stack + rdx: flags + rcx: arg ++ r8d: TID field in parent ++ r9d: thread pointer ++%esp+8: TID field in child + + The kernel expects: + rax: system call number + rdi: flags +- rsi: child_stack */ ++ rsi: child_stack ++ rdx: TID field in parent ++ r10: TID field in child ++ r8: thread pointer */ + + + .text +@@ -62,6 +68,9 @@ + + /* Do the system call. */ + movq %rdx, %rdi ++ movq %r8, %rdx ++ movq %r9, %r8 ++ movq 8(%rsp), %r10 + movq $SYS_ify(clone),%rax + syscall + +diff -u -udbrN glibc-2.3.2/sysdeps/unix/sysv/linux/x86_64/sysdep.h glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/x86_64/sysdep.h +--- glibc-2.3.2/sysdeps/unix/sysv/linux/x86_64/sysdep.h Thu Jan 9 03:54:57 2003 ++++ glibc-2.3.2-200304020432/sysdeps/unix/sysv/linux/x86_64/sysdep.h Sun Mar 23 20:42:23 2003 +@@ -81,6 +81,18 @@ + SYSCALL_ERROR_HANDLER \ + END (name) + ++#undef PSEUDO_NOERRNO ++#define PSEUDO_NOERRNO(name, syscall_name, args) \ ++ .text; \ ++ ENTRY (name) \ ++ DO_CALL (syscall_name, args) ++ ++#undef PSEUDO_END_NOERRNO ++#define PSEUDO_END_NOERRNO(name) \ ++ END (name) ++ ++#define ret_NOERRNO ret ++ + #ifndef PIC + #define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */ + #elif RTLD_PRIVATE_ERRNO +@@ -134,36 +146,41 @@ + jmp L(pseudo_end); + #endif /* PIC */ + +-/* Linux/x86-64 takes system call arguments in registers: ++/* The Linux/x86-64 kernel expects the system call parameters in ++ registers according to the following table: + +- Register setup: +- system call number rax ++ syscall number rax + arg 1 rdi + arg 2 rsi + arg 3 rdx +- arg 4 rcx ++ arg 4 r10 + arg 5 r8 + arg 6 r9 + ++ The Linux kernel uses and destroys internally these registers: + return address from + syscall rcx + additionally clobered: r12-r15,rbx,rbp + eflags from syscall r11 + +- The compiler is going to form a call by coming here, through PSEUDO, with arguments: ++ Normal function call, including calls to the system call stub ++ functions in the libc, get the first six parameters passed in ++ registers and the seventh parameter and later on the stack. The ++ register use is as follows: + +- syscall number in the DO_CALL macro ++ system call number in the DO_CALL macro + arg 1 rdi + arg 2 rsi + arg 3 rdx +- arg 4 r10 ++ arg 4 rcx + arg 5 r8 + arg 6 r9 + +- We have to take care that the stack is alignedto 16 bytes. When ++ We have to take care that the stack is aligned to 16 bytes. When + called the stack is not aligned since the return address has just + been pushed. + ++ + Syscalls of more than 6 arguments are not supported. */ + + #undef DO_CALL +diff -u -udbrN glibc-2.3.2/sysdeps/wordsize-32/Versions glibc-2.3.2-200304020432/sysdeps/wordsize-32/Versions +--- glibc-2.3.2/sysdeps/wordsize-32/Versions Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/wordsize-32/Versions Mon Mar 3 10:45:12 2003 +@@ -0,0 +1,7 @@ ++libc { ++ GLIBC_2.3 { ++ # These were erroneously omitted for 64-bit platforms in 2.3 ++ # and so we don't put them in locale/Versions. ++ strtoll_l; strtoull_l; ++ } ++} +diff -u -udbrN glibc-2.3.2/sysdeps/wordsize-64/Versions glibc-2.3.2-200304020432/sysdeps/wordsize-64/Versions +--- glibc-2.3.2/sysdeps/wordsize-64/Versions Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/wordsize-64/Versions Mon Mar 3 10:45:12 2003 +@@ -0,0 +1,6 @@ ++libc { ++ GLIBC_2.3.3 { ++ # These were erroneously omitted for 64-bit platforms in 2.3. ++ strtoll_l; strtoull_l; ++ } ++} +diff -u -udbrN glibc-2.3.2/sysdeps/wordsize-64/strtol_l.c glibc-2.3.2-200304020432/sysdeps/wordsize-64/strtol_l.c +--- glibc-2.3.2/sysdeps/wordsize-64/strtol_l.c Mon Aug 5 02:30:03 2002 ++++ glibc-2.3.2-200304020432/sysdeps/wordsize-64/strtol_l.c Mon Mar 3 10:45:12 2003 +@@ -1,11 +1,14 @@ + /* We have to irritate the compiler a bit. */ + #define ____strtoll_l_internal ____strtoll_l_internal_XXX + #define __strtoll_l __strtoll_l_XXX ++#define strtoll_l strtoll_l_XXX + + #include + + #undef ____strtoll_l_internal + #undef __strtoll_l ++#undef strtoll_l + strong_alias (____strtol_l_internal, ____strtoll_l_internal) + libc_hidden_ver (____strtol_l_internal, ____strtoll_l_internal) + weak_alias (__strtol_l, __strtoll_l) ++weak_alias (__strtol_l, strtoll_l) +diff -u -udbrN glibc-2.3.2/sysdeps/wordsize-64/strtoul_l.c glibc-2.3.2-200304020432/sysdeps/wordsize-64/strtoul_l.c +--- glibc-2.3.2/sysdeps/wordsize-64/strtoul_l.c Mon Aug 5 02:30:03 2002 ++++ glibc-2.3.2-200304020432/sysdeps/wordsize-64/strtoul_l.c Mon Mar 3 10:45:12 2003 +@@ -1,11 +1,14 @@ + /* We have to irritate the compiler a bit. */ + #define ____strtoull_l_internal ____strtoull_l_internal_XXX + #define __strtoull_l __strtoull_l_XXX ++#define strtoull_l strtoull_l_XXX + + #include + + #undef ____strtoull_l_internal + #undef __strtoull_l ++#undef strtoull_l + strong_alias (____strtoul_l_internal, ____strtoull_l_internal) + libc_hidden_ver (____strtoul_l_internal, ____strtoull_l_internal) + weak_alias (__strtoul_l, __strtoull_l) ++weak_alias (__strtoul_l, strtoull_l) +diff -u -udbrN glibc-2.3.2/sysdeps/x86_64/atomicity.h glibc-2.3.2-200304020432/sysdeps/x86_64/atomicity.h +--- glibc-2.3.2/sysdeps/x86_64/atomicity.h Wed Sep 19 12:12:07 2001 ++++ glibc-2.3.2-200304020432/sysdeps/x86_64/atomicity.h Thu Jan 1 01:00:00 1970 +@@ -1,57 +0,0 @@ +-/* Low-level functions for atomic operations. x86-64 version. +- Copyright (C) 1997, 2000, 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 +- 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 _ATOMICITY_H +-#define _ATOMICITY_H 1 +- +-#include +- +- +-static inline uint32_t +-__attribute__ ((unused)) +-exchange_and_add (volatile uint32_t *mem, uint32_t val) +-{ +- register uint32_t result; +- __asm__ __volatile__ ("lock; xaddl %0,%1" +- : "=r" (result), "=m" (*mem) : "0" (val), "1" (*mem)); +- return result; +-} +- +-static inline void +-__attribute__ ((unused)) +-atomic_add (volatile uint32_t *mem, int val) +-{ +- __asm__ __volatile__ ("lock; addl %1,%0" +- : "=m" (*mem) : "er" (val), "0" (*mem)); +-} +- +-static inline char +-__attribute__ ((unused)) +-compare_and_swap (volatile long int *p, long int oldval, long int newval) +-{ +- char ret; +- long int readval; +- +- __asm__ __volatile__ ("lock; cmpxchgq %3, %1; sete %0" +- : "=q" (ret), "=m" (*p), "=a" (readval) +- : "r" (newval), "1" (*p), "a" (oldval)); +- return ret; +-} +- +-#endif /* atomicity.h */ +diff -u -udbrN glibc-2.3.2/sysdeps/x86_64/bits/atomic.h glibc-2.3.2-200304020432/sysdeps/x86_64/bits/atomic.h +--- glibc-2.3.2/sysdeps/x86_64/bits/atomic.h Thu Jan 1 01:00:00 1970 ++++ glibc-2.3.2-200304020432/sysdeps/x86_64/bits/atomic.h Wed Mar 26 05:01:47 2003 +@@ -0,0 +1,321 @@ ++/* Copyright (C) 2002, 2003 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. */ ++ ++#include ++ ++ ++typedef int8_t atomic8_t; ++typedef uint8_t uatomic8_t; ++typedef int_fast8_t atomic_fast8_t; ++typedef uint_fast8_t uatomic_fast8_t; ++ ++typedef int16_t atomic16_t; ++typedef uint16_t uatomic16_t; ++typedef int_fast16_t atomic_fast16_t; ++typedef uint_fast16_t uatomic_fast16_t; ++ ++typedef int32_t atomic32_t; ++typedef uint32_t uatomic32_t; ++typedef int_fast32_t atomic_fast32_t; ++typedef uint_fast32_t uatomic_fast32_t; ++ ++typedef int64_t atomic64_t; ++typedef uint64_t uatomic64_t; ++typedef int_fast64_t atomic_fast64_t; ++typedef uint_fast64_t uatomic_fast64_t; ++ ++typedef intptr_t atomicptr_t; ++typedef uintptr_t uatomicptr_t; ++typedef intmax_t atomic_max_t; ++typedef uintmax_t uatomic_max_t; ++ ++ ++#ifndef LOCK ++# ifdef UP ++# define LOCK /* nothing */ ++# else ++# define LOCK "lock;" ++# endif ++#endif ++ ++ ++#define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \ ++ ({ __typeof (*mem) ret; \ ++ __asm __volatile (LOCK "cmpxchgb %b2, %1" \ ++ : "=a" (ret), "=m" (*mem) \ ++ : "q" (newval), "m" (*mem), "0" (oldval)); \ ++ ret; }) ++ ++#define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \ ++ ({ __typeof (*mem) ret; \ ++ __asm __volatile (LOCK "cmpxchgw %w2, %1" \ ++ : "=a" (ret), "=m" (*mem) \ ++ : "r" (newval), "m" (*mem), "0" (oldval)); \ ++ ret; }) ++ ++#define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \ ++ ({ __typeof (*mem) ret; \ ++ __asm __volatile (LOCK "cmpxchgl %2, %1" \ ++ : "=a" (ret), "=m" (*mem) \ ++ : "r" (newval), "m" (*mem), "0" (oldval)); \ ++ ret; }) ++ ++#define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \ ++ ({ __typeof (*mem) ret; \ ++ __asm __volatile (LOCK "cmpxchgq %q2, %1" \ ++ : "=a" (ret), "=m" (*mem) \ ++ : "r" ((long) (newval)), "m" (*mem), \ ++ "0" ((long) (oldval))); \ ++ ret; }) ++ ++ ++/* Note that we need no lock prefix. */ ++#define atomic_exchange(mem, newvalue) \ ++ ({ __typeof (*mem) result; \ ++ if (sizeof (*mem) == 1) \ ++ __asm __volatile ("xchgb %b0, %1" \ ++ : "=r" (result), "=m" (*mem) \ ++ : "0" (newvalue), "m" (*mem)); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile ("xchgw %w0, %1" \ ++ : "=r" (result), "=m" (*mem) \ ++ : "0" (newvalue), "m" (*mem)); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile ("xchgl %0, %1" \ ++ : "=r" (result), "=m" (*mem) \ ++ : "0" (newvalue), "m" (*mem)); \ ++ else \ ++ __asm __volatile ("xchgq %q0, %1" \ ++ : "=r" (result), "=m" (*mem) \ ++ : "0" ((long) (newvalue)), "m" (*mem)); \ ++ result; }) ++ ++ ++#define atomic_exchange_and_add(mem, value) \ ++ ({ __typeof (*mem) result; \ ++ if (sizeof (*mem) == 1) \ ++ __asm __volatile (LOCK "xaddb %b0, %1" \ ++ : "=r" (result), "=m" (*mem) \ ++ : "0" (value), "m" (*mem)); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile (LOCK "xaddw %w0, %1" \ ++ : "=r" (result), "=m" (*mem) \ ++ : "0" (value), "m" (*mem)); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile (LOCK "xaddl %0, %1" \ ++ : "=r" (result), "=m" (*mem) \ ++ : "0" (value), "m" (*mem)); \ ++ else \ ++ __asm __volatile (LOCK "xaddq %q0, %1" \ ++ : "=r" (result), "=m" (*mem) \ ++ : "0" ((long) (value)), "m" (*mem)); \ ++ result; }) ++ ++ ++#define atomic_add(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 "addb %b1, %0" \ ++ : "=m" (*mem) \ ++ : "ir" (value), "m" (*mem)); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile (LOCK "addw %w1, %0" \ ++ : "=m" (*mem) \ ++ : "ir" (value), "m" (*mem)); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile (LOCK "addl %1, %0" \ ++ : "=m" (*mem) \ ++ : "ir" (value), "m" (*mem)); \ ++ else \ ++ __asm __volatile (LOCK "addq %q1, %0" \ ++ : "=m" (*mem) \ ++ : "ir" ((long) (value)), "m" (*mem)); \ ++ }) ++ ++ ++#define atomic_add_negative(mem, value) \ ++ ({ unsigned char __result; \ ++ if (sizeof (*mem) == 1) \ ++ __asm __volatile (LOCK "addb %b2, %0; sets %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "ir" (value), "m" (*mem)); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile (LOCK "addw %w2, %0; sets %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "ir" (value), "m" (*mem)); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile (LOCK "addl %2, %0; sets %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "ir" (value), "m" (*mem)); \ ++ else \ ++ __asm __volatile (LOCK "addq %q2, %0; sets %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "ir" ((long) (value)), "m" (*mem)); \ ++ __result; }) ++ ++ ++#define atomic_add_zero(mem, value) \ ++ ({ unsigned char __result; \ ++ if (sizeof (*mem) == 1) \ ++ __asm __volatile (LOCK "addb %b2, %0; setz %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "ir" (value), "m" (*mem)); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile (LOCK "addw %w2, %0; setz %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "ir" (value), "m" (*mem)); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile (LOCK "addl %2, %0; setz %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "ir" (value), "m" (*mem)); \ ++ else \ ++ __asm __volatile (LOCK "addq %q2, %0; setz %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "ir" ((long) (value)), "m" (*mem)); \ ++ __result; }) ++ ++ ++#define atomic_increment(mem) \ ++ (void) ({ if (sizeof (*mem) == 1) \ ++ __asm __volatile (LOCK "incb %b0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem)); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile (LOCK "incw %w0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem)); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile (LOCK "incl %0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem)); \ ++ else \ ++ __asm __volatile (LOCK "incq %q0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem)); \ ++ }) ++ ++ ++#define atomic_increment_and_test(mem) \ ++ ({ unsigned char __result; \ ++ if (sizeof (*mem) == 1) \ ++ __asm __volatile (LOCK "incb %b0; sete %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "m" (*mem)); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile (LOCK "incw %w0; sete %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "m" (*mem)); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile (LOCK "incl %0; sete %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "m" (*mem)); \ ++ else \ ++ __asm __volatile (LOCK "incq %q0; sete %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "m" (*mem)); \ ++ __result; }) ++ ++ ++#define atomic_decrement(mem) \ ++ (void) ({ if (sizeof (*mem) == 1) \ ++ __asm __volatile (LOCK "decb %b0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem)); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile (LOCK "decw %w0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem)); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile (LOCK "decl %0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem)); \ ++ else \ ++ __asm __volatile (LOCK "decq %q0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem)); \ ++ }) ++ ++ ++#define atomic_decrement_and_test(mem) \ ++ ({ unsigned char __result; \ ++ if (sizeof (*mem) == 1) \ ++ __asm __volatile (LOCK "decb %b0; sete %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "m" (*mem)); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile (LOCK "decw %w0; sete %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "m" (*mem)); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile (LOCK "decl %0; sete %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "m" (*mem)); \ ++ else \ ++ __asm __volatile (LOCK "decq %q0; sete %1" \ ++ : "=m" (*mem), "=qm" (__result) \ ++ : "m" (*mem)); \ ++ __result; }) ++ ++ ++#define atomic_bit_set(mem, bit) \ ++ (void) ({ if (sizeof (*mem) == 1) \ ++ __asm __volatile (LOCK "orb %b2, %0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem), "ir" (1L << (bit))); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile (LOCK "orw %w2, %0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem), "ir" (1L << (bit))); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile (LOCK "orl %2, %0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem), "ir" (1L << (bit))); \ ++ else if (__builtin_constant_p (bit) && (bit) < 32) \ ++ __asm __volatile (LOCK "orq %2, %0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem), "i" (1L << (bit))); \ ++ else \ ++ __asm __volatile (LOCK "orq %q2, %0" \ ++ : "=m" (*mem) \ ++ : "m" (*mem), "r" (1UL << (bit))); \ ++ }) ++ ++ ++#define atomic_bit_test_set(mem, bit) \ ++ ({ unsigned char __result; \ ++ if (sizeof (*mem) == 1) \ ++ __asm __volatile (LOCK "btsb %3, %1; setc %0" \ ++ : "=q" (__result), "=m" (*mem) \ ++ : "m" (*mem), "ir" (bit)); \ ++ else if (sizeof (*mem) == 2) \ ++ __asm __volatile (LOCK "btsw %3, %1; setc %0" \ ++ : "=q" (__result), "=m" (*mem) \ ++ : "m" (*mem), "ir" (bit)); \ ++ else if (sizeof (*mem) == 4) \ ++ __asm __volatile (LOCK "btsl %3, %1; setc %0" \ ++ : "=q" (__result), "=m" (*mem) \ ++ : "m" (*mem), "ir" (bit)); \ ++ else \ ++ __asm __volatile (LOCK "btsq %3, %1; setc %0" \ ++ : "=q" (__result), "=m" (*mem) \ ++ : "m" (*mem), "ir" (bit)); \ ++ __result; }) +diff -u -udbrN glibc-2.3.2/sysdeps/x86_64/fpu/libm-test-ulps glibc-2.3.2-200304020432/sysdeps/x86_64/fpu/libm-test-ulps +--- glibc-2.3.2/sysdeps/x86_64/fpu/libm-test-ulps Fri Dec 6 23:25:36 2002 ++++ glibc-2.3.2-200304020432/sysdeps/x86_64/fpu/libm-test-ulps Sun Mar 23 01:52:10 2003 +@@ -145,7 +145,7 @@ + ldouble: 1 + + # ccos +-Test "Imaginary part of: ccos (-2 - 3 i) == -4.1896256909688072301 - 9.1092278937553365979 i": ++Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": + float: 1 + ifloat: 1 + ildouble: 1 +@@ -164,10 +164,10 @@ + ifloat: 1 + + # ccosh +-Test "Real part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Real part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + float: 1 + ifloat: 1 +-Test "Imaginary part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i": ++Test "Imaginary part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": + double: 1 + float: 1 + idouble: 1 +@@ -215,7 +215,7 @@ + float: 1 + idouble: 1 + ifloat: 1 +-Test "Imaginary part of: clog10 (-2 - 3 i) == 0.5569716761534183846 - 0.9375544629863747085 i": ++Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": + double: 1 + float: 5 + idouble: 1 +@@ -373,10 +373,10 @@ + ifloat: 1 + + # csinh +-Test "Real part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i": ++Test "Real part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": + double: 1 + idouble: 1 +-Test "Imaginary part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i": ++Test "Imaginary part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": + double: 1 + idouble: 1 + ildouble: 2 +@@ -399,12 +399,12 @@ + ifloat: 1 + + # ctan +-Test "Real part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i": ++Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": + double: 1 + idouble: 1 + ildouble: 439 + ldouble: 439 +-Test "Imaginary part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i": ++Test "Imaginary part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": + float: 1 + ifloat: 1 + ildouble: 2 +@@ -421,14 +421,14 @@ + ldouble: 3 + + # ctanh +-Test "Real part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i": ++Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": + float: 2 + ifloat: 2 + ildouble: 5 + ldouble: 5 + double: 1 + idouble: 1 +-Test "Imaginary part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i": ++Test "Imaginary part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": + ildouble: 25 + ldouble: 25 + Test "Imaginary part of: ctanh (0 + pi/4 i) == 0.0 + 1.0 i": +@@ -677,12 +677,12 @@ + Test "lgamma (-0.5) == log(2*sqrt(pi))": + ildouble: 1 + ldouble: 1 +-Test "lgamma (0.7) == 0.26086724653166651439": ++Test "lgamma (0.7) == 0.260867246531666514385732417016759578": + double: 1 + float: 1 + idouble: 1 + ifloat: 1 +-Test "lgamma (1.2) == -0.853740900033158497197e-1": ++Test "lgamma (1.2) == -0.853740900033158497197028392998854470e-1": + double: 1 + float: 2 + idouble: 1 +@@ -749,7 +749,7 @@ + Test "tgamma (0.5) == sqrt (pi)": + float: 1 + ifloat: 1 +-Test "tgamma (0.7) == 1.29805533264755778568": ++Test "tgamma (0.7) == 1.29805533264755778568117117915281162": + double: 1 + float: 1 + idouble: 1 +diff -u -udbrN glibc-2.3.2/timezone/antarctica glibc-2.3.2-200304020432/timezone/antarctica +--- glibc-2.3.2/timezone/antarctica Sat Jun 9 22:29:18 2001 ++++ glibc-2.3.2-200304020432/timezone/antarctica Mon Mar 24 20:00:03 2003 +@@ -1,4 +1,4 @@ +-# @(#)antarctica 7.22 ++# @(#)antarctica 7.23 + + # From Paul Eggert (1999-11-15): + # To keep things manageable, we list only locations occupied year-round; see +@@ -255,6 +255,13 @@ + # Halley is on a moving ice shelf and is periodically relocated + # so that it is never more than 10km from its nominal location. + # Rothera, Adelaide Island, -6734-6808, since 1976-12-01 ++# ++# From Paul Eggert (2002-10-22) ++# says Rothera is -03 all year. ++# ++# Zone NAME GMTOFF RULES FORMAT [UNTIL] ++Zone Antarctica/Rothera 0 - zzz 1976 Dec 1 ++ -3:00 - ROTT # Rothera time + + # Uruguay - year round base + # Artigas, King George Island, -621104-0585107 +diff -u -udbrN glibc-2.3.2/timezone/asia glibc-2.3.2-200304020432/timezone/asia +--- glibc-2.3.2/timezone/asia Tue Oct 15 18:59:28 2002 ++++ glibc-2.3.2-200304020432/timezone/asia Mon Mar 24 20:00:03 2003 +@@ -1,4 +1,4 @@ +-# @(#)asia 7.68 ++# @(#)asia 7.71 + + # 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 +@@ -34,6 +34,7 @@ + # 2:00 EET EEST Eastern European Time + # 2:00 IST IDT Israel + # 3:00 AST ADT Arabia* ++# 3:30 IRST IRDT Iran + # 4:00 GST Gulf* + # 5:30 IST India + # 7:00 ICT Indochina* +@@ -430,89 +431,97 @@ + 9:00 - EIT + + # Iran +-# From Paul Eggert (2000-06-12), following up a suggestion by Rich Wales: +-# Ahmea Alavi in +-# +-# TAGHVEEM (1993-07-12) +-# +-# writes ``Daylight saving time in Iran starts from the first day +-# of Farvardin and ends the first day of Mehr.'' This disagrees with the SSIM: ++ ++# From Roozbeh Pournader (2003-03-15): ++# This is an English translation of what I just found (originally in Persian). ++# The Gregorian dates in brackets are mine: + # +-# DST start DST end +-# year SSIM Alavi SSIM Alavi +-# 1991 05-03!= 03-21 09-20!= 09-23 +-# 1992 03-22!= 03-21 09-23 09-23 +-# 1993 03-21 03-21 09-23 09-23 +-# 1994 03-21 03-21 09-22!= 09-23 +-# 1995 03-21 03-21 09-22!= 09-23 +-# 1996 03-21!= 03-20 09-22 09-22 +-# 1997 03-22!= 03-21 09-22!= 09-23 +-# 1998 03-21 03-21 09-21!= 09-23 +-# 1999 03-22!= 03-21 09-22!= 09-23 +-# 2000 03-21!= 03-20 09-21!= 09-22 +-# 2001 03-19!= 03-21 09-19!= 09-23 +-# 2002 03-18!= 03-21 09-18!= 09-23 ++# Official Newspaper No. 13548-1370/6/25 [1991-09-16] ++# No. 16760/T233 H 1370/6/10 [1991-09-01] + # +-# Go with Alavi starting with 1992. +-# I used Ed Reingold's cal-persia in GNU Emacs 19.34 to compute Persian dates. ++# The Rule About Change of the Official Time of the Country ++# ++# The Board of Ministers, in the meeting dated 1370/5/23 [1991-08-14], ++# based on the suggestion number 2221/D dated 1370/4/22 [1991-07-13] ++# of the Country's Organization for Official and Employment Affairs, ++# and referring to the law for equating the working hours of workers ++# and officers in the whole country dated 1359/4/23 [1980-07-14], and ++# for synchronizing the official times of the country, agreed that: ++# ++# The official time of the country will should move forward one hour ++# at the 24[:00] hours of the first day of Farvardin and should return ++# to its previous state at the 24[:00] hours of the 30th day of ++# Shahrivar. ++# ++# First Deputy to the President - Hassan Habibi ++# ++# From personal experience, that agrees with what has been followed ++# for at least the last 5 years. Before that, for a few years, the ++# date used was the first Thursday night of Farvardin and the last ++# Thursday night of Shahrivar, but I can't give exact dates.... ++# I have also changed the abbreviations to what is considered correct ++# here in Iran, IRST for regular time and IRDT for daylight saving time. ++ ++# From Paul Eggert (2003-03-15) ++# 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. + # The Persian calendar is based on the sun, and dates after around 2050 + # are approximate; stop after 2037 when 32-bit time_t's overflow. + # + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +-Rule Iran 1978 1980 - Mar 21 0:00 1:00 S +-Rule Iran 1978 only - Oct 21 0:00 0 - +-Rule Iran 1979 only - Sep 19 0:00 0 - +-Rule Iran 1980 only - Sep 23 0:00 0 - +-Rule Iran 1991 only - May 3 0:00s 1:00 S +-Rule Iran 1991 only - Sep 20 0:00s 0 - +-Rule Iran 1992 1995 - Mar 21 0:00 1:00 S +-Rule Iran 1992 1995 - Sep 23 0:00 0 - +-Rule Iran 1996 only - Mar 20 0:00 1:00 S +-Rule Iran 1996 only - Sep 22 0:00 0 - +-Rule Iran 1997 1999 - Mar 21 0:00 1:00 S +-Rule Iran 1997 1999 - Sep 23 0:00 0 - +-Rule Iran 2000 only - Mar 20 0:00 1:00 S +-Rule Iran 2000 only - Sep 22 0:00 0 - +-Rule Iran 2001 2003 - Mar 21 0:00 1:00 S +-Rule Iran 2001 2003 - Sep 23 0:00 0 - +-Rule Iran 2004 only - Mar 20 0:00 1:00 S +-Rule Iran 2004 only - Sep 22 0:00 0 - +-Rule Iran 2005 2007 - Mar 21 0:00 1:00 S +-Rule Iran 2005 2007 - Sep 23 0:00 0 - +-Rule Iran 2008 only - Mar 20 0:00 1:00 S +-Rule Iran 2008 only - Sep 22 0:00 0 - +-Rule Iran 2009 2011 - Mar 21 0:00 1:00 S +-Rule Iran 2009 2011 - Sep 23 0:00 0 - +-Rule Iran 2012 only - Mar 20 0:00 1:00 S +-Rule Iran 2012 only - Sep 22 0:00 0 - +-Rule Iran 2013 2015 - Mar 21 0:00 1:00 S +-Rule Iran 2013 2015 - Sep 23 0:00 0 - +-Rule Iran 2016 only - Mar 20 0:00 1:00 S +-Rule Iran 2016 only - Sep 22 0:00 0 - +-Rule Iran 2017 2019 - Mar 21 0:00 1:00 S +-Rule Iran 2017 2019 - Sep 23 0:00 0 - +-Rule Iran 2020 only - Mar 20 0:00 1:00 S +-Rule Iran 2020 only - Sep 22 0:00 0 - +-Rule Iran 2021 2023 - Mar 21 0:00 1:00 S +-Rule Iran 2021 2023 - Sep 23 0:00 0 - +-Rule Iran 2024 2025 - Mar 20 0:00 1:00 S +-Rule Iran 2024 2025 - Sep 22 0:00 0 - +-Rule Iran 2026 2027 - Mar 21 0:00 1:00 S +-Rule Iran 2026 2027 - Sep 23 0:00 0 - +-Rule Iran 2028 2029 - Mar 20 0:00 1:00 S +-Rule Iran 2028 2029 - Sep 22 0:00 0 - +-Rule Iran 2030 2031 - Mar 21 0:00 1:00 S +-Rule Iran 2030 2031 - Sep 23 0:00 0 - +-Rule Iran 2032 2033 - Mar 20 0:00 1:00 S +-Rule Iran 2032 2033 - Sep 22 0:00 0 - +-Rule Iran 2034 2035 - Mar 21 0:00 1:00 S +-Rule Iran 2034 2035 - Sep 23 0:00 0 - +-Rule Iran 2036 2037 - Mar 20 0:00 1:00 S +-Rule Iran 2036 2037 - Sep 22 0:00 0 - ++Rule Iran 1978 1980 - Mar 21 0:00 1:00 D ++Rule Iran 1978 only - Oct 21 0:00 0 S ++Rule Iran 1979 only - Sep 19 0:00 0 S ++Rule Iran 1980 only - Sep 23 0:00 0 S ++Rule Iran 1991 only - May 3 0:00 1:00 D ++Rule Iran 1992 1995 - Mar 22 0:00 1:00 D ++Rule Iran 1991 1995 - Sep 22 0:00 0 S ++Rule Iran 1996 only - Mar 21 0:00 1:00 D ++Rule Iran 1996 only - Sep 21 0:00 0 S ++Rule Iran 1997 1999 - Mar 22 0:00 1:00 D ++Rule Iran 1997 1999 - Sep 22 0:00 0 S ++Rule Iran 2000 only - Mar 21 0:00 1:00 D ++Rule Iran 2000 only - Sep 21 0:00 0 S ++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 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 2025 - Mar 21 0:00 1:00 D ++Rule Iran 2024 2025 - Sep 21 0:00 0 S ++Rule Iran 2026 2027 - Mar 22 0:00 1:00 D ++Rule Iran 2026 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 +- 3:30 - IRT 1977 Nov ++ 3:30 - IRST 1977 Nov + 4:00 Iran IR%sT 1979 + 3:30 Iran IR%sT + +@@ -1154,9 +1163,26 @@ + # and Sunday of April" phrase, if taken literally, means that the + # transition takes place at 00:00 on the first Sunday on or after 04-02. + ++# From Paul Eggert (2003-02-09): ++# DAWN reported on 2002-10-05 ++# that 2002 DST ended that day at midnight. Go with McDow for now. ++ ++# From Steffen Thorsen (2003-03-14): ++# According to http://www.dawn.com/2003/03/07/top15.htm ++# there will be no DST in Pakistan this year: ++# ++# ISLAMABAD, March 6: Information and Media Development Minister Sheikh ++# Rashid Ahmed on Thursday said the cabinet had reversed a previous ++# decision to advance clocks by one hour in summer and put them back by ++# one hour in winter with the aim of saving light hours and energy. ++# ++# The minister told a news conference that the experiment had rather ++# shown 8 per cent higher consumption of electricity. ++ ++ + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +-Rule Pakistan 2002 max - Apr Sun>=2 0:00 1:00 S +-Rule Pakistan 2002 max - Oct 15 0:00 0 - ++Rule Pakistan 2002 only - Apr Sun>=2 0:01 1:00 S ++Rule Pakistan 2002 only - Oct Sun>=2 0:01 0 - + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Asia/Karachi 4:28:12 - LMT 1907 + 5:30 - IST 1942 Sep +diff -u -udbrN glibc-2.3.2/timezone/australasia glibc-2.3.2-200304020432/timezone/australasia +--- glibc-2.3.2/timezone/australasia Tue Oct 15 18:59:28 2002 ++++ glibc-2.3.2-200304020432/timezone/australasia Mon Mar 24 20:00:03 2003 +@@ -1,4 +1,4 @@ +-# @(#)australasia 7.67 ++# @(#)australasia 7.68 + # This file also includes Pacific islands. + + # Notes are at the end of this file +@@ -297,6 +297,17 @@ + ############################################################################### + + # New Zealand ++# ++# From Paul Eggert (2002-10-23): ++# The Department of Internal Affairs (DIA) maintains a brief history; ++# see tz-link.htm for the full reference. ++# ++# Shanks gives 1868 for the introduction of standard time; go with the ++# DIA's more-precise 1868-11-02. The DIA says that clocks were ++# advanced by half an hour in 1941; go with Shanks's more-precise ++# 1940-09-29 02:00. The DIA says that starting in 1933 DST began the ++# first Sunday in September; go with Shanks's last Sunday starting in ++# 1934. + + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + # Shanks gives 1927 Nov 6 - 1928 Mar 4, 1928 Oct 14 - 1929 Mar 17, +@@ -311,17 +322,17 @@ + # didn't change until 1945 Apr 30; go with Shanks. + Rule NZ 1934 1940 - Apr lastSun 2:00 0 S + Rule NZ 1934 1939 - Sep lastSun 2:00 0:30 HD +-Rule NZ 1974 only - Nov 3 2:00s 1:00 D ++Rule NZ 1974 only - Nov Sun>=1 2:00s 1:00 D ++Rule NZ 1975 only - Feb lastSun 2:00s 0 S + Rule NZ 1975 1988 - Oct lastSun 2:00s 1:00 D +-Rule NZ 1989 only - Oct 8 2:00s 1:00 D +-Rule NZ 1990 max - Oct Sun>=1 2:00s 1:00 D +-Rule NZ 1975 only - Feb 23 2:00s 0 S + Rule NZ 1976 1989 - Mar Sun>=1 2:00s 0 S ++Rule NZ 1989 only - Oct Sun>=8 2:00s 1:00 D ++Rule NZ 1990 max - Oct Sun>=1 2:00s 1:00 D + Rule NZ 1990 max - Mar Sun>=15 2:00s 0 S + Rule Chatham 1990 max - Oct Sun>=1 2:45s 1:00 D + Rule Chatham 1991 max - Mar Sun>=15 2:45s 0 S + # Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Pacific/Auckland 11:39:04 - LMT 1868 ++Zone Pacific/Auckland 11:39:04 - LMT 1868 Nov 2 + 11:30 NZ NZ%sT 1940 Sep 29 2:00 + 12:00 NZ NZ%sT + Zone Pacific/Chatham 12:45 Chatham CHA%sT +@@ -399,8 +410,8 @@ + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule Tonga 1999 only - Oct 7 2:00s 1:00 S + Rule Tonga 2000 only - Mar 19 2:00s 0 - +-Rule Tonga 2000 max - Nov Sun>=1 2:00 1:00 S +-Rule Tonga 2001 max - Jan lastSun 2:00 0 - ++Rule Tonga 2000 2001 - Nov Sun>=1 2:00 1:00 S ++Rule Tonga 2001 2002 - Jan lastSun 2:00 0 - + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Pacific/Tongatapu 12:19:20 - LMT 1901 + 12:20 - TOT 1941 # Tonga Time +@@ -1263,6 +1274,8 @@ + # of January the standard time in the Kingdom shall be moved backward by one + # hour to 1:00am. + ++# From Pulu 'Anau (2002-11-05): ++# The law was for 3 years, supposedly to get renewed. It wasn't. + + ############################################################################### + +diff -u -udbrN glibc-2.3.2/timezone/europe glibc-2.3.2-200304020432/timezone/europe +--- glibc-2.3.2/timezone/europe Sat Apr 6 05:40:00 2002 ++++ glibc-2.3.2-200304020432/timezone/europe Mon Mar 24 20:00:03 2003 +@@ -1,4 +1,4 @@ +-# @(#)europe 7.82 ++# @(#)europe 7.83 + + # 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 +@@ -33,17 +33,17 @@ + # I invented the abbreviations marked `*' in the following table; + # the rest are from earlier versions of this file, or from other sources. + # Corrections are welcome! +-# std dst ++# std dst 2dst + # LMT Local Mean Time +-# -4:00 AST Atlantic ++# -4:00 AST ADT Atlantic + # -3:00 WGT WGST Western Greenland* + # -1:00 EGT EGST Eastern Greenland* +-# 0:00 GMT BST Greenwich, British Summer ++# 0:00 GMT BST BDST Greenwich, British Summer + # 0:00 GMT IST Greenwich, Irish Summer +-# 0:00 WET WEST Western Europe +-# 0:19:32 AMT NST Amsterdam, Netherlands Summer (1835-1937)* ++# 0:00 WET WEST WEMT Western Europe ++# 0:19:32.13 AMT NST Amsterdam, Netherlands Summer (1835-1937)* + # 0:20 NET NEST Netherlands (1937-1940)* +-# 1:00 CET CEST Central Europe ++# 1:00 CET CEST CEMT Central Europe + # 1:00:14 SET Swedish (1879-1899)* + # 2:00 EET EEST Eastern Europe + # 3:00 MSK MSD Moscow +@@ -558,20 +558,30 @@ + 1:00 EU CE%sT + + # Austria ++ ++# 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 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 + Rule Austria 1920 only - Sep 13 2:00s 0 - +-Rule Austria 1945 only - Apr 2 2:00s 1:00 S +-Rule Austria 1945 only - Nov 18 2:00s 0 - + Rule Austria 1946 only - Apr 14 2:00s 1:00 S + Rule Austria 1946 1948 - Oct Sun>=1 2:00s 0 - + Rule Austria 1947 only - Apr 6 2:00s 1:00 S + Rule Austria 1948 only - Apr 18 2:00s 1:00 S ++Rule Austria 1980 only - Apr 6 0:00 1:00 S ++Rule Austria 1980 only - Sep 28 0:00 0 - + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Vienna 1:05:20 - LMT 1893 Apr +- 1:00 C-Eur CE%sT 1918 Jun 16 3:00 +- 1:00 Austria CE%sT 1940 Apr 1 2:00 +- 1:00 C-Eur CE%sT 1945 Apr 2 2:00 ++ 1:00 C-Eur CE%sT 1920 ++ 1:00 Austria CE%sT 1940 Apr 1 2:00s ++ 1:00 C-Eur CE%sT 1945 Apr 2 2:00s ++ 1:00 1:00 CEST 1945 Apr 12 2:00s ++ 1:00 - CET 1946 + 1:00 Austria CE%sT 1981 + 1:00 EU CE%sT + +@@ -654,7 +664,7 @@ + 1:00 EU CE%sT + + # Bosnia and Herzegovina +-# see Yugoslavia ++# see Serbia and Montenegro + + # Bulgaria + # +@@ -681,7 +691,7 @@ + 2:00 EU EE%sT + + # Croatia +-# see Yugosloavia ++# see Serbia and Montenegro + + # Czech Republic + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +@@ -991,25 +1001,29 @@ + # From Markus Kuhn (1998-09-29): + # The German time zone web site by the Physikalisch-Technische + # Bundesanstalt contains DST information back to 1916. +-# +-# +-# Realisation of Legal Time in Germany +-# ++# [See tz-link.htm for the URL.] ++ ++# From Joerg Schilling (2002-10-23): ++# In 1945, Berlin was switched to Moscow Summer time (GMT+4) by ++# General [Nikolai] Bersarin. ++ ++# From Paul Eggert (2003-03-08): ++# ++# says that Bersarin issued an order to use Moscow time on May 20. ++# However, Moscow did not observe daylight saving in 1945, so ++# this was equivalent to CEMT (GMT+3), not GMT+4. ++ + + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule Germany 1945 only - Apr 2 2:00s 1:00 S +-# Shanks says 05-24 2:00 to 09-24 3:00 for DDST; go with the PTB, who quotes +-# the Archiv fuer publizist. Arbeit (Munzinger-Archiv) 652 (Zeitsystem) +-# (1961-11-25), which gives dates only. Guess 3:00 transition times. +-Rule Germany 1945 only - May 31 3:00 2:00 M # Midsummer +-Rule Germany 1945 only - Sep 23 3:00 1:00 S ++Rule Germany 1945 only - May 24 2:00 2:00 M # Midsummer ++Rule Germany 1945 only - Sep 24 3:00 1:00 S + Rule Germany 1945 only - Nov 18 2:00s 0 - + Rule Germany 1946 only - Apr 14 2:00s 1:00 S + Rule Germany 1946 only - Oct 7 2:00s 0 - + Rule Germany 1947 1949 - Oct Sun>=1 2:00s 0 - + Rule Germany 1947 only - Apr 6 2:00s 1:00 S +-# The PTB gives 3:00 CET and 3:00 CEST for the midsummer transition times; +-# go with Shanks. + Rule Germany 1947 only - May 11 2:00s 2:00 M + Rule Germany 1947 only - Jun 29 3:00 1:00 S + Rule Germany 1948 only - Apr 18 2:00s 1:00 S +@@ -1341,6 +1355,15 @@ + # Fact File, Lithuanian State Department of Tourism + # (2000-03-27): Local time is GMT+2 hours ..., no daylight saving. + ++# From a user via Klaus Marten (2003-02-07): ++# As a candidate for membership of the European Union, Lithuania will ++# observe Summer Time in 2003, changing its clocks at the times laid ++# down in EU Directive 2000/84 of 19.I.01 (i.e. at the same times as its ++# neighbour Latvia). The text of the Lithuanian government Order of ++# 7.XI.02 to this effect can be found at ++# http://www.lrvk.lt/nut/11/n1749.htm ++ ++ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + Zone Europe/Vilnius 1:41:16 - LMT 1880 + 1:24:00 - WMT 1917 # Warsaw Mean Time +@@ -1355,7 +1378,8 @@ + 2:00 C-Eur EE%sT 1998 + 2:00 - EET 1998 Mar 29 1:00u + 1:00 EU CE%sT 1999 Oct 31 1:00u +- 2:00 - EET ++ 2:00 - EET 2003 Jan 1 ++ 2:00 EU EE%sT + + # Luxembourg + # Whitman disagrees with most of these dates in minor ways; go with Shanks. +@@ -1393,7 +1417,7 @@ + 1:00 EU CE%sT + + # Macedonia +-# see Yugoslavia ++# see Serbia and Montenegro + + # Malta + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +@@ -1979,11 +2003,27 @@ + 11:00 Russia ANA%sT 1992 Jan 19 2:00s + 12:00 Russia ANA%sT + ++# 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 ++ 1:00 C-Eur CE%sT 1945 May 8 2:00s ++ 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 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/Sarajevo # Bosnia and Herzegovina ++Link Europe/Belgrade Europe/Skopje # Macedonia ++Link Europe/Belgrade Europe/Zagreb # Croatia ++ + # Slovakia + Link Europe/Prague Europe/Bratislava + + # Slovenia +-# see Yugoslavia ++# see Serbia and Montenegro + + # Spain + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +@@ -2191,6 +2231,15 @@ + Link Europe/Istanbul Asia/Istanbul # Istanbul is in both continents. + + # Ukraine ++# ++# From Igor Karpov, who works for the Ukranian Ministry of Justice, ++# via Garrett Wollman (2003-01-27): ++# BTW, I've found the official document on this matter. It's goverment ++# regulations number 509, May 13, 1996. In my poor translation it says: ++# "Time in Ukraine is set to second timezone (Kiev time). Each last Sunday ++# of March at 3am the time is changing to 4am and each last Sunday of ++# October the time at 4am is changing to 3am" ++ + # Zone NAME GMTOFF RULES FORMAT [UNTIL] + # Most of Ukraine since 1970 has been like Kiev. + Zone Europe/Kiev 2:02:04 - LMT 1880 +@@ -2248,22 +2297,6 @@ + 3:00 Russia MSK/MSD 1997 + 3:00 - MSK 1997 Mar lastSun 1:00u + 2:00 EU EE%sT +- +-# Yugoslavia +-# Zone NAME GMTOFF RULES FORMAT [UNTIL] +-Zone Europe/Belgrade 1:22:00 - LMT 1884 +- 1:00 - CET 1941 Apr 18 23:00 +- 1:00 C-Eur CE%sT 1945 May 8 2:00s +- 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 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/Sarajevo # Bosnia and Herzegovina +-Link Europe/Belgrade Europe/Skopje # Macedonia +-Link Europe/Belgrade Europe/Zagreb # Croatia + + ############################################################################### + +diff -u -udbrN glibc-2.3.2/timezone/iso3166.tab glibc-2.3.2-200304020432/timezone/iso3166.tab +--- glibc-2.3.2/timezone/iso3166.tab Tue Oct 15 19:12:42 2002 ++++ glibc-2.3.2-200304020432/timezone/iso3166.tab Mon Mar 24 20:00:03 2003 +@@ -2,11 +2,11 @@ + # + # @(#)iso3166.tab 1.9 + # +-# From Paul Eggert (2002-05-28): ++# From Paul Eggert (2003-02-04): + # + # 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-5 (2002-05-20). See: ++# ISO 3166-1 Newsletter No. V-7 (2003-01-14). See: + # + # ISO 3166 Maintenance agency (ISO 3166/MA) + # . +@@ -256,7 +256,7 @@ + WS Samoa (Western) + YE Yemen + YT Mayotte +-YU Yugoslavia ++YU Serbia and Montenegro + ZA South Africa + ZM Zambia + ZW Zimbabwe +diff -u -udbrN glibc-2.3.2/timezone/northamerica glibc-2.3.2-200304020432/timezone/northamerica +--- glibc-2.3.2/timezone/northamerica Sat Apr 6 05:40:00 2002 ++++ glibc-2.3.2-200304020432/timezone/northamerica Mon Mar 24 20:00:03 2003 +@@ -1,4 +1,4 @@ +-# @(#)northamerica 7.61 ++# @(#)northamerica 7.62 + # also includes Central America and the Caribbean + + # This data is by no means authoritative; if you think you know better, +@@ -88,6 +88,23 @@ + # of surrender, all of whom interrupting the bells of Big Ben in + # London which were to precede Mr. Attlee's speech. + ++# From Paul Eggert (2003-02-09): It was Robert St John, not Bob Trout. From ++# Myrna Oliver's obituary of St John on page B16 of today's Los Angeles Times: ++# ++# ... a war-weary U.S. clung to radios, awaiting word of Japan's surrender. ++# Any announcement from Asia would reach St. John's New York newsroom on a ++# wire service teletype machine, which had prescribed signals for major news. ++# Associated Press, for example, would ring five bells before spewing out ++# typed copy of an important story, and 10 bells for news "of transcendental ++# importance." ++# ++# On Aug. 14, stalling while talking steadily into the NBC networks' open ++# microphone, St. John heard five bells and waited only to hear a sixth bell, ++# before announcing confidently: "Ladies and gentlemen, World War II is over. ++# The Japanese have agreed to our surrender terms." ++# ++# He had scored a 20-second scoop on other broadcasters. ++ + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule US 1918 1919 - Mar lastSun 2:00 1:00 D + Rule US 1918 1919 - Oct lastSun 2:00 0 S +@@ -189,10 +206,11 @@ + # US eastern time, represented by New York + + # Connecticut, Delaware, District of Columbia, most of Florida, +-# Georgia, far southeastern Indiana, eastern Kentucky, Maine, +-# Maryland, Massachusetts, New Hampshire, New Jersey, New York, North +-# Carolina, Ohio, Pennsylvania, Rhode Island, South Carolina, eastern +-# Tennessee, Vermont, Virginia, West Virginia ++# Georgia, southeast Indiana (Clark, Dearborn, Floyd, Harrison, and ++# Ohio counties), eastern Kentucky, Maine, Maryland, Massachusetts, ++# New Hampshire, New Jersey, New York, North Carolina, Ohio, ++# Pennsylvania, Rhode Island, South Carolina, eastern Tennessee, ++# Vermont, Virginia, West Virginia + + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER + Rule NYC 1920 only - Mar lastSun 2:00 1:00 D +@@ -211,10 +229,11 @@ + # US central time, represented by Chicago + + # Alabama, Arkansas, Florida panhandle, Illinois, western Indiana +-# corners, Iowa, most of Kansas, western Kentucky, Louisiana, +-# Minnesota, Mississippi, Missouri, eastern Nebraska, eastern North +-# Dakota, Oklahoma, eastern South Dakota, western Tennessee, most of +-# Texas, Wisconsin ++# (Gibson, Jasper, Lake, LaPorte, Newton, Porter, Posey, Spencer, ++# Vanderburgh, and Warrick counties), Iowa, most of Kansas, western ++# Kentucky, Louisiana, Minnesota, Mississippi, Missouri, eastern ++# Nebraska, eastern North Dakota, Oklahoma, eastern South Dakota, ++# western Tennessee, most of Texas, Wisconsin + + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER + Rule Chicago 1920 only - Jun 13 2:00 1:00 D +@@ -357,12 +376,32 @@ + # Now we turn to US areas that have diverged from the consensus since 1970. + + # Arizona mostly uses MST. ++ ++# From Paul Eggert (2002-10-20): ++# ++# The information in the rest of this paragraph is derived from the ++# ++# Daylight Saving Time web page (2002-01-23) maintained by the ++# Arizona State Library, Archives and Public Records. ++# Between 1944-01-01 and 1944-04-01 the State of Arizona used standard ++# time, but by federal law railroads, airlines, bus lines, military ++# personnel, and some engaged in interstate commerce continued to ++# observe war (i.e., daylight saving) time. The 1944-03-17 Phoenix ++# Gazette says that was the date the law changed, and that 04-01 was ++# the date the state's clocks would change. In 1945 the State of ++# Arizona used standard time all year, again with exceptions only as ++# mandated by federal law. Arizona observed DST in 1967, but Arizona ++# Laws 1968, ch. 183 (effective 1968-03-21) repealed DST. ++# ++# Shanks says the 1944 experiment came to an end on 1944-03-17. ++# Go with the Arizona State Library instead. ++ + Zone America/Phoenix -7:28:18 - LMT 1883 Nov 18 12:00 + -7:00 US M%sT 1944 Jan 1 00:01 +- -7:00 - MST 1944 Mar 17 00:01 ++ -7:00 - MST 1944 Apr 1 00:01 + -7:00 US M%sT 1944 Oct 1 00:01 + -7:00 - MST 1967 +- -7:00 US M%sT 1968 ++ -7:00 US M%sT 1968 Mar 21 + -7:00 - MST + # From Arthur David Olson (1988-02-13): + # A writer from the Inter Tribal Council of Arizona, Inc., +diff -u -udbrN glibc-2.3.2/timezone/southamerica glibc-2.3.2-200304020432/timezone/southamerica +--- glibc-2.3.2/timezone/southamerica Tue Oct 15 19:03:12 2002 ++++ glibc-2.3.2-200304020432/timezone/southamerica Mon Mar 24 20:00:03 2003 +@@ -1,4 +1,4 @@ +-# @(#)southamerica 7.45 ++# @(#)southamerica 7.46 + + # 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 +@@ -583,6 +583,10 @@ + # 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. ++ ++# 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 1918 only - Sep 1 0:00 1:00 S +diff -u -udbrN glibc-2.3.2/timezone/zone.tab glibc-2.3.2-200304020432/timezone/zone.tab +--- glibc-2.3.2/timezone/zone.tab Tue Oct 15 19:00:59 2002 ++++ glibc-2.3.2-200304020432/timezone/zone.tab Mon Mar 24 20:00:03 2003 +@@ -1,4 +1,4 @@ +-# @(#)zone.tab 1.27 ++# @(#)zone.tab 1.28 + # + # TZ zone descriptions + # +@@ -33,6 +33,7 @@ + AO -0848+01314 Africa/Luanda + AQ -7750+16636 Antarctica/McMurdo McMurdo Station, Ross Island + AQ -9000+00000 Antarctica/South_Pole Amundsen-Scott Station, South Pole ++AQ -6734-06808 Antarctica/Rothera Rothera Station, Adelaide Island + AQ -6448-06406 Antarctica/Palmer Palmer Station, Anvers Island + AQ -6736+06253 Antarctica/Mawson Mawson Station, Holme Bay + AQ -6835+07758 Antarctica/Davis Davis Station, Vestfold Hills +diff -u -udbrN glibc-2.3.2/tls.make.c glibc-2.3.2-200304020432/tls.make.c +--- glibc-2.3.2/tls.make.c Fri Nov 15 04:36:55 2002 ++++ glibc-2.3.2-200304020432/tls.make.c Wed Mar 26 23:49:17 2003 +@@ -2,6 +2,12 @@ + + #include + ++#if USE_TLS ++@@@ use-tls = yes @@@ ++#else ++@@@ use-tls = no @@@ ++#endif ++ + #if USE___THREAD + @@@ use-thread = yes @@@ + #else -- cgit v1.2.3