From 9b534d64d081161528d095b7d9e0a7c7110638a4 Mon Sep 17 00:00:00 2001 From: Chris Larson Date: Fri, 26 Sep 2003 23:05:36 +0000 Subject: [PATCH] Complete packages repos restructuring. BKrev: 3f74c640BCc6hOl3cavfpY6bTF5Dzw --- {content => acpid}/acpid-1.0.2.oe | 0 .../apache-2.0.47.oe | 0 .../compile.patch => bootmenu/bootmenu-0.6.oe | 0 .../bootmenu-0.6}/compile.patch | 0 .../busybox-1.00-pre2.oe | 0 .../busybox-suidinstall.patch | 0 .../busybox-1.00-pre2/console.patch | 0 .../busybox-1.00-pre2/defconfig | 0 .../busybox-1.00-pre2/dhcp-retrytime.patch | 0 .../busybox-1.00-pre2/hwclock.sh | 0 .../busybox-1.00-pre2/postinst | 0 {content => busybox}/busybox-1.00-pre2/prerm | 0 .../busybox-1.00-pre2/silence-hwclock.patch | 0 {content => busybox}/busybox-1.00-pre2/syslog | 0 .../busybox-1.00-pre2/tar.patch | 0 .../busybox-1.00-pre3.oe | 0 .../busybox-suidinstall.patch | 0 .../busybox-1.00-pre3/console.patch | 0 .../busybox-1.00-pre3/defconfig | 0 .../busybox-1.00-pre3/dhcp-retrytime.patch | 0 .../busybox-1.00-pre3/hwclock.sh | 0 .../busybox-1.00-pre3}/postinst | 0 .../busybox-1.00-pre3/prerm | 0 .../busybox-1.00-pre3/silence-hwclock.patch | 0 .../busybox-1.00-pre3/syslog | 0 .../busybox-1.00-pre3/tar.patch | 0 content/apache-2.0.47.oe | 27 - content/busybox-1.00-pre2.oe | 41 - content/busybox-1.00-pre3.oe | 40 - content/coreutils-5.0.oe | 8 - content/corkscrew-2.0.oe | 4 - content/cross-binutils-2.13.2.oe | 14 - content/cross-binutils-2.14.90.0.6.oe | 9 - content/cross-binutils-2.14.oe | 14 - content/cross-gcc-3.3.1.oe | 22 - content/cross-gcc-initial-3.3.1.oe | 16 - content/diffutils-2.8.1.oe | 7 - content/dropbear-0.36.oe | 14 - content/expat-1.95.6.oe | 24 - content/fakeroot-0.7.5.oe | 4 - content/fakeroot-buildarch-0.7.5.oe | 4 - .../glibc-2.3.2-200304020432.patch | 136135 --------------- content/glibc-2.3.2.oe | 113 - content/ifupdown-0.6.4.oe | 28 - content/initscripts-1.0.oe | 27 - content/ipkg-0.99.84.oe | 13 - content/ipkg-0.99.91.oe | 13 - content/ipkg-buildarch-0.99.84.oe | 2 - content/ipkg-buildarch-0.99.91.oe | 2 - content/ipkg-utils-1.0_cvs.oe | 21 - content/iputils-20020927.oe | 25 - content/irda-utils-0.9.15.oe | 21 - content/jpeg-6b.oe | 34 - content/libogg-1.0.0.oe | 12 - content/libpng-1.2.5.oe | 40 - content/libtool-1.4.3-r0/sedvar.patch | 16 - content/libtool-1.4.3.oe | 39 - content/libtool-1.5.oe | 36 - content/modutils-2.4.25.oe | 8 - content/mtd-buildarch.oe | 11 - content/mtd.oe | 17 - content/ncurses-4.2.oe | 41 - content/ncurses-5.3.oe | 43 - content/netbase-4.13.oe | 12 - content/netkit-base-0.17.oe | 16 - content/netkit-ftp-0.17.oe | 13 - content/ntp-4.1.2.oe | 10 - content/openobex-1.0.0.oe | 14 - content/openobex-apps-1.0.0.oe | 17 - content/openssl-0.9.7b.oe | 30 - content/oz-ppc-toolchain-binutils-2.13.2.oe | 32 - content/oz-ppc-toolchain-gcc-3.2.3.oe | 32 - content/oz-ppc-toolchain-glibc-2.3.2.oe | 35 - content/patcher-1.0.oe | 24 - content/pcre-4.4.oe | 35 - content/qte-2.3.6.oe | 36 - content/qte-2.3.7.oe | 68 - content/sysvinit-2.85.oe | 40 - content/tinylogin-1.4.oe | 17 - content/tmake-1.11.oe | 28 - content/tslib.oe | 26 - content/zlib-1.1.4.oe | 35 - content/zsh-4.1.1.oe | 13 - .../coreutils-5.0.oe | 0 .../coreutils-5.0/malloc.patch | 0 .../corkscrew-2.0.oe | 0 .../cross-binutils-2.13.2.oe | 0 .../cross-binutils-2.14.90.0.6.oe | 0 .../cross-binutils-2.14.oe | 0 .../cross-gcc-3.3.1.oe | 0 .../cross-gcc-initial-3.3.1.oe | 0 .../diffutils-2.8.1.oe | 0 .../dropbear-0.36.oe | 0 .../expat-1.95.6.oe | 0 .../fakeroot-0.7.5.oe | 0 .../fakeroot-buildarch-0.7.5.oe | 0 .../fbgetty-0.1.698.oe | 0 .../fbgetty-0.1.698/compile.patch | 0 .../alpha-pwrite.patch => fbi/fbi-1.22.oe | 0 .../glibc-2.3.2-r0/10_cvs.patch | 0 .../glibc-2.3.2-r0/30_glibc232-base.patch | 0 .../50_glibc23-hppa-entry.patch | 0 .../50_glibc232-arm-dwarf2-buildfix.patch | 0 .../50_glibc232-m68k-dwarf2-buildfix.patch | 0 .../50_glibc232-mips-buildfix.patch | 0 .../80_glibc232-futimes-buildfix.patch | 0 .../80_glibc232-iconvdata-fix.patch | 0 .../80_glibc232-locales-header.patch | 0 .../80_glibc232-wcsmbs-fix.patch | 0 .../81_glibc232-utimes-fix.patch | 0 .../glibc-2.3.2-r0/alpha-crti.patch | 0 .../glibc-2.3.2-r0/alpha-pic.patch | 0 .../glibc-2.3.2-r0/alpha-pwrite.patch | 0 .../glibc-2.3.2-r0/arm-no-hwcap.patch | 0 .../glibc-2.3.2-r0/arm-output-format.patch | 0 .../glibc-2.3.2-r0/autoconf.h | 0 .../glibc-2.3.2-r0/dyn-ldconfig.diff | 0 .../glibc-2.3.2-r0/fhs-linux-paths.patch | 0 .../glibc-2.3.2-200304020432.patch | 0 .../glibc-2.3.2-r0/glibc22-eo_EO.patch | 0 .../glibc-2.3.2-r0/glibc22-locales.patch | 0 .../glibc-2.3.2-r0/glibc22-m68k-compat.patch | 0 .../glibc-2.3.2-r0/glibc22-m68k-fpic.patch | 0 .../glibc-2.3.2-r0/glibc22-nss-upgrade.patch | 0 .../glibc22-ttyname-devfs.patch | 0 .../glibc23-01-hppa-dl-machine.patch | 0 .../glibc23-07-hppa-atomicity.patch | 0 .../glibc23-asserth-decls.patch | 0 .../glibc-2.3.2-r0/glibc23-cmov.patch | 0 .../glibc-2.3.2-r0/glibc23-ctype-compat.patch | 0 .../glibc-2.3.2-r0/glibc23-errno.patch | 0 .../glibc23-function-compat.patch | 0 .../glibc23-hppa-Rminkernel.patch | 0 .../glibc-2.3.2-r0/glibc23-hppa-compat.patch | 0 .../glibc-2.3.2-r0/glibc23-hppa-malloc8.patch | 0 .../glibc-2.3.2-r0/glibcbug.patch | 0 .../glibc-2.3.2-r0/hurd-enable-ldconfig.patch | 0 .../glibc-2.3.2-r0/ldconfig.patch | 0 .../glibc-2.3.2-r0/ldd.patch | 0 .../glibc-2.3.2-r0/libgcc-compat-all.patch | 0 .../glibc-2.3.2-r0/libgcc-compat-other.patch | 0 .../glibc-2.3.2-r0/librt-mips.patch | 0 .../lo_LA.UTF-8_not_supported.patch | 0 .../glibc-2.3.2-r0/locale-es_AR.patch | 0 .../glibc-2.3.2-r0/locales-stuff.patch | 0 .../glibc-2.3.2-r0/locales-supported.patch | 0 .../glibc-2.3.2-r0/makeconfig.patch | 0 .../glibc-2.3.2-r0/noinfo.patch | 0 .../glibc-2.3.2-r0/nss_compat-shadow.patch | 0 .../glibc-2.3.2-r0/powerpc-sysconf.patch | 0 .../glibc-2.3.2-r0/revert-old-libio.patch | 0 .../glibc-2.3.2-r0/s390-tls.patch | 0 .../glibc-2.3.2-r0/sedscript.patch | 0 .../glibc-2.3.2-r0/sparc64-fixups.patch | 0 .../glibc-2.3.2-r0/sparcv8-target.patch | 0 .../glibc-2.3.2-r0/syslog-backrev.patch | 0 .../glibc-2.3.2-r0/version.h | 0 .../devices => glibc/glibc-2.3.2.oe | 0 .../hotplug-2003_05_01-r0}/busybox.patch | 0 .../hotplug-2003_05_01.oe | 0 .../ifupdown-0.6.4.oe | 0 .../ifupdown-0.6.4}/init | 0 .../ifupdown-0.6.4/interfaces | 0 .../ifupdown-0.6.4/udhcpc.patch | 0 .../ifupdown-roam-0.59.oe | 0 .../ifupdown-roam-0.59/conffiles | 0 .../ifupdown-roam-0.59}/postinst | 0 .../ifupdown-roam-0.59/postrm | 0 .../ifupdown-roam-0.59/preinst | 0 .../initscripts-1.0-r0/banner | 0 .../initscripts-1.0-r0/banner-simpad | 0 .../initscripts-1.0-r0/bootlogo-simpad.gz | 0 .../initscripts-1.0-r0/bootmisc.sh | 0 .../initscripts-1.0-r0/checkfs.sh | 0 .../initscripts-1.0-r0/checkroot.sh | 0 .../initscripts-1.0-r0/devices | 0 .../initscripts-1.0-r0/devices-h3600 | 0 .../initscripts-1.0-r0/devices-simpad | 0 .../initscripts-1.0-r0/devpts.sh | 0 .../initscripts-1.0-r0/extractfs | 0 .../initscripts-1.0-r0/extractfs-ramses | 0 .../initscripts-1.0-r0/finish | 0 .../initscripts-1.0-r0/halt | 0 .../initscripts-1.0-r0/hostname.sh | 0 .../initscripts-1.0-r0/mountall.sh | 0 .../initscripts-1.0-r0/mountnfs.sh | 0 .../initscripts-1.0-r0/packages | 0 .../initscripts-1.0-r0/packages-ramses | 0 .../initscripts-1.0-r0/ramdisk | 0 .../initscripts-1.0-r0/reboot | 0 .../initscripts-1.0-r0/rmnologin | 0 .../initscripts-1.0-r0/sendsigs | 0 .../initscripts-1.0-r0/single | 0 .../initscripts-1.0-r0/umountfs | 0 .../initscripts-1.0-r0/umountfs-ramses | 0 .../initscripts-1.0-r0/umountnfs.sh | 0 .../initscripts-1.0-r0/urandom | 0 .../initscripts-1.0.oe | 0 .../run_tic.patch => ipkg/ipkg-0.99.84.oe | 0 .../ncurses/tic.patch => ipkg/ipkg-0.99.91.oe | 0 .../ipkg-buildarch-0.99.84.oe | 0 .../ipkg-buildarch-0.99.91.oe | 0 .../init => ipkg/ipkg-utils-1.0_cvs.oe | 0 .../ipkg-utils-buildarch-1.0_cvs.oe | 0 .../iputils-20020927.oe | 0 .../irda-utils-0.9.15.oe | 0 .../cross.patch => jpeg/jpeg-6b.oe | 0 .../jpeg-6b}/debian.patch | 0 .../scp-nossl.patch => libogg/libogg-1.0.0.oe | 0 .../libogg-1.0.0/libogg-configure.patch | 0 .../libpng-1.2.5.oe | 0 .../libtool-1.4.3-r0/debian.patch | 0 .../libtool-1.4.3-r0/libdir.patch | 0 .../libtool-1.4.3-r0/libtoolize-staging.patch | 0 .../libtool-1.4.3-r0/sedvar.patch | 0 .../need => libtool/libtool-1.4.3.oe | 0 .../libtool-1.5.oe | 0 .../libtool-1.5/libdir-la.patch | 0 .../libtool-1.5/libtoolize-staging.patch | 0 .../rc => libtool/libtool-1.5/sedvar.patch | 0 .../rcS => libtool/libtool-1.5/tag.patch | 0 .../rcS-default => man/man-1.5m2.oe | 0 .../automake.patch => man/man-pages-1.60.oe | 0 .../modutils-2.4.25-r0/modutils | 0 .../modutils-2.4.25-r0/modutils-notest.patch | 0 .../modutils-2.4.25.oe | 0 .../event1.patch => mtd/mtd-buildarch.oe | 0 content/tslib/multievent.patch => mtd/mtd.oe | 0 .../ncurses-4.2.oe | 0 .../tslib/raw.patch => ncurses/ncurses-5.3.oe | 0 .../ncurses/20030906.patch | 0 .../ncurses/mk_shared_lib.patch | 0 .../MCONFIG => ncurses/ncurses/run_tic.patch | 0 .../defines.h => ncurses/ncurses/tic.patch | 0 .../make_include => netbase/netbase-4.13.oe | 0 .../netbase-4.13/busybox.patch | 0 doc/README => netbase/netbase-4.13/init | 0 netkit-base/PLACEHOLDER | 0 netkit-base/netkit-base-0.17.oe | 0 netkit-base/netkit-base-0.17/configure.patch | 0 netkit-base/netkit-base-0.17/inetd.conf | 0 netkit-base/netkit-base-0.17/init | 0 netkit-base/netkit-base-0.17/mconfig.patch | 0 netkit-ftp/PLACEHOLDER | 0 netkit-ftp/netkit-ftp-0.17.oe | 0 netkit-ftp/netkit-ftp-0.17/mconfig.patch | 0 ntp/ntp-4.1.2.oe | 0 openobex/openobex-1.0.0.oe | 0 openobex/openobex-apps-1.0.0.oe | 0 openssh/openssh-3.7.1p1.oe | 0 openssh/openssh-3.7.1p1/cross.patch | 0 openssh/openssh-3.7.1p1/scp-nossl.patch | 0 openssh/openssh-3.7.1p1/sshd_config | 0 openssl/openssl-0.9.7b.oe | 0 openssl/openssl-0.9.7b/debian.patch | 0 oz/oz-ppc-toolchain-binutils-2.13.2.oe | 0 oz/oz-ppc-toolchain-gcc-3.2.3.oe | 0 oz/oz-ppc-toolchain-glibc-2.3.2.oe | 0 patcher/patcher-1.0.oe | 0 pcre/pcre-4.4.oe | 0 ppc/ppc-kernel-headers-2.4.21.oe | 0 qte/qte-2.3.6-r0/qpe.patch | 0 qte/qte-2.3.6.oe | 0 qte/qte-2.3.7-r0/qpe.patch | 0 qte/qte-2.3.7.oe | 0 resolvconf/resolvconf-0.41.oe | 0 sysvinit/sysvinit-2.85-r0/inittab | 0 sysvinit/sysvinit-2.85-r0/need | 0 sysvinit/sysvinit-2.85-r0/no_dev_tty.patch | 0 sysvinit/sysvinit-2.85-r0/postinst | 0 sysvinit/sysvinit-2.85-r0/prerm | 0 sysvinit/sysvinit-2.85-r0/provide | 0 sysvinit/sysvinit-2.85-r0/rc | 0 sysvinit/sysvinit-2.85-r0/rcS | 0 sysvinit/sysvinit-2.85-r0/rcS-default | 0 sysvinit/sysvinit-2.85.oe | 0 tinylogin/tinylogin-1.4.oe | 0 tmake/tmake-1.11.oe | 0 tslib/tslib.oe | 0 tslib/tslib/automake.patch | 0 tslib/tslib/collie-module.patch | 0 tslib/tslib/devfs.patch | 0 tslib/tslib/envvar_doc.patch | 0 tslib/tslib/event1.patch | 0 tslib/tslib/multievent.patch | 0 tslib/tslib/pointercal.patch | 0 tslib/tslib/raw.patch | 0 tslib/tslib/ts_calibrate.patch | 0 util-linux/util-linux-2.12.oe | 0 util-linux/util-linux-2.12/MCONFIG | 0 util-linux/util-linux-2.12/defines.h | 0 util-linux/util-linux-2.12/make_include | 0 util-linux/util-linux-2.12/swapargs.h | 0 zlib/zlib-1.1.4.oe | 0 zsh/zsh-4.1.1.oe | 0 295 files changed, 137478 deletions(-) rename {content => acpid}/acpid-1.0.2.oe (100%) rename content/bootmenu-0.6.oe => apache/apache-2.0.47.oe (100%) rename content/bootmenu-0.6/compile.patch => bootmenu/bootmenu-0.6.oe (100%) rename {content/fbgetty-0.1.698 => bootmenu/bootmenu-0.6}/compile.patch (100%) rename content/busybox-1.00-pre2/busybox-suidinstall.patch => busybox/busybox-1.00-pre2.oe (100%) rename {content/busybox-1.00-pre3 => busybox/busybox-1.00-pre2}/busybox-suidinstall.patch (100%) rename {content => busybox}/busybox-1.00-pre2/console.patch (100%) rename {content => busybox}/busybox-1.00-pre2/defconfig (100%) rename {content => busybox}/busybox-1.00-pre2/dhcp-retrytime.patch (100%) rename {content => busybox}/busybox-1.00-pre2/hwclock.sh (100%) rename {content => busybox}/busybox-1.00-pre2/postinst (100%) rename {content => busybox}/busybox-1.00-pre2/prerm (100%) rename {content => busybox}/busybox-1.00-pre2/silence-hwclock.patch (100%) rename {content => busybox}/busybox-1.00-pre2/syslog (100%) rename {content => busybox}/busybox-1.00-pre2/tar.patch (100%) rename content/busybox-1.00-pre3/console.patch => busybox/busybox-1.00-pre3.oe (100%) rename content/busybox-1.00-pre3/defconfig => busybox/busybox-1.00-pre3/busybox-suidinstall.patch (100%) rename content/busybox-1.00-pre3/dhcp-retrytime.patch => busybox/busybox-1.00-pre3/console.patch (100%) rename content/busybox-1.00-pre3/hwclock.sh => busybox/busybox-1.00-pre3/defconfig (100%) rename content/busybox-1.00-pre3/postinst => busybox/busybox-1.00-pre3/dhcp-retrytime.patch (100%) rename content/busybox-1.00-pre3/prerm => busybox/busybox-1.00-pre3/hwclock.sh (100%) rename {content/ifupdown-roam-0.59 => busybox/busybox-1.00-pre3}/postinst (100%) rename content/busybox-1.00-pre3/silence-hwclock.patch => busybox/busybox-1.00-pre3/prerm (100%) rename content/busybox-1.00-pre3/syslog => busybox/busybox-1.00-pre3/silence-hwclock.patch (100%) rename content/busybox-1.00-pre3/tar.patch => busybox/busybox-1.00-pre3/syslog (100%) rename content/coreutils-5.0/malloc.patch => busybox/busybox-1.00-pre3/tar.patch (100%) delete mode 100644 content/apache-2.0.47.oe delete mode 100644 content/busybox-1.00-pre2.oe delete mode 100644 content/busybox-1.00-pre3.oe delete mode 100644 content/coreutils-5.0.oe delete mode 100644 content/corkscrew-2.0.oe delete mode 100644 content/cross-binutils-2.13.2.oe delete mode 100644 content/cross-binutils-2.14.90.0.6.oe delete mode 100644 content/cross-binutils-2.14.oe delete mode 100644 content/cross-gcc-3.3.1.oe delete mode 100644 content/cross-gcc-initial-3.3.1.oe delete mode 100644 content/diffutils-2.8.1.oe delete mode 100644 content/dropbear-0.36.oe delete mode 100644 content/expat-1.95.6.oe delete mode 100644 content/fakeroot-0.7.5.oe delete mode 100644 content/fakeroot-buildarch-0.7.5.oe delete mode 100644 content/glibc-2.3.2-r0/glibc-2.3.2-200304020432.patch delete mode 100644 content/glibc-2.3.2.oe delete mode 100644 content/ifupdown-0.6.4.oe delete mode 100644 content/initscripts-1.0.oe delete mode 100644 content/ipkg-0.99.84.oe delete mode 100644 content/ipkg-0.99.91.oe delete mode 100644 content/ipkg-buildarch-0.99.84.oe delete mode 100644 content/ipkg-buildarch-0.99.91.oe delete mode 100644 content/ipkg-utils-1.0_cvs.oe delete mode 100644 content/iputils-20020927.oe delete mode 100644 content/irda-utils-0.9.15.oe delete mode 100644 content/jpeg-6b.oe delete mode 100644 content/libogg-1.0.0.oe delete mode 100644 content/libpng-1.2.5.oe delete mode 100644 content/libtool-1.4.3-r0/sedvar.patch delete mode 100644 content/libtool-1.4.3.oe delete mode 100644 content/libtool-1.5.oe delete mode 100644 content/modutils-2.4.25.oe delete mode 100644 content/mtd-buildarch.oe delete mode 100644 content/mtd.oe delete mode 100644 content/ncurses-4.2.oe delete mode 100644 content/ncurses-5.3.oe delete mode 100644 content/netbase-4.13.oe delete mode 100644 content/netkit-base-0.17.oe delete mode 100644 content/netkit-ftp-0.17.oe delete mode 100644 content/ntp-4.1.2.oe delete mode 100644 content/openobex-1.0.0.oe delete mode 100644 content/openobex-apps-1.0.0.oe delete mode 100644 content/openssl-0.9.7b.oe delete mode 100644 content/oz-ppc-toolchain-binutils-2.13.2.oe delete mode 100644 content/oz-ppc-toolchain-gcc-3.2.3.oe delete mode 100644 content/oz-ppc-toolchain-glibc-2.3.2.oe delete mode 100644 content/patcher-1.0.oe delete mode 100644 content/pcre-4.4.oe delete mode 100644 content/qte-2.3.6.oe delete mode 100644 content/qte-2.3.7.oe delete mode 100644 content/sysvinit-2.85.oe delete mode 100644 content/tinylogin-1.4.oe delete mode 100644 content/tmake-1.11.oe delete mode 100644 content/tslib.oe delete mode 100644 content/zlib-1.1.4.oe delete mode 100644 content/zsh-4.1.1.oe rename content/fbgetty-0.1.698.oe => coreutils/coreutils-5.0.oe (100%) rename content/fbi-1.22.oe => coreutils/coreutils-5.0/malloc.patch (100%) rename content/glibc-2.3.2-r0/10_cvs.patch => corkscrew/corkscrew-2.0.oe (100%) rename content/glibc-2.3.2-r0/30_glibc232-base.patch => cross/cross-binutils-2.13.2.oe (100%) rename content/glibc-2.3.2-r0/50_glibc23-hppa-entry.patch => cross/cross-binutils-2.14.90.0.6.oe (100%) rename content/glibc-2.3.2-r0/50_glibc232-arm-dwarf2-buildfix.patch => cross/cross-binutils-2.14.oe (100%) rename content/glibc-2.3.2-r0/50_glibc232-m68k-dwarf2-buildfix.patch => cross/cross-gcc-3.3.1.oe (100%) rename content/glibc-2.3.2-r0/50_glibc232-mips-buildfix.patch => cross/cross-gcc-initial-3.3.1.oe (100%) rename content/glibc-2.3.2-r0/80_glibc232-futimes-buildfix.patch => diffutils/diffutils-2.8.1.oe (100%) rename content/glibc-2.3.2-r0/80_glibc232-iconvdata-fix.patch => dropbear/dropbear-0.36.oe (100%) rename content/glibc-2.3.2-r0/80_glibc232-locales-header.patch => expat/expat-1.95.6.oe (100%) rename content/glibc-2.3.2-r0/80_glibc232-wcsmbs-fix.patch => fakeroot/fakeroot-0.7.5.oe (100%) rename content/glibc-2.3.2-r0/81_glibc232-utimes-fix.patch => fakeroot/fakeroot-buildarch-0.7.5.oe (100%) rename content/glibc-2.3.2-r0/alpha-crti.patch => fbgetty/fbgetty-0.1.698.oe (100%) rename content/glibc-2.3.2-r0/alpha-pic.patch => fbgetty/fbgetty-0.1.698/compile.patch (100%) rename content/glibc-2.3.2-r0/alpha-pwrite.patch => fbi/fbi-1.22.oe (100%) rename content/glibc-2.3.2-r0/arm-no-hwcap.patch => glibc/glibc-2.3.2-r0/10_cvs.patch (100%) rename content/glibc-2.3.2-r0/arm-output-format.patch => glibc/glibc-2.3.2-r0/30_glibc232-base.patch (100%) rename content/glibc-2.3.2-r0/autoconf.h => glibc/glibc-2.3.2-r0/50_glibc23-hppa-entry.patch (100%) rename content/glibc-2.3.2-r0/dyn-ldconfig.diff => glibc/glibc-2.3.2-r0/50_glibc232-arm-dwarf2-buildfix.patch (100%) rename content/glibc-2.3.2-r0/fhs-linux-paths.patch => glibc/glibc-2.3.2-r0/50_glibc232-m68k-dwarf2-buildfix.patch (100%) rename content/glibc-2.3.2-r0/glibc22-eo_EO.patch => glibc/glibc-2.3.2-r0/50_glibc232-mips-buildfix.patch (100%) rename content/glibc-2.3.2-r0/glibc22-locales.patch => glibc/glibc-2.3.2-r0/80_glibc232-futimes-buildfix.patch (100%) rename content/glibc-2.3.2-r0/glibc22-m68k-compat.patch => glibc/glibc-2.3.2-r0/80_glibc232-iconvdata-fix.patch (100%) rename content/glibc-2.3.2-r0/glibc22-m68k-fpic.patch => glibc/glibc-2.3.2-r0/80_glibc232-locales-header.patch (100%) rename content/glibc-2.3.2-r0/glibc22-nss-upgrade.patch => glibc/glibc-2.3.2-r0/80_glibc232-wcsmbs-fix.patch (100%) rename content/glibc-2.3.2-r0/glibc22-ttyname-devfs.patch => glibc/glibc-2.3.2-r0/81_glibc232-utimes-fix.patch (100%) rename content/glibc-2.3.2-r0/glibc23-01-hppa-dl-machine.patch => glibc/glibc-2.3.2-r0/alpha-crti.patch (100%) rename content/glibc-2.3.2-r0/glibc23-07-hppa-atomicity.patch => glibc/glibc-2.3.2-r0/alpha-pic.patch (100%) rename content/glibc-2.3.2-r0/glibc23-asserth-decls.patch => glibc/glibc-2.3.2-r0/alpha-pwrite.patch (100%) rename content/glibc-2.3.2-r0/glibc23-cmov.patch => glibc/glibc-2.3.2-r0/arm-no-hwcap.patch (100%) rename content/glibc-2.3.2-r0/glibc23-ctype-compat.patch => glibc/glibc-2.3.2-r0/arm-output-format.patch (100%) rename content/glibc-2.3.2-r0/glibc23-errno.patch => glibc/glibc-2.3.2-r0/autoconf.h (100%) rename content/glibc-2.3.2-r0/glibc23-function-compat.patch => glibc/glibc-2.3.2-r0/dyn-ldconfig.diff (100%) rename content/glibc-2.3.2-r0/glibc23-hppa-Rminkernel.patch => glibc/glibc-2.3.2-r0/fhs-linux-paths.patch (100%) rename content/glibc-2.3.2-r0/glibc23-hppa-compat.patch => glibc/glibc-2.3.2-r0/glibc-2.3.2-200304020432.patch (100%) rename content/glibc-2.3.2-r0/glibc23-hppa-malloc8.patch => glibc/glibc-2.3.2-r0/glibc22-eo_EO.patch (100%) rename content/glibc-2.3.2-r0/glibcbug.patch => glibc/glibc-2.3.2-r0/glibc22-locales.patch (100%) rename content/glibc-2.3.2-r0/hurd-enable-ldconfig.patch => glibc/glibc-2.3.2-r0/glibc22-m68k-compat.patch (100%) rename content/glibc-2.3.2-r0/ldconfig.patch => glibc/glibc-2.3.2-r0/glibc22-m68k-fpic.patch (100%) rename content/glibc-2.3.2-r0/ldd.patch => glibc/glibc-2.3.2-r0/glibc22-nss-upgrade.patch (100%) rename content/glibc-2.3.2-r0/libgcc-compat-all.patch => glibc/glibc-2.3.2-r0/glibc22-ttyname-devfs.patch (100%) rename content/glibc-2.3.2-r0/libgcc-compat-other.patch => glibc/glibc-2.3.2-r0/glibc23-01-hppa-dl-machine.patch (100%) rename content/glibc-2.3.2-r0/librt-mips.patch => glibc/glibc-2.3.2-r0/glibc23-07-hppa-atomicity.patch (100%) rename content/glibc-2.3.2-r0/lo_LA.UTF-8_not_supported.patch => glibc/glibc-2.3.2-r0/glibc23-asserth-decls.patch (100%) rename content/glibc-2.3.2-r0/locale-es_AR.patch => glibc/glibc-2.3.2-r0/glibc23-cmov.patch (100%) rename content/glibc-2.3.2-r0/locales-stuff.patch => glibc/glibc-2.3.2-r0/glibc23-ctype-compat.patch (100%) rename content/glibc-2.3.2-r0/locales-supported.patch => glibc/glibc-2.3.2-r0/glibc23-errno.patch (100%) rename content/glibc-2.3.2-r0/makeconfig.patch => glibc/glibc-2.3.2-r0/glibc23-function-compat.patch (100%) rename content/glibc-2.3.2-r0/noinfo.patch => glibc/glibc-2.3.2-r0/glibc23-hppa-Rminkernel.patch (100%) rename content/glibc-2.3.2-r0/nss_compat-shadow.patch => glibc/glibc-2.3.2-r0/glibc23-hppa-compat.patch (100%) rename content/glibc-2.3.2-r0/powerpc-sysconf.patch => glibc/glibc-2.3.2-r0/glibc23-hppa-malloc8.patch (100%) rename content/glibc-2.3.2-r0/revert-old-libio.patch => glibc/glibc-2.3.2-r0/glibcbug.patch (100%) rename content/glibc-2.3.2-r0/s390-tls.patch => glibc/glibc-2.3.2-r0/hurd-enable-ldconfig.patch (100%) rename content/glibc-2.3.2-r0/sedscript.patch => glibc/glibc-2.3.2-r0/ldconfig.patch (100%) rename content/glibc-2.3.2-r0/sparc64-fixups.patch => glibc/glibc-2.3.2-r0/ldd.patch (100%) rename content/glibc-2.3.2-r0/sparcv8-target.patch => glibc/glibc-2.3.2-r0/libgcc-compat-all.patch (100%) rename content/glibc-2.3.2-r0/syslog-backrev.patch => glibc/glibc-2.3.2-r0/libgcc-compat-other.patch (100%) rename content/glibc-2.3.2-r0/version.h => glibc/glibc-2.3.2-r0/librt-mips.patch (100%) rename content/hotplug-2003_05_01-r0/busybox.patch => glibc/glibc-2.3.2-r0/lo_LA.UTF-8_not_supported.patch (100%) rename content/hotplug-2003_05_01.oe => glibc/glibc-2.3.2-r0/locale-es_AR.patch (100%) rename content/ifupdown-0.6.4/init => glibc/glibc-2.3.2-r0/locales-stuff.patch (100%) rename content/ifupdown-0.6.4/interfaces => glibc/glibc-2.3.2-r0/locales-supported.patch (100%) rename content/ifupdown-0.6.4/udhcpc.patch => glibc/glibc-2.3.2-r0/makeconfig.patch (100%) rename content/ifupdown-roam-0.59.oe => glibc/glibc-2.3.2-r0/noinfo.patch (100%) rename content/ifupdown-roam-0.59/conffiles => glibc/glibc-2.3.2-r0/nss_compat-shadow.patch (100%) rename content/ifupdown-roam-0.59/postrm => glibc/glibc-2.3.2-r0/powerpc-sysconf.patch (100%) rename content/ifupdown-roam-0.59/preinst => glibc/glibc-2.3.2-r0/revert-old-libio.patch (100%) rename content/initscripts-1.0-r0/banner => glibc/glibc-2.3.2-r0/s390-tls.patch (100%) rename content/initscripts-1.0-r0/banner-simpad => glibc/glibc-2.3.2-r0/sedscript.patch (100%) rename content/initscripts-1.0-r0/bootlogo-simpad.gz => glibc/glibc-2.3.2-r0/sparc64-fixups.patch (100%) rename content/initscripts-1.0-r0/bootmisc.sh => glibc/glibc-2.3.2-r0/sparcv8-target.patch (100%) rename content/initscripts-1.0-r0/checkfs.sh => glibc/glibc-2.3.2-r0/syslog-backrev.patch (100%) rename content/initscripts-1.0-r0/checkroot.sh => glibc/glibc-2.3.2-r0/version.h (100%) rename content/initscripts-1.0-r0/devices => glibc/glibc-2.3.2.oe (100%) rename {content/netbase-4.13 => hotplug/hotplug-2003_05_01-r0}/busybox.patch (100%) rename content/initscripts-1.0-r0/devices-h3600 => hotplug/hotplug-2003_05_01.oe (100%) rename content/initscripts-1.0-r0/devices-simpad => ifupdown/ifupdown-0.6.4.oe (100%) rename {content/netbase-4.13 => ifupdown/ifupdown-0.6.4}/init (100%) rename content/initscripts-1.0-r0/devpts.sh => ifupdown/ifupdown-0.6.4/interfaces (100%) rename content/initscripts-1.0-r0/extractfs => ifupdown/ifupdown-0.6.4/udhcpc.patch (100%) rename content/initscripts-1.0-r0/extractfs-ramses => ifupdown/ifupdown-roam-0.59.oe (100%) rename content/initscripts-1.0-r0/finish => ifupdown/ifupdown-roam-0.59/conffiles (100%) rename {content/sysvinit-2.85-r0 => ifupdown/ifupdown-roam-0.59}/postinst (100%) rename content/initscripts-1.0-r0/halt => ifupdown/ifupdown-roam-0.59/postrm (100%) rename content/initscripts-1.0-r0/hostname.sh => ifupdown/ifupdown-roam-0.59/preinst (100%) rename content/initscripts-1.0-r0/mountall.sh => initscripts/initscripts-1.0-r0/banner (100%) rename content/initscripts-1.0-r0/mountnfs.sh => initscripts/initscripts-1.0-r0/banner-simpad (100%) rename content/initscripts-1.0-r0/packages => initscripts/initscripts-1.0-r0/bootlogo-simpad.gz (100%) rename content/initscripts-1.0-r0/packages-ramses => initscripts/initscripts-1.0-r0/bootmisc.sh (100%) rename content/initscripts-1.0-r0/ramdisk => initscripts/initscripts-1.0-r0/checkfs.sh (100%) rename content/initscripts-1.0-r0/reboot => initscripts/initscripts-1.0-r0/checkroot.sh (100%) rename content/initscripts-1.0-r0/rmnologin => initscripts/initscripts-1.0-r0/devices (100%) rename content/initscripts-1.0-r0/sendsigs => initscripts/initscripts-1.0-r0/devices-h3600 (100%) rename content/initscripts-1.0-r0/single => initscripts/initscripts-1.0-r0/devices-simpad (100%) rename content/initscripts-1.0-r0/umountfs => initscripts/initscripts-1.0-r0/devpts.sh (100%) rename content/initscripts-1.0-r0/umountfs-ramses => initscripts/initscripts-1.0-r0/extractfs (100%) rename content/initscripts-1.0-r0/umountnfs.sh => initscripts/initscripts-1.0-r0/extractfs-ramses (100%) rename content/initscripts-1.0-r0/urandom => initscripts/initscripts-1.0-r0/finish (100%) rename content/ipkg-utils-buildarch-1.0_cvs.oe => initscripts/initscripts-1.0-r0/halt (100%) rename content/jpeg-6b/debian.patch => initscripts/initscripts-1.0-r0/hostname.sh (100%) rename content/libogg-1.0.0/libogg-configure.patch => initscripts/initscripts-1.0-r0/mountall.sh (100%) rename content/libtool-1.4.3-r0/debian.patch => initscripts/initscripts-1.0-r0/mountnfs.sh (100%) rename content/libtool-1.4.3-r0/libdir.patch => initscripts/initscripts-1.0-r0/packages (100%) rename content/libtool-1.4.3-r0/libtoolize-staging.patch => initscripts/initscripts-1.0-r0/packages-ramses (100%) rename content/libtool-1.5/libdir-la.patch => initscripts/initscripts-1.0-r0/ramdisk (100%) rename content/libtool-1.5/libtoolize-staging.patch => initscripts/initscripts-1.0-r0/reboot (100%) rename content/libtool-1.5/sedvar.patch => initscripts/initscripts-1.0-r0/rmnologin (100%) rename content/libtool-1.5/tag.patch => initscripts/initscripts-1.0-r0/sendsigs (100%) rename content/man-1.5m2.oe => initscripts/initscripts-1.0-r0/single (100%) rename content/man-pages-1.60.oe => initscripts/initscripts-1.0-r0/umountfs (100%) rename content/modutils-2.4.25-r0/modutils => initscripts/initscripts-1.0-r0/umountfs-ramses (100%) rename content/modutils-2.4.25-r0/modutils-notest.patch => initscripts/initscripts-1.0-r0/umountnfs.sh (100%) rename content/ncurses/20030906.patch => initscripts/initscripts-1.0-r0/urandom (100%) rename content/ncurses/mk_shared_lib.patch => initscripts/initscripts-1.0.oe (100%) rename content/ncurses/run_tic.patch => ipkg/ipkg-0.99.84.oe (100%) rename content/ncurses/tic.patch => ipkg/ipkg-0.99.91.oe (100%) rename content/netkit-base-0.17/configure.patch => ipkg/ipkg-buildarch-0.99.84.oe (100%) rename content/netkit-base-0.17/inetd.conf => ipkg/ipkg-buildarch-0.99.91.oe (100%) rename content/netkit-base-0.17/init => ipkg/ipkg-utils-1.0_cvs.oe (100%) rename content/netkit-base-0.17/mconfig.patch => ipkg/ipkg-utils-buildarch-1.0_cvs.oe (100%) rename content/netkit-ftp-0.17/mconfig.patch => iputils/iputils-20020927.oe (100%) rename content/openssh-3.7.1p1.oe => irda/irda-utils-0.9.15.oe (100%) rename content/openssh-3.7.1p1/cross.patch => jpeg/jpeg-6b.oe (100%) rename {content/openssl-0.9.7b => jpeg/jpeg-6b}/debian.patch (100%) rename content/openssh-3.7.1p1/scp-nossl.patch => libogg/libogg-1.0.0.oe (100%) rename content/openssh-3.7.1p1/sshd_config => libogg/libogg-1.0.0/libogg-configure.patch (100%) rename content/ppc-kernel-headers-2.4.21.oe => libpng/libpng-1.2.5.oe (100%) rename content/qte-2.3.6-r0/qpe.patch => libtool/libtool-1.4.3-r0/debian.patch (100%) rename content/qte-2.3.7-r0/qpe.patch => libtool/libtool-1.4.3-r0/libdir.patch (100%) rename content/resolvconf-0.41.oe => libtool/libtool-1.4.3-r0/libtoolize-staging.patch (100%) rename content/sysvinit-2.85-r0/inittab => libtool/libtool-1.4.3-r0/sedvar.patch (100%) rename content/sysvinit-2.85-r0/need => libtool/libtool-1.4.3.oe (100%) rename content/sysvinit-2.85-r0/no_dev_tty.patch => libtool/libtool-1.5.oe (100%) rename content/sysvinit-2.85-r0/prerm => libtool/libtool-1.5/libdir-la.patch (100%) rename content/sysvinit-2.85-r0/provide => libtool/libtool-1.5/libtoolize-staging.patch (100%) rename content/sysvinit-2.85-r0/rc => libtool/libtool-1.5/sedvar.patch (100%) rename content/sysvinit-2.85-r0/rcS => libtool/libtool-1.5/tag.patch (100%) rename content/sysvinit-2.85-r0/rcS-default => man/man-1.5m2.oe (100%) rename content/tslib/automake.patch => man/man-pages-1.60.oe (100%) rename content/tslib/collie-module.patch => modutils/modutils-2.4.25-r0/modutils (100%) rename content/tslib/devfs.patch => modutils/modutils-2.4.25-r0/modutils-notest.patch (100%) rename content/tslib/envvar_doc.patch => modutils/modutils-2.4.25.oe (100%) rename content/tslib/event1.patch => mtd/mtd-buildarch.oe (100%) rename content/tslib/multievent.patch => mtd/mtd.oe (100%) rename content/tslib/pointercal.patch => ncurses/ncurses-4.2.oe (100%) rename content/tslib/raw.patch => ncurses/ncurses-5.3.oe (100%) rename content/tslib/ts_calibrate.patch => ncurses/ncurses/20030906.patch (100%) rename content/util-linux-2.12.oe => ncurses/ncurses/mk_shared_lib.patch (100%) rename content/util-linux-2.12/MCONFIG => ncurses/ncurses/run_tic.patch (100%) rename content/util-linux-2.12/defines.h => ncurses/ncurses/tic.patch (100%) rename content/util-linux-2.12/make_include => netbase/netbase-4.13.oe (100%) rename content/util-linux-2.12/swapargs.h => netbase/netbase-4.13/busybox.patch (100%) rename doc/README => netbase/netbase-4.13/init (100%) create mode 100644 netkit-base/PLACEHOLDER create mode 100644 netkit-base/netkit-base-0.17.oe create mode 100644 netkit-base/netkit-base-0.17/configure.patch create mode 100644 netkit-base/netkit-base-0.17/inetd.conf create mode 100644 netkit-base/netkit-base-0.17/init create mode 100644 netkit-base/netkit-base-0.17/mconfig.patch create mode 100644 netkit-ftp/PLACEHOLDER create mode 100644 netkit-ftp/netkit-ftp-0.17.oe create mode 100644 netkit-ftp/netkit-ftp-0.17/mconfig.patch create mode 100644 ntp/ntp-4.1.2.oe create mode 100644 openobex/openobex-1.0.0.oe create mode 100644 openobex/openobex-apps-1.0.0.oe create mode 100644 openssh/openssh-3.7.1p1.oe create mode 100644 openssh/openssh-3.7.1p1/cross.patch create mode 100644 openssh/openssh-3.7.1p1/scp-nossl.patch create mode 100644 openssh/openssh-3.7.1p1/sshd_config create mode 100644 openssl/openssl-0.9.7b.oe create mode 100644 openssl/openssl-0.9.7b/debian.patch create mode 100644 oz/oz-ppc-toolchain-binutils-2.13.2.oe create mode 100644 oz/oz-ppc-toolchain-gcc-3.2.3.oe create mode 100644 oz/oz-ppc-toolchain-glibc-2.3.2.oe create mode 100644 patcher/patcher-1.0.oe create mode 100644 pcre/pcre-4.4.oe create mode 100644 ppc/ppc-kernel-headers-2.4.21.oe create mode 100644 qte/qte-2.3.6-r0/qpe.patch create mode 100644 qte/qte-2.3.6.oe create mode 100644 qte/qte-2.3.7-r0/qpe.patch create mode 100644 qte/qte-2.3.7.oe create mode 100644 resolvconf/resolvconf-0.41.oe create mode 100644 sysvinit/sysvinit-2.85-r0/inittab create mode 100644 sysvinit/sysvinit-2.85-r0/need create mode 100644 sysvinit/sysvinit-2.85-r0/no_dev_tty.patch create mode 100644 sysvinit/sysvinit-2.85-r0/postinst create mode 100644 sysvinit/sysvinit-2.85-r0/prerm create mode 100644 sysvinit/sysvinit-2.85-r0/provide create mode 100644 sysvinit/sysvinit-2.85-r0/rc create mode 100644 sysvinit/sysvinit-2.85-r0/rcS create mode 100644 sysvinit/sysvinit-2.85-r0/rcS-default create mode 100644 sysvinit/sysvinit-2.85.oe create mode 100644 tinylogin/tinylogin-1.4.oe create mode 100644 tmake/tmake-1.11.oe create mode 100644 tslib/tslib.oe create mode 100644 tslib/tslib/automake.patch create mode 100644 tslib/tslib/collie-module.patch create mode 100644 tslib/tslib/devfs.patch create mode 100644 tslib/tslib/envvar_doc.patch create mode 100644 tslib/tslib/event1.patch create mode 100644 tslib/tslib/multievent.patch create mode 100644 tslib/tslib/pointercal.patch create mode 100644 tslib/tslib/raw.patch create mode 100644 tslib/tslib/ts_calibrate.patch create mode 100644 util-linux/util-linux-2.12.oe create mode 100644 util-linux/util-linux-2.12/MCONFIG create mode 100644 util-linux/util-linux-2.12/defines.h create mode 100644 util-linux/util-linux-2.12/make_include create mode 100644 util-linux/util-linux-2.12/swapargs.h create mode 100644 zlib/zlib-1.1.4.oe create mode 100644 zsh/zsh-4.1.1.oe diff --git a/content/acpid-1.0.2.oe b/acpid/acpid-1.0.2.oe similarity index 100% rename from content/acpid-1.0.2.oe rename to acpid/acpid-1.0.2.oe diff --git a/content/bootmenu-0.6.oe b/apache/apache-2.0.47.oe similarity index 100% rename from content/bootmenu-0.6.oe rename to apache/apache-2.0.47.oe diff --git a/content/bootmenu-0.6/compile.patch b/bootmenu/bootmenu-0.6.oe similarity index 100% rename from content/bootmenu-0.6/compile.patch rename to bootmenu/bootmenu-0.6.oe diff --git a/content/fbgetty-0.1.698/compile.patch b/bootmenu/bootmenu-0.6/compile.patch similarity index 100% rename from content/fbgetty-0.1.698/compile.patch rename to bootmenu/bootmenu-0.6/compile.patch diff --git a/content/busybox-1.00-pre2/busybox-suidinstall.patch b/busybox/busybox-1.00-pre2.oe similarity index 100% rename from content/busybox-1.00-pre2/busybox-suidinstall.patch rename to busybox/busybox-1.00-pre2.oe diff --git a/content/busybox-1.00-pre3/busybox-suidinstall.patch b/busybox/busybox-1.00-pre2/busybox-suidinstall.patch similarity index 100% rename from content/busybox-1.00-pre3/busybox-suidinstall.patch rename to busybox/busybox-1.00-pre2/busybox-suidinstall.patch diff --git a/content/busybox-1.00-pre2/console.patch b/busybox/busybox-1.00-pre2/console.patch similarity index 100% rename from content/busybox-1.00-pre2/console.patch rename to busybox/busybox-1.00-pre2/console.patch diff --git a/content/busybox-1.00-pre2/defconfig b/busybox/busybox-1.00-pre2/defconfig similarity index 100% rename from content/busybox-1.00-pre2/defconfig rename to busybox/busybox-1.00-pre2/defconfig diff --git a/content/busybox-1.00-pre2/dhcp-retrytime.patch b/busybox/busybox-1.00-pre2/dhcp-retrytime.patch similarity index 100% rename from content/busybox-1.00-pre2/dhcp-retrytime.patch rename to busybox/busybox-1.00-pre2/dhcp-retrytime.patch diff --git a/content/busybox-1.00-pre2/hwclock.sh b/busybox/busybox-1.00-pre2/hwclock.sh similarity index 100% rename from content/busybox-1.00-pre2/hwclock.sh rename to busybox/busybox-1.00-pre2/hwclock.sh diff --git a/content/busybox-1.00-pre2/postinst b/busybox/busybox-1.00-pre2/postinst similarity index 100% rename from content/busybox-1.00-pre2/postinst rename to busybox/busybox-1.00-pre2/postinst diff --git a/content/busybox-1.00-pre2/prerm b/busybox/busybox-1.00-pre2/prerm similarity index 100% rename from content/busybox-1.00-pre2/prerm rename to busybox/busybox-1.00-pre2/prerm diff --git a/content/busybox-1.00-pre2/silence-hwclock.patch b/busybox/busybox-1.00-pre2/silence-hwclock.patch similarity index 100% rename from content/busybox-1.00-pre2/silence-hwclock.patch rename to busybox/busybox-1.00-pre2/silence-hwclock.patch diff --git a/content/busybox-1.00-pre2/syslog b/busybox/busybox-1.00-pre2/syslog similarity index 100% rename from content/busybox-1.00-pre2/syslog rename to busybox/busybox-1.00-pre2/syslog diff --git a/content/busybox-1.00-pre2/tar.patch b/busybox/busybox-1.00-pre2/tar.patch similarity index 100% rename from content/busybox-1.00-pre2/tar.patch rename to busybox/busybox-1.00-pre2/tar.patch diff --git a/content/busybox-1.00-pre3/console.patch b/busybox/busybox-1.00-pre3.oe similarity index 100% rename from content/busybox-1.00-pre3/console.patch rename to busybox/busybox-1.00-pre3.oe diff --git a/content/busybox-1.00-pre3/defconfig b/busybox/busybox-1.00-pre3/busybox-suidinstall.patch similarity index 100% rename from content/busybox-1.00-pre3/defconfig rename to busybox/busybox-1.00-pre3/busybox-suidinstall.patch diff --git a/content/busybox-1.00-pre3/dhcp-retrytime.patch b/busybox/busybox-1.00-pre3/console.patch similarity index 100% rename from content/busybox-1.00-pre3/dhcp-retrytime.patch rename to busybox/busybox-1.00-pre3/console.patch diff --git a/content/busybox-1.00-pre3/hwclock.sh b/busybox/busybox-1.00-pre3/defconfig similarity index 100% rename from content/busybox-1.00-pre3/hwclock.sh rename to busybox/busybox-1.00-pre3/defconfig diff --git a/content/busybox-1.00-pre3/postinst b/busybox/busybox-1.00-pre3/dhcp-retrytime.patch similarity index 100% rename from content/busybox-1.00-pre3/postinst rename to busybox/busybox-1.00-pre3/dhcp-retrytime.patch diff --git a/content/busybox-1.00-pre3/prerm b/busybox/busybox-1.00-pre3/hwclock.sh similarity index 100% rename from content/busybox-1.00-pre3/prerm rename to busybox/busybox-1.00-pre3/hwclock.sh diff --git a/content/ifupdown-roam-0.59/postinst b/busybox/busybox-1.00-pre3/postinst similarity index 100% rename from content/ifupdown-roam-0.59/postinst rename to busybox/busybox-1.00-pre3/postinst diff --git a/content/busybox-1.00-pre3/silence-hwclock.patch b/busybox/busybox-1.00-pre3/prerm similarity index 100% rename from content/busybox-1.00-pre3/silence-hwclock.patch rename to busybox/busybox-1.00-pre3/prerm diff --git a/content/busybox-1.00-pre3/syslog b/busybox/busybox-1.00-pre3/silence-hwclock.patch similarity index 100% rename from content/busybox-1.00-pre3/syslog rename to busybox/busybox-1.00-pre3/silence-hwclock.patch diff --git a/content/busybox-1.00-pre3/tar.patch b/busybox/busybox-1.00-pre3/syslog similarity index 100% rename from content/busybox-1.00-pre3/tar.patch rename to busybox/busybox-1.00-pre3/syslog diff --git a/content/coreutils-5.0/malloc.patch b/busybox/busybox-1.00-pre3/tar.patch similarity index 100% rename from content/coreutils-5.0/malloc.patch rename to busybox/busybox-1.00-pre3/tar.patch diff --git a/content/apache-2.0.47.oe b/content/apache-2.0.47.oe deleted file mode 100644 index b46e854e56..0000000000 --- a/content/apache-2.0.47.oe +++ /dev/null @@ -1,27 +0,0 @@ -SRC_URI = http://ftp.epix.net/apache/httpd/httpd-${PV}.tar.gz -SECTION = net -DEPENDS = virtual/libc expat openssl -RDEPENDS = libc6, libexpat1, libssl0.9.7 - -S = ${WORKDIR}/httpd-${PV} - -inherit autotools libtool - -CFLAGS_append = " -DPATH_MAX=4096" -CFLAGS_prepend = "-I${STAGING_DIR}/target/include/openssl " -EXTRA_OECONF = --enable-ssl --with-ssl=${STAGING_DIR}/target --enable-dav --enable-dav-fs -do_compile () { - touch srclib/apr-util/uri/gen_uri_delims.lo - ${BUILD_CC} srclib/apr-util/uri/gen_uri_delims.c -o srclib/apr-util/uri/gen_uri_delims - touch srclib/pcre/dftables.lo - ${BUILD_CC} -I/usr/include/pcre srclib/pcre/dftables.c -o srclib/pcre/dftables - cd server - ${BUILD_CC} -I${S}/srclib/apr/include -c gen_test_char.c && touch gen_test_char.lo - ${BUILD_CC} -I${S}/os/unix -I${S}/srclib/apr/include -I${S}/srclib/apr-util/include -I${S}/include -c util_debug.c && touch util_debug.lo - ${BUILD_CC} gen_test_char.o util_debug.o -o gen_test_char - /bin/sh ${S}/srclib/apr/libtool --silent --mode=compile ${CC} -DPATH_MAX=4096 -I${S}/srclib/apr/include -prefer-non-pic -static -c gen_test_char.c && touch gen_test_char.lo - /bin/sh ${S}/srclib/apr/libtool --silent --mode=compile ${CC} -DPATH_MAX=4096 -I${S}/os/unix -I${S}/srclib/apr/include -I${S}/srclib/apr-util/include -I${S}/include -prefer-non-pic -static -c util_debug.c && touch util_debug.lo - touch gen_test_char - cd .. - oe_runmake -} diff --git a/content/busybox-1.00-pre2.oe b/content/busybox-1.00-pre2.oe deleted file mode 100644 index 252d6fefbb..0000000000 --- a/content/busybox-1.00-pre2.oe +++ /dev/null @@ -1,41 +0,0 @@ -LICENSE="GPL" -SRC_URI="http://www.busybox.net/downloads/${PN}-${PV}.tar.gz" -DEPENDS=virtual/libc -DESCRIPTION=BusyBox version ${PV}.\ - BusyBox combines tiny versions of many common UNIX utilities into a single\ - small executable. It provides minimalist replacements for most of the\ - utilities you usually find in GNU fileutils, shellutils, etc. The utilities\ - in BusyBox generally have fewer options than their full-featured GNU\ - cousins; however, the options that are included provide the expected\ - functionality and behave very much like their GNU counterparts. BusyBox\ - provides a fairly complete POSIX environment for any small or embedded\ - system. - -S="${WORKDIR}/${P}" -export EXTRA_CFLAGS="${CFLAGS}" -EXTRA_OEMAKE_append=' CROSS=${CROSS}' - -inherit cml1 - -do_configure () { - install -m 0644 ${FILESDIR}/defconfig ${S}/.config - cml1_do_configure -} - -do_compile () { - unset CFLAGS - base_do_compile -} - -do_install () { - install -d ${D}/etc/init.d - oe_runmake 'PREFIX=${D}' install - install -m 0755 ${FILESDIR}/syslog ${D}/etc/init.d/syslog - install -m 0755 ${FILESDIR}/hwclock.sh ${D}/etc/init.d/hwclock.sh -} - -do_package_ipk_prepend () { - set -e - install -m 0755 ${FILESDIR}/postinst ${D}/CONTROL/postinst; - install -m 0755 ${FILESDIR}/prerm ${D}/CONTROL/prerm; -} diff --git a/content/busybox-1.00-pre3.oe b/content/busybox-1.00-pre3.oe deleted file mode 100644 index 7ceb2c4631..0000000000 --- a/content/busybox-1.00-pre3.oe +++ /dev/null @@ -1,40 +0,0 @@ -LICENSE="GPL" -SRC_URI="http://www.busybox.net/downloads/${PN}-${PV}.tar.gz" -DEPENDS=virtual/libc -DESCRIPTION=BusyBox version ${PV}.\ - BusyBox combines tiny versions of many common UNIX utilities into a single\ - small executable. It provides minimalist replacements for most of the\ - utilities you usually find in GNU fileutils, shellutils, etc. The utilities\ - in BusyBox generally have fewer options than their full-featured GNU\ - cousins; however, the options that are included provide the expected\ - functionality and behave very much like their GNU counterparts. BusyBox\ - provides a fairly complete POSIX environment for any small or embedded\ - system. - -S="${WORKDIR}/${P}" -export EXTRA_CFLAGS="${CFLAGS}" -EXTRA_OEMAKE_append=' CROSS=${CROSS}' - -inherit cml1 - -do_configure () { - install -m 0644 ${FILESDIR}/defconfig ${S}/.config - cml1_do_configure -} - -do_compile () { - unset CFLAGS - base_do_compile -} - -do_install () { - install -d ${D}/etc/init.d - oe_runmake 'PREFIX=${D}' install - install -m 0755 ${FILESDIR}/syslog ${D}/etc/init.d/syslog - install -m 0755 ${FILESDIR}/hwclock.sh ${D}/etc/init.d/hwclock.sh -} - -do_package_ipk_prepend () { - install -m 0755 ${FILESDIR}/postinst ${D}/CONTROL/postinst; - install -m 0755 ${FILESDIR}/prerm ${D}/CONTROL/prerm; -} diff --git a/content/coreutils-5.0.oe b/content/coreutils-5.0.oe deleted file mode 100644 index 7aa6955861..0000000000 --- a/content/coreutils-5.0.oe +++ /dev/null @@ -1,8 +0,0 @@ -DEPENDS = virtual/libc -RDEPENDS = libc6 - -SRC_URI = ${GNU_MIRROR}/${PN}/${P}.tar.gz \ - file://${FILESDIR}/malloc.patch;patch=1 -S = ${WORKDIR}/${P} - -inherit autotools diff --git a/content/corkscrew-2.0.oe b/content/corkscrew-2.0.oe deleted file mode 100644 index 198dfd35b8..0000000000 --- a/content/corkscrew-2.0.oe +++ /dev/null @@ -1,4 +0,0 @@ -SRC_URI := http://www.agroman.net/${PN}/${P}.tar.gz -S := ${WORKDIR}/${P} - -inherit autotools diff --git a/content/cross-binutils-2.13.2.oe b/content/cross-binutils-2.13.2.oe deleted file mode 100644 index 87bd531472..0000000000 --- a/content/cross-binutils-2.13.2.oe +++ /dev/null @@ -1,14 +0,0 @@ -DESCRIPTION="binutils 2.13 from FSF" - -LICENSE="GPL" -RDEPEND="" -DEPEND="" -PROVIDES="virtual/${TARGET_ARCH}-${TARGET_OS}-binutils" - -SRC_URI="ftp://ftp.gnu.org/pub/gnu/binutils/binutils-2.13.2.tar.gz" -S = ${WORKDIR}/binutils-${PV} - -CROSS_DIR := ${CROSS_DIR} -prefix=${CROSS_DIR} -exec_prefix=${prefix} -inherit cross autotools diff --git a/content/cross-binutils-2.14.90.0.6.oe b/content/cross-binutils-2.14.90.0.6.oe deleted file mode 100644 index fa0fef3aa5..0000000000 --- a/content/cross-binutils-2.14.90.0.6.oe +++ /dev/null @@ -1,9 +0,0 @@ -PROVIDES = virtual/${OLDARCH}-${OLDOS}-binutils - -SRC_URI = http://ftp.kernel.org/pub/linux/devel/binutils/binutils-${PV}.tar.gz -S = ${WORKDIR}/binutils-${PV} - -CROSS_DIR := ${CROSS_DIR} -prefix=${CROSS_DIR} -exec_prefix=${prefix} -inherit cross autotools diff --git a/content/cross-binutils-2.14.oe b/content/cross-binutils-2.14.oe deleted file mode 100644 index fbc992e85e..0000000000 --- a/content/cross-binutils-2.14.oe +++ /dev/null @@ -1,14 +0,0 @@ -DESCRIPTION="binutils 2.13 from FSF" - -LICENSE="GPL" -RDEPEND="" -DEPEND="" -PROVIDES="virtual/${TARGET_ARCH}-${TARGET_OS}-binutils" - -SRC_URI="${GNU_MIRROR}/binutils/binutils-${PV}.tar.gz" -S = ${WORKDIR}/binutils-${PV} - -CROSS_DIR := ${CROSS_DIR} -prefix=${CROSS_DIR} -exec_prefix=${prefix} -inherit cross autotools diff --git a/content/cross-gcc-3.3.1.oe b/content/cross-gcc-3.3.1.oe deleted file mode 100644 index 1bf2d144cb..0000000000 --- a/content/cross-gcc-3.3.1.oe +++ /dev/null @@ -1,22 +0,0 @@ -PROVIDES="virtual/${OLDARCH}-${OLDOS}-gcc" - -SRC_URI = ${GNU_MIRROR}/gcc/gcc-${PV}.tar.gz -S = ${WORKDIR}/gcc-${PV} - -CROSS_DIR := ${CROSS_DIR} -prefix=${CROSS_DIR} -exec_prefix=${prefix} -inherit cross autotools - -EXTRA_OECONF = --oldincludedir=${prefix}/include --enable-shared \ - --with-gxx-include-dir=${CROSS_DIR}/include/c++ \ - --enable-shared \ - --enable-threads -tmake_file = gcc/config/${OLDARCH}/t-linux - -do_configure_append() { - touch ${tmake_file} - mv ${tmake_file} > ${tmake_file}.tmp - cat ${tmake_file}.tmp | sed -e's/-Dinhibit_libc -D__gthr_posix_h//g' > ${tmake_file} - rm -f ${tmake_file}.tmp -} diff --git a/content/cross-gcc-initial-3.3.1.oe b/content/cross-gcc-initial-3.3.1.oe deleted file mode 100644 index 573410ee30..0000000000 --- a/content/cross-gcc-initial-3.3.1.oe +++ /dev/null @@ -1,16 +0,0 @@ -include cross-gcc-${PV}.oe -PN:=${PN}-initial - -EXTRA_OECONF = --oldincludedir=${prefix}/include --enable-shared \ - --enable-languages=c \ - --disable-shared \ - --disable-threads - -do_configure_append () { - if (grep -q TARGET_LIBGCC2_CFLAGS ${tmake_file}); then - perl -pi -e 's/^(TARGET_LIBGCC2_CFLAGS.*)/$$1 -Dinhibit_libc -D__gthr_posix_h/' ${tmake_file} - else - echo 'TARGET_LIBGCC2_CFLAGS = -Dinhibit_libc -D__gthr_posix_h' >> ${tmake_file} - fi - echo 'T_CFLAGS = -Dinhibit_libc -D__gthr_posix_h' >> ${tmake_file} -} diff --git a/content/diffutils-2.8.1.oe b/content/diffutils-2.8.1.oe deleted file mode 100644 index dadfaf94fd..0000000000 --- a/content/diffutils-2.8.1.oe +++ /dev/null @@ -1,7 +0,0 @@ -DEPENDS = virtual/libc -RDEPENDS = libc6 - -SRC_URI = ${GNU_MIRROR}/${PN}/${P}.tar.gz -S = ${WORKDIR}/${P} - -inherit autotools diff --git a/content/dropbear-0.36.oe b/content/dropbear-0.36.oe deleted file mode 100644 index 12c718ca4a..0000000000 --- a/content/dropbear-0.36.oe +++ /dev/null @@ -1,14 +0,0 @@ -DESCRIPTION="Dropbear SSH Implementation" -LICENSE="MIT" -DEPENDS=virtual/libc zlib ncurses - -SRC_URI="http://matt.ucc.asn.au/dropbear/dropbear-${PV}.tar.bz2" -S="${WORKDIR}/${P}" - -inherit autotools - -CFLAGS_append = " -I${S}/libtomcrypt" -LD=${CC} -do_install_prepend () { - install -d ${D}/usr/sbin ${D}/usr/bin -} diff --git a/content/expat-1.95.6.oe b/content/expat-1.95.6.oe deleted file mode 100644 index 638ff75291..0000000000 --- a/content/expat-1.95.6.oe +++ /dev/null @@ -1,24 +0,0 @@ -DESCRIPTION = Jim Clarkes XML parser library. -DEPENDS = virtual/libc -RDEPENDS = libc6 - -SRC_URI = ${SOURCEFORGE_MIRROR}/${PN}/${P}.tar.gz -S = "${WORKDIR}/${P}" - -inherit autotools libtool - -do_stage () { - install -m 0644 lib/expat.h ${STAGING_DIR}/target/include/ - install -m 0755 .libs/libexpat.so.0.4.0 ${STAGING_LIBDIR}/ - ln -sf libexpat.so.0.4.0 ${STAGING_LIBDIR}/libexpat.so.1 - ln -sf libexpat.so.0.4.0 ${STAGING_LIBDIR}/libexpat.so.0 - ln -sf libexpat.so.0.4.0 ${STAGING_LIBDIR}/libexpat.so -} - -do_install () { - oe_runmake prefix="${D}/${prefix}" \ - bindir="${D}/${bindir}" \ - libdir="${D}/${libdir}" \ - includedir="${D}/${includedir}" \ - install -} diff --git a/content/fakeroot-0.7.5.oe b/content/fakeroot-0.7.5.oe deleted file mode 100644 index fad2bcdd95..0000000000 --- a/content/fakeroot-0.7.5.oe +++ /dev/null @@ -1,4 +0,0 @@ -SRC_URI := ${DEBIAN_MIRROR}/main/f/fakeroot/${PN}_${PV}.tar.gz -S = ${WORKDIR}/${P} - -inherit autotools libtool diff --git a/content/fakeroot-buildarch-0.7.5.oe b/content/fakeroot-buildarch-0.7.5.oe deleted file mode 100644 index ba44127844..0000000000 --- a/content/fakeroot-buildarch-0.7.5.oe +++ /dev/null @@ -1,4 +0,0 @@ -inherit native -include fakeroot-${PV}.oe -PN_append=-buildarch -S = ${WORKDIR}/fakeroot-${PV} diff --git a/content/glibc-2.3.2-r0/glibc-2.3.2-200304020432.patch b/content/glibc-2.3.2-r0/glibc-2.3.2-200304020432.patch deleted file mode 100644 index 5c945c124d..0000000000 --- a/content/glibc-2.3.2-r0/glibc-2.3.2-200304020432.patch +++ /dev/null @@ -1,136135 +0,0 @@ -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$. -+# From $Id$. - # 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 diff --git a/content/glibc-2.3.2.oe b/content/glibc-2.3.2.oe deleted file mode 100644 index 8392a5c8cc..0000000000 --- a/content/glibc-2.3.2.oe +++ /dev/null @@ -1,113 +0,0 @@ -DESCRIPTION="GNU C Library" -LICENSE="LGPL" -SECTION="libs" -PRIORITY=required -MAINTAINER="Chris Larson " - -SRC_URI=ftp://ftp.gnu.org/gnu/glibc/glibc-2.3.2.tar.gz \ - ftp://ftp.gnu.org/pub/gnu/glibc/glibc-linuxthreads-2.3.2.tar.gz \ - http://www.uclibc.org/downloads/toolchain/kernel-headers-2.4.21.tar.bz2 -SRC_URI_append=' file://${FILESDIR}/noinfo.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/10_cvs.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/30_glibc232-base.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/50_glibc232-arm-dwarf2-buildfix.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/50_glibc232-m68k-dwarf2-buildfix.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/50_glibc232-mips-buildfix.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/50_glibc23-hppa-entry.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/80_glibc232-futimes-buildfix.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/80_glibc232-iconvdata-fix.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/80_glibc232-locales-header.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/80_glibc232-wcsmbs-fix.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/81_glibc232-utimes-fix.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/alpha-crti.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/alpha-pic.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/alpha-pwrite.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/arm-no-hwcap.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/arm-output-format.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/fhs-linux-paths.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/glibc22-eo_EO.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/glibc22-locales.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/glibc22-m68k-compat.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/glibc22-m68k-fpic.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/glibc22-nss-upgrade.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/glibc22-ttyname-devfs.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/glibc23-01-hppa-dl-machine.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/glibc23-07-hppa-atomicity.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/glibc23-asserth-decls.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/glibc23-cmov.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/glibc23-ctype-compat.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/glibc23-errno.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/glibc23-function-compat.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/glibc23-hppa-compat.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/glibc23-hppa-malloc8.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/glibc23-hppa-Rminkernel.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/glibcbug.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/hurd-enable-ldconfig.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/ldconfig.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/ldd.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/libgcc-compat-all.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/libgcc-compat-other.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/librt-mips.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/locale-es_AR.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/locales-stuff.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/locales-supported.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/lo_LA.UTF-8_not_supported.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/makeconfig.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/nss_compat-shadow.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/powerpc-sysconf.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/revert-old-libio.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/s390-tls.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/sparc64-fixups.patch;patch=1' -SRC_URI_append=' file://${FILESDIR}/sparcv8-target.patch;patch=1;pnum=0' -SRC_URI_append=' file://${FILESDIR}/syslog-backrev.patch;patch=1;pnum=0' -#SRC_URI_append=' file://${FILESDIR}/dyn-ldconfig.diff;patch=1;pnum=0' -PROVIDES=virtual/libc - -S="${WORKDIR}/${P}" -builddir="${WORKDIR}/build-${TARGET_SYS}" - -inherit autotools - -EXTRA_OECONF="--with-elf --disable-profile --enable-add-ons=linuxthreads --with-elf --enable-shared --with-headers=${WORKDIR}/linux/include --without-cvs --enable-kernel=2.4.6" - -glibcbuild_do_unpack () { - mv "${WORKDIR}/linuxthreads" "${WORKDIR}/linuxthreads_db" "${S}/" -# kernel headers - cp -a "${FILESDIR}/version.h" "${FILESDIR}/autoconf.h" "${WORKDIR}/linux/include/linux/" - ln -sf "asm-${TARGET_ARCH}" "${WORKDIR}/linux/include/asm" -} - -python do_unpack () { - oe.build.exec_func('base_do_unpack', d) - oe.build.exec_func('glibcbuild_do_unpack', d) -} - -do_configure_prepend() { - mkdir -p "${builddir}" - cd "${builddir}" -} - -do_compile_prepend() { - touch sysdeps/${TARGET_ARCH}/framestate.c - cd "${builddir}" -} - -do_stage() { - oe_runmake -C '${builddir}' 'install_root=${STAGING_DIR}/target' \ - 'includedir=/include' 'libdir=/lib' 'slibdir=/lib' \ - '${STAGING_LIBDIR}/libc-${PV}.so' '${STAGING_LIBDIR}/libc.so.6' \ - install-headers install-lib - echo 'GROUP ( libc.so.6 libc_nonshared.a )' > \ - '${STAGING_LIBDIR}/libc.so' - mv '${STAGING_LIBDIR}/libpthread.so' '${STAGING_LIBDIR}/libpthread-old.so' - cat '${STAGING_LIBDIR}/libpthread-old.so' | sed -e's,/lib/,,g' > '${STAGING_LIBDIR}/libpthread.so' - cp -a '${WORKDIR}/linux/include/linux' '${STAGING_DIR}/target/include/' - cp -a '${WORKDIR}/linux/include/asm-${TARGET_ARCH}' '${STAGING_DIR}/target/include/' - ln -sf 'asm-${TARGET_ARCH}' '${STAGING_DIR}/target/include/asm' -} - -do_install() { - oe_runmake -C ${builddir} install_root=${D} install - cp -a ${WORKDIR}/linux/include/linux ${D}/${includedir}/ - cp -a ${WORKDIR}/linux/include/asm-${TARGET_ARCH} ${D}/${includedir}/asm -} diff --git a/content/ifupdown-0.6.4.oe b/content/ifupdown-0.6.4.oe deleted file mode 100644 index 0c1bcaedd0..0000000000 --- a/content/ifupdown-0.6.4.oe +++ /dev/null @@ -1,28 +0,0 @@ -DEPENDS = virtual/libc -RDEPENDS = libc6 -DESCRIPTION = High level tools to configure network interfaces\ - This package provides the tools ifup and ifdown which may be used to\ - configure (or, respectively, deconfigure) network interfaces, based on\ - the file /etc/network/interfaces. - -SRC_URI = ${DEBIAN_MIRROR}/main/i/${PN}/${PN}_${PV}.orig.tar.gz \ - ${DEBIAN_MIRROR}/main/i/${PN}/${PN}_${PV}-4.4.diff.gz;patch=1 \ - file://${FILESDIR}/udhcpc.patch;patch=1 -S = ${WORKDIR}/${P} - -EXTRA_OEMAKE = - -do_compile () { - chmod a+rx *.pl *.sh - oe_runmake 'CC=${CC}' "CFLAGS=${CFLAGS} -Wall -W -D'IFUPDOWN_VERSION=\"0.6.4\"'" -} - -do_install () { - install -d ${D}/etc/init.d \ - ${D}/etc/network \ - ${D}/sbin - install -m 0755 ifup ${D}/sbin/ - ln ${D}/sbin/ifup ${D}/sbin/ifdown - install -m 0644 ${FILESDIR}/init ${D}/etc/init.d/networking - install -m 0644 ${FILESDIR}/interfaces ${D}/etc/network/interfaces -} diff --git a/content/initscripts-1.0.oe b/content/initscripts-1.0.oe deleted file mode 100644 index 953fb51aed..0000000000 --- a/content/initscripts-1.0.oe +++ /dev/null @@ -1,27 +0,0 @@ -DESCRIPTION="SysV init scripts" -MAINTAINER="Chris Larson " - -do_install () { - install -d ${D}/${sysconfdir}/init.d \ - ${D}/${sysconfdir}/rcS.d \ - ${D}/${sysconfdir}/rc0.d \ - ${D}/${sysconfdir}/rc1.d \ - ${D}/${sysconfdir}/rc2.d \ - ${D}/${sysconfdir}/rc3.d \ - ${D}/${sysconfdir}/rc4.d \ - ${D}/${sysconfdir}/rc5.d \ - ${D}/${sysconfdir}/rc6.d - install -m 0755 ${FILESDIR}/bootmisc.sh ${D}/etc/init.d - install -m 0755 ${FILESDIR}/checkroot.sh ${D}/etc/init.d - install -m 0755 ${FILESDIR}/finish ${D}/etc/init.d - install -m 0755 ${FILESDIR}/halt ${D}/etc/init.d - install -m 0755 ${FILESDIR}/hostname.sh ${D}/etc/init.d - install -m 0755 ${FILESDIR}/mountall.sh ${D}/etc/init.d - install -m 0755 ${FILESDIR}/mountnfs.sh ${D}/etc/init.d - install -m 0755 ${FILESDIR}/reboot ${D}/etc/init.d - install -m 0755 ${FILESDIR}/rmnologin ${D}/etc/init.d - install -m 0755 ${FILESDIR}/sendsigs ${D}/etc/init.d - install -m 0755 ${FILESDIR}/single ${D}/etc/init.d - install -m 0755 ${FILESDIR}/umountnfs.sh ${D}/etc/init.d - install -m 0755 ${FILESDIR}/urandom ${D}/etc/init.d -} diff --git a/content/ipkg-0.99.84.oe b/content/ipkg-0.99.84.oe deleted file mode 100644 index 5095f69d23..0000000000 --- a/content/ipkg-0.99.84.oe +++ /dev/null @@ -1,13 +0,0 @@ -DESCRIPTION="Itsy Package Manager" -LICENSE="GPL" -PROVIDES=virtual/ipkg -DEPENDS=virtual/libc - -SRC_URI="cvs://anoncvs:anoncvs@192.58.209.91/cvs;module=familiar/dist/ipkg;tag=V0-99-84" -S="${WORKDIR}/ipkg/C" - -inherit autotools - -do_compile_prepend () { - ./autoconfigure.sh -} diff --git a/content/ipkg-0.99.91.oe b/content/ipkg-0.99.91.oe deleted file mode 100644 index 18788b759a..0000000000 --- a/content/ipkg-0.99.91.oe +++ /dev/null @@ -1,13 +0,0 @@ -DESCRIPTION="Itsy Package Manager" -LICENSE="GPL" -PROVIDES=virtual/ipkg -DEPENDS=virtual/libc - -SRC_URI="cvs://anoncvs:anoncvs@192.58.209.91/cvs;module=familiar/dist/ipkg;tag=${@'V' + string.replace(oe.data.getVar('PV',d,1), '.', '-')}" -S="${WORKDIR}/ipkg/C" - -inherit autotools - -do_compile_prepend () { - ./autoconfigure.sh -} diff --git a/content/ipkg-buildarch-0.99.84.oe b/content/ipkg-buildarch-0.99.84.oe deleted file mode 100644 index f4750147ca..0000000000 --- a/content/ipkg-buildarch-0.99.84.oe +++ /dev/null @@ -1,2 +0,0 @@ -inherit native -include ipkg-${PV}.oe diff --git a/content/ipkg-buildarch-0.99.91.oe b/content/ipkg-buildarch-0.99.91.oe deleted file mode 100644 index f4750147ca..0000000000 --- a/content/ipkg-buildarch-0.99.91.oe +++ /dev/null @@ -1,2 +0,0 @@ -inherit native -include ipkg-${PV}.oe diff --git a/content/ipkg-utils-1.0_cvs.oe b/content/ipkg-utils-1.0_cvs.oe deleted file mode 100644 index f28a6bf3dd..0000000000 --- a/content/ipkg-utils-1.0_cvs.oe +++ /dev/null @@ -1,21 +0,0 @@ -DESCRIPTION="Itsy Package Manager utilities" -DEPENDS="" -SECTION="base" -PRIORITY="optional" -MAINTAINER="Chris Larson " -LICENSE="GPL" -#DEPENDS=virtual/libc - -SRC_URI:="cvs://anoncvs:anoncvs@192.58.209.91/cvs;module=ipkg-utils" -S:="${WORKDIR}/${PN}" - -inherit autotools - -do_stage() { - cp ipkg* ${STAGING_BINDIR}/ -} - -do_install() { - install -d ${D}/usr/bin - cp ipkg* ${D}/usr/bin/ -} diff --git a/content/iputils-20020927.oe b/content/iputils-20020927.oe deleted file mode 100644 index d5e75a80fe..0000000000 --- a/content/iputils-20020927.oe +++ /dev/null @@ -1,25 +0,0 @@ -SRC_URI = http://www.tux.org/pub/people/alexey-kuznetsov/ip-routing/iputils-ss020927.tar.gz -S = ${WORKDIR}/${PN} - -EXTRA_OEMAKE = - -do_compile () { - oe_runmake 'CC=${CC}' \ - KERNEL_INCLUDE="${STAGING_DIR}/target/include" \ - LIBC_INCLUDE="${STAGING_DIR}/target/include" - oe_runmake -C doc 'CC=${CC}' \ - KERNEL_INCLUDE="${STAGING_DIR}/target/include" \ - LIBC_INCLUDE="${STAGING_DIR}/target/include" -} - -do_install () { - install -d ${D}/bin ${D}/usr/sbin \ - ${D}/${mandir}/man8 ${D}/${datadir}/doc/${P} - install -m 0755 ping ${D}/bin/ - for f in ipg tracepath clockdiff rdisc arping \ - tftpd rarpd tracepath6 traceroute6 ping6; do - install -m 0755 $f ${D}/usr/sbin/ - done - install -m 0644 doc/*.8 ${D}/${mandir}/man8/ - install -m 0644 doc/*.html ${D}/${datadir}/doc/${P}/ -} diff --git a/content/irda-utils-0.9.15.oe b/content/irda-utils-0.9.15.oe deleted file mode 100644 index e81638a803..0000000000 --- a/content/irda-utils-0.9.15.oe +++ /dev/null @@ -1,21 +0,0 @@ -DEPENDS = virtual/libc -RDEPENDS = libc6 -DESCRIPTION = Provides common files needed to use IrDA.\ - IrDA allows communication over Infrared with other devices\ - such as phones and laptops. - -SRC_URI = ${SOURCEFORGE_MIRROR}/irda/${P}.tar.gz -S = ${WORKDIR}/${P} - -inherit autotools libtool - -do_compile () { - oe_runmake -C irattach - oe_runmake -C irdaping -} - -do_install () { - install -d ${D}/usr/sbin - oe_runmake -C irattach ROOT="${D}" install - oe_runmake -C irdaping ROOT="${D}" install -} diff --git a/content/jpeg-6b.oe b/content/jpeg-6b.oe deleted file mode 100644 index 0c900a3186..0000000000 --- a/content/jpeg-6b.oe +++ /dev/null @@ -1,34 +0,0 @@ -SECTION="libs" -PRIORITY="required" -MAINTAINER="Chris Larson " -RDEPENDS="libc6" -DEPENDS=virtual/libc - -SRC_URI = http://www.ijg.org/files/jpegsrc.v${PV}.tar.gz \ - file://${FILESDIR}/debian.patch;patch=1 -S=${WORKDIR}/jpeg-${PV} - -inherit autotools libtool - -EXTRA_OECONF="--enable-static --enable-shared" - -CFLAGS_append = " -D_REENTRANT" -#export AR:=${AR} rv - -do_stage() { - install -m 644 -D jconfig.h ${STAGING_DIR}/target/include/jconfig.h - install -m 644 -D jpeglib.h ${STAGING_DIR}/target/include/jpeglib.h - install -m 644 -D jmorecfg.h ${STAGING_DIR}/target/include/jmorecfg.h - install -m 644 -D jerror.h ${STAGING_DIR}/target/include/jerror.h - install -m 644 -D jpegint.h ${STAGING_DIR}/target/include/jpegint.h - install -m 755 -D .libs/libjpeg.so.62.0.0 ${STAGING_LIBDIR}/libjpeg.so.62.0.0 - ln -sf libjpeg.so.62.0.0 ${STAGING_LIBDIR}/libjpeg.so.62 - ln -sf libjpeg.so.62.0.0 ${STAGING_LIBDIR}/libjpeg.so -} - -do_install() { - install -d ${D}/${bindir} ${D}/${includedir} \ - ${D}/${mandir}/man1 ${D}/${libdir} - oe_runmake 'prefix=${D}/${prefix}' 'exec_prefix=${D}/${exec_prefix}' \ - install -} diff --git a/content/libogg-1.0.0.oe b/content/libogg-1.0.0.oe deleted file mode 100644 index 58ea5406bb..0000000000 --- a/content/libogg-1.0.0.oe +++ /dev/null @@ -1,12 +0,0 @@ -SECTION="libs" -PRIORITY="optional" -MAINTAINER="" -RDEPENDS="libc6" -SECTION="libs" -DEPENDS=virtual/libc - -SRC_URI = "ftp://ftp.debian.org/debian/pool/main/libo/libogg/${PN}_${PV}.orig.tar.gz" -SRC_URI_append = " file://${FILESDIR}/libogg-configure.patch;patch=1" -S=${WORKDIR}/${P} - -inherit autotools libtool diff --git a/content/libpng-1.2.5.oe b/content/libpng-1.2.5.oe deleted file mode 100644 index caae22ec9f..0000000000 --- a/content/libpng-1.2.5.oe +++ /dev/null @@ -1,40 +0,0 @@ -DESCRIPTION="PNG Library" -SECTION="libs" -PRIORITY="required" -MAINTAINER="Chris Larson " -DEPENDS=virtual/libc base/zlib -RDEPENDS="libc6 zlib1g" -RDEPENDS_append_libpng3=' libpng12' - -SRC_URI = ${SOURCEFORGE_MIRROR}/png-mng/${P}.tar.bz2 -S = ${WORKDIR}/${P} - -EXTRA_OEMAKE_append=' ZLIBINC=${STAGING_DIR}/target/include ZLIBLIB=${STAGING_LIBDIR}' - -do_compile() { - sed < scripts/makefile.linux > makefile -e 's/^ZLIBINC.*//' -e 's/^ZLIBLIB.*//' - unset LDFLAGS - oe_runmake 'CC=${CC}' 'LD=${LD}' 'CFLAGS=${CFLAGS}' \ - 'ZLIBINC=${STAGING_DIR}/target/include' \ - 'ZLIBLIB=${STAGING_LIBDIR}' -} - -do_stage() { - install -m 644 -D png.h ${STAGING_DIR}/target/include/png.h - install -m 644 -D pngconf.h ${STAGING_DIR}/target/include/pngconf.h - install -m 755 -D libpng12.so.0.${PV} ${STAGING_LIBDIR}/libpng12.so.0.${PV} - ln -sf ./libpng12.so.0.${PV} ${STAGING_LIBDIR}/libpng12.so.0 - ln -sf ./libpng12.so.0.${PV} ${STAGING_LIBDIR}/libpng12.so - ln -sf ./libpng12.so ${STAGING_LIBDIR}/libpng.so.3 - ln -sf ./libpng12.so ${STAGING_LIBDIR}/libpng.so -} - -do_install () { - install -d ${D}/${bindir} ${D}/${mandir} \ - ${D}/${libdir} ${D}/${includedir} - unset LDFLAGS - oe_runmake 'prefix=${prefix}' 'DESTDIR=${D}' \ - 'DB=${D}/${bindir}' 'DI=${D}/${includedir}' \ - 'DL=${D}/${libdir}' 'DM=${D}/${mandir}' \ - install -} diff --git a/content/libtool-1.4.3-r0/sedvar.patch b/content/libtool-1.4.3-r0/sedvar.patch deleted file mode 100644 index 8142de8007..0000000000 --- a/content/libtool-1.4.3-r0/sedvar.patch +++ /dev/null @@ -1,16 +0,0 @@ - -# -# Made by http://www.mn-logistik.de/unsupported/pxa250/patcher -# - ---- libtool-1.4.3/ltmain.in~sedvar -+++ libtool-1.4.3/ltmain.in -@@ -48,6 +48,8 @@ - exit 0 - fi - -+[ -z "${SED}" ] && SED=sed -+ - # The name of this program. - progname=`$echo "$0" | ${SED} 's%^.*/%%'` - modename="$progname" diff --git a/content/libtool-1.4.3.oe b/content/libtool-1.4.3.oe deleted file mode 100644 index f8b159943c..0000000000 --- a/content/libtool-1.4.3.oe +++ /dev/null @@ -1,39 +0,0 @@ -PR = r0 - -DESCRIPTION = Generic library support script\ - This is GNU libtool, a generic library support script. Libtool hides\ - the complexity of generating special library types (such as shared\ - libraries) behind a consistent interface. To use libtool, add the\ - new generic library building commands to your Makefile, Makefile.in,\ - or Makefile.am. See the documentation for details. Libtool supports\ - building static libraries on all platforms.\ - Libtool supports generation of C, C++ and Java libraries. - -DEPENDS= - -SRC_URI = ${DEBIAN_MIRROR}/main/libt/${PN}/${PN}_${PV}.orig.tar.gz \ - file://${FILESDIR}/debian.patch;patch=1 \ - file://${FILESDIR}/libdir.patch;patch=1 \ - file://${FILESDIR}/sedvar.patch;patch=1 \ - file://${FILESDIR}/libtoolize-staging.patch;patch=1 -S = "${WORKDIR}/${P}" - -inherit autotools - -EXTRA_OECONF = --disable-ltdl-install -do_configure_prepend () { - unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS CC CPP - ./bootstrap -} - -do_stage () { - install -d ${STAGING_DIR}/share/libtool \ - ${STAGING_DIR}/share/aclocal - install -m 0755 libtool ${STAGING_BINDIR}/libtool - install -m 0755 libtoolize ${STAGING_BINDIR}/libtoolize - install -c config.guess ${STAGING_DIR}/share/libtool/ - install -c config.sub ${STAGING_DIR}/share/libtool/ - install -c -m 0644 ltmain.sh ${STAGING_DIR}/share/libtool/ - install -c -m 0644 libtool.m4 ${STAGING_DIR}/share/aclocal/ - install -c -m 0644 ltdl.m4 ${STAGING_DIR}/share/aclocal/ -} diff --git a/content/libtool-1.5.oe b/content/libtool-1.5.oe deleted file mode 100644 index 8d9d8c4b21..0000000000 --- a/content/libtool-1.5.oe +++ /dev/null @@ -1,36 +0,0 @@ -DESCRIPTION = Generic library support script\ - This is GNU libtool, a generic library support script. Libtool hides\ - the complexity of generating special library types (such as shared\ - libraries) behind a consistent interface. To use libtool, add the\ - new generic library building commands to your Makefile, Makefile.in,\ - or Makefile.am. See the documentation for details. Libtool supports\ - building static libraries on all platforms.\ - Libtool supports generation of C, C++ and Java libraries. - -SRC_URI = http://ftp.club.cc.cmu.edu/pub/gnu/libtool/libtool-1.5.tar.gz \ - file://${FILESDIR}/libdir-la.patch;patch=1 \ - file://${FILESDIR}/sedvar.patch;patch=1 \ - file://${FILESDIR}/tag.patch;patch=1 \ - file://${FILESDIR}/libtoolize-staging.patch;patch=1 -# file://${FILESDIR}/libdir-rpath.patch;patch=1 -S = "${WORKDIR}/${P}" - -inherit autotools - -EXTRA_OECONF = --disable-ltdl-install -do_configure_prepend () { - unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS CC CPP - ./bootstrap - rm -f ${S}/ltmain.sh -} - -do_stage () { - install -d ${STAGING_DIR}/share/{libtool,aclocal} - install -m 0755 libtool ${STAGING_BINDIR}/libtool - install -m 0755 libtoolize ${STAGING_BINDIR}/libtoolize - install -c config.guess ${STAGING_DIR}/share/libtool/ - install -c config.sub ${STAGING_DIR}/share/libtool/ - install -c -m 0644 ltmain.sh ${STAGING_DIR}/share/libtool/ - install -c -m 0644 libtool.m4 ${STAGING_DIR}/share/aclocal/ - install -c -m 0644 ltdl.m4 ${STAGING_DIR}/share/aclocal/ -} diff --git a/content/modutils-2.4.25.oe b/content/modutils-2.4.25.oe deleted file mode 100644 index ef217644de..0000000000 --- a/content/modutils-2.4.25.oe +++ /dev/null @@ -1,8 +0,0 @@ -SRC_URI = ftp://ftp.kernel.org/pub/linux/utils/kernel/${PN}/v2.4/${P}.tar.bz2 \ - file://${FILESDIR}/modutils-notest.patch;patch=1 -S = ${WORKDIR}/${P} - -inherit autotools - -EXTRA_OECONF = --disable-strip -export BUILDCC = ${BUILD_CC} diff --git a/content/mtd-buildarch.oe b/content/mtd-buildarch.oe deleted file mode 100644 index 4839c9cf68..0000000000 --- a/content/mtd-buildarch.oe +++ /dev/null @@ -1,11 +0,0 @@ -inherit native -include mtd.oe -PN=mtd-buildarch - -do_stage () { - for binary in ftl_format erase eraseall nanddump doc_loadbios \ - mkfs.jffs ftl_check mkfs.jffs2 lock unlock einfo mtd_debug \ - fcp nandwrite jffs2dump; do - install -m 0755 $binary ${STAGING_BINDIR}/ - done -} diff --git a/content/mtd.oe b/content/mtd.oe deleted file mode 100644 index 78b7c4d62f..0000000000 --- a/content/mtd.oe +++ /dev/null @@ -1,17 +0,0 @@ -PV = ${@os.popen("date +%Y%m%d").readline().strip()} - -S = ${WORKDIR}/mtd/util -SRC_URI = cvs://anoncvs:anoncvs@cvs.infradead.org/home/cvs;module=mtd - -CFLAGS_prepend = "-I${S}/../include " -CPPFLAGS_prepend = "-I${S}/../include " -CXXFLAGS_prepend = "-I${S}/../include " - -do_install () { - install -d ${D}/usr/bin - for binary in ftl_format erase eraseall nanddump doc_loadbios \ - mkfs.jffs ftl_check mkfs.jffs2 lock unlock einfo mtd_debug \ - fcp nandwrite jffs2dump; do - install -m 0755 $binary ${D}/usr/bin/ - done -} diff --git a/content/ncurses-4.2.oe b/content/ncurses-4.2.oe deleted file mode 100644 index a4ab4bee47..0000000000 --- a/content/ncurses-4.2.oe +++ /dev/null @@ -1,41 +0,0 @@ -DESCRIPTION="Ncurses library" -SECTION="libs" -DEPENDS=virtual/libc -SRC_URI = ${GNU_MIRROR}/ncurses/${P}.tar.gz \ - file://${FILESDIR}/mk_shared_lib.patch;patch=1 \ - file://${FILESDIR}/run_tic.patch;patch=1 -S = ${WORKDIR}/${P} - -inherit autotools - -EXTRA_OECONF=--with-shared \ - --without-profile \ - --without-debug \ - --disable-rpath \ - --enable-echo \ - --enable-const \ - --without-ada \ - --enable-termcap \ - --without-cxx-binding \ - --with-terminfo-dirs=/etc/terminfo:/usr/share/terminfo \ - --enable-overwrite -export HOSTCCFLAGS=-I${S}/ncurses -I${S}/include ${BUILD_CFLAGS} -export HOSTLDFLAGS= -export LD := ${CC} - -do_compile () { - oe_runmake -C progs 'HOSTCC=${BUILD_CC}' 'HOSTLDFLAGS=' \ - 'HOSTCCFLAGS=${HOSTCCFLAGS}' 'CC=${BUILD_CC}' \ - 'LINK=${BUILD_CXX}' 'CFLAGS=${HOSTCCFLAGS}' \ - 'LDFLAGS=-lncurses' tic - oe_runmake 'HOSTCC=${HOSTCC}' 'HOSTLDFLAGS=' 'HOSTCCFLAGS=${HOSTCCFLAGS}' -} - -do_stage () { - install -m 0755 lib/lib*.so.* ${STAGING_LIBDIR}/ - cp -R include/* ${STAGING_DIR}/target/include/ - ln -sf libpanel.so.${PV} ${STAGING_LIBDIR}/libpanel.so - ln -sf libform.so.${PV} ${STAGING_LIBDIR}/libform.so - ln -sf libmenu.so.${PV} ${STAGING_LIBDIR}/libmenu.so - ln -sf libncurses.so.${PV} ${STAGING_LIBDIR}/libncurses.so -} diff --git a/content/ncurses-5.3.oe b/content/ncurses-5.3.oe deleted file mode 100644 index 38fb4aee96..0000000000 --- a/content/ncurses-5.3.oe +++ /dev/null @@ -1,43 +0,0 @@ -BaseV := ${PV} -SnapV := 20030906 -PV = ${BaseV}.${SnapV} - -DESCRIPTION="Ncurses library" -SECTION="libs" -DEPENDS=virtual/libc -PROVIDES=${PV}-${BaseV} ${PV}-${BaseV}-${PR} \ - ${CATEGORY}/${PN}-${BaseV} ${CATEGORY}/${PN}-${BaseV}-${PR} -SRC_URI = ${GNU_MIRROR}/ncurses/${PN}-${BaseV}.tar.gz \ - file://${FILESDIR}/${SnapV}.patch;patch=1 -S = ${WORKDIR}/${PN}-${BaseV} - -inherit autotools - -EXTRA_OECONF=--with-shared \ - --without-profile \ - --without-debug \ - --disable-rpath \ - --enable-echo \ - --enable-const \ - --without-ada \ - --enable-termcap \ - --without-cxx-binding \ - --with-terminfo-dirs=/etc/terminfo:/usr/share/terminfo \ - --enable-overwrite -export BUILD_CC := ${BUILD_CC} -export BUILD_CCFLAGS=-I${S}/ncurses -I${S}/include ${BUILD_CFLAGS} -export BUILD_LDFLAGS= - -do_compile () { - oe_runmake BUILD_LDFLAGS="" 'BUILD_CCFLAGS=${BUILD_CCFLAGS}' -} - -do_stage () { - install -m 0755 lib/lib*.so.* ${STAGING_LIBDIR}/ - cp -R include/* ${STAGING_DIR}/target/include/ - ln -sf curses.h ${STAGING_DIR}/target/include/ncurses.h - ln -sf libpanel.so.5.3 ${STAGING_LIBDIR}/libpanel.so - ln -sf libform.so.5.3 ${STAGING_LIBDIR}/libform.so - ln -sf libmenu.so.5.3 ${STAGING_LIBDIR}/libmenu.so - ln -sf libncurses.so.5.3 ${STAGING_LIBDIR}/libncurses.so -} diff --git a/content/netbase-4.13.oe b/content/netbase-4.13.oe deleted file mode 100644 index 6218e757cd..0000000000 --- a/content/netbase-4.13.oe +++ /dev/null @@ -1,12 +0,0 @@ -SRC_URI = ${DEBIAN_MIRROR}/main/n/${PN}/${PN}_${PV}.tar.gz -S = ${WORKDIR}/${P} - -do_install () { - install -d ${D}/etc/init.d ${D}/${sbindir} ${D}/${mandir}/man8 - install -m 0644 ${FILESDIR}/init ${D}/etc/init.d/netbase - install -m 0644 etc-rpc ${D}/etc/rpc - install -m 0644 etc-protocols ${D}/etc/protocols - install -m 0644 etc-services ${D}/etc/services - install -m 0755 update-inetd ${D}/${sbindir}/ - install -m 0644 update-inetd.8 ${D}/${mandir}/man8/ -} diff --git a/content/netkit-base-0.17.oe b/content/netkit-base-0.17.oe deleted file mode 100644 index 53b9e8974e..0000000000 --- a/content/netkit-base-0.17.oe +++ /dev/null @@ -1,16 +0,0 @@ -SRC_URI = ftp://ftp.uk.linux.org/pub/linux/Networking/netkit/${P}.tar.gz \ - file://${FILESDIR}/configure.patch;patch=1 \ - file://${FILESDIR}/mconfig.patch;patch=1 -S = ${WORKDIR}/${P} - -EXTRA_OEMAKE = -C inetd -do_compile () { - oe_runmake 'CC=${CC}' 'LD=${LD}' all -} - -do_install () { - install -d ${D}/${sysconfdir}/init.d ${D}/${sbindir} - install -m 0755 inetd/inetd ${D}/${sbindir}/inetd - install -m 0755 ${FILESDIR}/init ${D}/${sysconfdir}/init.d/inetd - install -m 0644 ${FILESDIR}/inetd.conf ${D}/${sysconfdir} -} diff --git a/content/netkit-ftp-0.17.oe b/content/netkit-ftp-0.17.oe deleted file mode 100644 index c77ffa01be..0000000000 --- a/content/netkit-ftp-0.17.oe +++ /dev/null @@ -1,13 +0,0 @@ -SRC_URI = ftp://ftp.uk.linux.org/pub/linux/Networking/netkit/${P}.tar.gz \ - file://${FILESDIR}/mconfig.patch;patch=1 -S = ${WORKDIR}/${P} - -EXTRA_OEMAKE = -do_compile () { - oe_runmake 'CC=${CC}' 'LD=${LD}' all -} - -do_install () { - install -d ${D}/${bindir} - install -m 0755 ftp/ftp ${D}/${bindir} -} diff --git a/content/ntp-4.1.2.oe b/content/ntp-4.1.2.oe deleted file mode 100644 index 928b1209fa..0000000000 --- a/content/ntp-4.1.2.oe +++ /dev/null @@ -1,10 +0,0 @@ -DEPENDS = virtual/libc - -SRC_URI = http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/${P}.tar.gz -S = ${WORKDIR}/${P} - -inherit autotools - -EXTRA_OECONF = --with-openssl-libdir=${STAGING_LIBDIR} \ - --with-openssl-incdir=${STAGING_DIR}/target/include/openssl -CFLAGS_append = " -DPTYS_ARE_GETPT -DPTYS_ARE_SEARCHED" diff --git a/content/openobex-1.0.0.oe b/content/openobex-1.0.0.oe deleted file mode 100644 index f35d493129..0000000000 --- a/content/openobex-1.0.0.oe +++ /dev/null @@ -1,14 +0,0 @@ -DEPENDS = virtual/libc -RDEPENDS = libc6 - -SRC_URI = ${SOURCEFORGE_MIRROR}/openobex/${P}.tar.gz -S = ${WORKDIR}/${P} - -inherit autotools libtool - -do_stage () { - install -m 0755 src/.libs/libopenobex* ${STAGING_LIBDIR}/ - install -d ${STAGING_DIR}/target/include/openobex - install -m 0644 src/obex_const.h src/obex.h ${STAGING_DIR}/target/include/openobex/ - install -m 0755 openobex-config ${STAGING_BINDIR}/ -} diff --git a/content/openobex-apps-1.0.0.oe b/content/openobex-apps-1.0.0.oe deleted file mode 100644 index bac16557f1..0000000000 --- a/content/openobex-apps-1.0.0.oe +++ /dev/null @@ -1,17 +0,0 @@ -DEPENDS = virtual/libc openobex -RDEPENDS = libc6 libopenobex1 - -SRC_URI = ${SOURCEFORGE_MIRROR}/openobex/${P}.tar.gz -S = ${WORKDIR}/${P} - -inherit autotools libtool - -EXTRA_OECONF = --disable-glibtest --with-glib-prefix=${STAGING_DIR}/target -export OPENOBEX_CFLAGS=-I${STAGING_DIR}/target/include -export OPENOBEX_CONFIG = ${STAGING_BINDIR}/openobex-config \ - --prefix=${STAGING_DIR}/target \ - --exec-prefix=${STAGING_DIR}/target - -do_compile () { - oe_runmake 'INCLUDES=' -} diff --git a/content/openssl-0.9.7b.oe b/content/openssl-0.9.7b.oe deleted file mode 100644 index 6b27b50bcf..0000000000 --- a/content/openssl-0.9.7b.oe +++ /dev/null @@ -1,30 +0,0 @@ -SRC_URI = http://www.openssl.org/source/${P}.tar.gz \ - file://${FILESDIR}/debian.patch;patch=1 -S = ${WORKDIR}/${PN}-${PV} - -DEPENDS = virtual/libc -SECTION = libs -DESCRIPTION = Secure Socket Layer (SSL) binary and related cryptographic tools. - -export AR := ${AR} r -export CFLAG = "-fPIC -DTHREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -DTERMIO -Wall ${FULL_OPTIMIZATION}" -export DIRS = "crypto ssl" -export EX_LIBS = "-lgcc -ldl -L${STAGING_LIBDIR}" -do_compile () { - perl util/perlpath.pl /usr/bin - perl ./Configure shared --prefix=/usr --openssldir=/usr/lib/ssl ${TARGET_OS}-elf-${TARGET_ARCH} - ln -sf apps/openssl.pod crypto/crypto.pod ssl/ssl.pod doc/ - oe_runmake -f Makefile.ssl -} - -do_stage () { - cp --dereference -R include/openssl ${STAGING_DIR}/target/include/ - install -m 0755 libcrypto.so.0.9.7 ${STAGING_LIBDIR}/ - ln -sf libcrypto.so.0.9.7 ${STAGING_LIBDIR}/libcrypto.so - install -m 0755 libssl.so.0.9.7 ${STAGING_LIBDIR}/ - ln -sf libssl.so.0.9.7 ${STAGING_LIBDIR}/libssl.so -} - -do_install () { - oe_runmake -f Makefile.ssl INSTALL_PREFIX="${D}" install -} diff --git a/content/oz-ppc-toolchain-binutils-2.13.2.oe b/content/oz-ppc-toolchain-binutils-2.13.2.oe deleted file mode 100644 index cb6525db16..0000000000 --- a/content/oz-ppc-toolchain-binutils-2.13.2.oe +++ /dev/null @@ -1,32 +0,0 @@ -DESCRIPTION="binutils 2.13 from FSF" -SRC_URI="ftp://ftp.gnu.org/pub/gnu/binutils/binutils-2.13.2.tar.gz" -HOMEPAGE="http://gnu.org" -MAINTAINER="Tom Gall " - -LICENSE="GPL" -RDEPEND="" -DEPEND="" -PROVIDES="virtual/ppc-linux-binutils" - -inherit base - -do_unpack() { - base_do_unpack $@ || die -} - -do_compile() { - cd ${WORKDIR}/binutils-${PV} - unset CC CFLAGS CPPFLAGS LDFLAGS; - CC="" ./configure --prefix=/usr/local/ppc --target=ppc-linux || die " ${P} failed during configure" - oe_runmake -j 8 || die "failed building ${P}" - -} - -do_install() { - mkdir -p /usr/local/ppc - - cd ${WORKDIR}/binutils-${PV} - make install - - oeset COMPILERPATH /usr/local/ppc/bin -} diff --git a/content/oz-ppc-toolchain-gcc-3.2.3.oe b/content/oz-ppc-toolchain-gcc-3.2.3.oe deleted file mode 100644 index 8f4f5beb9b..0000000000 --- a/content/oz-ppc-toolchain-gcc-3.2.3.oe +++ /dev/null @@ -1,32 +0,0 @@ -DESCRIPTION="gcc 3.2.3 from FSF" -SRC_URI="ftp://ftp.gnu.org/pub/gnu/gcc/gcc-${PV}.tar.gz ftp://ftp.linuxppc64.org/pub/ppc32/oe/specs-${PV}.gz -HOMEPAGE="http://www.gnu.org" - -LICENSE="GPL" -RDEPEND="" -DEPEND="" -PROVIDES="virtual/ppc-linux-gcc" -MAINTAINER="Tom Gall " - -do_unpack() { - base_do_unpack $@ || die -} - -do_compile() { - cd ${WORKDIR}/gcc-${PV} - unset CC CFLAGS CPPFLAGS LDFLAGS; - export PATH="/usr/local/ppc/bin:$PATH" - CC="" ./configure --prefix=/usr/local/ppc --target=ppc-linux --enable-languages="c,c++" --without-libffi || die " ${P} failed during configure" - oe_runmake -j 8 || die "failed building ${P}" - -} - -do_install() { - mkdir -p /usr/local/ppc/lib/gcc-lib/ppc-linux/${PV} - cd ${WORKDIR}/gcc-${PV} - export PATH="/usr/local/ppc/bin:$PATH" - make install - cp ${WORKDIR}/specs-${PV} /usr/local/ppc/lib/gcc-lib/ppc-linux/${PV}/specs - - oeset COMPILERPATH /usr/local/ppc/bin -} diff --git a/content/oz-ppc-toolchain-glibc-2.3.2.oe b/content/oz-ppc-toolchain-glibc-2.3.2.oe deleted file mode 100644 index 1e3ac0beff..0000000000 --- a/content/oz-ppc-toolchain-glibc-2.3.2.oe +++ /dev/null @@ -1,35 +0,0 @@ -DESCRIPTION="glibc 2.3.2 from FSF" -SRC_URI="ftp://ftp.gnu.org/pub/gnu/glibc/glibc-2.3.2.tar.gz ftp://ftp.gnu.org/pub/gnu/glibc/glibc-linuxthreads-${PV}.tar.gz" -HOMEPAGE="http://www.gnu.org" - -LICENSE="LGPL" -RDEPEND="" -DEPEND="" -PROVIDES="virtual/ppc-linux-gcc" -MAINTAINER="Tom Gall " - -do_unpack() { - base_do_unpack $@ || die - mv ${WORKDIR}/linuxthreads* ${WORKDIR}/glibc-${PV} -} - -do_compile() { - cd ${WORKDIR}/glibc-${PV} - unset CC CFLAGS CPPFLAGS LDFLAGS; - export PATH="/usr/local/ppc/bin:$PATH" - mkdir -p ../glibc-bld - cd ../glibc-bld - CC="" ../glibc-${PV}/configure --prefix=/usr/local/ppc --build=ppc-linux --host=ppc-linux --target=ppc-linux --enable-add-ons=linuxthreads --enable-elf --with-headers=${STAGING_DIR}/target/include/ --enable-shared --without-cvs --without-gd --without-fp --with-cpu=403 || die " ${P} failed during configure" - oe_runmake -j 8 || die "failed building ${P}" - -} - -do_install() { - mkdir -p /usr/local/ppc/etc - touch /usr/local/ppc/etc/ld.so.conf - cd ${WORKDIR}/glibc-bld - export PATH="/usr/local/ppc/bin:$PATH" - make install - - oeset COMPILERPATH /usr/local/ppc/bin -} diff --git a/content/patcher-1.0.oe b/content/patcher-1.0.oe deleted file mode 100644 index 7d72d17845..0000000000 --- a/content/patcher-1.0.oe +++ /dev/null @@ -1,24 +0,0 @@ -SRC_URI="http://www.mn-logistik.de/unsupported/pxa250/patcher" -DESCRIPTION="Patcher tool" -LICENSE="Unknown" -DEPENDS= -SECTION="base" -PRIORITY="optional" -MAINTAINER="Chris Larson " - -do_unpack() { - oenote "Nothing to unpack!" -} - -do_stage() { - install -m 0755 ${DL_DIR}/patcher ${STAGING_BINDIR}/ -} - -do_install() { - install -d ${D}/usr/bin - install -m 0755 ${DL_DIR}/patcher ${D}/usr/bin -} - -inherit base - -DEPENDS_prepend_delete="patcher " diff --git a/content/pcre-4.4.oe b/content/pcre-4.4.oe deleted file mode 100644 index 36e0113380..0000000000 --- a/content/pcre-4.4.oe +++ /dev/null @@ -1,35 +0,0 @@ -DEPENDS = virtual/libc -RDEPENDS = libc6 -DESCRIPTION = Perl-compatible regular expression library. PCRE has its own native \ -API, but a set of "wrapper" functions that are based on the POSIX API \ -are also supplied in the library libpcreposix. Note that this just \ -provides a POSIX calling interface to PCRE; the regular expressions \ -themselves still follow Perl syntax and semantics. The header file for \ -the POSIX-style functions is called pcreposix.h. - - -SRC_URI = ftp://ftp.csx.cam.ac.uk/pub/software/programming/${PN}/${P}.tar.bz2 -S = "${WORKDIR}/${P}" - -inherit autotools libtool - -CFLAGS_append = " -D_REENTRANT" -do_compile () { - ${BUILD_CC} -I${S}/include -c dftables.c - ${BUILD_CC} dftables.o -o dftables - oe_runmake -} - -do_stage () { - install -m 0755 .libs/libpcreposix.so.0.0.0 ${STAGING_LIBDIR}/ - ln -sf libpcreposix.so.0.0.0 ${STAGING_LIBDIR}/libpcreposix.so.0 - install -m 0755 .libs/libpcre.so.0.0.1 ${STAGING_LIBDIR}/ - ln -sf libpcre.so.0.0.1 ${STAGING_LIBDIR}/libpcre.so.0 - - ln -sf libpcre.so.0.0.1 ${STAGING_LIBDIR}/libpcre.so - ln -sf libpcreposix.so.0.0.0 ${STAGING_LIBDIR}/libpcreposix.so - install -m 0644 .libs/libpcre.a ${STAGING_LIBDIR}/ - install -m 0644 .libs/libpcreposix.a ${STAGING_LIBDIR}/ - install -m 0644 pcre.h ${STAGING_DIR}/target/include/ - install -m 0644 pcreposix.h ${STAGING_DIR}/target/include/ -} diff --git a/content/qte-2.3.6.oe b/content/qte-2.3.6.oe deleted file mode 100644 index f086b961d8..0000000000 --- a/content/qte-2.3.6.oe +++ /dev/null @@ -1,36 +0,0 @@ -DESCRIPTION="Qt/Embedded version 2.3.6" -LICENSE="GPL/QPL" -SRC_URI="ftp://ftp.trolltech.com/pub/qt/source/qt-embedded-2.3.6.tar.gz" -SRC_URI_append=" file://${FILESDIR}/qpe.patch;patch=1" -DEPENDS=virtual/libc zlib libpng jpeg -PROVIDES=virtual/qte virtual/libqte2 -S="${WORKDIR}/qt-${PV}" - -# strip off leading and trailing whitespace, and made the vars single word -CXX:="${@oe.data.getVar('CXX', d, 1).strip().split()[0]}" -CC:="${@oe.data.getVar('CC', d, 1).strip().split()[0]}" -BUILD_CXX:="${@oe.data.getVar('BUILD_CXX', d, 1).strip().split()[0]}" -BUILD_CC:="${@oe.data.getVar('BUILD_CC', d, 1).strip().split()[0]}" -CFLAGS:="${@oe.data.getVar('CFLAGS', d, 1).strip()}" -CXXFLAGS:="${@oe.data.getVar('CXXFLAGS', d, 1).strip()}" -LDFLAGS:="${@oe.data.getVar('LDFLAGS', d, 1).strip()}" - -export QTDIR = ${S} - -ARCH_i686=x86 - -EXTRA_OECONF=-system-jpeg -system-libpng -system-zlib -no-qvfb -no-xft -no-vnc -gif ${EXTRA_OECONF_ARCH} ${EXTRA_OECONF_CONFIG} - -EXTRA_OECONF_CONFIG=-qconfig qpe -EXTRA_OECONF_ARCH=-xplatform ${TARGET_OS}-${TARGET_ARCH}-g++ -EXTRA_OECONF_ARCH_collie=-xplatform ${TARGET_OS}-sharp-g++ -EXTRA_OECONF_ARCH_ramses=-xplatform ${TARGET_OS}-ramses-g++ - -do_compile() { - if [ "$BUILD_ARCH" = "i686" ]; then - BUILD_ARCH=x86 - fi - echo yes | ./configure -platform $BUILD_OS-$BUILD_ARCH-g++ $EXTRA_OECONF || die "Configuring qt failed" - (cd src/moc; EXTRA_OEMAKE="SYSCONF_CXX='${BUILD_CXX}' SYSCONF_CC='${BUILD_CC}'" oe_runmake) - oe_runmake SYSCONF_CXX='${CXX}' SYSCONF_CC="${CC}" SYSCONF_LINK="${CC}" SYSCONF_SHLIB="${CC}" SYSCONF_CFLAGS="${CFLAGS}" SYSCONF_CXXFLAGS="${CXXFLAGS} -pipe -DQWS -fno-exceptions -fno-rtti -O2 -Wall -W -DNO_DEBUG" SYSCONF_LFLAGS="${LDFLAGS}" -} diff --git a/content/qte-2.3.7.oe b/content/qte-2.3.7.oe deleted file mode 100644 index a4e4ee1600..0000000000 --- a/content/qte-2.3.7.oe +++ /dev/null @@ -1,68 +0,0 @@ -DESCRIPTION="Qt/Embedded version ${PV}" -LICENSE="GPL/QPL" -SRC_URI="ftp://ftp.trolltech.com/pub/qt/source/qt-embedded-${PV}.tar.gz" -SRC_URI_append=" file://${FILESDIR}/qpe.patch;patch=1" -DEPENDS=virtual/libc base/zlib base/libpng base/jpeg -PROVIDES=virtual/qte virtual/libqte2 -S="${WORKDIR}/qt-${PV}" - -# strip off leading and trailing whitespace, and made the vars single word -#CXX:="${@oe.data.getVar('CXX', d, 1).strip().split()[-1]}" -#CC:="${@oe.data.getVar('CC', d, 1).strip().split()[-1]}" -#BUILD_CXX:="${@oe.data.getVar('BUILD_CXX', d, 1).strip().split()[-1]}" -#BUILD_CC:="${@oe.data.getVar('BUILD_CC', d, 1).strip().split()[-1]}" -#CFLAGS:="${@oe.data.getVar('CFLAGS', d, 1).strip()}" -#CXXFLAGS:="${@oe.data.getVar('CXXFLAGS', d, 1).strip()}" -#LDFLAGS:="${@oe.data.getVar('LDFLAGS', d, 1).strip()}" - -export QTDIR = ${S} - -ARCH_i686=x86 - -EXTRA_OECONF=-system-jpeg -system-libpng -system-zlib -no-qvfb -no-xft -no-vnc -gif ${EXTRA_OECONF_ARCH} ${EXTRA_OECONF_CONFIG} - -EXTRA_OECONF_CONFIG=-qconfig qpe -EXTRA_OECONF_ARCH=-xplatform ${TARGET_OS}-${TARGET_ARCH}-g++ -EXTRA_OECONF_ARCH_collie=-xplatform ${TARGET_OS}-sharp-g++ -EXTRA_OECONF_ARCH_ramses=-xplatform ${TARGET_OS}-ramses-g++ - -EXTRA_OEMAKE = -e - -export SYSCONF_CC = ${CC} -export SYSCONF_CXX = ${CXX} -export SYSCONF_LINK = ${CC} -export SYSCONF_SHLIB = ${CC} -export SYSCONF_CFLAGS = ${CFLAGS} -export SYSCONF_CXXFLAGS = ${CXXFLAGS} -pipe -DQWS -fno-exceptions -fno-rtti -DNO_DEBUG -export SYSCONF_LFLAGS = ${LDFLAGS} - -do_compile() { - unset CC CXX LD LINK CPP CFLAGS CXXFLAGS LDFLAGS - if [ "$BUILD_ARCH" = "i686" ]; then - BUILD_ARCH=x86 - fi - echo yes | ./configure -platform $BUILD_OS-$BUILD_ARCH-g++ $EXTRA_OECONF || die "Configuring qt failed" - ( - cd src/moc - export SYSCONF_CXX="${BUILD_CXX}" - export SYSCONF_CC="${BUILD_CC}" - export SYSCONF_LINK="${BUILD_CC}" - export SYSCONF_SHLIB="${BUILD_CC}" - unset SYSCONF_CFLAGS SYSCONF_CXXFLAGS SYSCONF_LFLAGS CROSS - oe_runmake - ) - cd ${S} - oe_runmake -} - -do_stage () { - install -m 0755 lib/libqte.so.* ${STAGING_LIBDIR}/ - install -m 0755 bin/moc ${STAGING_BINDIR}/ - rm -f include/qxt.h - cp -a -f --dereference include/* ${STAGING_DIR}/target/include/ -} - -do_install () { - install -d ${D}/usr/lib/qte2/lib - install -m 0755 lib/libqte.so.* ${D}/usr/lib/qte2/lib/ -} diff --git a/content/sysvinit-2.85.oe b/content/sysvinit-2.85.oe deleted file mode 100644 index 1eb13c3751..0000000000 --- a/content/sysvinit-2.85.oe +++ /dev/null @@ -1,40 +0,0 @@ -DEPENDS=virtual/libc -DESCRIPTION = System-V like init.\ - Init is the first program to run after your system is booted, and\ - continues to run as process number 1 until your system halts. Inits\ - job is to start other programs that are essential to the operation of\ - your system. All processes are descended from init. For more information,\ - see the manual page init(8). - -SRC_URI = ftp://ftp.cistron.nl/pub/people/miquels/${PN}/${P}.tar.gz -S="${WORKDIR}/${P}/src" - -CFLAGS_prepend = "-D_GNU_SOURCE " -export LCRYPT = "-lcrypt" - -do_install () { - install -d ${D}/${bindir} ${D}/${sbindir} \ - ${D}/sbin ${D}/${sysconfdir}/default \ - ${D}/${sysconfdir}/init.d -# install -m 755 debian/sysv-rc/sbin/invoke-rc.d \ -# debian/sysv-rc/sbin/update-rc.d ${D}/usr/sbin/ - install -m 755 halt killall5 \ - runlevel shutdown ${D}/sbin/ - install -m 755 init ${D}/sbin/sysvinit - install -m 755 mesg last ${D}/usr/bin/ - install -m 0755 ${FILESDIR}/need ${D}/sbin/need.sysvinit - install -m 0755 ${FILESDIR}/provide ${D}/sbin/provide.sysvinit - ln -sf halt ${D}/sbin/reboot - ln -sf halt ${D}/sbin/poweroff - ln -sf init ${D}/sbin/telinit - ln -sf killall5 ${D}/sbin/pidof - ln -sf last ${D}/usr/bin/lastb -# echo "/etc/inittab" > ${D}/CONTROL/conffiles -# echo "/etc/default/rcS" >> ${D}/CONTROL/conffiles -# install -m 0755 ${FILESDIR}/prerm ${D}/CONTROL/ -# install -m 0755 ${FILESDIR}/postinst ${D}/CONTROL/ - install -m 0644 ${FILESDIR}/inittab ${D}/etc/inittab - install -m 0644 ${FILESDIR}/rcS-default ${D}/etc/default/rcS - install -m 0755 ${FILESDIR}/rc ${D}/etc/init.d - install -m 0755 ${FILESDIR}/rcS ${D}/etc/init.d -} diff --git a/content/tinylogin-1.4.oe b/content/tinylogin-1.4.oe deleted file mode 100644 index 3c1e111f16..0000000000 --- a/content/tinylogin-1.4.oe +++ /dev/null @@ -1,17 +0,0 @@ -SRC_URI = http://tinylogin.busybox.net/downloads/${P}.tar.bz2 -S = ${WORKDIR}/${P} - -EXTRA_OEMAKE = - -do_compile () { - oe_runmake 'CC=${CC}' 'CROSS=${CROSS}' -} - -do_install () { - install -d ${D}/bin - install -m 4755 tinylogin ${D}/bin/tinylogin - for i in `cat tinylogin.links`; do - mkdir -p ${D}/`dirname $i` - ln -sf /bin/tinylogin ${D}/$i - done -} diff --git a/content/tmake-1.11.oe b/content/tmake-1.11.oe deleted file mode 100644 index ea3b68b403..0000000000 --- a/content/tmake-1.11.oe +++ /dev/null @@ -1,28 +0,0 @@ -SRC_URI="ftp://ftp.trolltech.com/pub/freebies/tmake/tmake-${PV}.tar.gz" -DESCRIPTION="tmake is an easy-to-use tool for creating and maintaining makefiles across many platforms and compilers." -LICENSE="Unknown" -DEPENDS="" -SECTION="base" -PRIORITY="optional" -MAINTAINER="Chris Larson " - -S="${WORKDIR}/${P}" - -do_stage() { - install -m 0755 bin/tmake bin/progen ${STAGING_BINDIR}/ - - install -d ${STAGING_DIR}/share/tmake - cp -R lib/* ${STAGING_DIR}/share/tmake/ -} - -do_install() { - install -d ${D}/usr/bin - install -m 0755 bin/tmake bin/progen ${D}/usr/bin/ - - install -d ${D}/usr/share/tmake - cp -R lib/* ${D}/usr/share/tmake/ -} - -PACKAGES="tmake" -FILES="" -FILES_tmake="/usr/bin/tmake /usr/bin/progen /usr/share/tmake/*" diff --git a/content/tslib.oe b/content/tslib.oe deleted file mode 100644 index 95edbc163b..0000000000 --- a/content/tslib.oe +++ /dev/null @@ -1,26 +0,0 @@ -DEPENDS = virtual/libc -RDEPENDS = libc6 - -SRC_URI := cvs://cvs:@pubcvs.arm.linux.org.uk/mnt/src/cvsroot;module=tslib -SRC_URI_append = " file://${FILESDIR}/pointercal.patch;patch=1" -SRC_URI_append = " file://${FILESDIR}/automake.patch;patch=1" -SRC_URI_append = " file://${FILESDIR}/multievent.patch;patch=1" -SRC_URI_append = " file://${FILESDIR}/envvar_doc.patch;patch=1" -#SRC_URI_append = " file://${FILESDIR}/raw.patch;patch=1" -#SRC_URI_append = " file://${FILESDIR}/collie-module.patch;patch=1" -S = ${WORKDIR}/${PN} - -inherit autotools libtool - -do_compile_prepend () { - ./autogen.sh -} - -do_stage () { - install -m 0755 src/.libs/libts-0.0.so.0.1.0 ${STAGING_LIBDIR}/ - ln -sf libts-0.0.so.0.1.0 ${STAGING_LIBDIR}/libts-0.0.so.0 - ln -sf libts-0.0.so.0.1.0 ${STAGING_LIBDIR}/libts-0.0.so - ln -sf libts-0.0.so ${STAGING_LIBDIR}/libts.so - install -m 0644 src/tslib.h ${STAGING_DIR}/target/include/ - install -m 0644 src/tslib-private.h ${STAGING_DIR}/target/include/ -} diff --git a/content/zlib-1.1.4.oe b/content/zlib-1.1.4.oe deleted file mode 100644 index 555f07ccc4..0000000000 --- a/content/zlib-1.1.4.oe +++ /dev/null @@ -1,35 +0,0 @@ -DESCRIPTION="Zlib Compression Library" -SECTION="libs" -PRIORITY="required" -MAINTAINER="Chris Larson " -RDEPENDS="libc6" - -SRC_URI="http://www.libpng.org/pub/png/src/zlib-${PV}.tar.gz" -DEPENDS=virtual/libc -S="${WORKDIR}/${P}" - -export LDSHARED:="${CC} -shared -Wl,-soname,libz.so.1" -export LDFLAGS:="${LDFLAGS} -L. -lz" -export CFLAGS:="-fPIC ${CFLAGS}" -export AR:="${AR} rc" -EXTRA_OEMAKE= - -do_compile() { - ./configure --prefix=${prefix} --exec_prefix=${exec_prefix} --shared --libdir=${libdir} --includedir=${includedir} - oe_runmake -e MAKEFLAGS="" libz.so.1.1.4 libz.a -} - -do_stage() { - install -m 0644 zlib.h ${STAGING_DIR}/target/include/zlib.h - install -m 0644 zconf.h ${STAGING_DIR}/target/include/zconf.h - install -m 0755 libz.so.1.1.4 ${STAGING_LIBDIR}/libz.so.1.1.4 - install -m 0755 libz.a ${STAGING_LIBDIR}/libz.a - ln -sf ./libz.so.1.1.4 ${STAGING_LIBDIR}/libz.so.1 - ln -sf ./libz.so.1.1.4 ${STAGING_LIBDIR}/libz.so -} - -do_install() { - install -d ${D}/${prefix} ${D}/${includedir} ${D}/${libdir} - oe_runmake 'prefix=${D}/${prefix}' 'includedir=${D}/${includedir}' \ - 'libdir=${D}/${libdir}' install -} diff --git a/content/zsh-4.1.1.oe b/content/zsh-4.1.1.oe deleted file mode 100644 index d42f7ea455..0000000000 --- a/content/zsh-4.1.1.oe +++ /dev/null @@ -1,13 +0,0 @@ -DESCRIPTION="Zsh shell" -SECTION="base" -PRIORITY="optional" -MAINTAINER="Chris Larson " -RDEPENDS="libc6" -DEPENDS=virtual/libc ncurses pcre - -SRC_URI="http://www.zsh.org/pub/${P}.tar.bz2" -S="${WORKDIR}/${P}" - -inherit autotools - -EXTRA_OECONF = "--with-curses-terminfo" diff --git a/content/fbgetty-0.1.698.oe b/coreutils/coreutils-5.0.oe similarity index 100% rename from content/fbgetty-0.1.698.oe rename to coreutils/coreutils-5.0.oe diff --git a/content/fbi-1.22.oe b/coreutils/coreutils-5.0/malloc.patch similarity index 100% rename from content/fbi-1.22.oe rename to coreutils/coreutils-5.0/malloc.patch diff --git a/content/glibc-2.3.2-r0/10_cvs.patch b/corkscrew/corkscrew-2.0.oe similarity index 100% rename from content/glibc-2.3.2-r0/10_cvs.patch rename to corkscrew/corkscrew-2.0.oe diff --git a/content/glibc-2.3.2-r0/30_glibc232-base.patch b/cross/cross-binutils-2.13.2.oe similarity index 100% rename from content/glibc-2.3.2-r0/30_glibc232-base.patch rename to cross/cross-binutils-2.13.2.oe diff --git a/content/glibc-2.3.2-r0/50_glibc23-hppa-entry.patch b/cross/cross-binutils-2.14.90.0.6.oe similarity index 100% rename from content/glibc-2.3.2-r0/50_glibc23-hppa-entry.patch rename to cross/cross-binutils-2.14.90.0.6.oe diff --git a/content/glibc-2.3.2-r0/50_glibc232-arm-dwarf2-buildfix.patch b/cross/cross-binutils-2.14.oe similarity index 100% rename from content/glibc-2.3.2-r0/50_glibc232-arm-dwarf2-buildfix.patch rename to cross/cross-binutils-2.14.oe diff --git a/content/glibc-2.3.2-r0/50_glibc232-m68k-dwarf2-buildfix.patch b/cross/cross-gcc-3.3.1.oe similarity index 100% rename from content/glibc-2.3.2-r0/50_glibc232-m68k-dwarf2-buildfix.patch rename to cross/cross-gcc-3.3.1.oe diff --git a/content/glibc-2.3.2-r0/50_glibc232-mips-buildfix.patch b/cross/cross-gcc-initial-3.3.1.oe similarity index 100% rename from content/glibc-2.3.2-r0/50_glibc232-mips-buildfix.patch rename to cross/cross-gcc-initial-3.3.1.oe diff --git a/content/glibc-2.3.2-r0/80_glibc232-futimes-buildfix.patch b/diffutils/diffutils-2.8.1.oe similarity index 100% rename from content/glibc-2.3.2-r0/80_glibc232-futimes-buildfix.patch rename to diffutils/diffutils-2.8.1.oe diff --git a/content/glibc-2.3.2-r0/80_glibc232-iconvdata-fix.patch b/dropbear/dropbear-0.36.oe similarity index 100% rename from content/glibc-2.3.2-r0/80_glibc232-iconvdata-fix.patch rename to dropbear/dropbear-0.36.oe diff --git a/content/glibc-2.3.2-r0/80_glibc232-locales-header.patch b/expat/expat-1.95.6.oe similarity index 100% rename from content/glibc-2.3.2-r0/80_glibc232-locales-header.patch rename to expat/expat-1.95.6.oe diff --git a/content/glibc-2.3.2-r0/80_glibc232-wcsmbs-fix.patch b/fakeroot/fakeroot-0.7.5.oe similarity index 100% rename from content/glibc-2.3.2-r0/80_glibc232-wcsmbs-fix.patch rename to fakeroot/fakeroot-0.7.5.oe diff --git a/content/glibc-2.3.2-r0/81_glibc232-utimes-fix.patch b/fakeroot/fakeroot-buildarch-0.7.5.oe similarity index 100% rename from content/glibc-2.3.2-r0/81_glibc232-utimes-fix.patch rename to fakeroot/fakeroot-buildarch-0.7.5.oe diff --git a/content/glibc-2.3.2-r0/alpha-crti.patch b/fbgetty/fbgetty-0.1.698.oe similarity index 100% rename from content/glibc-2.3.2-r0/alpha-crti.patch rename to fbgetty/fbgetty-0.1.698.oe diff --git a/content/glibc-2.3.2-r0/alpha-pic.patch b/fbgetty/fbgetty-0.1.698/compile.patch similarity index 100% rename from content/glibc-2.3.2-r0/alpha-pic.patch rename to fbgetty/fbgetty-0.1.698/compile.patch diff --git a/content/glibc-2.3.2-r0/alpha-pwrite.patch b/fbi/fbi-1.22.oe similarity index 100% rename from content/glibc-2.3.2-r0/alpha-pwrite.patch rename to fbi/fbi-1.22.oe diff --git a/content/glibc-2.3.2-r0/arm-no-hwcap.patch b/glibc/glibc-2.3.2-r0/10_cvs.patch similarity index 100% rename from content/glibc-2.3.2-r0/arm-no-hwcap.patch rename to glibc/glibc-2.3.2-r0/10_cvs.patch diff --git a/content/glibc-2.3.2-r0/arm-output-format.patch b/glibc/glibc-2.3.2-r0/30_glibc232-base.patch similarity index 100% rename from content/glibc-2.3.2-r0/arm-output-format.patch rename to glibc/glibc-2.3.2-r0/30_glibc232-base.patch diff --git a/content/glibc-2.3.2-r0/autoconf.h b/glibc/glibc-2.3.2-r0/50_glibc23-hppa-entry.patch similarity index 100% rename from content/glibc-2.3.2-r0/autoconf.h rename to glibc/glibc-2.3.2-r0/50_glibc23-hppa-entry.patch diff --git a/content/glibc-2.3.2-r0/dyn-ldconfig.diff b/glibc/glibc-2.3.2-r0/50_glibc232-arm-dwarf2-buildfix.patch similarity index 100% rename from content/glibc-2.3.2-r0/dyn-ldconfig.diff rename to glibc/glibc-2.3.2-r0/50_glibc232-arm-dwarf2-buildfix.patch diff --git a/content/glibc-2.3.2-r0/fhs-linux-paths.patch b/glibc/glibc-2.3.2-r0/50_glibc232-m68k-dwarf2-buildfix.patch similarity index 100% rename from content/glibc-2.3.2-r0/fhs-linux-paths.patch rename to glibc/glibc-2.3.2-r0/50_glibc232-m68k-dwarf2-buildfix.patch diff --git a/content/glibc-2.3.2-r0/glibc22-eo_EO.patch b/glibc/glibc-2.3.2-r0/50_glibc232-mips-buildfix.patch similarity index 100% rename from content/glibc-2.3.2-r0/glibc22-eo_EO.patch rename to glibc/glibc-2.3.2-r0/50_glibc232-mips-buildfix.patch diff --git a/content/glibc-2.3.2-r0/glibc22-locales.patch b/glibc/glibc-2.3.2-r0/80_glibc232-futimes-buildfix.patch similarity index 100% rename from content/glibc-2.3.2-r0/glibc22-locales.patch rename to glibc/glibc-2.3.2-r0/80_glibc232-futimes-buildfix.patch diff --git a/content/glibc-2.3.2-r0/glibc22-m68k-compat.patch b/glibc/glibc-2.3.2-r0/80_glibc232-iconvdata-fix.patch similarity index 100% rename from content/glibc-2.3.2-r0/glibc22-m68k-compat.patch rename to glibc/glibc-2.3.2-r0/80_glibc232-iconvdata-fix.patch diff --git a/content/glibc-2.3.2-r0/glibc22-m68k-fpic.patch b/glibc/glibc-2.3.2-r0/80_glibc232-locales-header.patch similarity index 100% rename from content/glibc-2.3.2-r0/glibc22-m68k-fpic.patch rename to glibc/glibc-2.3.2-r0/80_glibc232-locales-header.patch diff --git a/content/glibc-2.3.2-r0/glibc22-nss-upgrade.patch b/glibc/glibc-2.3.2-r0/80_glibc232-wcsmbs-fix.patch similarity index 100% rename from content/glibc-2.3.2-r0/glibc22-nss-upgrade.patch rename to glibc/glibc-2.3.2-r0/80_glibc232-wcsmbs-fix.patch diff --git a/content/glibc-2.3.2-r0/glibc22-ttyname-devfs.patch b/glibc/glibc-2.3.2-r0/81_glibc232-utimes-fix.patch similarity index 100% rename from content/glibc-2.3.2-r0/glibc22-ttyname-devfs.patch rename to glibc/glibc-2.3.2-r0/81_glibc232-utimes-fix.patch diff --git a/content/glibc-2.3.2-r0/glibc23-01-hppa-dl-machine.patch b/glibc/glibc-2.3.2-r0/alpha-crti.patch similarity index 100% rename from content/glibc-2.3.2-r0/glibc23-01-hppa-dl-machine.patch rename to glibc/glibc-2.3.2-r0/alpha-crti.patch diff --git a/content/glibc-2.3.2-r0/glibc23-07-hppa-atomicity.patch b/glibc/glibc-2.3.2-r0/alpha-pic.patch similarity index 100% rename from content/glibc-2.3.2-r0/glibc23-07-hppa-atomicity.patch rename to glibc/glibc-2.3.2-r0/alpha-pic.patch diff --git a/content/glibc-2.3.2-r0/glibc23-asserth-decls.patch b/glibc/glibc-2.3.2-r0/alpha-pwrite.patch similarity index 100% rename from content/glibc-2.3.2-r0/glibc23-asserth-decls.patch rename to glibc/glibc-2.3.2-r0/alpha-pwrite.patch diff --git a/content/glibc-2.3.2-r0/glibc23-cmov.patch b/glibc/glibc-2.3.2-r0/arm-no-hwcap.patch similarity index 100% rename from content/glibc-2.3.2-r0/glibc23-cmov.patch rename to glibc/glibc-2.3.2-r0/arm-no-hwcap.patch diff --git a/content/glibc-2.3.2-r0/glibc23-ctype-compat.patch b/glibc/glibc-2.3.2-r0/arm-output-format.patch similarity index 100% rename from content/glibc-2.3.2-r0/glibc23-ctype-compat.patch rename to glibc/glibc-2.3.2-r0/arm-output-format.patch diff --git a/content/glibc-2.3.2-r0/glibc23-errno.patch b/glibc/glibc-2.3.2-r0/autoconf.h similarity index 100% rename from content/glibc-2.3.2-r0/glibc23-errno.patch rename to glibc/glibc-2.3.2-r0/autoconf.h diff --git a/content/glibc-2.3.2-r0/glibc23-function-compat.patch b/glibc/glibc-2.3.2-r0/dyn-ldconfig.diff similarity index 100% rename from content/glibc-2.3.2-r0/glibc23-function-compat.patch rename to glibc/glibc-2.3.2-r0/dyn-ldconfig.diff diff --git a/content/glibc-2.3.2-r0/glibc23-hppa-Rminkernel.patch b/glibc/glibc-2.3.2-r0/fhs-linux-paths.patch similarity index 100% rename from content/glibc-2.3.2-r0/glibc23-hppa-Rminkernel.patch rename to glibc/glibc-2.3.2-r0/fhs-linux-paths.patch diff --git a/content/glibc-2.3.2-r0/glibc23-hppa-compat.patch b/glibc/glibc-2.3.2-r0/glibc-2.3.2-200304020432.patch similarity index 100% rename from content/glibc-2.3.2-r0/glibc23-hppa-compat.patch rename to glibc/glibc-2.3.2-r0/glibc-2.3.2-200304020432.patch diff --git a/content/glibc-2.3.2-r0/glibc23-hppa-malloc8.patch b/glibc/glibc-2.3.2-r0/glibc22-eo_EO.patch similarity index 100% rename from content/glibc-2.3.2-r0/glibc23-hppa-malloc8.patch rename to glibc/glibc-2.3.2-r0/glibc22-eo_EO.patch diff --git a/content/glibc-2.3.2-r0/glibcbug.patch b/glibc/glibc-2.3.2-r0/glibc22-locales.patch similarity index 100% rename from content/glibc-2.3.2-r0/glibcbug.patch rename to glibc/glibc-2.3.2-r0/glibc22-locales.patch diff --git a/content/glibc-2.3.2-r0/hurd-enable-ldconfig.patch b/glibc/glibc-2.3.2-r0/glibc22-m68k-compat.patch similarity index 100% rename from content/glibc-2.3.2-r0/hurd-enable-ldconfig.patch rename to glibc/glibc-2.3.2-r0/glibc22-m68k-compat.patch diff --git a/content/glibc-2.3.2-r0/ldconfig.patch b/glibc/glibc-2.3.2-r0/glibc22-m68k-fpic.patch similarity index 100% rename from content/glibc-2.3.2-r0/ldconfig.patch rename to glibc/glibc-2.3.2-r0/glibc22-m68k-fpic.patch diff --git a/content/glibc-2.3.2-r0/ldd.patch b/glibc/glibc-2.3.2-r0/glibc22-nss-upgrade.patch similarity index 100% rename from content/glibc-2.3.2-r0/ldd.patch rename to glibc/glibc-2.3.2-r0/glibc22-nss-upgrade.patch diff --git a/content/glibc-2.3.2-r0/libgcc-compat-all.patch b/glibc/glibc-2.3.2-r0/glibc22-ttyname-devfs.patch similarity index 100% rename from content/glibc-2.3.2-r0/libgcc-compat-all.patch rename to glibc/glibc-2.3.2-r0/glibc22-ttyname-devfs.patch diff --git a/content/glibc-2.3.2-r0/libgcc-compat-other.patch b/glibc/glibc-2.3.2-r0/glibc23-01-hppa-dl-machine.patch similarity index 100% rename from content/glibc-2.3.2-r0/libgcc-compat-other.patch rename to glibc/glibc-2.3.2-r0/glibc23-01-hppa-dl-machine.patch diff --git a/content/glibc-2.3.2-r0/librt-mips.patch b/glibc/glibc-2.3.2-r0/glibc23-07-hppa-atomicity.patch similarity index 100% rename from content/glibc-2.3.2-r0/librt-mips.patch rename to glibc/glibc-2.3.2-r0/glibc23-07-hppa-atomicity.patch diff --git a/content/glibc-2.3.2-r0/lo_LA.UTF-8_not_supported.patch b/glibc/glibc-2.3.2-r0/glibc23-asserth-decls.patch similarity index 100% rename from content/glibc-2.3.2-r0/lo_LA.UTF-8_not_supported.patch rename to glibc/glibc-2.3.2-r0/glibc23-asserth-decls.patch diff --git a/content/glibc-2.3.2-r0/locale-es_AR.patch b/glibc/glibc-2.3.2-r0/glibc23-cmov.patch similarity index 100% rename from content/glibc-2.3.2-r0/locale-es_AR.patch rename to glibc/glibc-2.3.2-r0/glibc23-cmov.patch diff --git a/content/glibc-2.3.2-r0/locales-stuff.patch b/glibc/glibc-2.3.2-r0/glibc23-ctype-compat.patch similarity index 100% rename from content/glibc-2.3.2-r0/locales-stuff.patch rename to glibc/glibc-2.3.2-r0/glibc23-ctype-compat.patch diff --git a/content/glibc-2.3.2-r0/locales-supported.patch b/glibc/glibc-2.3.2-r0/glibc23-errno.patch similarity index 100% rename from content/glibc-2.3.2-r0/locales-supported.patch rename to glibc/glibc-2.3.2-r0/glibc23-errno.patch diff --git a/content/glibc-2.3.2-r0/makeconfig.patch b/glibc/glibc-2.3.2-r0/glibc23-function-compat.patch similarity index 100% rename from content/glibc-2.3.2-r0/makeconfig.patch rename to glibc/glibc-2.3.2-r0/glibc23-function-compat.patch diff --git a/content/glibc-2.3.2-r0/noinfo.patch b/glibc/glibc-2.3.2-r0/glibc23-hppa-Rminkernel.patch similarity index 100% rename from content/glibc-2.3.2-r0/noinfo.patch rename to glibc/glibc-2.3.2-r0/glibc23-hppa-Rminkernel.patch diff --git a/content/glibc-2.3.2-r0/nss_compat-shadow.patch b/glibc/glibc-2.3.2-r0/glibc23-hppa-compat.patch similarity index 100% rename from content/glibc-2.3.2-r0/nss_compat-shadow.patch rename to glibc/glibc-2.3.2-r0/glibc23-hppa-compat.patch diff --git a/content/glibc-2.3.2-r0/powerpc-sysconf.patch b/glibc/glibc-2.3.2-r0/glibc23-hppa-malloc8.patch similarity index 100% rename from content/glibc-2.3.2-r0/powerpc-sysconf.patch rename to glibc/glibc-2.3.2-r0/glibc23-hppa-malloc8.patch diff --git a/content/glibc-2.3.2-r0/revert-old-libio.patch b/glibc/glibc-2.3.2-r0/glibcbug.patch similarity index 100% rename from content/glibc-2.3.2-r0/revert-old-libio.patch rename to glibc/glibc-2.3.2-r0/glibcbug.patch diff --git a/content/glibc-2.3.2-r0/s390-tls.patch b/glibc/glibc-2.3.2-r0/hurd-enable-ldconfig.patch similarity index 100% rename from content/glibc-2.3.2-r0/s390-tls.patch rename to glibc/glibc-2.3.2-r0/hurd-enable-ldconfig.patch diff --git a/content/glibc-2.3.2-r0/sedscript.patch b/glibc/glibc-2.3.2-r0/ldconfig.patch similarity index 100% rename from content/glibc-2.3.2-r0/sedscript.patch rename to glibc/glibc-2.3.2-r0/ldconfig.patch diff --git a/content/glibc-2.3.2-r0/sparc64-fixups.patch b/glibc/glibc-2.3.2-r0/ldd.patch similarity index 100% rename from content/glibc-2.3.2-r0/sparc64-fixups.patch rename to glibc/glibc-2.3.2-r0/ldd.patch diff --git a/content/glibc-2.3.2-r0/sparcv8-target.patch b/glibc/glibc-2.3.2-r0/libgcc-compat-all.patch similarity index 100% rename from content/glibc-2.3.2-r0/sparcv8-target.patch rename to glibc/glibc-2.3.2-r0/libgcc-compat-all.patch diff --git a/content/glibc-2.3.2-r0/syslog-backrev.patch b/glibc/glibc-2.3.2-r0/libgcc-compat-other.patch similarity index 100% rename from content/glibc-2.3.2-r0/syslog-backrev.patch rename to glibc/glibc-2.3.2-r0/libgcc-compat-other.patch diff --git a/content/glibc-2.3.2-r0/version.h b/glibc/glibc-2.3.2-r0/librt-mips.patch similarity index 100% rename from content/glibc-2.3.2-r0/version.h rename to glibc/glibc-2.3.2-r0/librt-mips.patch diff --git a/content/hotplug-2003_05_01-r0/busybox.patch b/glibc/glibc-2.3.2-r0/lo_LA.UTF-8_not_supported.patch similarity index 100% rename from content/hotplug-2003_05_01-r0/busybox.patch rename to glibc/glibc-2.3.2-r0/lo_LA.UTF-8_not_supported.patch diff --git a/content/hotplug-2003_05_01.oe b/glibc/glibc-2.3.2-r0/locale-es_AR.patch similarity index 100% rename from content/hotplug-2003_05_01.oe rename to glibc/glibc-2.3.2-r0/locale-es_AR.patch diff --git a/content/ifupdown-0.6.4/init b/glibc/glibc-2.3.2-r0/locales-stuff.patch similarity index 100% rename from content/ifupdown-0.6.4/init rename to glibc/glibc-2.3.2-r0/locales-stuff.patch diff --git a/content/ifupdown-0.6.4/interfaces b/glibc/glibc-2.3.2-r0/locales-supported.patch similarity index 100% rename from content/ifupdown-0.6.4/interfaces rename to glibc/glibc-2.3.2-r0/locales-supported.patch diff --git a/content/ifupdown-0.6.4/udhcpc.patch b/glibc/glibc-2.3.2-r0/makeconfig.patch similarity index 100% rename from content/ifupdown-0.6.4/udhcpc.patch rename to glibc/glibc-2.3.2-r0/makeconfig.patch diff --git a/content/ifupdown-roam-0.59.oe b/glibc/glibc-2.3.2-r0/noinfo.patch similarity index 100% rename from content/ifupdown-roam-0.59.oe rename to glibc/glibc-2.3.2-r0/noinfo.patch diff --git a/content/ifupdown-roam-0.59/conffiles b/glibc/glibc-2.3.2-r0/nss_compat-shadow.patch similarity index 100% rename from content/ifupdown-roam-0.59/conffiles rename to glibc/glibc-2.3.2-r0/nss_compat-shadow.patch diff --git a/content/ifupdown-roam-0.59/postrm b/glibc/glibc-2.3.2-r0/powerpc-sysconf.patch similarity index 100% rename from content/ifupdown-roam-0.59/postrm rename to glibc/glibc-2.3.2-r0/powerpc-sysconf.patch diff --git a/content/ifupdown-roam-0.59/preinst b/glibc/glibc-2.3.2-r0/revert-old-libio.patch similarity index 100% rename from content/ifupdown-roam-0.59/preinst rename to glibc/glibc-2.3.2-r0/revert-old-libio.patch diff --git a/content/initscripts-1.0-r0/banner b/glibc/glibc-2.3.2-r0/s390-tls.patch similarity index 100% rename from content/initscripts-1.0-r0/banner rename to glibc/glibc-2.3.2-r0/s390-tls.patch diff --git a/content/initscripts-1.0-r0/banner-simpad b/glibc/glibc-2.3.2-r0/sedscript.patch similarity index 100% rename from content/initscripts-1.0-r0/banner-simpad rename to glibc/glibc-2.3.2-r0/sedscript.patch diff --git a/content/initscripts-1.0-r0/bootlogo-simpad.gz b/glibc/glibc-2.3.2-r0/sparc64-fixups.patch similarity index 100% rename from content/initscripts-1.0-r0/bootlogo-simpad.gz rename to glibc/glibc-2.3.2-r0/sparc64-fixups.patch diff --git a/content/initscripts-1.0-r0/bootmisc.sh b/glibc/glibc-2.3.2-r0/sparcv8-target.patch similarity index 100% rename from content/initscripts-1.0-r0/bootmisc.sh rename to glibc/glibc-2.3.2-r0/sparcv8-target.patch diff --git a/content/initscripts-1.0-r0/checkfs.sh b/glibc/glibc-2.3.2-r0/syslog-backrev.patch similarity index 100% rename from content/initscripts-1.0-r0/checkfs.sh rename to glibc/glibc-2.3.2-r0/syslog-backrev.patch diff --git a/content/initscripts-1.0-r0/checkroot.sh b/glibc/glibc-2.3.2-r0/version.h similarity index 100% rename from content/initscripts-1.0-r0/checkroot.sh rename to glibc/glibc-2.3.2-r0/version.h diff --git a/content/initscripts-1.0-r0/devices b/glibc/glibc-2.3.2.oe similarity index 100% rename from content/initscripts-1.0-r0/devices rename to glibc/glibc-2.3.2.oe diff --git a/content/netbase-4.13/busybox.patch b/hotplug/hotplug-2003_05_01-r0/busybox.patch similarity index 100% rename from content/netbase-4.13/busybox.patch rename to hotplug/hotplug-2003_05_01-r0/busybox.patch diff --git a/content/initscripts-1.0-r0/devices-h3600 b/hotplug/hotplug-2003_05_01.oe similarity index 100% rename from content/initscripts-1.0-r0/devices-h3600 rename to hotplug/hotplug-2003_05_01.oe diff --git a/content/initscripts-1.0-r0/devices-simpad b/ifupdown/ifupdown-0.6.4.oe similarity index 100% rename from content/initscripts-1.0-r0/devices-simpad rename to ifupdown/ifupdown-0.6.4.oe diff --git a/content/netbase-4.13/init b/ifupdown/ifupdown-0.6.4/init similarity index 100% rename from content/netbase-4.13/init rename to ifupdown/ifupdown-0.6.4/init diff --git a/content/initscripts-1.0-r0/devpts.sh b/ifupdown/ifupdown-0.6.4/interfaces similarity index 100% rename from content/initscripts-1.0-r0/devpts.sh rename to ifupdown/ifupdown-0.6.4/interfaces diff --git a/content/initscripts-1.0-r0/extractfs b/ifupdown/ifupdown-0.6.4/udhcpc.patch similarity index 100% rename from content/initscripts-1.0-r0/extractfs rename to ifupdown/ifupdown-0.6.4/udhcpc.patch diff --git a/content/initscripts-1.0-r0/extractfs-ramses b/ifupdown/ifupdown-roam-0.59.oe similarity index 100% rename from content/initscripts-1.0-r0/extractfs-ramses rename to ifupdown/ifupdown-roam-0.59.oe diff --git a/content/initscripts-1.0-r0/finish b/ifupdown/ifupdown-roam-0.59/conffiles similarity index 100% rename from content/initscripts-1.0-r0/finish rename to ifupdown/ifupdown-roam-0.59/conffiles diff --git a/content/sysvinit-2.85-r0/postinst b/ifupdown/ifupdown-roam-0.59/postinst similarity index 100% rename from content/sysvinit-2.85-r0/postinst rename to ifupdown/ifupdown-roam-0.59/postinst diff --git a/content/initscripts-1.0-r0/halt b/ifupdown/ifupdown-roam-0.59/postrm similarity index 100% rename from content/initscripts-1.0-r0/halt rename to ifupdown/ifupdown-roam-0.59/postrm diff --git a/content/initscripts-1.0-r0/hostname.sh b/ifupdown/ifupdown-roam-0.59/preinst similarity index 100% rename from content/initscripts-1.0-r0/hostname.sh rename to ifupdown/ifupdown-roam-0.59/preinst diff --git a/content/initscripts-1.0-r0/mountall.sh b/initscripts/initscripts-1.0-r0/banner similarity index 100% rename from content/initscripts-1.0-r0/mountall.sh rename to initscripts/initscripts-1.0-r0/banner diff --git a/content/initscripts-1.0-r0/mountnfs.sh b/initscripts/initscripts-1.0-r0/banner-simpad similarity index 100% rename from content/initscripts-1.0-r0/mountnfs.sh rename to initscripts/initscripts-1.0-r0/banner-simpad diff --git a/content/initscripts-1.0-r0/packages b/initscripts/initscripts-1.0-r0/bootlogo-simpad.gz similarity index 100% rename from content/initscripts-1.0-r0/packages rename to initscripts/initscripts-1.0-r0/bootlogo-simpad.gz diff --git a/content/initscripts-1.0-r0/packages-ramses b/initscripts/initscripts-1.0-r0/bootmisc.sh similarity index 100% rename from content/initscripts-1.0-r0/packages-ramses rename to initscripts/initscripts-1.0-r0/bootmisc.sh diff --git a/content/initscripts-1.0-r0/ramdisk b/initscripts/initscripts-1.0-r0/checkfs.sh similarity index 100% rename from content/initscripts-1.0-r0/ramdisk rename to initscripts/initscripts-1.0-r0/checkfs.sh diff --git a/content/initscripts-1.0-r0/reboot b/initscripts/initscripts-1.0-r0/checkroot.sh similarity index 100% rename from content/initscripts-1.0-r0/reboot rename to initscripts/initscripts-1.0-r0/checkroot.sh diff --git a/content/initscripts-1.0-r0/rmnologin b/initscripts/initscripts-1.0-r0/devices similarity index 100% rename from content/initscripts-1.0-r0/rmnologin rename to initscripts/initscripts-1.0-r0/devices diff --git a/content/initscripts-1.0-r0/sendsigs b/initscripts/initscripts-1.0-r0/devices-h3600 similarity index 100% rename from content/initscripts-1.0-r0/sendsigs rename to initscripts/initscripts-1.0-r0/devices-h3600 diff --git a/content/initscripts-1.0-r0/single b/initscripts/initscripts-1.0-r0/devices-simpad similarity index 100% rename from content/initscripts-1.0-r0/single rename to initscripts/initscripts-1.0-r0/devices-simpad diff --git a/content/initscripts-1.0-r0/umountfs b/initscripts/initscripts-1.0-r0/devpts.sh similarity index 100% rename from content/initscripts-1.0-r0/umountfs rename to initscripts/initscripts-1.0-r0/devpts.sh diff --git a/content/initscripts-1.0-r0/umountfs-ramses b/initscripts/initscripts-1.0-r0/extractfs similarity index 100% rename from content/initscripts-1.0-r0/umountfs-ramses rename to initscripts/initscripts-1.0-r0/extractfs diff --git a/content/initscripts-1.0-r0/umountnfs.sh b/initscripts/initscripts-1.0-r0/extractfs-ramses similarity index 100% rename from content/initscripts-1.0-r0/umountnfs.sh rename to initscripts/initscripts-1.0-r0/extractfs-ramses diff --git a/content/initscripts-1.0-r0/urandom b/initscripts/initscripts-1.0-r0/finish similarity index 100% rename from content/initscripts-1.0-r0/urandom rename to initscripts/initscripts-1.0-r0/finish diff --git a/content/ipkg-utils-buildarch-1.0_cvs.oe b/initscripts/initscripts-1.0-r0/halt similarity index 100% rename from content/ipkg-utils-buildarch-1.0_cvs.oe rename to initscripts/initscripts-1.0-r0/halt diff --git a/content/jpeg-6b/debian.patch b/initscripts/initscripts-1.0-r0/hostname.sh similarity index 100% rename from content/jpeg-6b/debian.patch rename to initscripts/initscripts-1.0-r0/hostname.sh diff --git a/content/libogg-1.0.0/libogg-configure.patch b/initscripts/initscripts-1.0-r0/mountall.sh similarity index 100% rename from content/libogg-1.0.0/libogg-configure.patch rename to initscripts/initscripts-1.0-r0/mountall.sh diff --git a/content/libtool-1.4.3-r0/debian.patch b/initscripts/initscripts-1.0-r0/mountnfs.sh similarity index 100% rename from content/libtool-1.4.3-r0/debian.patch rename to initscripts/initscripts-1.0-r0/mountnfs.sh diff --git a/content/libtool-1.4.3-r0/libdir.patch b/initscripts/initscripts-1.0-r0/packages similarity index 100% rename from content/libtool-1.4.3-r0/libdir.patch rename to initscripts/initscripts-1.0-r0/packages diff --git a/content/libtool-1.4.3-r0/libtoolize-staging.patch b/initscripts/initscripts-1.0-r0/packages-ramses similarity index 100% rename from content/libtool-1.4.3-r0/libtoolize-staging.patch rename to initscripts/initscripts-1.0-r0/packages-ramses diff --git a/content/libtool-1.5/libdir-la.patch b/initscripts/initscripts-1.0-r0/ramdisk similarity index 100% rename from content/libtool-1.5/libdir-la.patch rename to initscripts/initscripts-1.0-r0/ramdisk diff --git a/content/libtool-1.5/libtoolize-staging.patch b/initscripts/initscripts-1.0-r0/reboot similarity index 100% rename from content/libtool-1.5/libtoolize-staging.patch rename to initscripts/initscripts-1.0-r0/reboot diff --git a/content/libtool-1.5/sedvar.patch b/initscripts/initscripts-1.0-r0/rmnologin similarity index 100% rename from content/libtool-1.5/sedvar.patch rename to initscripts/initscripts-1.0-r0/rmnologin diff --git a/content/libtool-1.5/tag.patch b/initscripts/initscripts-1.0-r0/sendsigs similarity index 100% rename from content/libtool-1.5/tag.patch rename to initscripts/initscripts-1.0-r0/sendsigs diff --git a/content/man-1.5m2.oe b/initscripts/initscripts-1.0-r0/single similarity index 100% rename from content/man-1.5m2.oe rename to initscripts/initscripts-1.0-r0/single diff --git a/content/man-pages-1.60.oe b/initscripts/initscripts-1.0-r0/umountfs similarity index 100% rename from content/man-pages-1.60.oe rename to initscripts/initscripts-1.0-r0/umountfs diff --git a/content/modutils-2.4.25-r0/modutils b/initscripts/initscripts-1.0-r0/umountfs-ramses similarity index 100% rename from content/modutils-2.4.25-r0/modutils rename to initscripts/initscripts-1.0-r0/umountfs-ramses diff --git a/content/modutils-2.4.25-r0/modutils-notest.patch b/initscripts/initscripts-1.0-r0/umountnfs.sh similarity index 100% rename from content/modutils-2.4.25-r0/modutils-notest.patch rename to initscripts/initscripts-1.0-r0/umountnfs.sh diff --git a/content/ncurses/20030906.patch b/initscripts/initscripts-1.0-r0/urandom similarity index 100% rename from content/ncurses/20030906.patch rename to initscripts/initscripts-1.0-r0/urandom diff --git a/content/ncurses/mk_shared_lib.patch b/initscripts/initscripts-1.0.oe similarity index 100% rename from content/ncurses/mk_shared_lib.patch rename to initscripts/initscripts-1.0.oe diff --git a/content/ncurses/run_tic.patch b/ipkg/ipkg-0.99.84.oe similarity index 100% rename from content/ncurses/run_tic.patch rename to ipkg/ipkg-0.99.84.oe diff --git a/content/ncurses/tic.patch b/ipkg/ipkg-0.99.91.oe similarity index 100% rename from content/ncurses/tic.patch rename to ipkg/ipkg-0.99.91.oe diff --git a/content/netkit-base-0.17/configure.patch b/ipkg/ipkg-buildarch-0.99.84.oe similarity index 100% rename from content/netkit-base-0.17/configure.patch rename to ipkg/ipkg-buildarch-0.99.84.oe diff --git a/content/netkit-base-0.17/inetd.conf b/ipkg/ipkg-buildarch-0.99.91.oe similarity index 100% rename from content/netkit-base-0.17/inetd.conf rename to ipkg/ipkg-buildarch-0.99.91.oe diff --git a/content/netkit-base-0.17/init b/ipkg/ipkg-utils-1.0_cvs.oe similarity index 100% rename from content/netkit-base-0.17/init rename to ipkg/ipkg-utils-1.0_cvs.oe diff --git a/content/netkit-base-0.17/mconfig.patch b/ipkg/ipkg-utils-buildarch-1.0_cvs.oe similarity index 100% rename from content/netkit-base-0.17/mconfig.patch rename to ipkg/ipkg-utils-buildarch-1.0_cvs.oe diff --git a/content/netkit-ftp-0.17/mconfig.patch b/iputils/iputils-20020927.oe similarity index 100% rename from content/netkit-ftp-0.17/mconfig.patch rename to iputils/iputils-20020927.oe diff --git a/content/openssh-3.7.1p1.oe b/irda/irda-utils-0.9.15.oe similarity index 100% rename from content/openssh-3.7.1p1.oe rename to irda/irda-utils-0.9.15.oe diff --git a/content/openssh-3.7.1p1/cross.patch b/jpeg/jpeg-6b.oe similarity index 100% rename from content/openssh-3.7.1p1/cross.patch rename to jpeg/jpeg-6b.oe diff --git a/content/openssl-0.9.7b/debian.patch b/jpeg/jpeg-6b/debian.patch similarity index 100% rename from content/openssl-0.9.7b/debian.patch rename to jpeg/jpeg-6b/debian.patch diff --git a/content/openssh-3.7.1p1/scp-nossl.patch b/libogg/libogg-1.0.0.oe similarity index 100% rename from content/openssh-3.7.1p1/scp-nossl.patch rename to libogg/libogg-1.0.0.oe diff --git a/content/openssh-3.7.1p1/sshd_config b/libogg/libogg-1.0.0/libogg-configure.patch similarity index 100% rename from content/openssh-3.7.1p1/sshd_config rename to libogg/libogg-1.0.0/libogg-configure.patch diff --git a/content/ppc-kernel-headers-2.4.21.oe b/libpng/libpng-1.2.5.oe similarity index 100% rename from content/ppc-kernel-headers-2.4.21.oe rename to libpng/libpng-1.2.5.oe diff --git a/content/qte-2.3.6-r0/qpe.patch b/libtool/libtool-1.4.3-r0/debian.patch similarity index 100% rename from content/qte-2.3.6-r0/qpe.patch rename to libtool/libtool-1.4.3-r0/debian.patch diff --git a/content/qte-2.3.7-r0/qpe.patch b/libtool/libtool-1.4.3-r0/libdir.patch similarity index 100% rename from content/qte-2.3.7-r0/qpe.patch rename to libtool/libtool-1.4.3-r0/libdir.patch diff --git a/content/resolvconf-0.41.oe b/libtool/libtool-1.4.3-r0/libtoolize-staging.patch similarity index 100% rename from content/resolvconf-0.41.oe rename to libtool/libtool-1.4.3-r0/libtoolize-staging.patch diff --git a/content/sysvinit-2.85-r0/inittab b/libtool/libtool-1.4.3-r0/sedvar.patch similarity index 100% rename from content/sysvinit-2.85-r0/inittab rename to libtool/libtool-1.4.3-r0/sedvar.patch diff --git a/content/sysvinit-2.85-r0/need b/libtool/libtool-1.4.3.oe similarity index 100% rename from content/sysvinit-2.85-r0/need rename to libtool/libtool-1.4.3.oe diff --git a/content/sysvinit-2.85-r0/no_dev_tty.patch b/libtool/libtool-1.5.oe similarity index 100% rename from content/sysvinit-2.85-r0/no_dev_tty.patch rename to libtool/libtool-1.5.oe diff --git a/content/sysvinit-2.85-r0/prerm b/libtool/libtool-1.5/libdir-la.patch similarity index 100% rename from content/sysvinit-2.85-r0/prerm rename to libtool/libtool-1.5/libdir-la.patch diff --git a/content/sysvinit-2.85-r0/provide b/libtool/libtool-1.5/libtoolize-staging.patch similarity index 100% rename from content/sysvinit-2.85-r0/provide rename to libtool/libtool-1.5/libtoolize-staging.patch diff --git a/content/sysvinit-2.85-r0/rc b/libtool/libtool-1.5/sedvar.patch similarity index 100% rename from content/sysvinit-2.85-r0/rc rename to libtool/libtool-1.5/sedvar.patch diff --git a/content/sysvinit-2.85-r0/rcS b/libtool/libtool-1.5/tag.patch similarity index 100% rename from content/sysvinit-2.85-r0/rcS rename to libtool/libtool-1.5/tag.patch diff --git a/content/sysvinit-2.85-r0/rcS-default b/man/man-1.5m2.oe similarity index 100% rename from content/sysvinit-2.85-r0/rcS-default rename to man/man-1.5m2.oe diff --git a/content/tslib/automake.patch b/man/man-pages-1.60.oe similarity index 100% rename from content/tslib/automake.patch rename to man/man-pages-1.60.oe diff --git a/content/tslib/collie-module.patch b/modutils/modutils-2.4.25-r0/modutils similarity index 100% rename from content/tslib/collie-module.patch rename to modutils/modutils-2.4.25-r0/modutils diff --git a/content/tslib/devfs.patch b/modutils/modutils-2.4.25-r0/modutils-notest.patch similarity index 100% rename from content/tslib/devfs.patch rename to modutils/modutils-2.4.25-r0/modutils-notest.patch diff --git a/content/tslib/envvar_doc.patch b/modutils/modutils-2.4.25.oe similarity index 100% rename from content/tslib/envvar_doc.patch rename to modutils/modutils-2.4.25.oe diff --git a/content/tslib/event1.patch b/mtd/mtd-buildarch.oe similarity index 100% rename from content/tslib/event1.patch rename to mtd/mtd-buildarch.oe diff --git a/content/tslib/multievent.patch b/mtd/mtd.oe similarity index 100% rename from content/tslib/multievent.patch rename to mtd/mtd.oe diff --git a/content/tslib/pointercal.patch b/ncurses/ncurses-4.2.oe similarity index 100% rename from content/tslib/pointercal.patch rename to ncurses/ncurses-4.2.oe diff --git a/content/tslib/raw.patch b/ncurses/ncurses-5.3.oe similarity index 100% rename from content/tslib/raw.patch rename to ncurses/ncurses-5.3.oe diff --git a/content/tslib/ts_calibrate.patch b/ncurses/ncurses/20030906.patch similarity index 100% rename from content/tslib/ts_calibrate.patch rename to ncurses/ncurses/20030906.patch diff --git a/content/util-linux-2.12.oe b/ncurses/ncurses/mk_shared_lib.patch similarity index 100% rename from content/util-linux-2.12.oe rename to ncurses/ncurses/mk_shared_lib.patch diff --git a/content/util-linux-2.12/MCONFIG b/ncurses/ncurses/run_tic.patch similarity index 100% rename from content/util-linux-2.12/MCONFIG rename to ncurses/ncurses/run_tic.patch diff --git a/content/util-linux-2.12/defines.h b/ncurses/ncurses/tic.patch similarity index 100% rename from content/util-linux-2.12/defines.h rename to ncurses/ncurses/tic.patch diff --git a/content/util-linux-2.12/make_include b/netbase/netbase-4.13.oe similarity index 100% rename from content/util-linux-2.12/make_include rename to netbase/netbase-4.13.oe diff --git a/content/util-linux-2.12/swapargs.h b/netbase/netbase-4.13/busybox.patch similarity index 100% rename from content/util-linux-2.12/swapargs.h rename to netbase/netbase-4.13/busybox.patch diff --git a/doc/README b/netbase/netbase-4.13/init similarity index 100% rename from doc/README rename to netbase/netbase-4.13/init diff --git a/netkit-base/PLACEHOLDER b/netkit-base/PLACEHOLDER new file mode 100644 index 0000000000..e69de29bb2 diff --git a/netkit-base/netkit-base-0.17.oe b/netkit-base/netkit-base-0.17.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/netkit-base/netkit-base-0.17/configure.patch b/netkit-base/netkit-base-0.17/configure.patch new file mode 100644 index 0000000000..e69de29bb2 diff --git a/netkit-base/netkit-base-0.17/inetd.conf b/netkit-base/netkit-base-0.17/inetd.conf new file mode 100644 index 0000000000..e69de29bb2 diff --git a/netkit-base/netkit-base-0.17/init b/netkit-base/netkit-base-0.17/init new file mode 100644 index 0000000000..e69de29bb2 diff --git a/netkit-base/netkit-base-0.17/mconfig.patch b/netkit-base/netkit-base-0.17/mconfig.patch new file mode 100644 index 0000000000..e69de29bb2 diff --git a/netkit-ftp/PLACEHOLDER b/netkit-ftp/PLACEHOLDER new file mode 100644 index 0000000000..e69de29bb2 diff --git a/netkit-ftp/netkit-ftp-0.17.oe b/netkit-ftp/netkit-ftp-0.17.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/netkit-ftp/netkit-ftp-0.17/mconfig.patch b/netkit-ftp/netkit-ftp-0.17/mconfig.patch new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ntp/ntp-4.1.2.oe b/ntp/ntp-4.1.2.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openobex/openobex-1.0.0.oe b/openobex/openobex-1.0.0.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openobex/openobex-apps-1.0.0.oe b/openobex/openobex-apps-1.0.0.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openssh/openssh-3.7.1p1.oe b/openssh/openssh-3.7.1p1.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openssh/openssh-3.7.1p1/cross.patch b/openssh/openssh-3.7.1p1/cross.patch new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openssh/openssh-3.7.1p1/scp-nossl.patch b/openssh/openssh-3.7.1p1/scp-nossl.patch new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openssh/openssh-3.7.1p1/sshd_config b/openssh/openssh-3.7.1p1/sshd_config new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openssl/openssl-0.9.7b.oe b/openssl/openssl-0.9.7b.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openssl/openssl-0.9.7b/debian.patch b/openssl/openssl-0.9.7b/debian.patch new file mode 100644 index 0000000000..e69de29bb2 diff --git a/oz/oz-ppc-toolchain-binutils-2.13.2.oe b/oz/oz-ppc-toolchain-binutils-2.13.2.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/oz/oz-ppc-toolchain-gcc-3.2.3.oe b/oz/oz-ppc-toolchain-gcc-3.2.3.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/oz/oz-ppc-toolchain-glibc-2.3.2.oe b/oz/oz-ppc-toolchain-glibc-2.3.2.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/patcher/patcher-1.0.oe b/patcher/patcher-1.0.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pcre/pcre-4.4.oe b/pcre/pcre-4.4.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ppc/ppc-kernel-headers-2.4.21.oe b/ppc/ppc-kernel-headers-2.4.21.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/qte/qte-2.3.6-r0/qpe.patch b/qte/qte-2.3.6-r0/qpe.patch new file mode 100644 index 0000000000..e69de29bb2 diff --git a/qte/qte-2.3.6.oe b/qte/qte-2.3.6.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/qte/qte-2.3.7-r0/qpe.patch b/qte/qte-2.3.7-r0/qpe.patch new file mode 100644 index 0000000000..e69de29bb2 diff --git a/qte/qte-2.3.7.oe b/qte/qte-2.3.7.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/resolvconf/resolvconf-0.41.oe b/resolvconf/resolvconf-0.41.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sysvinit/sysvinit-2.85-r0/inittab b/sysvinit/sysvinit-2.85-r0/inittab new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sysvinit/sysvinit-2.85-r0/need b/sysvinit/sysvinit-2.85-r0/need new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sysvinit/sysvinit-2.85-r0/no_dev_tty.patch b/sysvinit/sysvinit-2.85-r0/no_dev_tty.patch new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sysvinit/sysvinit-2.85-r0/postinst b/sysvinit/sysvinit-2.85-r0/postinst new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sysvinit/sysvinit-2.85-r0/prerm b/sysvinit/sysvinit-2.85-r0/prerm new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sysvinit/sysvinit-2.85-r0/provide b/sysvinit/sysvinit-2.85-r0/provide new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sysvinit/sysvinit-2.85-r0/rc b/sysvinit/sysvinit-2.85-r0/rc new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sysvinit/sysvinit-2.85-r0/rcS b/sysvinit/sysvinit-2.85-r0/rcS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sysvinit/sysvinit-2.85-r0/rcS-default b/sysvinit/sysvinit-2.85-r0/rcS-default new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sysvinit/sysvinit-2.85.oe b/sysvinit/sysvinit-2.85.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tinylogin/tinylogin-1.4.oe b/tinylogin/tinylogin-1.4.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tmake/tmake-1.11.oe b/tmake/tmake-1.11.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tslib/tslib.oe b/tslib/tslib.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tslib/tslib/automake.patch b/tslib/tslib/automake.patch new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tslib/tslib/collie-module.patch b/tslib/tslib/collie-module.patch new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tslib/tslib/devfs.patch b/tslib/tslib/devfs.patch new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tslib/tslib/envvar_doc.patch b/tslib/tslib/envvar_doc.patch new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tslib/tslib/event1.patch b/tslib/tslib/event1.patch new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tslib/tslib/multievent.patch b/tslib/tslib/multievent.patch new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tslib/tslib/pointercal.patch b/tslib/tslib/pointercal.patch new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tslib/tslib/raw.patch b/tslib/tslib/raw.patch new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tslib/tslib/ts_calibrate.patch b/tslib/tslib/ts_calibrate.patch new file mode 100644 index 0000000000..e69de29bb2 diff --git a/util-linux/util-linux-2.12.oe b/util-linux/util-linux-2.12.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/util-linux/util-linux-2.12/MCONFIG b/util-linux/util-linux-2.12/MCONFIG new file mode 100644 index 0000000000..e69de29bb2 diff --git a/util-linux/util-linux-2.12/defines.h b/util-linux/util-linux-2.12/defines.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/util-linux/util-linux-2.12/make_include b/util-linux/util-linux-2.12/make_include new file mode 100644 index 0000000000..e69de29bb2 diff --git a/util-linux/util-linux-2.12/swapargs.h b/util-linux/util-linux-2.12/swapargs.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zlib/zlib-1.1.4.oe b/zlib/zlib-1.1.4.oe new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zsh/zsh-4.1.1.oe b/zsh/zsh-4.1.1.oe new file mode 100644 index 0000000000..e69de29bb2 -- 2.39.5